diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 065ac1786e..650577f74f 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -884,5 +884,9 @@ Thu Mar 30 11:11:13 CEST 2000 - Synced preproc.y with gram.y. - Fixed comment parsing bug. + +Fri Mar 31 08:25:58 CEST 2000 + + - Synced preproc.y with gram.y. - Set library version to 3.1.0. - Set ecpg version to 2.7.0. diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 7715e7d095..ac98aa333c 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -390,8 +390,9 @@ statement: ecpgstart opt_at stmt ';' { connection = NULL; } | cpp_line { fprintf(yyout, "%s", $1); free($1); } | blockstart { fputs($1, yyout); free($1); } | blockend { fputs($1, yyout); free($1); } + ; -opt_at: SQL_AT connection_target { connection = $2; } +opt_at: SQL_AT connection_target { connection = $2; }; stmt: AlterTableStmt { output_statement($1, 0, NULL, connection); } | AlterGroupStmt { output_statement($1, 0, NULL, connection); } @@ -781,12 +782,20 @@ opt_level: READ COMMITTED { $$ = make_str("read committed"); } var_value: Sconst { $$ = $1; } - | DEFAULT { $$ = make_str("default"); } + | FCONST { $$ = make_name(); } + | Iconst { $$ = $1; } + | name_list { + if (strlen($1) == 0) + mmerror(ET_ERROR, "SET must have at least one argument."); + + $$ = $1; + } + | DEFAULT { $$ = make_str("default"); } ; zone_value: Sconst { $$ = $1; } - | DEFAULT { $$ = make_str("default"); } - | LOCAL { $$ = make_str("local"); } + | DEFAULT { $$ = make_str("default"); } + | LOCAL { $$ = make_str("local"); } ; opt_encoding: Sconst { $$ = $1; } @@ -4066,6 +4075,7 @@ opt_options: Op ColId $$ = make2_str(make_str("?"), $2); } | /* empty */ { $$ = EMPTY; } + ; /* * Declare a prepared cursor. The syntax is different from the standard @@ -4114,7 +4124,7 @@ ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident * the exec sql deallocate prepare command to deallocate a previously * prepared statement */ -ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); } +ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); }; /* * variable declaration inside the exec sql declare block @@ -4128,17 +4138,19 @@ ECPGDeclaration: sql_startdeclare fprintf(yyout, "%s/* exec sql end declare section */", $3); free($3); output_line_number(); - } + }; -sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {} +sql_startdeclare: ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {}; -sql_enddeclare: ecpgstart END_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); } + ; declaration: storage_clause storage_modifier { @@ -4162,17 +4174,19 @@ declaration: storage_clause storage_modifier variable_list ';' { $$ = cat_str(6, actual_startline[struct_level], $1, $2, $4.type_str, $6, make_str(";\n")); - } + }; storage_clause : S_EXTERN { $$ = make_str("extern"); } - | S_STATIC { $$ = make_str("static"); } - | S_REGISTER { $$ = make_str("register"); } - | S_AUTO { $$ = make_str("auto"); } - | /* empty */ { $$ = EMPTY; } + | S_STATIC { $$ = make_str("static"); } + | S_REGISTER { $$ = make_str("register"); } + | S_AUTO { $$ = make_str("auto"); } + | /* empty */ { $$ = EMPTY; } + ; -storage_modifier : S_CONST { $$ = make_str("const"); } - | S_VOLATILE { $$ = make_str("volatile"); } - | /* empty */ { $$ = EMPTY; } +storage_modifier : S_CONST { $$ = make_str("const"); } + | S_VOLATILE { $$ = make_str("volatile"); } + | /* empty */ { $$ = EMPTY; } + ; type: simple_type { @@ -4220,6 +4234,7 @@ type: simple_type $$.type_index = this->type->type_index; struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list); } + ; enum_type: SQL_ENUM opt_symbol enum_definition { @@ -4229,22 +4244,23 @@ enum_type: SQL_ENUM opt_symbol enum_definition { $$ = cat2_str(make_str("enum"), $2); } + ; -enum_definition: '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); } +enum_definition: '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); }; struct_type: s_struct '{' variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level]); free(actual_storage[struct_level--]); $$ = cat_str(4, $1, make_str("{"), $3, make_str("}")); - } + }; union_type: s_union '{' variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level]); free(actual_storage[struct_level--]); $$ = cat_str(4, $1, make_str("{"), $3, make_str("}")); - } + }; s_struct: SQL_STRUCT opt_symbol { @@ -4257,7 +4273,7 @@ s_struct: SQL_STRUCT opt_symbol initializer = 0; $$ = cat2_str(make_str("struct"), $2); - } + }; s_union: UNION opt_symbol { @@ -4270,7 +4286,7 @@ s_union: UNION opt_symbol initializer = 0; $$ = cat2_str(make_str("union"), $2); - } + }; simple_type: unsigned_type { $$=$1; } | opt_signed signed_type { $$=$2; } @@ -4300,7 +4316,7 @@ opt_signed: SQL_SIGNED | /* EMPTY */ ; -varchar_type: VARCHAR { $$ = ECPGt_varchar; } +varchar_type: VARCHAR { $$ = ECPGt_varchar; }; variable_list: variable { @@ -4310,6 +4326,7 @@ variable_list: variable { $$ = cat_str(3, $1, make_str(","), $3); } + ; variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer { @@ -4384,16 +4401,18 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1])); free($2); - } + }; opt_initializer: /* empty */ { $$ = EMPTY; } | '=' c_term { initializer = 1; $$ = cat2_str(make_str("="), $2); } + ; opt_pointer: /* empty */ { $$ = EMPTY; } | '*' { $$ = make_str("*"); } + ; /* * As long as the prepare statement is not supported by the backend, we will @@ -4403,7 +4422,7 @@ ECPGDeclare: DECLARE STATEMENT ident { /* this is only supported for compatibility */ $$ = cat_str(3, make_str("/* declare statement"), $3, make_str("*/")); - } + }; /* * the exec sql disconnect statement: disconnect from the given database */ @@ -4413,9 +4432,11 @@ dis_name: connection_object { $$ = $1; } | CURRENT { $$ = make_str("\"CURRENT\""); } | ALL { $$ = make_str("\"ALL\""); } | /* empty */ { $$ = make_str("\"CURRENT\""); } + ; connection_object: connection_target { $$ = $1; } | DEFAULT { $$ = make_str("\"DEFAULT\""); } + ; /* * execute a given string as sql command @@ -4448,30 +4469,31 @@ ECPGExecute : EXECUTE IMMEDIATE execstring { $$ = make_str("?"); } + ; -execstring: char_variable | - CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }; +execstring: char_variable { $$ = $1; } + | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } + ; /* * the exec sql free command to deallocate a previously * prepared statement */ -ECPGFree: SQL_FREE ident { $$ = $2; } +ECPGFree: SQL_FREE ident { $$ = $2; }; /* * open is an open cursor, at the moment this has to be removed */ -ECPGOpen: SQL_OPEN name ecpg_using { - $$ = $2; -}; +ECPGOpen: SQL_OPEN name ecpg_using { $$ = $2; }; ecpg_using: /* empty */ { $$ = EMPTY; } | USING variablelist { /* mmerror ("open cursor with variables not implemented yet"); */ $$ = EMPTY; } + ; -variablelist: cinputvariable | cinputvariable ',' variablelist +variablelist: cinputvariable | cinputvariable ',' variablelist; /* * As long as the prepare statement is not supported by the backend, we will @@ -4480,7 +4502,7 @@ variablelist: cinputvariable | cinputvariable ',' variablelist ECPGPrepare: SQL_PREPARE ident FROM execstring { $$ = cat2_str(make3_str(make_str("\""), $2, make_str("\",")), $4); - } + }; /* * dynamic SQL: descriptor based access @@ -4491,31 +4513,29 @@ ECPGPrepare: SQL_PREPARE ident FROM execstring * deallocate a descriptor */ ECPGDeallocateDescr: SQL_DEALLOCATE SQL_DESCRIPTOR ident -{ drop_descriptor($3,connection); - $$ = $3; -} + { + drop_descriptor($3,connection); + $$ = $3; + }; /* * allocate a descriptor */ ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR ident -{ add_descriptor($3,connection); - $$ = $3; -} + { + add_descriptor($3,connection); + $$ = $3; + }; /* * read from descriptor */ -ECPGGetDescHeaderItem: cvariable '=' desc_header_item { - push_assignment($1, $3); -} +ECPGGetDescHeaderItem: cvariable '=' desc_header_item { push_assignment($1, $3); }; -desc_header_item: SQL_COUNT { $$ = ECPGd_count; } +desc_header_item: SQL_COUNT { $$ = ECPGd_count; }; -ECPGGetDescItem: cvariable '=' descriptor_item { - push_assignment($1, $3); -} +ECPGGetDescItem: cvariable '=' descriptor_item { push_assignment($1, $3); }; descriptor_item: SQL_DATA { $$ = ECPGd_data; } | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; } @@ -4534,18 +4554,21 @@ descriptor_item: SQL_DATA { $$ = ECPGd_data; } ; ECPGGetDescHeaderItems: ECPGGetDescHeaderItem - | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem; + | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem + ; ECPGGetDescItems: ECPGGetDescItem - | ECPGGetDescItems ',' ECPGGetDescItem; + | ECPGGetDescItems ',' ECPGGetDescItem + ; ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR ident ECPGGetDescHeaderItems - { $$ = $3; } + { $$ = $3; }; ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR ident SQL_VALUE cvariable ECPGGetDescItems { $$.str = $5; $$.name = $3; } | SQL_GET SQL_DESCRIPTOR ident SQL_VALUE Iconst ECPGGetDescItems { $$.str = $5; $$.name = $3; } + ; /***************************************************************************** * @@ -4602,7 +4625,7 @@ ECPGRelease: TransactionStmt SQL_RELEASE fprintf(yyout, "ECPGdisconnect(__LINE__, \"\");"); whenever_action(0); free($1); - } + }; /* * set/reset the automatic transaction mode, this needs a differnet handling @@ -4611,10 +4634,11 @@ ECPGRelease: TransactionStmt SQL_RELEASE ECPGSetAutocommit: SET SQL_AUTOCOMMIT to_equal on_off { $$ = $4; - } + }; on_off: ON { $$ = make_str("on"); } | SQL_OFF { $$ = make_str("off"); } + ; to_equal: TO | '='; @@ -4625,7 +4649,7 @@ to_equal: TO | '='; ECPGSetConnection: SET SQL_CONNECTION to_equal connection_object { $$ = $4; - } + }; /* * define a new type for embedded SQL @@ -4676,7 +4700,7 @@ ECPGTypedef: TYPE_P ECPGColLabel IS type opt_type_array_bounds opt_reference types = this; $$ = cat_str(7, make_str("/* exec sql type"), mm_strdup($2), make_str("is"), mm_strdup($4.type_str), mm_strdup($5.str), $6, make_str("*/")); - } + }; opt_type_array_bounds: '[' ']' opt_type_array_bounds { @@ -4718,6 +4742,7 @@ opt_type_array_bounds: '[' ']' opt_type_array_bounds opt_reference: SQL_REFERENCE { $$ = make_str("reference"); } | /* empty */ { $$ = EMPTY; } + ; /* * define the type of one variable for embedded SQL @@ -4776,68 +4801,81 @@ ECPGVar: SQL_VAR ECPGColLabel IS type opt_type_array_bounds opt_reference p->type = type; $$ = cat_str(7, make_str("/* exec sql var"), mm_strdup($2), make_str("is"), mm_strdup($4.type_str), mm_strdup($5.str), $6, make_str("*/")); - } + }; /* * whenever statement: decide what to do in case of error/no data found * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION */ -ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action { - when_error.code = $3.code; - when_error.command = $3.command; - $$ = cat_str(3, make_str("/* exec sql whenever sqlerror "), $3.str, make_str("; */\n")); -} - | SQL_WHENEVER NOT SQL_FOUND action { - when_nf.code = $4.code; - when_nf.command = $4.command; - $$ = cat_str(3, make_str("/* exec sql whenever not found "), $4.str, make_str("; */\n")); -} - | SQL_WHENEVER SQL_SQLWARNING action { - when_warn.code = $3.code; - when_warn.command = $3.command; - $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */\n")); -} +ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action + { + when_error.code = $3.code; + when_error.command = $3.command; + $$ = cat_str(3, make_str("/* exec sql whenever sqlerror "), $3.str, make_str("; */\n")); + } + | SQL_WHENEVER NOT SQL_FOUND action + { + when_nf.code = $4.code; + when_nf.command = $4.command; + $$ = cat_str(3, make_str("/* exec sql whenever not found "), $4.str, make_str("; */\n")); + } + | SQL_WHENEVER SQL_SQLWARNING action + { + when_warn.code = $3.code; + when_warn.command = $3.command; + $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */\n")); + } + ; -action : SQL_CONTINUE { - $$.code = W_NOTHING; - $$.command = NULL; - $$.str = make_str("continue"); -} - | SQL_SQLPRINT { - $$.code = W_SQLPRINT; - $$.command = NULL; - $$.str = make_str("sqlprint"); -} - | SQL_STOP { - $$.code = W_STOP; - $$.command = NULL; - $$.str = make_str("stop"); -} - | SQL_GOTO name { - $$.code = W_GOTO; - $$.command = strdup($2); - $$.str = cat2_str(make_str("goto "), $2); -} - | SQL_GO TO name { - $$.code = W_GOTO; - $$.command = strdup($3); - $$.str = cat2_str(make_str("goto "), $3); -} - | DO name '(' c_args ')' { - $$.code = W_DO; - $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); - $$.str = cat2_str(make_str("do"), mm_strdup($$.command)); -} - | DO SQL_BREAK { - $$.code = W_BREAK; - $$.command = NULL; - $$.str = make_str("break"); -} - | SQL_CALL name '(' c_args ')' { - $$.code = W_DO; - $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); - $$.str = cat2_str(make_str("call"), mm_strdup($$.command)); -} +action : SQL_CONTINUE + { + $$.code = W_NOTHING; + $$.command = NULL; + $$.str = make_str("continue"); + } + | SQL_SQLPRINT + { + $$.code = W_SQLPRINT; + $$.command = NULL; + $$.str = make_str("sqlprint"); + } + | SQL_STOP + { + $$.code = W_STOP; + $$.command = NULL; + $$.str = make_str("stop"); + } + | SQL_GOTO name + { + $$.code = W_GOTO; + $$.command = strdup($2); + $$.str = cat2_str(make_str("goto "), $2); + } + | SQL_GO TO name + { + $$.code = W_GOTO; + $$.command = strdup($3); + $$.str = cat2_str(make_str("goto "), $3); + } + | DO name '(' c_args ')' + { + $$.code = W_DO; + $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); + $$.str = cat2_str(make_str("do"), mm_strdup($$.command)); + } + | DO SQL_BREAK + { + $$.code = W_BREAK; + $$.command = NULL; + $$.str = make_str("break"); + } + | SQL_CALL name '(' c_args ')' + { + $$.code = W_DO; + $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); + $$.str = cat2_str(make_str("call"), mm_strdup($$.command)); + } + ; /* some other stuff for ecpg */ @@ -4889,9 +4927,11 @@ ECPGTypeName: SQL_BOOL { $$ = make_str("bool"); } | DOUBLE { $$ = make_str("double"); } ; +/* not needed at the moment + * | UNION { $$ = make_str("union"); } + */ ECPGLabelTypeName: CHAR { $$ = make_str("char"); } | FLOAT { $$ = make_str("float"); } - | UNION { $$ = make_str("union"); } | VARCHAR { $$ = make_str("varchar"); } | ECPGTypeName { $$ = $1; } ; @@ -4900,8 +4940,18 @@ opt_symbol: symbol { $$ = $1; } | /*EMPTY*/ { $$ = EMPTY; } ; -symbol: ColLabel { $$ = $1; } +symbol: ColLabel { $$ = $1; }; +/* These show up as operators, and will screw up the parsing if + * allowed as identifiers or labels. + * Thanks to Tom Lane for pointing this out. - thomas 2000-03-29 + | BETWEEN { $$ = make_str("between"); } + | IN { $$ = make_str("in"); } + | IS { $$ = make_str("is"); } + | ISNULL { $$ = make_str("isnull"); } + | NOTNULL { $$ = make_str("notnull"); } + | OVERLAPS { $$ = make_str("overlaps"); } + */ ECPGColId: /* to be used instead of ColId */ ECPGKeywords { $$ = $1; } | ident { $$ = $1; } @@ -4916,7 +4966,6 @@ ECPGColId: /* to be used instead of ColId */ | BACKWARD { $$ = make_str("backward"); } | BEFORE { $$ = make_str("before"); } | BEGIN_TRANS { $$ = make_str("begin"); } - | BETWEEN { $$ = make_str("between"); } | CACHE { $$ = make_str("cache"); } | CASCADE { $$ = make_str("cascade"); } | CLOSE { $$ = make_str("close"); } @@ -4944,7 +4993,6 @@ ECPGColId: /* to be used instead of ColId */ | GRANT { $$ = make_str("grant"); } | HANDLER { $$ = make_str("handler"); } | IMMEDIATE { $$ = make_str("immediate"); } - | IN { $$ = make_str("in"); } | INCREMENT { $$ = make_str("increment"); } | INDEX { $$ = make_str("index"); } | INHERITS { $$ = make_str("inherits"); } @@ -4952,8 +5000,6 @@ ECPGColId: /* to be used instead of ColId */ | INSERT { $$ = make_str("insert"); } | INSTEAD { $$ = make_str("instead"); } | INTERVAL { $$ = make_str("interval"); } - | IS { $$ = make_str("is"); } - | ISNULL { $$ = make_str("isnull"); } | ISOLATION { $$ = make_str("isolation"); } | KEY { $$ = make_str("key"); } | LANGUAGE { $$ = make_str("language"); } @@ -4972,13 +5018,11 @@ ECPGColId: /* to be used instead of ColId */ | NOCREATEUSER { $$ = make_str("nocreateuser"); } | NOTHING { $$ = make_str("nothing"); } | NOTIFY { $$ = make_str("notify"); } - | NOTNULL { $$ = make_str("notnull"); } | OF { $$ = make_str("of"); } | OIDS { $$ = make_str("oids"); } | ONLY { $$ = make_str("only"); } | OPERATOR { $$ = make_str("operator"); } | OPTION { $$ = make_str("option"); } - | OVERLAPS { $$ = make_str("overlaps"); } | PARTIAL { $$ = make_str("partial"); } | PASSWORD { $$ = make_str("password"); } | PENDANT { $$ = make_str("pendant"); } @@ -5029,11 +5073,22 @@ ECPGColId: /* to be used instead of ColId */ | ZONE { $$ = make_str("zone"); } ; +/* These show up as operators, and will screw up the parsing if + * allowed as identifiers or labels. + * Thanks to Tom Lane for pointing this out. - thomas 2000-03-29 + | ALL { $$ = make_str("all"); } + | ANY { $$ = make_str("any"); } + | EXCEPT { $$ = make_str("except"); } + | INTERSECT { $$ = make_str("intersect"); } + | LIKE { $$ = make_str("like"); } + | NOT { $$ = make_str("not"); } + | NULLIF { $$ = make_str("nullif"); } + | NULL_P { $$ = make_str("null"); } + | OR { $$ = make_str("or"); } + */ ECPGColLabel: ECPGColId { $$ = $1; } | ABORT_TRANS { $$ = make_str("abort"); } - | ALL { $$ = make_str("all"); } | ANALYZE { $$ = make_str("analyze"); } - | ANY { $$ = make_str("any"); } | ASC { $$ = make_str("asc"); } | BINARY { $$ = make_str("binary"); } | BIT { $$ = make_str("bit"); } @@ -5063,7 +5118,6 @@ ECPGColLabel: ECPGColId { $$ = $1; } | DO { $$ = make_str("do"); } | ELSE { $$ = make_str("else"); } | END_TRANS { $$ = make_str("end"); } - | EXCEPT { $$ = make_str("except"); } | EXISTS { $$ = make_str("exists"); } | EXPLAIN { $$ = make_str("explain"); } | EXTEND { $$ = make_str("extend"); } @@ -5078,12 +5132,10 @@ ECPGColLabel: ECPGColId { $$ = $1; } | HAVING { $$ = make_str("having"); } | INITIALLY { $$ = make_str("initially"); } | INNER_P { $$ = make_str("inner"); } - | INTERSECT { $$ = make_str("intersect"); } | INTO { $$ = make_str("into"); } | JOIN { $$ = make_str("join"); } | LEADING { $$ = make_str("leading"); } | LEFT { $$ = make_str("left"); } - | LIKE { $$ = make_str("like"); } | LISTEN { $$ = make_str("listen"); } | LOAD { $$ = make_str("load"); } | LOCK_P { $$ = make_str("lock"); } @@ -5092,13 +5144,9 @@ ECPGColLabel: ECPGColId { $$ = $1; } | NCHAR { $$ = make_str("nchar"); } | NEW { $$ = make_str("new"); } | NONE { $$ = make_str("none"); } - | NOT { $$ = make_str("not"); } - | NULLIF { $$ = make_str("nullif"); } - | NULL_P { $$ = make_str("null"); } | NUMERIC { $$ = make_str("numeric"); } | OFFSET { $$ = make_str("offset"); } | ON { $$ = make_str("on"); } - | OR { $$ = make_str("or"); } | ORDER { $$ = make_str("order"); } | OUTER_P { $$ = make_str("outer"); } | POSITION { $$ = make_str("position"); } @@ -5131,42 +5179,48 @@ ECPGColLabel: ECPGColId { $$ = $1; } into_list : coutputvariable | into_list ',' coutputvariable; -ecpgstart: SQL_START { reset_variables();} +ecpgstart: SQL_START { reset_variables(); }; c_args: /* empty */ { $$ = EMPTY; } | c_list { $$ = $1; } + ; -coutputvariable : cvariable indicator { +coutputvariable : cvariable indicator + { add_variable(&argsresult, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2)); -} + }; -cinputvariable : cvariable indicator { +cinputvariable : cvariable indicator + { if ($2 != NULL && (find_variable($2))->type->typ == ECPGt_array) mmerror(ET_ERROR, "arrays of indicators are not allowed on input"); add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2)); -} + }; -civariableonly : cvariable { +civariableonly : cvariable + { add_variable(&argsinsert, find_variable($1), &no_indicator); $$ = make_str("?"); -} + }; -cvariable: CVARIABLE { $$ = $1; } +cvariable: CVARIABLE { $$ = $1; }; indicator: /* empty */ { $$ = NULL; } | cvariable { check_indicator((find_variable($1))->type); $$ = $1; } | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; } | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; } + ; ident: IDENT { $$ = $1; } - | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }; + | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } + ; /* * C stuff */ -cpp_line: CPP_LINE { $$ = $1; } +cpp_line: CPP_LINE { $$ = $1; }; c_stuff: c_anything { $$ = $1; } | c_stuff c_anything @@ -5177,18 +5231,22 @@ c_stuff: c_anything { $$ = $1; } { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); } + ; c_list: c_term { $$ = $1; } | c_list ',' c_term { $$ = cat_str(3, $1, make_str(","), $3); } + ; c_term: c_stuff { $$ = $1; } | '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); } + ; c_thing: c_anything { $$ = $1; } | '(' { $$ = make_str("("); } | ')' { $$ = make_str(")"); } | ',' { $$ = make_str(","); } | ';' { $$ = make_str(";"); } + ; c_anything: IDENT { $$ = $1; } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } @@ -5222,16 +5280,19 @@ c_anything: IDENT { $$ = $1; } | '[' { $$ = make_str("["); } | ']' { $$ = make_str("]"); } | '=' { $$ = make_str("="); } + ; -blockstart : '{' { - braces_open++; - $$ = make_str("{"); -} +blockstart : '{' + { + braces_open++; + $$ = make_str("{"); + }; -blockend : '}' { - remove_variables(braces_open--); - $$ = make_str("}"); -} +blockend : '}' + { + remove_variables(braces_open--); + $$ = make_str("}"); + }; %%