Re: [BUG] Storage declaration in ECPG
05.09.2022, 11:12, "Kyotaro Horiguchi" : About the test, don't we need the test for non-varchar/bytea staticvariables like "static int inta, intb, intc;"?Good idea, thanks. I have added tests for static int and bytea. The new patch is in the attachment and here https://github.com/andr-sokolov/postgresql/commit/5a4adc1b5a2a0adfc152debcaf825e7a95a47450From 5a4adc1b5a2a0adfc152debcaf825e7a95a47450 Mon Sep 17 00:00:00 2001 From: Andrey Sokolov Date: Sun, 4 Sep 2022 12:48:22 +0300 Subject: [PATCH v2] Fix storage declaration in ECPG The ECPG preprocessor converted the code "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 ;". Storage declaration applied only to the first structure. Now storage declaration is repeated before each structure. --- src/interfaces/ecpg/preproc/ecpg.trailer | 4 +- src/interfaces/ecpg/preproc/type.h| 1 + src/interfaces/ecpg/test/ecpg_schedule| 1 + .../test/expected/preproc-static_variables.c | 215 ++ .../expected/preproc-static_variables.stderr | 150 .../expected/preproc-static_variables.stdout | 12 + src/interfaces/ecpg/test/preproc/.gitignore | 2 + src/interfaces/ecpg/test/preproc/Makefile | 1 + .../ecpg/test/preproc/static_variables.pgc| 118 ++ 9 files changed, 503 insertions(+), 1 deletion(-) create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.c create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stderr create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stdout create mode 100644 src/interfaces/ecpg/test/preproc/static_variables.pgc diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 0b100b9b04..54254e2f97 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -479,6 +479,7 @@ type_declaration: S_TYPEDEF 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); } diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h index fb20be53e0..08b739e5f3 100644 --- a/src/interfaces/ecpg/preproc/type.h +++ b/src/interfaces/ecpg/preproc/type.h @@ -114,6 +114,7 @@ struct exec struct this_type { + char *type_storage; enum ECPGttype type_enum; char *type_str; char *type_dimension; diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule index e034c5a420..d594c4d9b0 100644 --- a/src/interfaces/ecpg/test/ecpg_schedule +++ b/src/interfaces/ecpg/test/ecpg_schedule @@ -24,6 +24,7 @@ test: preproc/comment test: preproc/cursor test: preproc/define test: preproc/init +test: preproc/static_variables test: preproc/strings test: preproc/type test: preproc/variable diff --git a/src/interfaces/ecpg/test/expected/preproc-static_variables.c b/src/interfaces/ecpg/test/expected/preproc-static_variables.c new file mode 100644 index 00..5a6bcee666 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.c @@ -0,0 +1,215 @@ +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + +#line 1 "static_variables.pgc" +#include + + +#line 1 "regression.h" + + + + + + +#line 3 "static_variables.pgc" + + +/* exec sql whenever sqlerror stop ; */ +#line 5 "static_variables.pgc" + + +/* declare cur cursor for select firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 from persons */ +#line 11 "static_variables.pgc" + + +/* exec sql begin declare section */ + + + + + +#line
[BUG] Storage declaration in ECPG
Hi, The ECPG preprocessor converts the code"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 ;".Storage declaration applies only to the first structure. The patch in the attachment fixes the bug. Storage declaration will be repeated before each structure.The patch is on github too: https://github.com/andr-sokolov/postgresql/commit/c8f8fc7a211938569e7d46c91a428d8cb25b6f9c --Andrey SokolovArenadata https://arenadata.tech/From c8f8fc7a211938569e7d46c91a428d8cb25b6f9c Mon Sep 17 00:00:00 2001 From: Andrey Sokolov Date: Sun, 4 Sep 2022 12:48:22 +0300 Subject: [PATCH] Fix storage declaration in ECPG The ECPG preprocessor converted the code "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 ;". Storage declaration applied only to the first structure. Now storage declaration is repeated before each structure. --- src/interfaces/ecpg/preproc/ecpg.trailer | 4 +- src/interfaces/ecpg/preproc/type.h| 1 + src/interfaces/ecpg/test/ecpg_schedule| 1 + .../test/expected/preproc-static_variables.c | 145 ++ .../expected/preproc-static_variables.stderr | 96 .../expected/preproc-static_variables.stdout | 3 + src/interfaces/ecpg/test/preproc/.gitignore | 2 + src/interfaces/ecpg/test/preproc/Makefile | 1 + .../ecpg/test/preproc/static_variables.pgc| 55 +++ 9 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.c create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stderr create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stdout create mode 100644 src/interfaces/ecpg/test/preproc/static_variables.pgc diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 0b100b9b04..54254e2f97 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -479,6 +479,7 @@ type_declaration: S_TYPEDEF 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); } diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h index fb20be53e0..08b739e5f3 100644 --- a/src/interfaces/ecpg/preproc/type.h +++ b/src/interfaces/ecpg/preproc/type.h @@ -114,6 +114,7 @@ struct exec struct this_type { + char *type_storage; enum ECPGttype type_enum; char *type_str; char *type_dimension; diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule index e034c5a420..d594c4d9b0 100644 --- a/src/interfaces/ecpg/test/ecpg_schedule +++ b/src/interfaces/ecpg/test/ecpg_schedule @@ -24,6 +24,7 @@ test: preproc/comment test: preproc/cursor test: preproc/define test: preproc/init +test: preproc/static_variables test: preproc/strings test: preproc/type test: preproc/variable diff --git a/src/interfaces/ecpg/test/expected/preproc-static_variables.c b/src/interfaces/ecpg/test/expected/preproc-static_variables.c new file mode 100644 index 00..b0f62a8b14 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.c @@ -0,0 +1,145 @@ +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + +#line 1 "static_variables.pgc" +#include + + +#line 1 "regression.h" + + + + + + +#line 3 "static_variables.pgc" + + +/* exec sql whenever sqlerror stop ; */ +#line 5 "static_variables.pgc" + + +/* declare cur cur