Fix possible omission of variable storage markers in ECPG.
authorTom Lane <[email protected]>
Fri, 9 Sep 2022 19:34:04 +0000 (15:34 -0400)
committerTom Lane <[email protected]>
Fri, 9 Sep 2022 19:34:04 +0000 (15:34 -0400)
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

src/interfaces/ecpg/preproc/ecpg.trailer
src/interfaces/ecpg/preproc/type.h
src/interfaces/ecpg/test/expected/preproc-variable.c
src/interfaces/ecpg/test/expected/preproc-variable.stderr
src/interfaces/ecpg/test/expected/preproc-variable.stdout
src/interfaces/ecpg/test/preproc/variable.pgc

index 0b100b9b0437031419cc31c5b562ecff67ac54fa..435c139ec2658421e380782c1a057e6db2f9e04f 100644 (file)
@@ -476,9 +476,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;
@@ -493,6 +494,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;
@@ -949,7 +951,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);
        }
index fb20be53e0b2f12882083339e0df311f4c6fefda..08b739e5f35abd7caf25c62f4baca67393656f6c 100644 (file)
@@ -114,6 +114,7 @@ struct exec
 
 struct this_type
 {
+   char       *type_storage;
    enum ECPGttype type_enum;
    char       *type_str;
    char       *type_dimension;
index 3954f837690990841d20bbc0440caf8f744e99ea..cce377021be6496975432e0b8bb59a30918be0eb 100644 (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;
 }
index 08cdcc695f082669f7ada82a45e9a33ed06e8bc8..0fb5b0322186d8aa8c8c3e1aafdbe4be78e7aa61 100644 (file)
 [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 58: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 58: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[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 59: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 59: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 62: action "commit"; 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 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_execute on line 63: using PQexec
+[NO_PID]: ecpg_execute on line 65: using PQexec
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_process_output on line 63: OK: DECLARE CURSOR
+[NO_PID]: ecpg_process_output on line 65: OK: DECLARE CURSOR
 [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 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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_process_output on line 74: correctly got 1 tuples with 5 fields
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_get_data on line 72: RESULT: Mum      offset: -1; array: no
+[NO_PID]: ecpg_get_data on line 74: RESULT: Mum      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:  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:  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_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: 1987-07-14 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: 3 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_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_process_output on line 74: correctly got 1 tuples with 5 fields
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_get_data on line 72: RESULT: Dad      offset: -1; array: no
+[NO_PID]: ecpg_get_data on line 74: RESULT: Dad      offset: -1; array: no
 [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: 19610721 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:  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_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: 1987-07-14 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: 3 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_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_process_output on line 74: correctly got 1 tuples with 5 fields
 [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_get_data on line 74: RESULT: Child 1  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:  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: 16 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_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:  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_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_process_output on line 74: correctly got 1 tuples with 5 fields
 [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_get_data on line 74: RESULT: Child 2  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:  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: 14 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_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:  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_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_process_output on line 74: correctly got 1 tuples with 5 fields
 [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_get_data on line 74: RESULT: Child 3  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:  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: 9 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_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:  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_execute on line 72: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[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 72: using PQexec
+[NO_PID]: ecpg_execute on line 74: using PQexec
 [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_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 72: no data found on line 72
+[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
index f4ee9c3b15cc97e2359db144771595077d8972d3..89e841fe663ce5d7e0d08d31b9969fbc1a040a53 100644 (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
index 423a01c16e23256f0ac5c7d2e5614ac0d5542eab..032c2fe57b8561c4e78bd43e512a279f93245573 100644 (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;
 }