From: Michael Meskes Date: Mon, 6 Dec 2004 20:35:35 +0000 (+0000) Subject: Fixed bug in parsing of typedef'ed array sizes. X-Git-Tag: REL9_0_0~11199 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ec7806db2c4515b30e071dc6b6944858805317e6;p=pg-rex%2Fsyncrep.git Fixed bug in parsing of typedef'ed array sizes. Synced parser. --- diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index e714705cf1..3d6fe4fbb1 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1877,6 +1877,11 @@ Mon Oct 18 15:34:51 CEST 2004 Wed Nov 10 14:43:50 CET 2004 - List VALUE as a keyword. + +Mon Dec 6 21:27:34 CET 2004 + + - Fixed bug in parsing of typedef'ed array sizes. + - Synced parser. - Set ecpg version to 3.2.0. - Set compat library version to 1.2. - Set ecpg library version to 4.2. diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 3339ec477e..02b33e8bbd 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.301 2004/11/10 13:48:10 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.302 2004/12/06 20:35:35 meskes Exp $ */ /* Copyright comment */ %{ @@ -208,16 +208,16 @@ static char * adjust_informix(struct arguments *list) { /* Informix accepts DECLARE with variables that are out of scope when OPEN is called. - * for instance you can declare variables in a function, and then subsequently use them - * { - * declare_vars(); - * exec sql ... which uses vars declared in the above function - * + * for instance you can declare variables in a function, and then subsequently use them + * { + * declare_vars(); + * exec sql ... which uses vars declared in the above function + * * This breaks standard and leads to some very dangerous programming. * Since they do, we have to work around and accept their syntax as well. * But we will do so ONLY in Informix mode. * We have to change the variables to our own struct and just store the pointer instead of the variable - */ + */ struct arguments *ptr; char *result = make_str(""); @@ -1955,12 +1955,8 @@ any_name: ColId { $$ = $1; } | ColId attrs { $$ = cat2_str($1, $2); } ; -/* - * The slightly convoluted way of writing this production avoids reduce/reduce - * errors against indirection_el. - */ attrs: '.' attr_name { $$ = cat2_str(make_str("."), $2); } - | '.' attr_name attrs { $$ = cat_str(3, make_str("."), $2, $3); } + | attrs '.' attr_name { $$ = cat_str(3, $1, make_str("."), $3); } ; /***************************************************************************** @@ -4167,7 +4163,7 @@ qualified_name_list: qualified_name qualified_name: relation_name { $$ = $1; } - | relation_name attrs + | relation_name indirection { $$ = cat2_str($1, $2); } ; diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index c55b0ae32f..acd2faf83d 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -365,7 +365,7 @@ ECPGdump_a_simple(FILE *o, const char *name, enum ECPGttype type, else sprintf(variable, "&(%s%s)", prefix ? prefix : "", name); - sprintf(offset, "%s*sizeof(char)", strcmp(varcharsize, "0") == 0 ? "1" : varcharsize); + sprintf(offset, "(%s)*sizeof(char)", strcmp(varcharsize, "0") == 0 ? "1" : varcharsize); break; case ECPGt_numeric: diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index 6037d978c7..e26dc02985 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -560,7 +560,7 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty * changed later on when the variable is defined */ *length = make_str("1"); - else if (atoi(*dimension) == 0) + else if (strcmp(*dimension, "0") == 0) *length = make_str("-1"); else *length = *dimension;