diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 296b34d5cd282d937cb7a0ed1f16966b3b61e251..43e110bf781ae457a1f66a14a3b3397afce5adec 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -755,3 +755,8 @@ Thu Dec 23 13:25:05 CET 1999 - Fixed command line parsing. - Set ecpg version to 2.6.13. +Thu Jan 6 09:52:27 CET 2000 + + - Synced preproc.y with gram.y. + - Made sure Bruce's additions also make it into my source tree. + - Set ecpg version to 2.6.14. diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index ad2af4804527895b327299d40e3085c03926023b..4c07c57655866e6fabaf0a29155210b0603c267b 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global MAJOR_VERSION=2 MINOR_VERSION=6 -PATCHLEVEL=13 +PATCHLEVEL=14 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 999ae050c9a2d42a6d539236092327642692061e..e8a9fb11d69aa97d2616efbbbbea1514293c425f 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -27,7 +27,6 @@ static char *connection = NULL; static int QueryIsRule = 0, ForUpdateNotAllowed = 0, FoundInto = 0; static struct this_type actual_type[STRUCT_DEPTH]; static char *actual_storage[STRUCT_DEPTH]; -static char *actual_startline[STRUCT_DEPTH]; /* temporarily store struct members while creating the data structure */ struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL }; @@ -70,7 +69,7 @@ void output_line_number() { if (input_filename) - fprintf(yyout, "\n#line %d \"%s\"\n", yylineno, input_filename); + fprintf(yyout, "\n#line %d \"%s\"\n", yylineno + 1, input_filename); } static void @@ -480,20 +479,6 @@ make_name(void) return(name); } -static char * -hashline_number() -{ - if (input_filename) - { - char* line = mm_alloc(strlen("\n#line %d \"%s\"\n") + 21 + strlen(input_filename)); - sprintf(line, "\n#line %d \"%s\"\n", yylineno, input_filename); - - return line; - } - - return EMPTY; -} - static void output_statement(char * stmt, int mode) { @@ -772,7 +757,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt %type <str> NotifyStmt columnElem copy_dirn UnlistenStmt copy_null %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary -%type <str> opt_with_copy FetchStmt direction fetch_how_many portal_name +%type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name %type <str> ClosePortalStmt DropStmt VacuumStmt opt_verbose %type <str> opt_analyze opt_va_list va_list ExplainStmt index_params %type <str> index_list func_index index_elem opt_type opt_class access_method_clause @@ -803,11 +788,12 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type <str> select_offset_value table_list using_expr join_expr %type <str> using_list from_expr table_expr join_clause join_type %type <str> join_qual update_list join_clause join_clause_with_union -%type <str> opt_level opt_lock lock_type, +%type <str> opt_level opt_lock lock_type users_in_new_group_clause %type <str> OptConstrFromTable comment_op ConstraintAttributeSpec %type <str> constraints_set_list constraints_set_namelist comment_fn %type <str> constraints_set_mode comment_type comment_cl comment_ag %type <str> ConstraintDeferrabilitySpec ConstraintTimeSpec +%type <str> CreateGroupStmt, AlterGroupStmt, DropGroupStmt %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen %type <str> indicator ECPGExecute ECPGPrepare ecpg_using @@ -822,7 +808,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate %type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations %type <str> sql_declaration sql_variable_list sql_variable opt_at -%type <str> struct_type s_struct declaration declarations variable_declarations +%type <str> struct_type s_struct declaration variable_declarations %type <str> s_struct s_union union_type ECPGSetAutocommit on_off %type <type_enum> simple_type varchar_type @@ -851,12 +837,14 @@ statement: ecpgstart opt_at stmt ';' { connection = NULL; } opt_at: SQL_AT connection_target { connection = $2; } stmt: AddAttrStmt { output_statement($1, 0); } + | AlterGroupStmt { output_statement($1, 0); } | AlterUserStmt { output_statement($1, 0); } | ClosePortalStmt { output_statement($1, 0); } | CommentStmt { output_statement($1, 0); } | CopyStmt { output_statement($1, 0); } | CreateStmt { output_statement($1, 0); } | CreateAsStmt { output_statement($1, 0); } + | CreateGroupStmt { output_statement($1, 0); } | CreateSeqStmt { output_statement($1, 0); } | CreatePLangStmt { output_statement($1, 0); } | CreateTrigStmt { output_statement($1, 0); } @@ -865,6 +853,7 @@ stmt: AddAttrStmt { output_statement($1, 0); } | DefineStmt { output_statement($1, 0); } | DropStmt { output_statement($1, 0); } | TruncateStmt { output_statement($1, 0); } + | DropGroupStmt { output_statement($1, 0); } | DropPLangStmt { output_statement($1, 0); } | DropTrigStmt { output_statement($1, 0); } | DropUserStmt { output_statement($1, 0); } @@ -1111,10 +1100,6 @@ user_group_list: user_group_list ',' UserId user_group_clause: IN GROUP user_group_list { - /* the backend doesn't actually process this, - * so an warning message is probably fairer */ - mmerror(ET_WARN, "IN GROUP is not implemented"); - $$ = cat2_str(make_str("in group"), $3); } | /*EMPTY*/ { $$ = EMPTY; } @@ -1124,6 +1109,63 @@ user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make_str("valid until") | /*EMPTY*/ { $$ = EMPTY; } ; + +/***************************************************************************** + * + * Create a postresql group + * + * + ****************************************************************************/ +CreateGroupStmt: CREATE GROUP UserId + { + $$ = cat2_str(make_str("create group"), $3); + } + | CREATE GROUP UserId WITH sysid_clause users_in_new_group_clause + { + $$ = cat_str(5, make_str("create group"), $3, make_str("with"), $5, $6); + } + ; + +users_in_new_group_clause: USER user_group_list { $$ = cat2_str(make_str("user"), $2); } + | /* EMPTY */ { $$ = EMPTY; } + ; + + +/***************************************************************************** + * + * Alter a postresql group + * + * + *****************************************************************************/ +AlterGroupStmt: ALTER GROUP UserId WITH SYSID Iconst + { + $$ = cat_str(4, make_str("alter group"), $3, make_str("with sysid"), $6); + } + | + ALTER GROUP UserId ADD USER user_group_list + { + $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6); + } + | + ALTER GROUP UserId DROP USER user_group_list + { + $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6); + } + ; + +/***************************************************************************** + * + * Drop a postresql group + * + * + *****************************************************************************/ +DropGroupStmt: DROP GROUP UserId + { + $$ = cat2_str(make_str("drop group"), $3); + } + ; + + /***************************************************************************** * * Set PG internal variable @@ -1885,36 +1927,20 @@ TruncateStmt: TRUNCATE TABLE relation_name * *****************************************************************************/ -FetchStmt: FETCH direction fetch_how_many portal_name INTO into_list +FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list { if (strcmp($2, "relative") == 0 && atol($3) == 0L) mmerror(ET_ERROR, "FETCH/RELATIVE at current position is not supported"); $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } - | FETCH fetch_how_many portal_name INTO into_list - { - $$ = cat_str(3, make_str("fetch"), $2, $3); - } - | FETCH portal_name INTO into_list + | MOVE opt_direction fetch_how_many opt_portal_name { - $$ = cat_str(2, make_str("fetch"), $2); - } - | MOVE direction fetch_how_many portal_name - { - $$ = cat_str(4, make_str("move"), $2, $3, $4); - } - | MOVE fetch_how_many portal_name - { - $$ = cat_str(3, make_str("move"), $2, $3); - } - | MOVE portal_name - { - $$ = cat_str(2, make_str("move"), $2); + $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } ; -direction: FORWARD { $$ = make_str("forward"); } +opt_direction: FORWARD { $$ = make_str("forward"); } | BACKWARD { $$ = make_str("backward"); } | RELATIVE { $$ = make_str("relative"); } | ABSOLUTE @@ -1922,6 +1948,7 @@ direction: FORWARD { $$ = make_str("forward"); } mmerror(ET_WARN, "FETCH/ABSOLUTE not supported, backend will use RELATIVE"); $$ = make_str("absolute"); } + | /*EMPTY*/ { $$ = EMPTY; /* default */ } ; fetch_how_many: Iconst { $$ = $1; } @@ -1929,11 +1956,13 @@ fetch_how_many: Iconst { $$ = $1; } | ALL { $$ = make_str("all"); } | NEXT { $$ = make_str("next"); } | PRIOR { $$ = make_str("prior"); } + | /*EMPTY*/ { $$ = EMPTY; /*default*/ } ; -portal_name: IN name { $$ = cat2_str(make_str("in"), $2); } +opt_portal_name: IN name { $$ = cat2_str(make_str("in"), $2); } | FROM name { $$ = cat2_str(make_str("from"), $2); } - | name { $$ = cat2_str(make_str("in"), $1); } +/* | name { $$ = cat2_str(make_str("in"), $1); }*/ + | /*EMPTY*/ { $$ = EMPTY; } ; /***************************************************************************** @@ -4503,6 +4532,7 @@ ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = cat_str(3, make_str("ECP ECPGDeclaration: sql_startdeclare { fputs("/* exec sql begin declare section */", yyout); + output_line_number(); } variable_declarations sql_enddeclare { @@ -4515,16 +4545,18 @@ sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {} sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION ';' {} -variable_declarations: /* empty */ { $$ = EMPTY; } - | declarations { $$ = $1; } - -declarations: declaration { $$ = $1; } - | declarations declaration { $$ = cat2_str($1, $2); } +variable_declarations: /* empty */ + { + $$ = EMPTY; + } + | declaration variable_declarations + { + $$ = cat2_str($1, $2); + } declaration: storage_clause { actual_storage[struct_level] = mm_strdup($1); - actual_startline[struct_level] = hashline_number(); } type { @@ -4534,7 +4566,7 @@ declaration: storage_clause } variable_list ';' { - $$ = cat_str(5, actual_startline[struct_level], $1, $3.type_str, $5, make_str(";\n")); + $$ = cat_str(4, $1, $3.type_str, $5, make_str(";\n")); } storage_clause : S_EXTERN { $$ = make_str("extern"); } @@ -5441,7 +5473,7 @@ c_stuff: c_anything { $$ = $1; } } c_list: c_term { $$ = $1; } - | c_list ',' c_term { $$ = cat_str(3, $1, make_str(","), $3); } + | c_term ',' c_list { $$ = cat_str(3, $1, make_str(","), $3); } c_term: c_stuff { $$ = $1; } | '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); } diff --git a/src/interfaces/ecpg/test/test1.pgc b/src/interfaces/ecpg/test/test1.pgc index 6ace9d57624d1a39dde9777d82e806d3553216de..be3a2fc61ed231c5c0a19a9abba7b9b955e53b63 100644 --- a/src/interfaces/ecpg/test/test1.pgc +++ b/src/interfaces/ecpg/test/test1.pgc @@ -82,7 +82,7 @@ exec sql end declare section; for (i=0, j=sqlca.sqlerrd[2]; i<j; i++) printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); - exec sql at pm select name, amount, letter into :name, :amount, :letter from "Test"; + exec sql at pm select * into :name, :amount, :letter from "Test"; for (i=0, j=sqlca.sqlerrd[2]; i<j; i++) printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); diff --git a/src/interfaces/ecpg/test/test3.pgc b/src/interfaces/ecpg/test/test3.pgc index 12e3e07dd21fdc65a097fecd92f6ec7576f57762..12a7e3f9e2707e556158f584ff46f291fbcba303 100644 --- a/src/interfaces/ecpg/test/test3.pgc +++ b/src/interfaces/ecpg/test/test3.pgc @@ -19,7 +19,7 @@ exec sql begin declare section; int ind_children; str *married = NULL; char *wifesname="Petra"; - char *query="select name, born, age, married, children from meskes where name = :var1"; + char *query="select * from meskes where name = :var1"; exec sql end declare section; exec sql declare cur cursor for @@ -41,8 +41,8 @@ exec sql end declare section; exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3); exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 33, '19900404', 3); exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 8); - exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 5); - exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 1); + exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 6); + exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 2); strcpy(msg, "commit"); exec sql commit;