diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 1c3372193d..f369cf89dd 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1810,6 +1810,10 @@ Thu Jun 17 13:50:06 CEST 2004 - Added patch by ISHIDA Akio to allow indicators in execute statements. + +Sun Jun 20 12:44:01 CEST 2004 + + - Synced parser and keyword list. - Set pgtypes library version to 1.2. - Set ecpg version to 3.2.0. - Set compat library version to 1.2. diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index 8011ffe4aa..67525830c4 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.62 2004/04/29 14:08:10 meskes Exp $ + * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.63 2004/06/20 10:45:47 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -292,6 +292,7 @@ static ScanKeyword ScanKeywords[] = { {"substring", SUBSTRING}, {"sysid", SYSID}, {"table", TABLE}, + {"tablespace", TABLESPACE}, {"temp", TEMP}, {"template", TEMPLATE}, {"temporary", TEMPORARY}, diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 7f03deb058..d02a3d0976 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.287 2004/06/17 11:52:25 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.288 2004/06/20 10:45:47 meskes Exp $ */ /* Copyright comment */ %{ @@ -382,7 +382,7 @@ add_additional_variables(char *name, bool insert) STABLE START STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID - TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP TO TOAST + TABLE TABLESPACE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE USER USING @@ -451,7 +451,7 @@ add_additional_variables(char *name, bool insert) %type Typename SimpleTypename Numeric opt_float opt_numeric %type opt_decimal Character character opt_varying opt_charset %type opt_timezone opt_interval table_ref fetch_direction -%type row_descriptor ConstDatetime AlterDomainStmt AlterSeqStmt +%type ConstDatetime AlterDomainStmt AlterSeqStmt %type SelectStmt into_clause OptTemp ConstraintAttributeSpec %type opt_table opt_all sort_clause sortby_list ConstraintAttr %type sortby qualified_name_list name_list ColId_or_Sconst @@ -471,13 +471,13 @@ add_additional_variables(char *name, bool insert) %type def_elem def_list definition DefineStmt select_with_parens %type opt_instead event RuleActionList opt_using CreateAssertStmt %type RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type -%type RuleStmt opt_column oper_argtypes NumConst +%type RuleStmt opt_column oper_argtypes NumConst var_name %type MathOp RemoveFuncStmt aggr_argtype for_update_clause %type RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt %type RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler %type VariableSetStmt var_value zone_value VariableShowStmt %type VariableResetStmt AlterTableStmt from_list overlay_list -%type user_list OptUserList OptUserElem relation_name +%type user_list OptUserList OptUserElem relation_name OptTableSpace %type CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList %type OptSeqElem TriggerForSpec TriggerForOpt TriggerForType %type DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt @@ -506,13 +506,13 @@ add_additional_variables(char *name, bool insert) %type select_limit opt_for_update_clause CheckPointStmt %type OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior %type handler_name any_name_list any_name opt_as insert_column_list -%type columnref dotted_name function_name insert_target_el +%type columnref function_name insert_target_el %type insert_target_list insert_column_item DropRuleStmt %type createfunc_opt_item set_rest var_list_or_default %type CreateFunctionStmt createfunc_opt_list func_table %type DropUserStmt copy_from copy_opt_list copy_opt_item %type opt_oids TableLikeClause key_action opt_definition -%type cast_context row r_expr qual_Op qual_all_Op opt_default +%type cast_context row qual_Op qual_all_Op opt_default %type CreateConversionStmt any_operator opclass_item_list %type iso_level type_list CharacterWithLength ConstCharacter %type CharacterWithoutLength BitWithLength BitWithoutLength @@ -542,7 +542,8 @@ add_additional_variables(char *name, bool insert) %type inf_val_list inf_col_list using_descriptor into_descriptor %type ecpg_into_using prepared_name struct_union_type_with_symbol %type ECPGunreserved ECPGunreserved_interval cvariable -%type AlterDatabaseOwnerStmt +%type AlterDbOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt +%type DropTableSpaceStmt indirection indirection_el %type s_struct_union_symbol @@ -593,7 +594,7 @@ opt_at: AT connection_target }; stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } - | AlterDatabaseOwnerStmt { output_statement($1, 0, connection); } + | AlterDbOwnerStmt { output_statement($1, 0, connection); } | AlterDomainStmt { output_statement($1, 0, connection); } | AlterGroupStmt { output_statement($1, 0, connection); } | AlterSeqStmt { output_statement($1, 0, connection); } @@ -641,6 +642,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } | CreateSeqStmt { output_statement($1, 0, connection); } | CreateStmt { output_statement($1, 0, connection); } | CreateTrigStmt { output_statement($1, 0, connection); } + | CreateTableSpaceStmt { output_statement($1, 0, connection); } | CreateUserStmt { output_statement($1, 0, connection); } | CreatedbStmt { output_statement($1, 0, connection); } /*| DeallocateStmt { output_statement($1, 0, connection); }*/ @@ -654,6 +656,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } | DropPLangStmt { output_statement($1, 0, connection); } | DropRuleStmt { output_statement($1, 0, connection); } | DropStmt { output_statement($1, 0, connection); } + | DropTableSpaceStmt { output_statement($1, 0, connection); } | DropTrigStmt { output_statement($1, 0, connection); } | DropUserStmt { output_statement($1, 0, connection); } | DropdbStmt { output_statement($1, 0, connection); } @@ -969,10 +972,10 @@ DropGroupStmt: DROP GROUP_P UserId * *****************************************************************************/ -CreateSchemaStmt: CREATE SCHEMA UserId OptSchemaName AUTHORIZATION UserId OptSchemaEltList - { $$ = cat_str(6, make_str("create schema"), $3, $4, make_str("authorization"), $6, $7); } - | CREATE SCHEMA ColId OptSchemaEltList - { $$ = cat_str(3, make_str("create schema"), $3, $4); } +CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptTableSpace OptSchemaEltList + { $$ = cat_str(6, make_str("create schema"), $3, make_str("authorization"), $5, $6, $7); } + | CREATE SCHEMA ColId OptTableSpace OptSchemaEltList + { $$ = cat_str(4, make_str("create schema"), $3, $4, $5); } ; OptSchemaName: ColId { $$ = $1; } @@ -1013,9 +1016,9 @@ VariableSetStmt: SET set_rest { $$ = cat2_str(make_str("set session"), $3 ); } ; -set_rest: ColId TO var_list_or_default +set_rest: var_name TO var_list_or_default { $$ = cat_str(3, $1, make_str("to"), $3); } - | ColId "=" var_list_or_default + | var_name "=" var_list_or_default { $$ = cat_str(3, $1, make_str("="), $3); } | TIME ZONE zone_value { $$ = cat2_str(make_str("time zone"), $3); } @@ -1031,6 +1034,11 @@ set_rest: ColId TO var_list_or_default { $$ = make_str("session authorization default"); } ; +var_name: ColId { $$ = $1; } + | var_name '.' ColId { $$ = cat_str(3, $1, make_str("."), $3); } + ; + + var_list_or_default: var_list { $$ = $1; } | DEFAULT @@ -1192,6 +1200,9 @@ alter_table_cmd: /* ALTER TABLE CLUSTER ON */ | CLUSTER ON name { $$ = cat_str(2, make_str("cluster on"), $3); } +/* ALTER TABLE SET WITHOUT CLUSTER */ + | SET WITHOUT CLUSTER + { $$ = make_str("set without cluster"); } ; alter_column_default: @@ -1300,11 +1311,11 @@ opt_using: USING { $$ = make_str("using"); } *****************************************************************************/ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' - OptInherit OptWithOids OnCommitOption - { $$ = cat_str(10, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10); } + OptInherit OptWithOids OnCommitOption OptTableSpace + { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10, $11); } | CREATE OptTemp TABLE qualified_name OF qualified_name - '(' OptTableElementList ')' OptWithOids OnCommitOption - { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11); } + '(' OptTableElementList ')' OptWithOids OnCommitOption OptTableSpace + { $$ = cat_str(12, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11, $12); } ; /* @@ -1494,6 +1505,9 @@ OnCommitOption: ON COMMIT DROP { $$ = make_str("on commit drop"); } | /*EMPTY*/ { $$ = EMPTY; } ; +OptTableSpace: TABLESPACE name { $$ = cat2_str(make_str("tablespace"), $2); } + | /*EMPTY*/ { $$ = EMPTY; } + ; /* * Note: CREATE TABLE ... AS SELECT ... is just another spelling for @@ -1547,8 +1561,8 @@ CreateAsElement: ColId { $$ = $1; } * *****************************************************************************/ -CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList - { $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); } +CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList OptTableSpace + { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5, $6); } ; AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList @@ -1604,12 +1618,10 @@ opt_Trusted: TRUSTED { $$ = make_str("trusted"); } /* This ought to be just func_name, but that causes reduce/reduce conflicts * (CREATE LANGUAGE is the only place where func_name isn't followed by '('). - * Work around by using name and dotted_name separately. + * Work around by using simple names instead. */ -handler_name: name - { $$ = $1; } - | dotted_name - { $$ = $1; /* XXX changing soon */ } +handler_name: name { $$ = $1; } + | name attrs { $$ = cat2_str($1, $2); } ; opt_lancompiler: LANCOMPILER StringConst @@ -1626,6 +1638,35 @@ opt_procedural: PROCEDURAL { $$ = make_str("prcedural"); } | /*EMPTY*/ { $$ = EMPTY; } ; +/***************************************************************************** + * + * QUERY: + * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/' + * + *****************************************************************************/ + +CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst + { $$ = cat_str(5,make_str("create tablespace"), $3, $4, make_str("location"), $6); } + ; + +OptTableSpaceOwner: OWNER name { $$ = cat2_str(make_str("owner"), $2); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +/***************************************************************************** + * + * QUERY : + * DROP TABLESPACE + * + * No need for drop behaviour as we cannot implement dependencies for + * objects in other databases; we can only support RESTRICT. + * + ****************************************************************************/ + + +DropTableSpaceStmt: DROP TABLESPACE name { $$ = cat2_str(make_str("drop tablespace"), $3); }; + + /***************************************************************************** * * QUERIES : @@ -1851,11 +1892,18 @@ any_name_list: any_name { $$ = cat_str(3, $1, make_str(","), $3); } ; -any_name: ColId - { $$ = $1; } - | dotted_name - { $$ = $1; } - ; +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); } + ; + /***************************************************************************** * * QUERY: @@ -2041,6 +2089,8 @@ privilege_target: qualified_name_list { $$ = cat2_str(make_str("language") , $2); } | SCHEMA name_list { $$ = cat2_str(make_str("schema") , $2); } + | TABLESPACE name_list + { $$ = cat2_str(make_str("tablespace") , $2); } ; grantee_list: grantee @@ -2082,13 +2132,13 @@ function_with_argtypes: func_name func_args { $$ = cat2_str($1, $2); }; * QUERY: * create index on * [ using ] "(" ( | using ] )+ ")" - * [ where ] + * [ tablespace ] [ where ] * *****************************************************************************/ IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name - access_method_clause '(' index_params ')' where_clause - { $$ = cat_str(11, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11); } + access_method_clause '(' index_params ')' OptTableSpace where_clause + { $$ = cat_str(12, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11, $12); } ; index_opt_unique: UNIQUE { $$ = make_str("unique"); } @@ -2505,7 +2555,11 @@ createdb_opt_list: createdb_opt_item { $$ = cat2_str($1, $2); } ; -createdb_opt_item: LOCATION opt_equal StringConst +createdb_opt_item: TABLESPACE opt_equal name + { $$ = cat_str(3,make_str("tablespace"), $2, $3); } + | TABLESPACE opt_equal DEFAULT + { $$ = cat_str(3, make_str("tablespace"), $2, make_str("default")); } + | LOCATION opt_equal StringConst { $$ = cat_str(3,make_str("location"), $2, $3); } | LOCATION opt_equal DEFAULT { $$ = cat_str(3, make_str("location"), $2, make_str("default")); } @@ -2535,7 +2589,7 @@ opt_equal: '=' { $$ = make_str("="); } * *****************************************************************************/ -AlterDatabaseOwnerStmt: ALTER DATABASE database_name OWNER TO UserId +AlterDbOwnerStmt: ALTER DATABASE database_name OWNER TO UserId { $$ = cat_str(4, make_str("alter database"), $3, make_str("owner to"), $6); } AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest { $$ = cat_str(4, make_str("alter database"), $3, make_str("set"), $5); } @@ -3413,80 +3467,6 @@ opt_interval: YEAR_P { $$ = make_str("year"); } * expression grammar * *****************************************************************************/ - -/* Expressions using row descriptors - * Define row_descriptor to allow yacc to break the reduce/reduce conflict - * with singleton expressions. - */ -r_expr: row IN_P select_with_parens - { $$ = cat_str(3, $1, make_str("in"), $3); } - | row NOT IN_P select_with_parens - { $$ = cat_str(3, $1, make_str("not in"), $4); } - | row subquery_Op sub_type select_with_parens %prec Op - { $$ = cat_str(4, $1, $2, $3, $4); } - | row subquery_Op select_with_parens %prec Op - { $$ = cat_str(3, $1, $2, $3); } - | row subquery_Op row %prec Op - { $$ = cat_str(3, $1, $2, $3); } - | row IS NULL_P - { $$ = cat2_str($1, make_str("is null")); } - | row IS NOT NULL_P - { $$ = cat2_str($1, make_str("is not null")); } - | row OVERLAPS row - { $$ = cat_str(3, $1, make_str("overlaps"), $3); } - | row IS DISTINCT FROM row %prec IS - { $$ = cat_str(3, $1, make_str("is distinct from"), $5); } - ; - -row: ROW '(' row_descriptor ')' - { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); } - | ROW '(' a_expr ')' - { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); } - | ROW '(' ')' - { $$ = make_str("row()"); } - | '(' row_descriptor ')' - { $$ = cat_str(3, make_str("("), $2, make_str(")")); } - ; - -row_descriptor: expr_list ',' a_expr - { $$ = cat_str(3, $1, make_str(","), $3); } - ; - -sub_type: ANY { $$ = make_str("ANY"); } - | SOME { $$ = make_str("SOME"); } - | ALL { $$ = make_str("ALL"); } - ; - -all_Op: Op { $$ = $1; } - | MathOp { $$ = $1; } - ; - -MathOp: '+' { $$ = make_str("+"); } - | '-' { $$ = make_str("-"); } - | '*' { $$ = make_str("*"); } - | '%' { $$ = make_str("%"); } - | '^' { $$ = make_str("^"); } - | '/' { $$ = make_str("/"); } - | '<' { $$ = make_str("<"); } - | '>' { $$ = make_str(">"); } - | '=' { $$ = make_str("="); } - ; - -qual_Op: Op { $$ = $1; } - | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } - ; - -qual_all_Op: all_Op { $$ = $1; } - | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } - ; - -subquery_Op: all_Op { $$ = $1; } - | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } - | LIKE { $$ = make_str("like"); } - | NOT LIKE { $$ = make_str("not like"); } - | ILIKE { $$ = make_str("ilike"); } - | NOT ILIKE { $$ = make_str("not ilike"); } - ; /* General expressions * This is the heart of the expression syntax. @@ -3634,8 +3614,6 @@ a_expr: c_expr { $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); } | UNIQUE select_with_parens %prec Op { $$ = cat2_str(make_str("unique"), $2); } - | r_expr - { $$ = $1; } ; /* Restricted expressions @@ -3704,10 +3682,8 @@ c_expr: columnref { $$ = $1; } | AexprConst { $$ = $1; } - | PARAM attrs opt_indirection - { $$ = cat_str(3, make_str("param"), $2, $3); } - | '(' a_expr ')' attrs opt_indirection - { $$ = cat_str(5, make_str("("), $2, make_str(")"), $4, $5); } + | PARAM opt_indirection + { $$ = cat2_str(make_str("param"), $2); } | '(' a_expr ')' opt_indirection { $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); } | case_expr @@ -3771,17 +3747,52 @@ c_expr: columnref { $$ = cat2_str(make_str("array"), $2); } | ARRAY array_expr { $$ = cat2_str(make_str("array"), $2); } + | row + { $$ = $1; } ; -/* - * This used to use ecpg_expr, but since there is no shift/reduce conflict - * anymore, we can remove ecpg_expr. - MM - */ -opt_indirection: '[' a_expr ']' opt_indirection - { $$ = cat_str(4, make_str("["), $2, make_str("]"), $4); } - | '[' a_expr ':' a_expr ']' opt_indirection - { $$ = cat_str(6, make_str("["), $2, make_str(":"), $4, make_str("]"), $6); } - | /* EMPTY */ - { $$ = EMPTY; } + +row: ROW '(' expr_list ')' + { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); } + | ROW '(' ')' + { $$ = make_str("row()"); } + | '(' expr_list ',' a_expr ')' + { $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); } + ; + +sub_type: ANY { $$ = make_str("ANY"); } + | SOME { $$ = make_str("SOME"); } + | ALL { $$ = make_str("ALL"); } + ; + +all_Op: Op { $$ = $1; } + | MathOp { $$ = $1; } + ; + +MathOp: '+' { $$ = make_str("+"); } + | '-' { $$ = make_str("-"); } + | '*' { $$ = make_str("*"); } + | '%' { $$ = make_str("%"); } + | '^' { $$ = make_str("^"); } + | '/' { $$ = make_str("/"); } + | '<' { $$ = make_str("<"); } + | '>' { $$ = make_str(">"); } + | '=' { $$ = make_str("="); } + ; + +qual_Op: Op { $$ = $1; } + | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } + ; + +qual_all_Op: all_Op { $$ = $1; } + | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } + ; + +subquery_Op: all_Op { $$ = $1; } + | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); } + | LIKE { $$ = make_str("like"); } + | NOT LIKE { $$ = make_str("not like"); } + | ILIKE { $$ = make_str("ilike"); } + | NOT ILIKE { $$ = make_str("not ilike"); } ; expr_list: a_expr @@ -3918,27 +3929,29 @@ case_default: ELSE a_expr ; case_arg: a_expr { $$ = $1; } - | /*EMPTY*/ { $$ = EMPTY; } + | /*EMPTY*/ { $$ = EMPTY; } ; -columnref: relation_name opt_indirection - { $$ = cat2_str($1, $2); } - | dotted_name opt_indirection - { $$ = cat2_str($1, $2); } +columnref: relation_name { $$ = $1; } + | relation_name indirection { $$ = cat2_str($1, $2); } ; -dotted_name: relation_name attrs - { $$ = cat2_str($1, $2); } - ; +indirection_el: + '.' attr_name { $$ = cat2_str(make_str("."), $2); } + | '.' '*' { $$ = make_str(".*"); } + | '[' a_expr ']' { $$ = cat_str(3, make_str("["), $2, make_str("]")); } + | '[' a_expr ':' a_expr ']' { $$ = cat_str(5, make_str("["), $2, make_str(":"), $4, make_str("]")); } + ; -attrs: '.' attr_name - { $$ = cat2_str(make_str("."), $2); } - | '.' '*' - { $$ = make_str(".*"); } - | '.' attr_name attrs - { $$ = cat_str(3, make_str("."), $2, $3); } - ; +indirection: indirection_el { $$ = $1; } + | indirection indirection_el { $$ = cat2_str($1, $2); } + ; +opt_indirection: + /*EMPTY*/ { $$ = EMPTY; } + | opt_indirection indirection_el { $$ = cat2_str($1, $2);} + ; + opt_empty_parentheses: '(' ')' { $$ = make_str("()"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -3946,11 +3959,10 @@ opt_empty_parentheses: '(' ')' { $$ = make_str("()"); } /***************************************************************************** * - * target lists + * target lists for SELECT, UPDATE, INSERT * *****************************************************************************/ -/* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */ target_list: target_list ',' target_el { $$ = cat_str(3, $1, make_str(","), $3); } | target_el @@ -4047,8 +4059,8 @@ insert_target_list: insert_target_list ',' insert_target_el { $$ = $1; } ; -insert_target_el: target_el { $$ = $1; } - | DEFAULT { $$ = make_str("default"); } +insert_target_el: a_expr { $$ = $1; } + | DEFAULT { $$ = make_str("default"); } ; @@ -4070,8 +4082,8 @@ qualified_name_list: qualified_name qualified_name: relation_name { $$ = $1; } - | dotted_name - { $$ = $1; } + | relation_name attrs + { $$ = cat2_str($1, $2); } ; name_list: name @@ -4089,18 +4101,10 @@ index_name: ColId { $$ = $1; }; file_name: StringConst { $$ = $1; }; -/* func_name will soon return a List ... but not yet */ -/* -func_name: function_name - { $$ = list_make1(makeString($1)); } - | dotted_name - { $$ = $1; } - ; -*/ func_name: function_name { $$ = $1; } - | dotted_name - { $$ = $1; } + | relation_name indirection + { $$ = cat2_str($1, $2); } ; @@ -4115,8 +4119,6 @@ AexprConst: PosAllConst { $$ = cat_str(3, $1, $2, $3); } | ConstInterval '(' PosIntConst ')' StringConst opt_interval { $$ = cat_str(6, $1, make_str("("), $3, make_str(")"), $5, $6); } - | PARAM opt_indirection - { $$ = cat2_str(make_str("param"), $2); } | TRUE_P { $$ = make_str("true"); } | FALSE_P @@ -5898,6 +5900,7 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | STORAGE { $$ = make_str("storage"); } | STRICT_P { $$ = make_str("strict"); } | SYSID { $$ = make_str("sysid"); } + | TABLESPACE { $$ = make_str("tablespace"); } | TEMP { $$ = make_str("temp"); } | TEMPLATE { $$ = make_str("template"); } | TEMPORARY { $$ = make_str("temporary"); }