Replace constants by C variables wherever possible.

This commit is contained in:
Michael Meskes 2000-10-12 18:25:36 +00:00
parent 5bcc226d9d
commit 965a0a40e1
3 changed files with 115 additions and 130 deletions

View File

@ -960,5 +960,10 @@ Wed Oct 4 14:36:51 CEST 2000
Wed Oct 11 16:49:36 CEST 2000 Wed Oct 11 16:49:36 CEST 2000
- Synced preproc.y with gram.y. - 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 ecpg version to 2.8.0.
- Set library version to 3.2.0. - Set library version to 3.2.0.

View File

@ -284,7 +284,7 @@ make_name(void)
%type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
%type <str> OptUnder key_reference comment_text ConstraintDeferrabilitySpec %type <str> OptUnder key_reference comment_text ConstraintDeferrabilitySpec
%type <str> key_match ColLabel SpecialRuleRelation ColId columnDef %type <str> key_match ColLabel SpecialRuleRelation ColId columnDef
%type <str> ColConstraint ColConstraintElem NumericOnly FloatOnly %type <str> ColConstraint ColConstraintElem
%type <str> OptTableElementList OptTableElement TableConstraint %type <str> OptTableElementList OptTableElement TableConstraint
%type <str> ConstraintElem key_actions ColQualList TokenId DropSchemaStmt %type <str> ConstraintElem key_actions ColQualList TokenId DropSchemaStmt
%type <str> target_list target_el update_target_list alias_clause %type <str> target_list target_el update_target_list alias_clause
@ -329,41 +329,41 @@ make_name(void)
%type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
%type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
%type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted %type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted
%type <str> CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg %type <str> CreatePLangStmt TriggerFuncArgs TriggerFuncArg
%type <str> ViewStmt LoadStmt CreatedbStmt createdb_opt_encoding %type <str> ViewStmt LoadStmt CreatedbStmt createdb_opt_encoding
%type <str> createdb_opt_location opt_encoding OptInherit Geometric %type <str> createdb_opt_location opt_encoding OptInherit Geometric
%type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit bit %type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit bit
%type <str> GrantStmt privileges operation_commalist operation %type <str> GrantStmt privileges operation_commalist operation PosAllConst
%type <str> opt_cursor opt_lmode ConstraintsSetStmt comment_tg %type <str> opt_cursor opt_lmode ConstraintsSetStmt comment_tg AllConst
%type <str> case_expr when_clause_list case_default case_arg when_clause %type <str> case_expr when_clause_list case_default case_arg when_clause
%type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec %type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec
%type <str> select_offset_value ReindexStmt join_type opt_only opt_boolean %type <str> select_offset_value ReindexStmt join_type opt_only opt_boolean
%type <str> join_qual update_list AlterSchemaStmt joined_table %type <str> join_qual update_list AlterSchemaStmt joined_table
%type <str> opt_level opt_lock lock_type users_in_new_group_clause %type <str> opt_level opt_lock lock_type users_in_new_group_clause
%type <str> OptConstrFromTable comment_op OptTempTableName %type <str> OptConstrFromTable comment_op OptTempTableName StringConst
%type <str> constraints_set_list constraints_set_namelist comment_fn %type <str> constraints_set_list constraints_set_namelist comment_fn
%type <str> constraints_set_mode comment_type comment_cl comment_ag %type <str> constraints_set_mode comment_type comment_cl comment_ag
%type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete %type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete
%type <str> opt_force key_update CreateSchemaStmt %type <str> opt_force key_update CreateSchemaStmt PosIntStringConst
%type <str> SessionList SessionClause SetSessionStmt %type <str> SessionList SessionClause SetSessionStmt IntConst PosIntConst
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
%type <str> indicator ECPGExecute ECPGPrepare ecpg_using %type <str> indicator ECPGExecute ECPGPrepare ecpg_using
%type <str> storage_clause opt_initializer c_anything blockstart %type <str> storage_clause opt_initializer c_anything blockstart
%type <str> blockend variable_list variable c_thing c_term %type <str> blockend variable_list variable c_thing c_term
%type <str> opt_pointer cvariable ECPGDisconnect dis_name storage_modifier %type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
%type <str> stmt ECPGRelease execstring server_name %type <str> stmt ECPGRelease execstring server_name
%type <str> connection_object opt_server opt_port c_stuff opt_reference %type <str> connection_object opt_server opt_port c_stuff opt_reference
%type <str> user_name opt_user char_variable ora_user ident %type <str> user_name opt_user char_variable ora_user ident
%type <str> db_prefix server opt_options opt_connection_name c_list %type <str> db_prefix server opt_options opt_connection_name c_list
%type <str> ECPGSetConnection cpp_line ECPGTypedef c_args ECPGKeywords %type <str> ECPGSetConnection cpp_line ECPGTypedef c_args ECPGKeywords
%type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate %type <str> enum_type civar civarind ECPGCursorStmt ECPGDeallocate
%type <str> ECPGFree ECPGDeclare ECPGVar opt_at enum_definition %type <str> ECPGFree ECPGDeclare ECPGVar opt_at enum_definition
%type <str> struct_type s_struct declaration declarations variable_declarations %type <str> struct_type s_struct declaration declarations variable_declarations
%type <str> s_union union_type ECPGSetAutocommit on_off %type <str> s_union union_type ECPGSetAutocommit on_off
%type <str> ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol %type <str> ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol
%type <str> ECPGGetDescriptorHeader ECPGColLabel ECPGTypeName %type <str> ECPGGetDescriptorHeader ECPGColLabel ECPGTypeName
%type <str> ECPGLabelTypeName ECPGColId %type <str> ECPGLabelTypeName ECPGColId variablelist cvariable
%type <descriptor> ECPGFetchDescStmt ECPGGetDescriptor %type <descriptor> ECPGFetchDescStmt ECPGGetDescriptor
@ -620,7 +620,7 @@ AlterUserStmt: ALTER USER UserId user_createdb_clause
{ {
$$ = cat_str(5, make_str("alter user"), $3, $4, $5, $6); $$ = 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_createdb_clause
user_createuser_clause user_valid_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; } | /*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"); mmerror(ET_ERROR, "sysid must be positive");
$$ = cat2_str(make_str("sysid"), $2); } $$ = cat2_str(make_str("sysid"), $2); }
@ -691,7 +691,7 @@ user_group_clause: IN GROUP user_list
| /*EMPTY*/ { $$ = EMPTY; } | /*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; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
@ -848,11 +848,7 @@ opt_level: READ COMMITTED { $$ = make_str("read committed"); }
var_value: opt_boolean { $$ = $1; } var_value: opt_boolean { $$ = $1; }
| Sconst { $$ = $1; } | AllConst { $$ = $1; }
| Iconst { $$ = $1; }
| '-' Iconst { $$ = cat2_str(make_str("-"), $2); }
| Fconst { $$ = $1; }
| '-' Fconst { $$ = cat2_str(make_str("-"), $2); }
| name_list { | name_list {
if (strlen($1) == 0) if (strlen($1) == 0)
mmerror(ET_ERROR, "SET must have at least one argument."); 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"); } | OFF { $$ = make_str("off"); }
; ;
zone_value: Sconst { $$ = $1; } zone_value: StringConst { $$ = $1; }
| DEFAULT { $$ = make_str("default"); } | DEFAULT { $$ = make_str("default"); }
| LOCAL { $$ = make_str("local"); } | LOCAL { $$ = make_str("local"); }
; ;
opt_encoding: Sconst { $$ = $1; } opt_encoding: StringConst { $$ = $1; }
| DEFAULT { $$ = make_str("default"); } | DEFAULT { $$ = make_str("default"); }
| /*EMPTY*/ { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
@ -1037,7 +1033,7 @@ copy_dirn: TO
* used depends on the direction. (It really doesn't make sense to copy from * used depends on the direction. (It really doesn't make sense to copy from
* stdout. We silently correct the "typo". - AY 9/94 * stdout. We silently correct the "typo". - AY 9/94
*/ */
copy_file_name: Sconst { $$ = $1; } copy_file_name: StringConst { $$ = $1; }
| STDIN { $$ = make_str("stdin"); } | STDIN { $$ = make_str("stdin"); }
| STDOUT { $$ = make_str("stdout"); } | 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 * 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; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
@ -1061,7 +1057,7 @@ opt_using: USING { $$ = make_str("using"); }
| /* EMPTY */ { $$ = EMPTY; } | /* 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; } | /* EMPTY */ { $$ = EMPTY; }
; ;
@ -1329,7 +1325,7 @@ OptSeqList: OptSeqList OptSeqElem
| { $$ = EMPTY; } | { $$ = EMPTY; }
; ;
OptSeqElem: CACHE IntegerOnly OptSeqElem: CACHE IntConst
{ {
$$ = cat2_str(make_str("cache"), $2); $$ = cat2_str(make_str("cache"), $2);
} }
@ -1337,48 +1333,24 @@ OptSeqElem: CACHE IntegerOnly
{ {
$$ = make_str("cycle"); $$ = make_str("cycle");
} }
| INCREMENT IntegerOnly | INCREMENT IntConst
{ {
$$ = cat2_str(make_str("increment"), $2); $$ = cat2_str(make_str("increment"), $2);
} }
| MAXVALUE IntegerOnly | MAXVALUE IntConst
{ {
$$ = cat2_str(make_str("maxvalue"), $2); $$ = cat2_str(make_str("maxvalue"), $2);
} }
| MINVALUE IntegerOnly | MINVALUE IntConst
{ {
$$ = cat2_str(make_str("minvalue"), $2); $$ = cat2_str(make_str("minvalue"), $2);
} }
| START IntegerOnly | START IntConst
{ {
$$ = cat2_str(make_str("start"), $2); $$ = 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 : * QUERIES :
@ -1387,8 +1359,8 @@ IntegerOnly: Iconst
* *
*****************************************************************************/ *****************************************************************************/
CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE StringConst
HANDLER def_name LANCOMPILER Sconst 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); $$ = 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"); } PLangTrusted: TRUSTED { $$ = make_str("trusted"); }
| { $$ = EMPTY; } | { $$ = EMPTY; }
DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst DropPLangStmt: DROP PROCEDURAL LANGUAGE StringConst
{ {
$$ = cat2_str(make_str("drop procedural language"), $4); $$ = cat2_str(make_str("drop procedural language"), $4);
} }
@ -1472,15 +1444,10 @@ TriggerFuncArgs: TriggerFuncArg
{ $$ = EMPTY; } { $$ = EMPTY; }
; ;
TriggerFuncArg: Iconst TriggerFuncArg: PosAllConst
{ {
$$ = $1; $$ = $1;
} }
| Fconst
{
$$ = $1;
}
| Sconst { $$ = $1; }
| ColId { $$ = $1; } | ColId { $$ = $1; }
; ;
@ -1575,8 +1542,7 @@ def_elem: def_name '=' def_arg {
def_arg: func_return { $$ = $1; } def_arg: func_return { $$ = $1; }
| TokenId { $$ = $1; } | TokenId { $$ = $1; }
| all_Op { $$ = $1; } | all_Op { $$ = $1; }
| NumericOnly { $$ = $1; } | AllConst { $$ = $1; }
| Sconst { $$ = $1; }
; ;
/***************************************************************************** /*****************************************************************************
@ -1671,8 +1637,7 @@ direction: FORWARD { $$ = make_str("forward"); }
} }
; ;
fetch_how_many: Iconst { $$ = $1; } fetch_how_many: IntConst { $$ = $1; }
| '-' Iconst { $$ = cat2_str(make_str("-"), $2); }
| ALL { $$ = make_str("all"); } | ALL { $$ = make_str("all"); }
| NEXT { $$ = make_str("next"); } | NEXT { $$ = make_str("next"); }
| PRIOR { $$ = make_str("prior"); } | PRIOR { $$ = make_str("prior"); }
@ -1739,7 +1704,7 @@ comment_op: OPERATOR { $$ = make_str("operator"); }
comment_tg: TRIGGER { $$ = make_str("trigger"); } comment_tg: TRIGGER { $$ = make_str("trigger"); }
comment_text: Sconst { $$ = $1; } comment_text: StringConst { $$ = $1; }
| NULL_P { $$ = make_str("null"); } | NULL_P { $$ = make_str("null"); }
; ;
@ -1953,7 +1918,7 @@ RecipeStmt: EXECUTE RECIPE recipe_name
*****************************************************************************/ *****************************************************************************/
ProcedureStmt: CREATE FUNCTION func_name func_args 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); $$ = 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; } func_as: StringConst { $$ = $1; }
| Sconst ',' Sconst { $$ = cat_str(3, $1, make_str(","), $3); } | StringConst ',' StringConst { $$ = cat_str(3, $1, make_str(","), $3); }
func_return: Typename 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"); } | LOCATION '=' DEFAULT { $$ = make_str("location = default"); }
| /*EMPTY*/ { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
createdb_opt_encoding: ENCODING '=' Sconst createdb_opt_encoding: ENCODING '=' PosIntStringConst
{
#ifndef MULTIBYTE
mmerror(ET_ERROR, "Multi-byte support is not enabled.");
#endif
$$ = cat2_str(make_str("encoding ="), $3);
}
| ENCODING '=' Iconst
{ {
#ifndef MULTIBYTE #ifndef MULTIBYTE
mmerror(ET_ERROR, "Multi-byte support is not enabled."); mmerror(ET_ERROR, "Multi-byte support is not enabled.");
@ -2732,12 +2690,12 @@ opt_select_limit: LIMIT select_limit_value ',' select_offset_value
{ $$ = EMPTY; } { $$ = EMPTY; }
; ;
select_limit_value: Iconst { $$ = $1; } select_limit_value: PosIntConst { $$ = $1; }
| ALL { $$ = make_str("all"); } | ALL { $$ = make_str("all"); }
| PARAM { $$ = make_name(); } | PARAM { $$ = make_name(); }
; ;
select_offset_value: Iconst { $$ = $1; } select_offset_value: PosIntConst { $$ = $1; }
| PARAM { $$ = make_name(); } | PARAM { $$ = make_name(); }
; ;
@ -2986,7 +2944,7 @@ opt_array_bounds: '[' ']' opt_array_bounds
} }
; ;
Iresult: Iconst { $$ = atol($1); } Iresult: PosIntConst { $$ = atol($1); }
| '(' Iresult ')' { $$ = $2; } | '(' Iresult ')' { $$ = $2; }
| Iresult '+' Iresult { $$ = $1 + $3; } | Iresult '+' Iresult { $$ = $1 + $3; }
| Iresult '-' Iresult { $$ = $1 - $3; } | Iresult '-' Iresult { $$ = $1 - $3; }
@ -3048,7 +3006,7 @@ Numeric: FLOAT opt_float
Geometric: PATH_P { $$ = make_str("path"); }; Geometric: PATH_P { $$ = make_str("path"); };
opt_float: '(' Iconst ')' opt_float: '(' PosIntConst ')'
{ {
if (atol($2) < 1) if (atol($2) < 1)
mmerror(ET_ERROR, "precision for FLOAT must be at least 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) { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $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(")")); $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")"));
} }
| '(' Iconst ')' | '(' PosIntConst ')'
{ {
if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $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) { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $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(")")); $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")"));
} }
| '(' Iconst ')' | '(' PosIntConst ')'
{ {
if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) { if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $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 * SQL92 bit-field data types
* The following implements BIT() and BIT VARYING(). * The following implements BIT() and BIT VARYING().
*/ */
Bit: bit '(' Iconst ')' Bit: bit '(' PosIntConst ')'
{ {
$$ = cat_str(4, $1, make_str("("), $3, make_str(")")); $$ = cat_str(4, $1, make_str("("), $3, make_str(")"));
if (atol($3) < 1) if (atol($3) < 1)
@ -3149,7 +3107,7 @@ bit: BIT opt_varying
* The following implements CHAR() and VARCHAR(). * The following implements CHAR() and VARCHAR().
* - ay 6/95 * - ay 6/95
*/ */
Character: character '(' Iconst ')' Character: character '(' PosIntConst ')'
{ {
if (atol($3) < 1) if (atol($3) < 1)
{ {
@ -3446,8 +3404,6 @@ a_expr: c_expr
} }
| row_expr | row_expr
{ $$ = $1; } { $$ = $1; }
| cinputvariable
{ $$ = make_str("?"); }
; ;
/* Restricted expressions /* Restricted expressions
@ -3506,8 +3462,6 @@ b_expr: c_expr
{ $$ = cat2_str($1, $2); } { $$ = cat2_str($1, $2); }
| b_expr Op | b_expr Op
{ $$ = cat2_str($1, $2); } { $$ = cat2_str($1, $2); }
| civariableonly
{ $$ = $1; }
; ;
/* /*
@ -3544,7 +3498,7 @@ c_expr: attr
{ $$ = make_str("current_date"); } { $$ = make_str("current_date"); }
| CURRENT_TIME | CURRENT_TIME
{ $$ = make_str("current_time"); } { $$ = make_str("current_time"); }
| CURRENT_TIME '(' Iconst ')' | CURRENT_TIME '(' PosIntConst ')'
{ {
if (atol($3) != 0) if (atol($3) != 0)
{ {
@ -3556,7 +3510,7 @@ c_expr: attr
} }
| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP
{ $$ = make_str("current_timestamp"); } { $$ = make_str("current_timestamp"); }
| CURRENT_TIMESTAMP '(' Iconst ')' | CURRENT_TIMESTAMP '(' PosIntConst ')'
{ {
if (atol($3) != 0) if (atol($3) != 0)
{ {
@ -3622,8 +3576,6 @@ extract_list: extract_arg FROM a_expr
} }
| /* EMPTY */ | /* EMPTY */
{ $$ = EMPTY; } { $$ = EMPTY; }
| cinputvariable
{ $$ = make_str("?"); }
; ;
extract_arg: datetime { $$ = $1; } extract_arg: datetime { $$ = $1; }
@ -3835,28 +3787,20 @@ index_name: ColId { $$ = $1; };
name: ColId { $$ = $1; }; name: ColId { $$ = $1; };
func_name: ColId { $$ = $1; }; func_name: ColId { $$ = $1; };
file_name: Sconst { $$ = $1; }; file_name: StringConst { $$ = $1; };
/* Constants /* Constants
* Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24 * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
*/ */
AexprConst: Iconst AexprConst: PosAllConst
{ {
$$ = $1; $$ = $1;
} }
| Fconst | ConstTypename StringConst
{
$$ = $1;
}
| Sconst
{
$$ = $1;
}
| ConstTypename Sconst
{ {
$$ = cat2_str($1, $2); $$ = cat2_str($1, $2);
} }
| ConstInterval Sconst opt_interval | ConstInterval StringConst opt_interval
{ {
$$ = cat_str(3, $1, $2, $3); $$ = cat_str(3, $1, $2, $3);
} }
@ -3874,6 +3818,8 @@ AexprConst: Iconst
{ {
$$ = make_str("null"); $$ = make_str("null");
} }
| civarind
{ $$ = make_str("?"); }
; ;
ParamNo: PARAM opt_indirection ParamNo: PARAM opt_indirection
@ -3892,6 +3838,36 @@ Sconst: SCONST {
$$[strlen($1)+1]='\''; $$[strlen($1)+1]='\'';
free($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;}; UserId: ColId { $$ = $1;};
/* Column identifier /* 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("\""))); $$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6), $7, make_str("\"")));
} }
| char_variable | StringConst
{
$$ = $1;
}
| Sconst
{ {
$$ = mm_strdup($1); $$ = mm_strdup($1);
$$[0] = '\"'; $$[0] = '\"';
@ -4034,7 +4006,7 @@ server_name: ColId { $$ = $1; }
| ColId '.' server_name { $$ = make3_str($1, make_str("."), $3); } | ColId '.' server_name { $$ = make3_str($1, make_str("."), $3); }
| IP { $$ = make_name(); } | IP { $$ = make_name(); }
opt_port: ':' Iconst { $$ = make2_str(make_str(":"), $2); } opt_port: ':' PosIntConst { $$ = make2_str(make_str(":"), $2); }
| /* empty */ { $$ = EMPTY; } | /* empty */ { $$ = EMPTY; }
opt_connection_name: AS connection_target { $$ = $2; } opt_connection_name: AS connection_target { $$ = $2; }
@ -4065,8 +4037,7 @@ user_name: UserId { if ($1[0] == '\"')
else else
$$ = make3_str(make_str("\""), $1, make_str("\"")); $$ = make3_str(make_str("\""), $1, make_str("\""));
} }
| char_variable { $$ = $1; } | StringConst { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
| SCONST { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
char_variable: cvariable char_variable: cvariable
{ /* check if we have a char variable */ { /* 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 * 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; } | 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) if ($2 != NULL && (find_variable($2))->type->typ == ECPGt_array)
mmerror(ET_ERROR, "arrays of indicators are not allowed on input"); 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)); 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); add_variable(&argsinsert, find_variable($1), &no_indicator);
$$ = make_str("?"); $$ = $1;
}; };
cvariable: CVARIABLE { $$ = $1; }; cvariable: CVARIABLE { $$ = $1; }
indicator: /* empty */ { $$ = NULL; } indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; }
| cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
| SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; } | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
| SQL_INDICATOR name { 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; } c_anything: IDENT { $$ = $1; }
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
| Iconst { $$ = $1; } | PosIntConst { $$ = $1; }
| Fconst { $$ = $1; } | Fconst { $$ = $1; }
| Sconst { $$ = $1; } | Sconst { $$ = $1; }
| '*' { $$ = make_str("*"); } | '*' { $$ = make_str("*"); }

View File

@ -18,7 +18,7 @@ exec sql begin declare section;
birthinfo ind_birth; birthinfo ind_birth;
} ind_personal; } ind_personal;
int *ind_married = NULL; int *ind_married = NULL;
int children; int children, movevalue = 2;
int ind_children; int ind_children;
str *married = NULL; str *married = NULL;
char *wifesname="Petra"; char *wifesname="Petra";
@ -53,6 +53,9 @@ exec sql end declare section;
strcpy(msg, "open"); strcpy(msg, "open");
exec sql open cur; exec sql open cur;
strcpy(msg, "move");
exec sql move :movevalue in cur;
exec sql whenever not found do break; exec sql whenever not found do break;
while (1) { while (1) {