Fix possible omission of variable storage markers in ECPG.

The ECPG preprocessor converted code such as

static varchar str1[10], str2[20], str3[30];

into

static  struct varchar_1  { int len; char arr[ 10 ]; }  str1 ;
        struct varchar_2  { int len; char arr[ 20 ]; }  str2 ;
        struct varchar_3  { int len; char arr[ 30 ]; }  str3 ;

thus losing the storage attribute for the later variables.
Repeat the declaration for each such variable.

(Note that this occurred only for variables declared "varchar"
or "bytea", which may help explain how it escaped detection
for so long.)

Andrey Sokolov

Discussion: https://postgr.es/m/942241662288242@mail.yandex.ru
This commit is contained in:
Tom Lane 2022-09-09 15:34:04 -04:00
parent a61095aa79
commit a6618842fa
6 changed files with 151 additions and 123 deletions

View File

@ -425,9 +425,10 @@ type_declaration: S_TYPEDEF
$$ = mm_strdup("");
};
var_declaration: storage_declaration
var_type
var_declaration:
storage_declaration var_type
{
actual_type[struct_level].type_storage = $1;
actual_type[struct_level].type_enum = $2.type_enum;
actual_type[struct_level].type_str = $2.type_str;
actual_type[struct_level].type_dimension = $2.type_dimension;
@ -442,6 +443,7 @@ var_declaration: storage_declaration
}
| var_type
{
actual_type[struct_level].type_storage = EMPTY;
actual_type[struct_level].type_enum = $1.type_enum;
actual_type[struct_level].type_str = $1.type_str;
actual_type[struct_level].type_dimension = $1.type_dimension;
@ -822,7 +824,7 @@ variable_list: variable
| variable_list ',' variable
{
if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
$$ = cat_str(3, $1, mm_strdup(";"), $3);
$$ = cat_str(4, $1, mm_strdup(";"), mm_strdup(actual_type[struct_level].type_storage), $3);
else
$$ = cat_str(3, $1, mm_strdup(","), $3);
}

View File

@ -114,6 +114,7 @@ struct exec
struct this_type
{
char *type_storage;
enum ECPGttype type_enum;
char *type_str;
char *type_dimension;

View File

@ -71,6 +71,8 @@ main (void)
#line 27 "variable.pgc"
struct personal_struct {
@ -98,27 +100,33 @@ main (void)
} ; struct t2 {
#line 32 "variable.pgc"
struct varchar_3 { int len; char arr[ BUFFERSIZ ]; } name ;
} ;/* exec sql end declare section */
} ;
#line 33 "variable.pgc"
static struct varchar_4 { int len; char arr[ 50 ]; } vc1 ; static struct varchar_5 { int len; char arr[ 50 ]; } vc2 ; static struct varchar_6 { int len; char arr[ 255 ]; } vc3 ;
#line 34 "variable.pgc"
static int i1 , i2 , i3 ;
/* exec sql end declare section */
#line 35 "variable.pgc"
#line 35 "variable.pgc"
#line 37 "variable.pgc"
char * married = NULL ;
#line 35 "variable.pgc"
#line 37 "variable.pgc"
#line 36 "variable.pgc"
#line 38 "variable.pgc"
long ind_married ;
#line 36 "variable.pgc"
#line 38 "variable.pgc"
#line 37 "variable.pgc"
#line 39 "variable.pgc"
ind children ;
#line 37 "variable.pgc"
#line 39 "variable.pgc"
int loopcount;
char msg[128];
@ -127,78 +135,78 @@ main (void)
strcpy(msg, "connect");
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0);
#line 44 "variable.pgc"
#line 46 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 44 "variable.pgc"
#line 46 "variable.pgc"
strcpy(msg, "set");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT);
#line 47 "variable.pgc"
#line 49 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 47 "variable.pgc"
#line 49 "variable.pgc"
strcpy(msg, "create");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table family ( name char ( 8 ) , born integer , age smallint , married date , children integer )", ECPGt_EOIT, ECPGt_EORT);
#line 50 "variable.pgc"
#line 52 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 50 "variable.pgc"
#line 52 "variable.pgc"
strcpy(msg, "insert");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into family ( name , married , children ) values ( 'Mum' , '19870714' , 3 )", ECPGt_EOIT, ECPGt_EORT);
#line 53 "variable.pgc"
#line 55 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 53 "variable.pgc"
#line 55 "variable.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into family ( name , born , married , children ) values ( 'Dad' , '19610721' , '19870714' , 3 )", ECPGt_EOIT, ECPGt_EORT);
#line 54 "variable.pgc"
#line 56 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 54 "variable.pgc"
#line 56 "variable.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into family ( name , age ) values ( 'Child 1' , 16 )", ECPGt_EOIT, ECPGt_EORT);
#line 55 "variable.pgc"
#line 57 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 55 "variable.pgc"
#line 57 "variable.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into family ( name , age ) values ( 'Child 2' , 14 )", ECPGt_EOIT, ECPGt_EORT);
#line 56 "variable.pgc"
#line 58 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 56 "variable.pgc"
#line 58 "variable.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into family ( name , age ) values ( 'Child 3' , 9 )", ECPGt_EOIT, ECPGt_EORT);
#line 57 "variable.pgc"
#line 59 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 57 "variable.pgc"
#line 59 "variable.pgc"
strcpy(msg, "commit");
{ ECPGtrans(__LINE__, NULL, "commit");
#line 60 "variable.pgc"
#line 62 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 60 "variable.pgc"
#line 62 "variable.pgc"
strcpy(msg, "open");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
#line 65 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 63 "variable.pgc"
#line 65 "variable.pgc"
/* exec sql whenever not found break ; */
#line 65 "variable.pgc"
#line 67 "variable.pgc"
p=&personal;
@ -217,13 +225,13 @@ if (sqlca.sqlcode < 0) exit (1);}
ECPGt_long,&(ind_married),(long)1,(long)1,sizeof(long),
ECPGt_int,&(children.integer),(long)1,(long)1,sizeof(int),
ECPGt_short,&(ind_children.smallint),(long)1,(long)1,sizeof(short), ECPGt_EORT);
#line 72 "variable.pgc"
#line 74 "variable.pgc"
if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
#line 72 "variable.pgc"
#line 74 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 72 "variable.pgc"
#line 74 "variable.pgc"
printf("%8.8s", personal.name.arr);
if (i->ind_birth.born >= 0)
@ -242,35 +250,42 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
#line 91 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 89 "variable.pgc"
#line 91 "variable.pgc"
strcpy(msg, "drop");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table family", ECPGt_EOIT, ECPGt_EORT);
#line 92 "variable.pgc"
#line 94 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 92 "variable.pgc"
#line 94 "variable.pgc"
strcpy(msg, "commit");
{ ECPGtrans(__LINE__, NULL, "commit");
#line 95 "variable.pgc"
#line 97 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 95 "variable.pgc"
#line 97 "variable.pgc"
strcpy(msg, "disconnect");
{ ECPGdisconnect(__LINE__, "CURRENT");
#line 98 "variable.pgc"
#line 100 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 98 "variable.pgc"
#line 100 "variable.pgc"
/* this just to silence unused-variable warnings: */
vc1.len = vc2.len = vc3.len = 0;
i1 = i2 = i3 = 0;
printf("%d %d %d %d %d %d\n",
vc1.len, vc2.len, vc3.len,
i1, i2, i3);
return 0;
}

View File

@ -2,167 +2,167 @@
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 47: query: set datestyle to iso; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 49: query: set datestyle to iso; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 47: using PQexec
[NO_PID]: ecpg_execute on line 49: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 47: OK: SET
[NO_PID]: ecpg_process_output on line 49: OK: SET
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 50: query: create table family ( name char ( 8 ) , born integer , age smallint , married date , children integer ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 52: query: create table family ( name char ( 8 ) , born integer , age smallint , married date , children integer ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 50: using PQexec
[NO_PID]: ecpg_execute on line 52: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 50: OK: CREATE TABLE
[NO_PID]: ecpg_process_output on line 52: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 53: query: insert into family ( name , married , children ) values ( 'Mum' , '19870714' , 3 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 53: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 53: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 54: query: insert into family ( name , born , married , children ) values ( 'Dad' , '19610721' , '19870714' , 3 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 54: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 54: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 55: query: insert into family ( name , age ) values ( 'Child 1' , 16 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 55: query: insert into family ( name , married , children ) values ( 'Mum' , '19870714' , 3 ); with 0 parameter(s) on connection ecpg1_regression
[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_process_output on line 55: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 56: query: insert into family ( name , age ) values ( 'Child 2' , 14 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 56: query: insert into family ( name , born , married , children ) values ( 'Dad' , '19610721' , '19870714' , 3 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 56: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 56: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 57: query: insert into family ( name , age ) values ( 'Child 3' , 9 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 57: query: insert into family ( name , age ) values ( 'Child 1' , 16 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 57: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 57: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 60: action "commit"; connection "ecpg1_regression"
[NO_PID]: ecpg_execute on line 58: query: insert into family ( name , age ) values ( 'Child 2' , 14 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 63: query: declare cur cursor for select name , born , age , married , children from family; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 58: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 63: using PQexec
[NO_PID]: ecpg_process_output on line 58: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 63: OK: DECLARE CURSOR
[NO_PID]: ecpg_execute on line 59: query: insert into family ( name , age ) values ( 'Child 3' , 9 ); with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 59: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_process_output on line 59: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 5 fields
[NO_PID]: ECPGtrans on line 62: action "commit"; connection "ecpg1_regression"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: Mum offset: -1; array: no
[NO_PID]: ecpg_execute on line 65: query: declare cur cursor for select name , born , age , married , children from family; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_execute on line 65: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_process_output on line 65: OK: DECLARE CURSOR
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_store_result on line 72: allocating memory for 1 tuples
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 1987-07-14 offset: -1; array: no
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 3 offset: -1; array: no
[NO_PID]: ecpg_process_output on line 74: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_get_data on line 74: RESULT: Mum offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 5 fields
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: Dad offset: -1; array: no
[NO_PID]: ecpg_store_result on line 74: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 19610721 offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: 1987-07-14 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: 3 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_store_result on line 72: allocating memory for 1 tuples
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 1987-07-14 offset: -1; array: no
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 3 offset: -1; array: no
[NO_PID]: ecpg_process_output on line 74: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_get_data on line 74: RESULT: Dad offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_get_data on line 74: RESULT: 19610721 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 5 fields
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: Child 1 offset: -1; array: no
[NO_PID]: ecpg_store_result on line 74: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: 1987-07-14 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 16 offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: 3 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_store_result on line 72: allocating memory for 1 tuples
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_process_output on line 74: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_get_data on line 74: RESULT: Child 1 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 5 fields
[NO_PID]: ecpg_get_data on line 74: RESULT: 16 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: Child 2 offset: -1; array: no
[NO_PID]: ecpg_store_result on line 74: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 14 offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_store_result on line 72: allocating memory for 1 tuples
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_process_output on line 74: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_get_data on line 74: RESULT: Child 2 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 5 fields
[NO_PID]: ecpg_get_data on line 74: RESULT: 14 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: Child 3 offset: -1; array: no
[NO_PID]: ecpg_store_result on line 74: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: 9 offset: -1; array: no
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_store_result on line 72: allocating memory for 1 tuples
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 72: RESULT: offset: -1; array: no
[NO_PID]: ecpg_process_output on line 74: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_get_data on line 74: RESULT: Child 3 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 72: using PQexec
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 72: correctly got 0 tuples with 5 fields
[NO_PID]: ecpg_get_data on line 74: RESULT: 9 offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: raising sqlcode 100 on line 72: no data found on line 72
[NO_PID]: ecpg_store_result on line 74: allocating memory for 1 tuples
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 74: RESULT: offset: -1; array: no
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 74: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 74: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 74: correctly got 0 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: raising sqlcode 100 on line 74: no data found on line 74
[NO_PID]: sqlca: code: 100, state: 02000
[NO_PID]: ecpg_execute on line 89: query: close cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 91: query: close cur; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 89: using PQexec
[NO_PID]: ecpg_execute on line 91: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 89: OK: CLOSE CURSOR
[NO_PID]: ecpg_process_output on line 91: OK: CLOSE CURSOR
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 92: query: drop table family; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: ecpg_execute on line 94: query: drop table family; with 0 parameter(s) on connection ecpg1_regression
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 92: using PQexec
[NO_PID]: ecpg_execute on line 94: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_process_output on line 92: OK: DROP TABLE
[NO_PID]: ecpg_process_output on line 94: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 95: action "commit"; connection "ecpg1_regression"
[NO_PID]: ECPGtrans on line 97: action "commit"; connection "ecpg1_regression"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection ecpg1_regression closed
[NO_PID]: sqlca: code: 0, state: 00000

View File

@ -3,3 +3,4 @@ Dad , born 19610721, married 1987-07-14, children = 3
Child 1 , age = 16
Child 2 , age = 14
Child 3 , age = 9
0 0 0 0 0 0

View File

@ -30,6 +30,8 @@ exec sql begin declare section;
} ind_personal, *i;
ind ind_children;
struct t1 { str name; }; struct t2 { str name; };
static varchar vc1[50], vc2[50], vc3[255];
static int i1, i2, i3;
exec sql end declare section;
exec sql char *married = NULL;
@ -97,5 +99,12 @@ exec sql end declare section;
strcpy(msg, "disconnect");
exec sql disconnect;
/* this just to silence unused-variable warnings: */
vc1.len = vc2.len = vc3.len = 0;
i1 = i2 = i3 = 0;
printf("%d %d %d %d %d %d\n",
vc1.len, vc2.len, vc3.len,
i1, i2, i3);
return 0;
}