Hi,
in a continued effort for better Informix ESQL/C compatibility,
we added the "string" pseudo-type handling to ECPG.
This type in ESQL/C is documented as:
--------------------------------------------------
The string Data Type
The string data type is an ESQL/C data type that holds character data
that is
null terminated and does not contain trailing blanks. When an application
reads a value from a CHAR column into a host variable of data type
string, it
strips the value of any trailing blanks and appends a null terminator. The
behavior is the same if an application reads a value from a VARCHAR column
into a host variable of data type string.
Declare the string data type with a length of [n+1] (where n is the size
of the
column with values that you want read) to allow for the null terminator. Use
the following syntax to declare a host variable of the string data type:
EXEC SQL BEGIN DECLARE SECTION;
string str_name[n + 1];
EXEC SQL END DECLARE SECTION;
--------------------------------------------------
So, we added it accordingly. This means the following:
- "string" has become a type name, reserved word in ECPG.
- When ECPG encounters "string", it will be transparently replaced by
"char" in the generated C source, but ECPGt_string will be passed
to ECPGdo()
- ecpg_get_data() right-trims the string value if ECPGt_string was passed.
Two regression tests had to be modified because "string" is now
a type name: preproc/define.pgc and preproc/type.pgc.
The attached patch is built upon our previous patch supporting
dynamic cursor and SQLDA.
Best regards,
Zoltán Böszörményi
--
Bible has answers for everything. Proof:
"But let your communication be, Yea, yea; Nay, nay: for whatsoever is more
than these cometh of evil." (Matthew 5:37) - basics of digital technology.
"May your kingdom come" - superficial description of plate tectonics
----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
http://www.postgresql.at/
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/data.c
postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/data.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/data.c 2009-01-15 12:52:55.000000000 +0100
--- postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/data.c 2009-07-04 12:27:57.000000000 +0200
*************** ecpg_get_data(const PGresult *results, i
*** 138,143 ****
--- 138,144 ----
case ECPGt_char:
case ECPGt_unsigned_char:
case ECPGt_varchar:
+ case ECPGt_string:
break;
default:
*************** ecpg_get_data(const PGresult *results, i
*** 389,394 ****
--- 390,396 ----
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
if (pval)
{
if (varcharsize == 0 || varcharsize > size)
*************** ecpg_get_data(const PGresult *results, i
*** 426,431 ****
--- 428,454 ----
sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W';
}
}
+ /* Do the rtrim() */
+ if (type == ECPGt_string)
+ {
+ char *str = (char *) ((long) var + offset * act_tuple);
+ char *last;
+ int len = strlen(str);
+
+ last = str + len;
+ while (last > str)
+ {
+ if (*last == '\0')
+ last--;
+ else if (*last == ' ')
+ {
+ *last = '\0';
+ last--;
+ }
+ else
+ break;
+ }
+ }
pval += size;
}
break;
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/descriptor.c
postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/descriptor.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/descriptor.c 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/descriptor.c 2009-07-04 12:12:02.000000000 +0200
*************** get_char_item(int lineno, void *var, enu
*** 201,206 ****
--- 201,207 ----
{
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
strncpy((char *) var, value, varcharsize);
break;
case ECPGt_varchar:
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/execute.c
postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/execute.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/execute.c 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/execute.c 2009-07-04 12:12:02.000000000 +0200
*************** ecpg_store_result(const PGresult *result
*** 360,365 ****
--- 360,366 ----
{
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
if (!var->varcharsize && !var->arrsize)
{
/* special mode for handling char**foo=0 */
*************** ecpg_store_result(const PGresult *result
*** 419,425 ****
/* fill the variable with the tuple(s) */
if (!var->varcharsize && !var->arrsize &&
! (var->type == ECPGt_char || var->type == ECPGt_unsigned_char))
{
/* special mode for handling char**foo=0 */
--- 420,426 ----
/* fill the variable with the tuple(s) */
if (!var->varcharsize && !var->arrsize &&
! (var->type == ECPGt_char || var->type == ECPGt_unsigned_char || var->type == ECPGt_string))
{
/* special mode for handling char**foo=0 */
*************** ecpg_store_input(const int lineno, const
*** 758,763 ****
--- 759,765 ----
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
{
/* set slen to string length if type is char * */
int slen = (var->varcharsize == 0) ? strlen((char *) var->value) : (unsigned int)
var->varcharsize;
*************** ecpg_execute(struct statement * stmt)
*** 1196,1201 ****
--- 1198,1204 ----
{
case ECPGt_char:
case ECPGt_varchar:
+ case ECPGt_string:
desc_inlist.varcharsize = strlen(sqlda->sqlvar[i].sqldata);
break;
default:
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/misc.c
postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/misc.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/misc.c 2009-06-11 16:49:13.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/misc.c 2009-07-04 12:12:02.000000000 +0200
*************** ECPGset_noind_null(enum ECPGttype type,
*** 295,300 ****
--- 295,301 ----
{
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
*((char *) ptr) = '\0';
break;
case ECPGt_short:
*************** ECPGis_noind_null(enum ECPGttype type, v
*** 361,366 ****
--- 362,368 ----
{
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
if (*((char *) ptr) == '\0')
return true;
break;
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/typename.c
postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/typename.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/ecpglib/typename.c 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/ecpglib/typename.c 2009-07-04 12:12:02.000000000 +0200
*************** ecpg_type_name(enum ECPGttype typ)
*** 20,25 ****
--- 20,26 ----
switch (typ)
{
case ECPGt_char:
+ case ECPGt_string:
return "char";
case ECPGt_unsigned_char:
return "unsigned char";
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/include/ecpgtype.h
postgresql-8.4.0-string/src/interfaces/ecpg/include/ecpgtype.h
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/include/ecpgtype.h 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/include/ecpgtype.h 2009-07-04 12:06:05.000000000 +0200
*************** enum ECPGttype
*** 62,68 ****
ECPGt_EOIT, /* End of insert types. */
ECPGt_EORT, /* End of result types. */
ECPGt_NO_INDICATOR, /* no indicator */
! ECPGt_sqlda /* INFORMIX-compatible sqlda_t descriptor */
};
/* descriptor items */
--- 62,69 ----
ECPGt_EOIT, /* End of insert types. */
ECPGt_EORT, /* End of result types. */
ECPGt_NO_INDICATOR, /* no indicator */
! ECPGt_sqlda, /* INFORMIX-compatible sqlda_t descriptor */
! ECPGt_string /* trimmed (char *) type */
};
/* descriptor items */
*************** enum ECPGdtype
*** 87,93 ****
ECPGd_cardinality
};
! #define IS_SIMPLE_TYPE(type) ((type) >= ECPGt_char && (type) <= ECPGt_interval)
/* we also have to handle different statement types */
enum ECPG_statement_type
--- 88,94 ----
ECPGd_cardinality
};
! #define IS_SIMPLE_TYPE(type) (((type) >= ECPGt_char && (type) <= ECPGt_interval) || ((type) == ECPGt_string))
/* we also have to handle different statement types */
enum ECPG_statement_type
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/c_keywords.c
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/c_keywords.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/c_keywords.c 2009-06-11 16:49:13.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/c_keywords.c 2009-07-04 13:40:14.000000000 +0200
*************** static const ScanKeyword ScanCKeywords[]
*** 45,50 ****
--- 45,51 ----
{"short", SQL_SHORT, 0},
{"signed", SQL_SIGNED, 0},
{"static", S_STATIC, 0},
+ {"string", STRING_P, 0},
{"struct", SQL_STRUCT, 0},
{"to", TO, 0},
{"typedef", S_TYPEDEF, 0},
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.addons
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.addons
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.addons 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.addons 2009-07-04 14:26:02.000000000 +0200
*************** ECPG: ColIdcol_name_keyword rule
*** 331,336 ****
--- 331,337 ----
| ECPGKeywords { $$ = $1; }
| ECPGCKeywords { $$ = $1; }
| CHAR_P { $$ = make_str("char"); }
+ | STRING_P { $$ = make_str("char"); }
| VALUES { $$ = make_str("values"); }
ECPG: type_function_nametype_func_name_keyword rule
| ECPGKeywords { $$ = $1; }
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.header
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.header
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.header 2009-06-11 01:11:52.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.header 2009-07-04 11:49:50.000000000 +0200
*************** adjust_informix(struct arguments *list)
*** 256,267 ****
original_var = ptr->variable->name;
sprintf(temp, "%d))", ecpg_informix_var);
! if ((ptr->variable->type->type != ECPGt_varchar && ptr->variable->type->type != ECPGt_char &&
ptr->variable->type->type!= ECPGt_unsigned_char) && atoi(ptr->variable->type->size) > 1)
{
ptr->variable = new_variable(cat_str(4, make_str("("),
mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)),make_str(" *)(ECPG_informix_get_var("),
mm_strdup(temp)),ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, make_str("1"),
ptr->variable->type->u.element->lineno),ptr->variable->type->size), 0);
sprintf(temp, "%d, (", ecpg_informix_var++);
}
! else if ((ptr->variable->type->type == ECPGt_varchar || ptr->variable->type->type == ECPGt_char ||
ptr->variable->type->type== ECPGt_unsigned_char) && atoi(ptr->variable->type->size) > 1)
{
ptr->variable = new_variable(cat_str(4, make_str("("),
mm_strdup(ecpg_type_name(ptr->variable->type->type)),make_str(" *)(ECPG_informix_get_var("), mm_strdup(temp)),
ECPGmake_simple_type(ptr->variable->type->type,ptr->variable->type->size, ptr->variable->type->lineno), 0);
sprintf(temp, "%d, (", ecpg_informix_var++);
--- 256,267 ----
original_var = ptr->variable->name;
sprintf(temp, "%d))", ecpg_informix_var);
! if ((ptr->variable->type->type != ECPGt_varchar && ptr->variable->type->type != ECPGt_char &&
ptr->variable->type->type!= ECPGt_unsigned_char && ptr->variable->type->type != ECPGt_string) &&
atoi(ptr->variable->type->size)> 1)
{
ptr->variable = new_variable(cat_str(4, make_str("("),
mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)),make_str(" *)(ECPG_informix_get_var("),
mm_strdup(temp)),ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, make_str("1"),
ptr->variable->type->u.element->lineno),ptr->variable->type->size), 0);
sprintf(temp, "%d, (", ecpg_informix_var++);
}
! else if ((ptr->variable->type->type == ECPGt_varchar || ptr->variable->type->type == ECPGt_char ||
ptr->variable->type->type== ECPGt_unsigned_char || ptr->variable->type->type != ECPGt_string) &&
atoi(ptr->variable->type->size)> 1)
{
ptr->variable = new_variable(cat_str(4, make_str("("),
mm_strdup(ecpg_type_name(ptr->variable->type->type)),make_str(" *)(ECPG_informix_get_var("), mm_strdup(temp)),
ECPGmake_simple_type(ptr->variable->type->type,ptr->variable->type->size, ptr->variable->type->lineno), 0);
sprintf(temp, "%d, (", ecpg_informix_var++);
*************** add_typedef(char *name, char * dimension
*** 371,376 ****
--- 371,377 ----
if (type_enum != ECPGt_varchar &&
type_enum != ECPGt_char &&
type_enum != ECPGt_unsigned_char &&
+ type_enum != ECPGt_string &&
atoi(this->type->type_index) >= 0)
mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.tokens
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.tokens
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.tokens 2008-11-14 11:03:33.000000000 +0100
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.tokens 2009-07-04 10:59:43.000000000 +0200
***************
*** 25,28 ****
%token TYPECAST
%token CSTRING CVARIABLE CPP_LINE IP
%token DOLCONST ECONST NCONST UCONST UIDENT
!
--- 25,28 ----
%token TYPECAST
%token CSTRING CVARIABLE CPP_LINE IP
%token DOLCONST ECONST NCONST UCONST UIDENT
! %token STRING_P
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.trailer
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.trailer
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/ecpg.trailer 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/ecpg.trailer 2009-07-04 11:51:06.000000000 +0200
*************** char_variable: cvariable
*** 213,218 ****
--- 213,219 ----
{
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
$$ = $1;
break;
case ECPGt_varchar:
*************** signed_type: SQL_SHORT { $$ = ECPGt_s
*** 795,800 ****
--- 796,802 ----
}
| SQL_BOOL { $$ = ECPGt_bool; }
| CHAR_P { $$ = ECPGt_char; }
+ | STRING_P { $$ = ECPGt_string; }
| DOUBLE_P { $$ = ECPGt_double; }
;
*************** variable: opt_pointer ECPGColLabel opt_a
*** 855,860 ****
--- 857,863 ----
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
if (atoi(dimension) == -1)
{
int i = strlen($5);
*************** ECPGVar: SQL_VAR
*** 1331,1336 ****
--- 1334,1340 ----
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
if (atoi(dimension) == -1)
type = ECPGmake_simple_type($5.type_enum, length, 0);
else
*************** c_anything: ecpg_ident { $$ = $1; }
*** 2017,2022 ****
--- 2021,2027 ----
| SQL_UNSIGNED { $$ = make_str("unsigned"); }
| YEAR_P { $$ = make_str("year"); }
| CHAR_P { $$ = make_str("char"); }
+ | STRING_P { $$ = make_str("char"); }
| FLOAT_P { $$ = make_str("float"); }
| TO { $$ = make_str("to"); }
| UNION { $$ = make_str("union"); }
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/type.c
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/type.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/type.c 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/type.c 2009-07-04 14:12:07.000000000 +0200
*************** get_type(enum ECPGttype type)
*** 200,205 ****
--- 200,208 ----
case ECPGt_timestamp:
return ("ECPGt_timestamp");
break;
+ case ECPGt_string:
+ return ("ECPGt_string");
+ break;
default:
mmerror(PARSE_ERROR, ET_ERROR, "unrecognized variable type code %d", type);
}
*************** ECPGdump_a_simple(FILE *o, const char *n
*** 368,373 ****
--- 371,377 ----
case ECPGt_char:
case ECPGt_unsigned_char:
case ECPGt_char_variable:
+ case ECPGt_string:
/*
* we have to use the pointer except for arrays with given
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/variable.c
postgresql-8.4.0-string/src/interfaces/ecpg/preproc/variable.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/preproc/variable.c 2009-07-04 10:42:50.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/preproc/variable.c 2009-07-04 11:45:25.000000000 +0200
*************** adjust_array(enum ECPGttype type_enum, c
*** 524,530 ****
"multilevel pointers (more than 2 levels) are not supported; found %d
levels",pointer_len),
pointer_len);
! if (pointer_len > 1 && type_enum != ECPGt_char && type_enum != ECPGt_unsigned_char)
mmerror(PARSE_ERROR, ET_FATAL, "pointer to pointer is not supported for this data type");
if (pointer_len > 1 && (atoi(*length) >= 0 || atoi(*dimension) >= 0))
--- 524,530 ----
"multilevel pointers (more than 2 levels) are not supported; found %d
levels",pointer_len),
pointer_len);
! if (pointer_len > 1 && type_enum != ECPGt_char && type_enum != ECPGt_unsigned_char && type_enum != ECPGt_string)
mmerror(PARSE_ERROR, ET_FATAL, "pointer to pointer is not supported for this data type");
if (pointer_len > 1 && (atoi(*length) >= 0 || atoi(*dimension) >= 0))
*************** adjust_array(enum ECPGttype type_enum, c
*** 563,568 ****
--- 563,569 ----
break;
case ECPGt_char:
case ECPGt_unsigned_char:
+ case ECPGt_string:
/* char ** */
if (pointer_len == 2)
{
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-define.c
postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-define.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-define.c 2008-12-29 18:07:06.000000000 +0100
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-define.c 2009-07-04 14:41:02.000000000 +0200
*************** main(void)
*** 40,46 ****
{
/* exec sql begin declare section */
! typedef char string [ 8 ];
#line 21 "define.pgc"
--- 40,46 ----
{
/* exec sql begin declare section */
! typedef char str [ 8 ];
#line 21 "define.pgc"
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.c
postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.c
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.c 2008-12-29 18:07:06.000000000 +0100
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.c 2009-07-04 14:42:08.000000000 +0200
*************** typedef short mmSmallInt ;
*** 40,52 ****
#line 8 "type.pgc"
- /* exec sql type string is char [ 11 ] */
- #line 10 "type.pgc"
-
- typedef char string[11];
-
/* exec sql type c is char reference */
! #line 13 "type.pgc"
typedef char* c;
--- 40,47 ----
#line 8 "type.pgc"
/* exec sql type c is char reference */
! #line 10 "type.pgc"
typedef char* c;
*************** typedef char* c;
*** 58,73 ****
struct TBempl {
! #line 19 "type.pgc"
mmInteger idnum ;
! #line 20 "type.pgc"
mmChar name [ 21 ] ;
! #line 21 "type.pgc"
mmSmallInt accs ;
} ;/* exec sql end declare section */
! #line 23 "type.pgc"
int
--- 53,68 ----
struct TBempl {
! #line 16 "type.pgc"
mmInteger idnum ;
! #line 17 "type.pgc"
mmChar name [ 21 ] ;
! #line 18 "type.pgc"
mmSmallInt accs ;
} ;/* exec sql end declare section */
! #line 20 "type.pgc"
int
*************** main (void)
*** 83,117 ****
! #line 29 "type.pgc"
struct TBempl empl ;
! #line 30 "type.pgc"
! string str ;
! #line 31 "type.pgc"
c ptr = NULL ;
! #line 36 "type.pgc"
struct varchar_vc {
! #line 34 "type.pgc"
int len ;
! #line 35 "type.pgc"
char text [ 10 ] ;
} vc ;
/* exec sql end declare section */
! #line 37 "type.pgc"
/* exec sql var vc is [ 10 ] */
! #line 39 "type.pgc"
ECPGdebug (1, stderr);
empl.idnum = 1;
{ ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0); }
! #line 43 "type.pgc"
if (sqlca.sqlcode)
{
--- 78,112 ----
! #line 26 "type.pgc"
struct TBempl empl ;
! #line 27 "type.pgc"
! char str [ 11 ] ;
! #line 28 "type.pgc"
c ptr = NULL ;
! #line 33 "type.pgc"
struct varchar_vc {
! #line 31 "type.pgc"
int len ;
! #line 32 "type.pgc"
char text [ 10 ] ;
} vc ;
/* exec sql end declare section */
! #line 34 "type.pgc"
/* exec sql var vc is [ 10 ] */
! #line 36 "type.pgc"
ECPGdebug (1, stderr);
empl.idnum = 1;
{ ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0); }
! #line 40 "type.pgc"
if (sqlca.sqlcode)
{
*************** main (void)
*** 120,126 ****
}
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table empl ( idnum integer , name char ( 20 ) , accs
smallint, string1 char ( 10 ) , string2 char ( 10 ) , string3 char ( 10 ) )", ECPGt_EOIT, ECPGt_EORT);}
! #line 51 "type.pgc"
if (sqlca.sqlcode)
{
--- 115,121 ----
}
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table empl ( idnum integer , name char ( 20 ) , accs
smallint, string1 char ( 10 ) , string2 char ( 10 ) , string3 char ( 10 ) )", ECPGt_EOIT, ECPGt_EORT);}
! #line 48 "type.pgc"
if (sqlca.sqlcode)
{
*************** main (void)
*** 129,135 ****
}
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into empl values ( 1 , 'user name' , 320 , 'first str' ,
'secondstr' , 'third str' )", ECPGt_EOIT, ECPGt_EORT);}
! #line 58 "type.pgc"
if (sqlca.sqlcode)
{
--- 124,130 ----
}
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into empl values ( 1 , 'user name' , 320 , 'first str' ,
'secondstr' , 'third str' )", ECPGt_EOIT, ECPGt_EORT);}
! #line 55 "type.pgc"
if (sqlca.sqlcode)
{
*************** main (void)
*** 146,158 ****
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
! ECPGt_char,(str),(long)11,(long)1,(11)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(ptr),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(vc),(long)10,(long)1,sizeof(struct varchar_vc),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
! #line 68 "type.pgc"
if (sqlca.sqlcode)
{
--- 141,153 ----
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
! ECPGt_string,&(str),(long)11,(long)1,sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(ptr),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(vc),(long)10,(long)1,sizeof(struct varchar_vc),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
! #line 65 "type.pgc"
if (sqlca.sqlcode)
{
*************** main (void)
*** 162,168 ****
printf ("id=%ld name='%s' accs=%d str='%s' ptr='%s' vc='%10.10s'\n", empl.idnum, empl.name, empl.accs, str, ptr,
vc.text);
{ ECPGdisconnect(__LINE__, "CURRENT");}
! #line 76 "type.pgc"
free(ptr);
--- 157,163 ----
printf ("id=%ld name='%s' accs=%d str='%s' ptr='%s' vc='%10.10s'\n", empl.idnum, empl.name, empl.accs, str, ptr,
vc.text);
{ ECPGdisconnect(__LINE__, "CURRENT");}
! #line 73 "type.pgc"
free(ptr);
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.stderr
postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.stderr
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.stderr 2008-12-29 18:07:06.000000000 +0100
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.stderr 2009-07-04 14:42:09.000000000
+0200
***************
*** 2,40 ****
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 50: query: create table empl ( idnum integer , name char ( 20 ) , accs smallint ,
string1char ( 10 ) , string2 char ( 10 ) , string3 char ( 10 ) ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 50: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 50: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 58: query: insert into empl values ( 1 , 'user name' , 320 , 'first str' , 'second
str', 'third str' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 58: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 58: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 65: query: select idnum , name , accs , string1 , string2 , string3 from empl where
idnum= $1 ; with 1 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 65: using PQexecParams
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: free_params on line 65: parameter 1 = 1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 65: correctly got 1 tuples with 6 fields
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: 1 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: user name offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: 320 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: first str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_store_result on line 65: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: second str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 65: RESULT: third str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000
--- 2,40 ----
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 47: query: create table empl ( idnum integer , name char ( 20 ) , accs smallint ,
string1char ( 10 ) , string2 char ( 10 ) , string3 char ( 10 ) ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 47: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 47: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 55: query: insert into empl values ( 1 , 'user name' , 320 , 'first str' , 'second
str', 'third str' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 55: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 55: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 62: query: select idnum , name , accs , string1 , string2 , string3 from empl where
idnum= $1 ; with 1 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 62: using PQexecParams
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: free_params on line 62: parameter 1 = 1
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_execute on line 62: correctly got 1 tuples with 6 fields
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: 1 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: user name offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: 320 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: first str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_store_result on line 62: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: second str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
! [NO_PID]: ecpg_get_data on line 62: RESULT: third str offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.stdout
postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.stdout
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/expected/preproc-type.stdout 2006-09-08 11:03:40.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/expected/preproc-type.stdout 2009-07-04 14:42:10.000000000
+0200
***************
*** 1 ****
! id=1 name='user name ' accs=320 str='first str ' ptr='second str' vc='third str '
--- 1 ----
! id=1 name='user name ' accs=320 str='first str' ptr='second str' vc='third str '
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/preproc/define.pgc
postgresql-8.4.0-string/src/interfaces/ecpg/test/preproc/define.pgc
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/preproc/define.pgc 2006-09-08 11:03:40.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/preproc/define.pgc 2009-07-04 14:03:18.000000000 +0200
*************** main(void)
*** 18,24 ****
{
exec sql begin declare section;
exec sql ifdef NAMELEN;
! typedef char string[NAMELEN];
intarray amount;
char name[AMOUNT][NAMELEN];
char letter[AMOUNT][1];
--- 18,24 ----
{
exec sql begin declare section;
exec sql ifdef NAMELEN;
! typedef char str[NAMELEN];
intarray amount;
char name[AMOUNT][NAMELEN];
char letter[AMOUNT][1];
diff -dcrpN postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/preproc/type.pgc
postgresql-8.4.0-string/src/interfaces/ecpg/test/preproc/type.pgc
*** postgresql-8.4.0-sqlda/src/interfaces/ecpg/test/preproc/type.pgc 2006-09-08 15:32:29.000000000 +0200
--- postgresql-8.4.0-string/src/interfaces/ecpg/test/preproc/type.pgc 2009-07-04 14:04:29.000000000 +0200
*************** EXEC SQL typedef long mmInteger;
*** 7,15 ****
EXEC SQL typedef char mmChar;
EXEC SQL typedef short mmSmallInt;
- exec sql type string is char[11];
- typedef char string[11];
-
exec sql type c is char reference;
typedef char* c;
--- 7,12 ----
*************** main (void)
*** 27,33 ****
{
EXEC SQL BEGIN DECLARE SECTION;
struct TBempl empl;
! string str;
c ptr = NULL;
struct varchar_vc
{
--- 24,30 ----
{
EXEC SQL BEGIN DECLARE SECTION;
struct TBempl empl;
! string str[11];
c ptr = NULL;
struct varchar_vc
{