From 965a0a40e1869868df2ef2cc16f5fd80b9c55557 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Thu, 12 Oct 2000 18:25:36 +0000 Subject: [PATCH] Replace constants by C variables wherever possible. --- src/interfaces/ecpg/ChangeLog | 5 + src/interfaces/ecpg/preproc/preproc.y | 233 ++++++++++++-------------- src/interfaces/ecpg/test/test3.pgc | 7 +- 3 files changed, 115 insertions(+), 130 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 6c594bf3e9..1816ec16af 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -960,5 +960,10 @@ Wed Oct 4 14:36:51 CEST 2000 Wed Oct 11 16:49:36 CEST 2000 - Synced preproc.y with gram.y. + +Thu Oct 12 20:13:00 CEST 2000 + + - Changed parser to accept a variable instead of a constant wherever + possible. - Set ecpg version to 2.8.0. - Set library version to 3.2.0. diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 055288ec79..6aae3c4d53 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -284,7 +284,7 @@ make_name(void) %type CreateAsElement OptCreateAs CreateAsList CreateAsStmt %type OptUnder key_reference comment_text ConstraintDeferrabilitySpec %type key_match ColLabel SpecialRuleRelation ColId columnDef -%type ColConstraint ColConstraintElem NumericOnly FloatOnly +%type ColConstraint ColConstraintElem %type OptTableElementList OptTableElement TableConstraint %type ConstraintElem key_actions ColQualList TokenId DropSchemaStmt %type target_list target_el update_target_list alias_clause @@ -329,41 +329,41 @@ make_name(void) %type OptSeqElem TriggerForSpec TriggerForOpt TriggerForType %type DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt %type TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted -%type CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg +%type CreatePLangStmt TriggerFuncArgs TriggerFuncArg %type ViewStmt LoadStmt CreatedbStmt createdb_opt_encoding %type createdb_opt_location opt_encoding OptInherit Geometric %type DropdbStmt ClusterStmt grantee RevokeStmt Bit bit -%type GrantStmt privileges operation_commalist operation -%type opt_cursor opt_lmode ConstraintsSetStmt comment_tg +%type GrantStmt privileges operation_commalist operation PosAllConst +%type opt_cursor opt_lmode ConstraintsSetStmt comment_tg AllConst %type case_expr when_clause_list case_default case_arg when_clause %type select_clause opt_select_limit select_limit_value ConstraintTimeSpec %type select_offset_value ReindexStmt join_type opt_only opt_boolean %type join_qual update_list AlterSchemaStmt joined_table %type opt_level opt_lock lock_type users_in_new_group_clause -%type OptConstrFromTable comment_op OptTempTableName +%type OptConstrFromTable comment_op OptTempTableName StringConst %type constraints_set_list constraints_set_namelist comment_fn %type constraints_set_mode comment_type comment_cl comment_ag %type CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete -%type opt_force key_update CreateSchemaStmt -%type SessionList SessionClause SetSessionStmt +%type opt_force key_update CreateSchemaStmt PosIntStringConst +%type SessionList SessionClause SetSessionStmt IntConst PosIntConst %type ECPGWhenever ECPGConnect connection_target ECPGOpen %type indicator ECPGExecute ECPGPrepare ecpg_using %type storage_clause opt_initializer c_anything blockstart %type blockend variable_list variable c_thing c_term -%type opt_pointer cvariable ECPGDisconnect dis_name storage_modifier +%type opt_pointer ECPGDisconnect dis_name storage_modifier %type stmt ECPGRelease execstring server_name %type connection_object opt_server opt_port c_stuff opt_reference %type user_name opt_user char_variable ora_user ident %type db_prefix server opt_options opt_connection_name c_list %type ECPGSetConnection cpp_line ECPGTypedef c_args ECPGKeywords -%type enum_type civariableonly ECPGCursorStmt ECPGDeallocate +%type enum_type civar civarind ECPGCursorStmt ECPGDeallocate %type ECPGFree ECPGDeclare ECPGVar opt_at enum_definition %type struct_type s_struct declaration declarations variable_declarations %type s_union union_type ECPGSetAutocommit on_off %type ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol %type ECPGGetDescriptorHeader ECPGColLabel ECPGTypeName -%type ECPGLabelTypeName ECPGColId +%type ECPGLabelTypeName ECPGColId variablelist cvariable %type ECPGFetchDescStmt ECPGGetDescriptor @@ -620,7 +620,7 @@ AlterUserStmt: ALTER USER UserId user_createdb_clause { $$ = cat_str(5, make_str("alter user"), $3, $4, $5, $6); } - | ALTER USER UserId WITH PASSWORD Sconst + | ALTER USER UserId WITH PASSWORD StringConst user_createdb_clause user_createuser_clause user_valid_clause { @@ -641,11 +641,11 @@ DropUserStmt: DROP USER user_list } ; -user_passwd_clause: PASSWORD Sconst { $$ = cat2_str(make_str("password") , $2); } +user_passwd_clause: PASSWORD StringConst { $$ = cat2_str(make_str("password") , $2); } | /*EMPTY*/ { $$ = EMPTY; } ; -sysid_clause: SYSID Iconst { if (atoi($2) <= 0) +sysid_clause: SYSID PosIntConst { if (atoi($2) <= 0) mmerror(ET_ERROR, "sysid must be positive"); $$ = cat2_str(make_str("sysid"), $2); } @@ -691,7 +691,7 @@ user_group_clause: IN GROUP user_list | /*EMPTY*/ { $$ = EMPTY; } ; -user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make_str("valid until"), $3); } +user_valid_clause: VALID UNTIL StringConst { $$ = cat2_str(make_str("valid until"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -848,11 +848,7 @@ opt_level: READ COMMITTED { $$ = make_str("read committed"); } var_value: opt_boolean { $$ = $1; } - | Sconst { $$ = $1; } - | Iconst { $$ = $1; } - | '-' Iconst { $$ = cat2_str(make_str("-"), $2); } - | Fconst { $$ = $1; } - | '-' Fconst { $$ = cat2_str(make_str("-"), $2); } + | AllConst { $$ = $1; } | name_list { if (strlen($1) == 0) mmerror(ET_ERROR, "SET must have at least one argument."); @@ -868,12 +864,12 @@ opt_boolean: TRUE_P { $$ = make_str("true"); } | OFF { $$ = make_str("off"); } ; -zone_value: Sconst { $$ = $1; } +zone_value: StringConst { $$ = $1; } | DEFAULT { $$ = make_str("default"); } | LOCAL { $$ = make_str("local"); } ; -opt_encoding: Sconst { $$ = $1; } +opt_encoding: StringConst { $$ = $1; } | DEFAULT { $$ = make_str("default"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1037,7 +1033,7 @@ copy_dirn: TO * used depends on the direction. (It really doesn't make sense to copy from * stdout. We silently correct the "typo". - AY 9/94 */ -copy_file_name: Sconst { $$ = $1; } +copy_file_name: StringConst { $$ = $1; } | STDIN { $$ = make_str("stdin"); } | STDOUT { $$ = make_str("stdout"); } ; @@ -1053,7 +1049,7 @@ opt_with_copy: WITH OIDS { $$ = make_str("with oids"); } /* * the default copy delimiter is tab but the user can configure it */ -copy_delimiter: opt_using DELIMITERS Sconst { $$ = cat_str(3, $1, make_str("delimiters"), $3); } +copy_delimiter: opt_using DELIMITERS StringConst { $$ = cat_str(3, $1, make_str("delimiters"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1061,7 +1057,7 @@ opt_using: USING { $$ = make_str("using"); } | /* EMPTY */ { $$ = EMPTY; } ; -copy_null: WITH NULL_P AS Sconst { $$ = cat2_str(make_str("with null as"), $4); } +copy_null: WITH NULL_P AS StringConst { $$ = cat2_str(make_str("with null as"), $4); } | /* EMPTY */ { $$ = EMPTY; } ; @@ -1329,7 +1325,7 @@ OptSeqList: OptSeqList OptSeqElem | { $$ = EMPTY; } ; -OptSeqElem: CACHE IntegerOnly +OptSeqElem: CACHE IntConst { $$ = cat2_str(make_str("cache"), $2); } @@ -1337,48 +1333,24 @@ OptSeqElem: CACHE IntegerOnly { $$ = make_str("cycle"); } - | INCREMENT IntegerOnly + | INCREMENT IntConst { $$ = cat2_str(make_str("increment"), $2); } - | MAXVALUE IntegerOnly + | MAXVALUE IntConst { $$ = cat2_str(make_str("maxvalue"), $2); } - | MINVALUE IntegerOnly + | MINVALUE IntConst { $$ = cat2_str(make_str("minvalue"), $2); } - | START IntegerOnly + | START IntConst { $$ = cat2_str(make_str("start"), $2); } ; -NumericOnly: FloatOnly { $$ = $1; } - | IntegerOnly { $$ = $1; } - -FloatOnly: Fconst - { - $$ = $1; - } - | '-' Fconst - { - $$ = cat2_str(make_str("-"), $2); - } - ; - - -IntegerOnly: Iconst - { - $$ = $1; - } - | '-' Iconst - { - $$ = cat2_str(make_str("-"), $2); - } - ; - /***************************************************************************** * * QUERIES : @@ -1387,8 +1359,8 @@ IntegerOnly: Iconst * *****************************************************************************/ -CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst - HANDLER def_name LANCOMPILER Sconst +CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE StringConst + HANDLER def_name LANCOMPILER StringConst { $$ = cat_str(8, make_str("create"), $2, make_str("precedural language"), $5, make_str("handler"), $7, make_str("langcompiler"), $9); } @@ -1397,7 +1369,7 @@ CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst PLangTrusted: TRUSTED { $$ = make_str("trusted"); } | { $$ = EMPTY; } -DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst +DropPLangStmt: DROP PROCEDURAL LANGUAGE StringConst { $$ = cat2_str(make_str("drop procedural language"), $4); } @@ -1472,15 +1444,10 @@ TriggerFuncArgs: TriggerFuncArg { $$ = EMPTY; } ; -TriggerFuncArg: Iconst +TriggerFuncArg: PosAllConst { $$ = $1; } - | Fconst - { - $$ = $1; - } - | Sconst { $$ = $1; } | ColId { $$ = $1; } ; @@ -1575,8 +1542,7 @@ def_elem: def_name '=' def_arg { def_arg: func_return { $$ = $1; } | TokenId { $$ = $1; } | all_Op { $$ = $1; } - | NumericOnly { $$ = $1; } - | Sconst { $$ = $1; } + | AllConst { $$ = $1; } ; /***************************************************************************** @@ -1671,8 +1637,7 @@ direction: FORWARD { $$ = make_str("forward"); } } ; -fetch_how_many: Iconst { $$ = $1; } - | '-' Iconst { $$ = cat2_str(make_str("-"), $2); } +fetch_how_many: IntConst { $$ = $1; } | ALL { $$ = make_str("all"); } | NEXT { $$ = make_str("next"); } | PRIOR { $$ = make_str("prior"); } @@ -1739,7 +1704,7 @@ comment_op: OPERATOR { $$ = make_str("operator"); } comment_tg: TRIGGER { $$ = make_str("trigger"); } -comment_text: Sconst { $$ = $1; } +comment_text: StringConst { $$ = $1; } | NULL_P { $$ = make_str("null"); } ; @@ -1953,7 +1918,7 @@ RecipeStmt: EXECUTE RECIPE recipe_name *****************************************************************************/ ProcedureStmt: CREATE FUNCTION func_name func_args - RETURNS func_return AS func_as LANGUAGE Sconst opt_with + RETURNS func_return AS func_as LANGUAGE StringConst opt_with { $$ = cat_str(10, make_str("create function"), $3, $4, make_str("returns"), $6, make_str("as"), $8, make_str("language"), $10, $11); } @@ -1998,8 +1963,8 @@ opt_arg: IN { $$ = make_str("in"); } } ; -func_as: Sconst { $$ = $1; } - | Sconst ',' Sconst { $$ = cat_str(3, $1, make_str(","), $3); } +func_as: StringConst { $$ = $1; } + | StringConst ',' StringConst { $$ = cat_str(3, $1, make_str(","), $3); } func_return: Typename { @@ -2292,19 +2257,12 @@ CreatedbStmt: CREATE DATABASE database_name WITH createdb_opt_location createdb } ; -createdb_opt_location: LOCATION '=' Sconst { $$ = cat2_str(make_str("location ="), $3); } +createdb_opt_location: LOCATION '=' StringConst { $$ = cat2_str(make_str("location ="), $3); } | LOCATION '=' DEFAULT { $$ = make_str("location = default"); } | /*EMPTY*/ { $$ = EMPTY; } ; -createdb_opt_encoding: ENCODING '=' Sconst - { -#ifndef MULTIBYTE - mmerror(ET_ERROR, "Multi-byte support is not enabled."); -#endif - $$ = cat2_str(make_str("encoding ="), $3); - } - | ENCODING '=' Iconst +createdb_opt_encoding: ENCODING '=' PosIntStringConst { #ifndef MULTIBYTE mmerror(ET_ERROR, "Multi-byte support is not enabled."); @@ -2732,12 +2690,12 @@ opt_select_limit: LIMIT select_limit_value ',' select_offset_value { $$ = EMPTY; } ; -select_limit_value: Iconst { $$ = $1; } +select_limit_value: PosIntConst { $$ = $1; } | ALL { $$ = make_str("all"); } | PARAM { $$ = make_name(); } ; -select_offset_value: Iconst { $$ = $1; } +select_offset_value: PosIntConst { $$ = $1; } | PARAM { $$ = make_name(); } ; @@ -2986,7 +2944,7 @@ opt_array_bounds: '[' ']' opt_array_bounds } ; -Iresult: Iconst { $$ = atol($1); } +Iresult: PosIntConst { $$ = atol($1); } | '(' Iresult ')' { $$ = $2; } | Iresult '+' Iresult { $$ = $1 + $3; } | Iresult '-' Iresult { $$ = $1 - $3; } @@ -3048,7 +3006,7 @@ Numeric: FLOAT opt_float Geometric: PATH_P { $$ = make_str("path"); }; -opt_float: '(' Iconst ')' +opt_float: '(' PosIntConst ')' { if (atol($2) < 1) mmerror(ET_ERROR, "precision for FLOAT must be at least 1"); @@ -3062,7 +3020,7 @@ opt_float: '(' Iconst ')' } ; -opt_numeric: '(' Iconst ',' Iconst ')' +opt_numeric: '(' PosIntConst ',' PosIntConst ')' { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); @@ -3074,7 +3032,7 @@ opt_numeric: '(' Iconst ',' Iconst ')' } $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); } - | '(' Iconst ')' + | '(' PosIntConst ')' { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); @@ -3088,7 +3046,7 @@ opt_numeric: '(' Iconst ',' Iconst ')' } ; -opt_decimal: '(' Iconst ',' Iconst ')' +opt_decimal: '(' PosIntConst ',' PosIntConst ')' { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); @@ -3100,7 +3058,7 @@ opt_decimal: '(' Iconst ',' Iconst ')' } $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); } - | '(' Iconst ')' + | '(' PosIntConst ')' { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); @@ -3118,7 +3076,7 @@ opt_decimal: '(' Iconst ',' Iconst ')' * SQL92 bit-field data types * The following implements BIT() and BIT VARYING(). */ -Bit: bit '(' Iconst ')' +Bit: bit '(' PosIntConst ')' { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); if (atol($3) < 1) @@ -3149,7 +3107,7 @@ bit: BIT opt_varying * The following implements CHAR() and VARCHAR(). * - ay 6/95 */ -Character: character '(' Iconst ')' +Character: character '(' PosIntConst ')' { if (atol($3) < 1) { @@ -3446,8 +3404,6 @@ a_expr: c_expr } | row_expr { $$ = $1; } - | cinputvariable - { $$ = make_str("?"); } ; /* Restricted expressions @@ -3506,8 +3462,6 @@ b_expr: c_expr { $$ = cat2_str($1, $2); } | b_expr Op { $$ = cat2_str($1, $2); } - | civariableonly - { $$ = $1; } ; /* @@ -3544,7 +3498,7 @@ c_expr: attr { $$ = make_str("current_date"); } | CURRENT_TIME { $$ = make_str("current_time"); } - | CURRENT_TIME '(' Iconst ')' + | CURRENT_TIME '(' PosIntConst ')' { if (atol($3) != 0) { @@ -3556,7 +3510,7 @@ c_expr: attr } | CURRENT_TIMESTAMP { $$ = make_str("current_timestamp"); } - | CURRENT_TIMESTAMP '(' Iconst ')' + | CURRENT_TIMESTAMP '(' PosIntConst ')' { if (atol($3) != 0) { @@ -3622,8 +3576,6 @@ extract_list: extract_arg FROM a_expr } | /* EMPTY */ { $$ = EMPTY; } - | cinputvariable - { $$ = make_str("?"); } ; extract_arg: datetime { $$ = $1; } @@ -3835,28 +3787,20 @@ index_name: ColId { $$ = $1; }; name: ColId { $$ = $1; }; func_name: ColId { $$ = $1; }; -file_name: Sconst { $$ = $1; }; +file_name: StringConst { $$ = $1; }; /* Constants * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24 */ -AexprConst: Iconst +AexprConst: PosAllConst { $$ = $1; } - | Fconst - { - $$ = $1; - } - | Sconst - { - $$ = $1; - } - | ConstTypename Sconst + | ConstTypename StringConst { $$ = cat2_str($1, $2); } - | ConstInterval Sconst opt_interval + | ConstInterval StringConst opt_interval { $$ = cat_str(3, $1, $2, $3); } @@ -3874,6 +3818,8 @@ AexprConst: Iconst { $$ = make_str("null"); } + | civarind + { $$ = make_str("?"); } ; ParamNo: PARAM opt_indirection @@ -3892,6 +3838,36 @@ Sconst: SCONST { $$[strlen($1)+1]='\''; free($1); } +PosIntConst: Iconst { $$ = $1; } + | civar { $$ = make_str("?"); } + ; + +IntConst: PosIntConst { $$ = $1; } + | '-' PosIntConst { $$ = cat2_str(make_str("-"), $2); } + ; + +StringConst: Sconst { $$ = $1; } + | civar { $$ = make_str("?"); } + ; + +PosIntStringConst: Iconst { $$ = $1; } + | Sconst { $$ = $1; } + | civar { $$ = make_str("?"); } + ; +AllConst: Sconst { $$ = $1; } + | Fconst { $$ = $1; } + | Iconst { $$ = $1; } + | '-' Fconst { $$ = cat2_str(make_str("-"), $2); } + | '-' Iconst { $$ = cat2_str(make_str("-"), $2); } + | civar { $$ = make_str("?"); } + ; + +PosAllConst: Sconst { $$ = $1; } + | Fconst { $$ = $1; } + | Iconst { $$ = $1; } + | civar { $$ = make_str("?"); } + ; + UserId: ColId { $$ = $1;}; /* Column identifier @@ -3987,11 +3963,7 @@ connection_target: database_name opt_server opt_port $$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6), $7, make_str("\""))); } - | char_variable - { - $$ = $1; - } - | Sconst + | StringConst { $$ = mm_strdup($1); $$[0] = '\"'; @@ -4034,7 +4006,7 @@ server_name: ColId { $$ = $1; } | ColId '.' server_name { $$ = make3_str($1, make_str("."), $3); } | IP { $$ = make_name(); } -opt_port: ':' Iconst { $$ = make2_str(make_str(":"), $2); } +opt_port: ':' PosIntConst { $$ = make2_str(make_str(":"), $2); } | /* empty */ { $$ = EMPTY; } opt_connection_name: AS connection_target { $$ = $2; } @@ -4065,8 +4037,7 @@ user_name: UserId { if ($1[0] == '\"') else $$ = make3_str(make_str("\""), $1, make_str("\"")); } - | char_variable { $$ = $1; } - | SCONST { $$ = make3_str(make_str("\""), $1, make_str("\"")); } + | StringConst { $$ = make3_str(make_str("\""), $1, make_str("\"")); } char_variable: cvariable { /* check if we have a char variable */ @@ -4528,7 +4499,8 @@ ecpg_using: /* empty */ { $$ = EMPTY; } } ; -variablelist: cinputvariable | cinputvariable ',' variablelist; +variable: civarind | civar +variablelist: variable | variable ',' variablelist; /* * As long as the prepare statement is not supported by the backend, we will @@ -5237,12 +5209,18 @@ 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)); - }; + add_variable(&argsresult, find_variable($1), find_variable($2)); + } + | cvariable + { + add_variable(&argsresult, find_variable($1), &no_indicator); + } + ; -cinputvariable : cvariable indicator + +civarind: cvariable indicator { if ($2 != NULL && (find_variable($2))->type->typ == ECPGt_array) mmerror(ET_ERROR, "arrays of indicators are not allowed on input"); @@ -5250,16 +5228,15 @@ cinputvariable : cvariable indicator add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2)); }; -civariableonly : cvariable +civar: cvariable { add_variable(&argsinsert, find_variable($1), &no_indicator); - $$ = make_str("?"); + $$ = $1; }; -cvariable: CVARIABLE { $$ = $1; }; +cvariable: CVARIABLE { $$ = $1; } -indicator: /* empty */ { $$ = NULL; } - | cvariable { check_indicator((find_variable($1))->type); $$ = $1; } +indicator: 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; } ; @@ -5302,7 +5279,7 @@ c_thing: c_anything { $$ = $1; } c_anything: IDENT { $$ = $1; } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } - | Iconst { $$ = $1; } + | PosIntConst { $$ = $1; } | Fconst { $$ = $1; } | Sconst { $$ = $1; } | '*' { $$ = make_str("*"); } diff --git a/src/interfaces/ecpg/test/test3.pgc b/src/interfaces/ecpg/test/test3.pgc index 44815067ba..75bdad5700 100644 --- a/src/interfaces/ecpg/test/test3.pgc +++ b/src/interfaces/ecpg/test/test3.pgc @@ -18,7 +18,7 @@ exec sql begin declare section; birthinfo ind_birth; } ind_personal; int *ind_married = NULL; - int children; + int children, movevalue = 2; int ind_children; str *married = NULL; char *wifesname="Petra"; @@ -53,8 +53,11 @@ exec sql end declare section; strcpy(msg, "open"); exec sql open cur; - exec sql whenever not found do break; + strcpy(msg, "move"); + exec sql move :movevalue in cur; + exec sql whenever not found do break; + while (1) { strcpy(msg, "fetch"); exec sql fetch from cur into :personal:ind_personal, :married:ind_married, :children:ind_children;