diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index fc889f18019b2ab48ba44026205adb9c2d8419cd..712c40d32b02fce8172866e6d35ef6394ab8dd88 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.193 2002/07/20 08:24:18 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.194 2002/07/21 08:20:07 meskes Exp $ */ /* Copyright comment */ %{ @@ -179,19 +179,19 @@ make_name(void) /* ordinary key words in alphabetical order */ %token <keyword> ABORT_TRANS, ABSOLUTE, ACCESS, ACTION, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYSE, ANALYZE, AND, ANY, AS, ASC, ASSERTION, - ASSIGNMENT, ASYMMETRIC, AT, AUTHORIZATION, + AT, AUTHORIZATION, BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BIGINT, BINARY, BIT, BOTH, BOOLEAN, BY, CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR_P, CHARACTER, CHARACTERISTICS, CHECK, CHECKPOINT, CLOSE, CLUSTER, COALESCE, COLLATE, - COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, COPY, + COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, COPY, CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE, DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, DEFERRED, - DEFINER, DELETE_P, DELIMITER, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP, + DEFINER, DELETE_P, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP, EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXCLUSIVE, EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT, @@ -218,26 +218,26 @@ make_name(void) NUMERIC, OF, OFF, OFFSET, OIDS, OLD, ON, ONLY, OPERATOR, OPTION, OR, ORDER, - OUT_P, OUTER_P, OVERLAPS, OVERLAY, OWNER, + OUT_P, OUTER_P, OVERLAPS, OWNER, - PARTIAL, PASSWORD, PATH_P, PENDANT, PLACING, POSITION, PRECISION, PRIMARY, + PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PROCEDURAL, READ, REAL, REFERENCES, REINDEX, RELATIVE, RENAME, REPLACE, RESET, RESTRICT, RETURNS, REVOKE, RIGHT, ROLLBACK, ROW, RULE, SCHEMA, SCROLL, SECOND_P, SECURITY, SELECT, SEQUENCE, SERIALIZABLE, - SESSION, SESSION_USER, SET, SETOF, SHARE, SHOW, SIMILAR, SIMPLE, SMALLINT, SOME, + SESSION, SESSION_USER, SET, SETOF, SHARE, SHOW, SMALLINT, SOME, STABLE, START, STATEMENT, STATISTICS, STDIN, STDOUT, STORAGE, STRICT, - SUBSTRING, SYMMETRIC, SYSID, + SUBSTRING, SYSID, TABLE, TEMP, TEMPLATE, TEMPORARY, THEN, TIME, TIMESTAMP, TO, TOAST, - TRAILING, TRANSACTION, TREAT, TRIGGER, TRIM, TRUE_P, TRUNCATE, TRUSTED, TYPE_P, + TRAILING, TRANSACTION, TRIGGER, TRIM, TRUE_P, TRUNCATE, TRUSTED, TYPE_P, UNENCRYPTED, UNION, UNIQUE, UNKNOWN, UNLISTEN, UNTIL, UPDATE, USAGE, USER, USING, VACUUM, VALID, VALUES, VARCHAR, VARYING, VERBOSE, VERSION, VIEW, VOLATILE, - WHEN, WHERE, WITH, WITHOUT, WORK, WRITE, + WHEN, WHERE, WITH, WITHOUT, WORK, YEAR_P, ZONE @@ -252,6 +252,9 @@ make_name(void) %token <ival> ICONST PARAM %token <dval> FCONST +/* these are not real. they are here so that they get generated as #define's*/ +%token OP + /* precedence: lowest to highest */ %left UNION EXCEPT %left INTERSECT @@ -261,13 +264,13 @@ make_name(void) %right NOT %right '=' %nonassoc '<' '>' -%nonassoc LIKE ILIKE SIMILAR +%nonassoc LIKE ILIKE %nonassoc ESCAPE %nonassoc OVERLAPS -%nonassoc BETWEEN DISTINCT +%nonassoc BETWEEN %nonassoc IN_P -%left POSTFIXOP /* dummy for postfix Op rules */ -%left Op OPERATOR /* multi-character ops and user-defined operators */ +%left POSTFIXOP /* dummy for postfix Op rules */ +%left Op /* multi-character ops and user-defined operators */ %nonassoc NOTNULL %nonassoc ISNULL %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN @@ -284,75 +287,81 @@ make_name(void) %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt +%type <str> key_reference comment_text ConstraintDeferrabilitySpec %type <str> key_match ColLabel SpecialRuleRelation ColId columnDef -%type <str> drop_type Bitconst -%type <str> OptTableElementList OptTableElement -%type <str> key_actions type_name AllConst +%type <str> ColConstraint ColConstraintElem drop_type Bitconst +%type <str> OptTableElementList OptTableElement TableConstraint +%type <str> ConstraintElem key_actions ColQualList type_name DropSchemaStmt %type <str> target_list target_el update_target_list alias_clause %type <str> update_target_el opt_id qualified_name database_name %type <str> access_method attr_name index_name name func_name %type <str> file_name AexprConst c_expr ConstTypename var_list -%type <str> in_expr_nodes a_expr b_expr TruncateStmt +%type <str> in_expr_nodes a_expr b_expr TruncateStmt CommentStmt %type <str> opt_indirection expr_list extract_list extract_arg -%type <str> position_list substr_list substr_from -%type <str> trim_list in_expr substr_for attrs opt_symmetry +%type <str> position_list substr_list substr_from alter_column_default +%type <str> trim_list in_expr substr_for attrs drop_behavior %type <str> Typename SimpleTypename Generic Numeric opt_float opt_numeric %type <str> opt_decimal Character character opt_varying opt_charset %type <str> opt_collate opt_timezone opt_interval table_ref -%type <str> row_descriptor row_list ConstDatetime opt_chain -%type <str> SelectStmt into_clause OptTemp -%type <str> opt_table opt_all sort_clause sortby_list +%type <str> row_expr row_descriptor row_list ConstDatetime opt_chain +%type <str> SelectStmt into_clause OptTemp ConstraintAttributeSpec +%type <str> opt_table opt_all sort_clause sortby_list ConstraintAttr %type <str> sortby OptUseOp qualified_name_list name_list ColId_or_Sconst %type <str> group_clause having_clause from_clause opt_distinct %type <str> join_outer where_clause relation_expr sub_type opt_arg %type <str> opt_column_list insert_rest InsertStmt OptimizableStmt %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt -%type <str> NotifyStmt columnElem UnlistenStmt -%type <str> ListenStmt -%type <str> FetchStmt direction fetch_how_many from_in +%type <str> NotifyStmt columnElem copy_dirn UnlistenStmt copy_null +%type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary +%type <str> opt_with_copy FetchStmt direction fetch_how_many from_in %type <str> ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose %type <str> opt_full func_arg OptWithOids opt_freeze opt_ecpg_into %type <str> analyze_keyword opt_name_list ExplainStmt index_params %type <str> index_list func_index index_elem opt_class access_method_clause %type <str> index_opt_unique IndexStmt func_return ConstInterval -%type <str> func_args_list func_args opt_with def_arg overlay_placing -%type <str> def_elem def_list definition select_with_parens -%type <str> opt_instead event RuleActionList -%type <str> RuleActionMulti func_as reindex_type +%type <str> func_args_list func_args opt_with def_arg +%type <str> def_elem def_list definition DefineStmt select_with_parens +%type <str> opt_instead event RuleActionList opt_using CreateAssertStmt +%type <str> RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type %type <str> RuleStmt opt_column opt_name oper_argtypes NumConst %type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause -%type <str> RemoveAggrStmt select_no_parens -%type <str> RemoveOperStmt RenameStmt all_Op +%type <str> RemoveAggrStmt opt_procedural select_no_parens +%type <str> RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler %type <str> VariableSetStmt var_value zone_value VariableShowStmt -%type <str> VariableResetStmt from_list overlay_list -%type <str> opt_trans relation_name -%type <str> simple_select +%type <str> VariableResetStmt AlterTableStmt from_list +%type <str> opt_trans user_list OptUserList OptUserElem relation_name +%type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList +%type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType +%type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt +%type <str> TriggerActionTime CreateTrigStmt DropPLangStmt +%type <str> CreatePLangStmt TriggerFuncArgs TriggerFuncArg simple_select %type <str> ViewStmt LoadStmt CreatedbStmt createdb_opt_item %type <str> createdb_opt_list opt_encoding OptInherit opt_equal -%type <str> DropdbStmt ClusterStmt Bit -%type <str> PosAllConst -%type <str> opt_cursor +%type <str> AlterUserSetStmt privilege_list privilege privilege_target +%type <str> opt_grant_grant_option opt_revoke_grant_option +%type <str> function_with_argtypes_list function_with_argtypes +%type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit +%type <str> GrantStmt privileges PosAllConst constraints_set_list +%type <str> opt_cursor ConstraintsSetStmt AllConst CreateDomainStmt %type <str> case_expr when_clause_list case_default case_arg when_clause %type <str> select_clause opt_select_limit select_limit_value -%type <str> AlterDatabaseSetStmt +%type <str> ConstraintTimeSpec AlterDatabaseSetStmt DropAssertStmt %type <str> select_offset_value ReindexStmt join_type opt_boolean -%type <str> join_qual update_list joined_table -%type <str> opt_level opt_lock lock_type -%type <str> OptTempTableName StringConst -%type <str> opt_empty_parentheses -%type <str> key_delete -%type <str> opt_force key_update PosIntStringConst -%type <str> IntConst PosIntConst func_type opt_or_replace +%type <str> join_qual update_list AlterSchemaStmt joined_table +%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem +%type <str> OptConstrFromTable OptTempTableName StringConst +%type <str> constraints_set_mode comment_type opt_empty_parentheses +%type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete +%type <str> opt_force key_update CreateSchemaStmt PosIntStringConst +%type <str> IntConst PosIntConst grantee_list func_type opt_or_replace %type <str> select_limit opt_for_update_clause CheckPointStmt -%type <str> opt_drop_behavior -%type <str> any_name_list any_name opt_as insert_column_list +%type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior +%type <str> handler_name any_name_list any_name opt_as insert_column_list %type <str> columnref dotted_name function_name insert_target_el %type <str> insert_target_list insert_column_item DropRuleStmt %type <str> createfunc_opt_item set_rest var_list_or_default %type <str> CreateFunctionStmt createfunc_opt_list func_table -%type <str> opt_mode TableLikeClause key_action opt_definition -%type <str> opt_assignment row r_expr qual_Op qual_all_Op opt_default -%type <str> CreateConversionStmt any_operator +%type <str> DropUserStmt %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen %type <str> indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into @@ -390,6 +399,7 @@ make_name(void) %type <ival> Iresult +%token YYERROR_VERBOSE %% prog: statements; @@ -419,16 +429,39 @@ opt_at: AT connection_target }; stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } + | AlterGroupStmt { output_statement($1, 0, connection); } + | AlterSchemaStmt { output_statement($1, 0, connection); } + | AlterTableStmt { output_statement($1, 0, connection); } + | AlterUserStmt { output_statement($1, 0, connection); } + | AlterUserSetStmt { output_statement($1, 0, connection); } | ClosePortalStmt { output_statement($1, 0, connection); } + | CommentStmt { output_statement($1, 0, connection); } + | CopyStmt { output_statement($1, 0, connection); } | CreateStmt { output_statement($1, 0, connection); } | CreateAsStmt { output_statement($1, 0, connection); } + | CreateDomainStmt { output_statement($1, 0, connection); } | CreateFunctionStmt { output_statement($1, 0, connection); } + | CreateSchemaStmt { output_statement($1, 0, connection); } + | CreateGroupStmt { output_statement($1, 0, connection); } + | CreateSeqStmt { output_statement($1, 0, connection); } + | CreatePLangStmt { output_statement($1, 0, connection); } + | CreateAssertStmt { output_statement($1, 0, connection); } + | CreateTrigStmt { output_statement($1, 0, connection); } + | CreateUserStmt { output_statement($1, 0, connection); } | ClusterStmt { output_statement($1, 0, connection); } + | DefineStmt { output_statement($1, 0, connection); } | DropStmt { output_statement($1, 0, connection); } + | DropSchemaStmt { output_statement($1, 0, connection); } | TruncateStmt { output_statement($1, 0, connection); } + | DropGroupStmt { output_statement($1, 0, connection); } + | DropPLangStmt { output_statement($1, 0, connection); } + | DropAssertStmt { output_statement($1, 0, connection); } + | DropTrigStmt { output_statement($1, 0, connection); } | DropRuleStmt { output_statement($1, 0, connection); } + | DropUserStmt { output_statement($1, 0, connection); } | ExplainStmt { output_statement($1, 0, connection); } | FetchStmt { output_statement($1, 1, connection); } + | GrantStmt { output_statement($1, 0, connection); } | IndexStmt { output_statement($1, 0, connection); } | ListenStmt { output_statement($1, 0, connection); } | UnlistenStmt { output_statement($1, 0, connection); } @@ -439,6 +472,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } | RemoveOperStmt { output_statement($1, 0, connection); } | RemoveFuncStmt { output_statement($1, 0, connection); } | RenameStmt { output_statement($1, 0, connection); } + | RevokeStmt { output_statement($1, 0, connection); } | OptimizableStmt { if (strncmp($1, "/* " , sizeof("/* ")-1) == 0) @@ -462,8 +496,8 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } | VariableSetStmt { output_statement($1, 0, connection); } | VariableShowStmt { output_statement($1, 0, connection); } | VariableResetStmt { output_statement($1, 0, connection); } + | ConstraintsSetStmt { output_statement($1, 0, connection); } | CheckPointStmt { output_statement($1, 0, connection); } - | CreateConversionStmt { output_statement($1, 0, connection); } | ECPGAllocateDescr { fprintf(yyout,"ECPGallocate_desc(__LINE__, %s);",$1); @@ -613,6 +647,172 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } } ; + +/* + * We start with a lot of stuff that's very similar to the backend's parsing + */ + +/***************************************************************************** + * + * Create a new Postgres DBMS user + * + * + *****************************************************************************/ + +CreateUserStmt: CREATE USER UserId OptUserList + { $$ = cat_str(3, make_str("create user"), $3, $4); } + | CREATE USER UserId WITH OptUserList + { $$ = cat_str(4, make_str("create user"), $3, make_str("with"), $5); } + ; + +/***************************************************************************** + * + * Alter a postgresql DBMS user + * + * + *****************************************************************************/ + +AlterUserStmt: ALTER USER UserId OptUserList + { $$ = cat_str(3, make_str("alter user"), $3, $4); } + | ALTER USER UserId WITH OptUserList + { $$ = cat_str(4, make_str("alter user"), $3, make_str("with"), $5); } + ; + +AlterUserSetStmt: ALTER USER UserId SET set_rest + { $$ = cat_str(4, make_str("alter user"), $3, make_str("set"), $5); } + | ALTER USER UserId VariableResetStmt + { $$ = cat_str(3, make_str("alter user"), $3, $4); } + ; + +/***************************************************************************** + * + * Drop a postgresql DBMS user + * + * + *****************************************************************************/ +DropUserStmt: DROP USER user_list + { $$ = cat2_str(make_str("drop user"), $3);} + ; +/* + * Options for CREATE USER and ALTER USER + */ + +OptUserList: OptUserList OptUserElem { $$ = cat2_str($1, $2); } + | /* EMPTY */ { $$ = EMPTY; } + ; + +OptUserElem: PASSWORD Sconst + { $$ = cat2_str(make_str("password"), $2); } + | SYSID Iconst + { $$ = cat2_str(make_str("sysid"), $2); } + | CREATEDB + { $$ = make_str("createdb"); } + | NOCREATEDB + { $$ = make_str("nocreatedb"); } + | CREATEUSER + { $$ = make_str("createuser"); } + | NOCREATEUSER + { $$ = make_str("nocreateuser"); } + | IN_P GROUP_P user_list + { $$ = cat2_str(make_str("in group"), $3); } + | VALID UNTIL Sconst + { $$ = cat2_str(make_str("valid until"), $3); } + ; + +user_list: user_list ',' UserId + { $$ = cat_str(3, $1, make_str(","), $3); } + | UserId + { $$ = $1; } + ; + +/***************************************************************************** + * + * Create a postgresql group + * + * + ****************************************************************************/ +CreateGroupStmt: CREATE GROUP_P UserId OptGroupList + { $$ = cat_str(3, make_str("create group"), $3, $4); } + | CREATE GROUP_P UserId WITH OptGroupList + { $$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5); } + ; + +/* + * Options for CREATE GROUP + */ +OptGroupList: OptGroupList OptGroupElem { $$ = cat2_str($1, $2); } + | /* EMPTY */ { $$ = EMPTY; } + ; + +OptGroupElem: USER user_list + { $$ = cat2_str(make_str("user"), $2); } + | SYSID Iconst + { $$ = cat2_str(make_str("sysid"), $2); } + ; + + +/***************************************************************************** + * + * Alter a postgresql group + * + * + *****************************************************************************/ +AlterGroupStmt: ALTER GROUP_P UserId ADD USER user_list + { $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6); } + | ALTER GROUP_P UserId DROP USER user_list + { $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6); } + ; + +/***************************************************************************** + * + * Drop a postgresql group + * + * + *****************************************************************************/ +DropGroupStmt: DROP GROUP_P UserId + { $$ = cat2_str(make_str("drop group"), $3); } + ; + +/***************************************************************************** + * + * Manipulate a schema + * + * + *****************************************************************************/ + +CreateSchemaStmt: CREATE SCHEMA UserId OptSchemaName AUTHORIZATION UserId OptSchemaEltList + { $$ = cat_str(6, make_str("create scheme"), $3, $4, make_str("authorization"), $6, $7); } + | CREATE SCHEMA ColId OptSchemaEltList + { $$ = cat_str(3, make_str("create scheme"), $3, $4); } + ; + +AlterSchemaStmt: ALTER SCHEMA ColId + { $$ = cat2_str(make_str("alter scheme"), $3); } + ; + +DropSchemaStmt: DROP SCHEMA ColId + { $$ = cat2_str(make_str("drop scheme"), $3); } + ; + +OptSchemaName: ColId { $$ = $1; } + | /* EMPTY */ { $$ = EMPTY; } + ; + +OptSchemaEltList: OptSchemaEltList schema_stmt { $$ = cat2_str($1, $2); } + | /* EMPTY */ { $$ = EMPTY; } + ; + +/* + * schema_stmt are the ones that can show up inside a CREATE SCHEMA + * statement (in addition to by themselves). + */ +schema_stmt: CreateStmt { $$ = $1; } + | GrantStmt { $$ = $1; } + | ViewStmt { $$ = $1; } + ; + + + /***************************************************************************** * * Set PG internal variable @@ -635,8 +835,8 @@ set_rest: ColId TO var_list_or_default { $$ = cat_str(3, $1, make_str("="), $3); } | TIME ZONE zone_value { $$ = cat2_str(make_str("time zone"), $3); } - | TRANSACTION ISOLATION LEVEL opt_level opt_mode - { $$ = cat_str(3, make_str("transaction isolation level"), $4, $5); } + | TRANSACTION ISOLATION LEVEL opt_level + { $$ = cat2_str(make_str("transaction isolation level"), $4); } | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level { $$ = cat2_str(make_str("session characteristics as transaction isolation level"), $7); } | NAMES opt_encoding @@ -663,12 +863,7 @@ opt_level: READ COMMITTED { $$ = make_str("read committed"); } | SERIALIZABLE { $$ = make_str("serializable"); } ; -opt_mode: READ WRITE { $$ = make_str("read write"); } - | READ ONLY { mmerror(PARSE_ERROR, ET_ERROR, "SET TRANSACTION/READ ONLY is not yet supported"); - $$ = make_str("read only"); } - | /* EMPTY */ { $$ = EMPTY; } - ; - + var_value: opt_boolean { $$ = $1; } | AllConst { $$ = $1; } | ColId { $$ = $1; } @@ -688,7 +883,7 @@ opt_boolean: TRUE_P { $$ = make_str("true"); } * so use IDENT and reject anything which is a reserved word. */ zone_value: AllConst { $$ = $1; } - | ident { $$ = $1; } + | IDENT { $$ = $1; } | ConstInterval StringConst opt_interval { $$ = cat_str(3, $1, $2, $3); } | ConstInterval '(' PosIntConst ')' StringConst opt_interval @@ -732,12 +927,78 @@ VariableResetStmt: RESET ColId { $$ = make_str("reset all"); } ; +ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode + { $$ = cat_str(3, make_str("set constraints"), $3, $4); } + ; + +constraints_set_list: ALL + { $$ = make_str("all"); } + | name_list + { $$ = $1; } + ; + +constraints_set_mode: DEFERRED { $$ = make_str("deferred"); } + | IMMEDIATE { $$ = make_str("immediate"); } + ; + /* * Checkpoint statement */ CheckPointStmt: CHECKPOINT { $$= make_str("checkpoint"); } ; + +/***************************************************************************** + * + * ALTER TABLE variations + * + *****************************************************************************/ + +AlterTableStmt: +/* ALTER TABLE <relation> ADD [COLUMN] <coldef> */ + ALTER TABLE relation_expr ADD opt_column columnDef + { $$ = cat_str(5, make_str("alter table"), $3, make_str("add"), $5, $6); } +/* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */ + | ALTER TABLE relation_expr ALTER opt_column ColId alter_column_default + { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, $7); } +/* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */ + | ALTER TABLE relation_expr ALTER opt_column ColId DROP NOT NULL_P + { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("drop not null")); } +/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */ + | ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P + { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set not null")); } +/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <Iconst> */ + | ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS Iconst + { $$ = cat_str(7, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set statistics"), $9); } +/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */ + | ALTER TABLE relation_expr ALTER opt_column ColId SET STORAGE ColId + { $$ = cat_str(7, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set storage"), $9); } +/* ALTER TABLE <relation> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */ + | ALTER TABLE relation_expr DROP opt_column ColId drop_behavior + { $$ = cat_str(6, make_str("alter table"), $3, make_str("drop"), $5, $6, $7); } +/* ALTER TABLE <relation> ADD CONSTRAINT ... */ + | ALTER TABLE relation_expr ADD TableConstraint + { $$ = cat_str(4, make_str("alter table"), $3, make_str("add"), $5); } +/* ALTER TABLE <relation> DROP CONSTRAINT ... */ + | ALTER TABLE relation_expr DROP CONSTRAINT name drop_behavior + { $$ = cat_str(5, make_str("alter table"), $3, make_str("drop constraint"), $6, $7); } + /* ALTER TABLE <name> CREATE TOAST TABLE */ + | ALTER TABLE qualified_name CREATE TOAST TABLE + { $$ = cat_str(3, make_str("alter table"), $3, make_str("create toast table")); } +/* ALTER TABLE <name> OWNER TO UserId */ + | ALTER TABLE qualified_name OWNER TO UserId + { $$ = cat_str(4, make_str("alter table"), $3, make_str("owner to"), $6); } + ; + +alter_column_default: + SET DEFAULT a_expr { $$ = cat2_str(make_str("set default"), $3); } + | DROP DEFAULT { $$ = make_str("drop default"); } + ; + +drop_behavior: CASCADE { $$ = make_str("cascade"); } + | RESTRICT { $$ = make_str("restrict"); } + ; + opt_drop_behavior: CASCADE { $$ = make_str("cascade"); } | RESTRICT { $$ = make_str("restrict"); } | /* EMPTY */ { $$ = EMPTY; } @@ -757,6 +1018,59 @@ opt_id: ColId { $$ = $1; } | /*EMPTY*/ { $$ = NULL; } ; +/***************************************************************************** + * + * QUERY : + * COPY [BINARY] <relname> FROM/TO + * [USING DELIMITERS <delimiter>] + * + *****************************************************************************/ + +CopyStmt: COPY opt_binary qualified_name opt_with_copy copy_dirn copy_file_name copy_delimiter copy_null + { $$ = cat_str(8, make_str("copy"), $2, $3, $4, $5, $6, $7, $8); } + ; + +copy_dirn: TO { $$ = make_str("to"); } + | FROM { $$ = make_str("from"); } + ; + +/* + * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is + * 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: StringConst { $$ = $1; } + | STDIN { $$ = make_str("stdin"); } + | STDOUT { $$ = make_str("stdout"); } + ; + +opt_binary: BINARY { $$ = make_str("binary"); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +opt_with_copy: WITH OIDS { $$ = make_str("with oids"); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +/* + * the default copy delimiter is tab but the user can configure it + */ +copy_delimiter: opt_using DELIMITERS StringConst + { $$ = cat_str(3, $1, make_str("delimiters"), $3); } + | /*EMPTY*/ + { $$ = EMPTY; } + ; + +opt_using: USING { $$ = make_str("using"); } + | /* EMPTY */ { $$ = EMPTY; } + ; + +copy_null: WITH NULL_P AS StringConst + { $$ = cat2_str(make_str("with null as"), $4); } + | /* EMPTY */ + { $$ = EMPTY; } + ; + /***************************************************************************** * * QUERY : @@ -800,15 +1114,30 @@ OptTableElementList: OptTableElementList ',' OptTableElement ; OptTableElement: columnDef { $$ = $1; } - | TableLikeClause { $$ = $1; } + | TableConstraint { $$ = $1; } ; -columnDef: ColId Typename opt_collate +columnDef: ColId Typename ColQualList opt_collate { - $$ = cat_str(3, $1, $2, $3); + if (strlen($4) > 0) + { + sprintf(errortext, "Currently unsupported CREATE TABLE / COLLATE %s will be passed to backend", $4); + mmerror(PARSE_ERROR, ET_WARNING, errortext); + } + $$ = cat_str(4, $1, $2, $3, $4); } ; +ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +ColConstraint: CONSTRAINT name ColConstraintElem + { $$ = cat_str(3, make_str("constraint"), $2, $3); } + | ColConstraintElem { $$ = $1; } + | ConstraintAttr { $$ = $1; } + ; + /* DEFAULT NULL is already the default for Postgres. * But define it here and carry it forward into the system * to make it explicit. @@ -820,14 +1149,60 @@ columnDef: ColId Typename opt_collate * shift/reduce conflicts with WITH TIME ZONE anyway. * - thomas 1999-01-08 */ +ColConstraintElem: NOT NULL_P + { $$ = make_str("not null"); } + | NULL_P + { $$ = make_str("null"); } + | UNIQUE + { $$ = make_str("unique"); } + | PRIMARY KEY + { $$ = make_str("primary key"); } + | CHECK '(' a_expr ')' + { $$ = cat_str(3, make_str("check ("), $3, make_str(")")); } + | DEFAULT b_expr + { $$ = cat2_str(make_str("default"), $2); } + | REFERENCES qualified_name opt_column_list key_match key_actions + { $$ = cat_str(5, make_str("references"), $2, $3, $4, $5); } + ; -TableLikeClause: LIKE any_name - { - mmerror(PARSE_ERROR, ET_ERROR, "LIKE in table definitions not yet supported"); - $$ = cat2_str(make_str("like"), $2); - } +/* + * ConstraintAttr represents constraint attributes, which we parse as if + * they were independent constraint clauses, in order to avoid shift/reduce + * conflicts (since NOT might start either an independent NOT NULL clause + * or an attribute). analyze.c is responsible for attaching the attribute + * information to the preceding "real" constraint node, and for complaining + * if attribute clauses appear in the wrong place or wrong combinations. + * + * See also ConstraintAttributeSpec, which can be used in places where + * there is no parsing conflict. + */ +ConstraintAttr: DEFERRABLE { $$ = make_str("deferrable"); } + | NOT DEFERRABLE { $$ = make_str("not deferrable"); } + | INITIALLY DEFERRED { $$ = make_str("initially deferred"); } + | INITIALLY IMMEDIATE { $$ = make_str("initially immediate"); } ; - + +/* ConstraintElem specifies constraint syntax which is not embedded into + * a column definition. ColConstraintElem specifies the embedded form. + * - thomas 1997-12-03 + */ +TableConstraint: CONSTRAINT name ConstraintElem + { $$ = cat_str(3, make_str("constraint"), $2, $3); } + | ConstraintElem + { $$ = $1; } + ; + +ConstraintElem: CHECK '(' a_expr ')' + { $$ = cat_str(3, make_str("check("), $3, make_str(")")); } + | UNIQUE '(' columnList ')' + { $$ = cat_str(3, make_str("unique("), $3, make_str(")")); } + | PRIMARY KEY '(' columnList ')' + { $$ = cat_str(3, make_str("primary key("), $4, make_str(")")); } + | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list + key_match key_actions ConstraintAttributeSpec + { $$ = cat_str(8, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10, $11); } + ; + opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -859,15 +1234,15 @@ key_actions: key_delete { $$ = $1; } | /*EMPTY*/ { $$ = EMPTY; } ; -key_delete: ON DELETE_P key_action +key_delete: ON DELETE_P key_reference { $$ = cat2_str(make_str("on delete"), $3); } ; -key_update: ON UPDATE key_action +key_update: ON UPDATE key_reference { $$ = cat2_str(make_str("on update"), $3); } ; -key_action: NO ACTION { $$ = make_str("no action"); } +key_reference: NO ACTION { $$ = make_str("no action"); } | RESTRICT { $$ = make_str("restrict"); } | CASCADE { $$ = make_str("cascade"); } | SET DEFAULT { $$ = make_str("set default"); } @@ -916,6 +1291,215 @@ CreateAsList: CreateAsList ',' CreateAsElement CreateAsElement: ColId { $$ = $1; } ; + +/***************************************************************************** + * + * QUERY : + * CREATE SEQUENCE seqname + * + *****************************************************************************/ + +CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList + { $$ = cat_str(4, make_str("create sequence"), $2, $4, $5); } + ; + +OptSeqList: OptSeqList OptSeqElem { $$ = cat2_str($1, $2); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +OptSeqElem: CACHE NumConst + { $$ = cat2_str(make_str("cache"), $2); } + | CYCLE + { $$ = make_str("cycle"); } + | INCREMENT NumConst + { $$ = cat2_str(make_str("increment"), $2); } + | MAXVALUE NumConst + { $$ = cat2_str(make_str("maxvalue"), $2); } + | MINVALUE NumConst + { $$ = cat2_str(make_str("minvalue"), $2); } + | START NumConst + { $$ = cat2_str(make_str("start"), $2); } + ; + +/***************************************************************************** + * + * QUERIES : + * CREATE PROCEDURAL LANGUAGE ... + * DROP PROCEDURAL LANGUAGE ... + * + *****************************************************************************/ + +CreatePLangStmt: CREATE opt_Trusted opt_procedural LANGUAGE ColId_or_Sconst + HANDLER handler_name opt_lancompiler + { $$ = cat_str(8, make_str("create"), $2, $3, make_str("language"), $5, make_str("handler"), $7, $8); } + ; + +opt_Trusted: TRUSTED { $$ = make_str("trusted"); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +/* 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. + */ +handler_name: name + { $$ = $1; } + | dotted_name + { $$ = $1; /* XXX changing soon */ } + ; + +opt_lancompiler: LANCOMPILER StringConst + { $$ = cat2_str(make_str("lancompiler"), $2); } + | /*EMPTY*/ + { $$ = ""; } + ; + +DropPLangStmt: DROP opt_procedural LANGUAGE StringConst + { $$ = cat_str(4, make_str("drop"), $2, make_str("language"), $4); } + ; + +opt_procedural: PROCEDURAL { $$ = make_str("prcedural"); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +/***************************************************************************** + * + * QUERIES : + * CREATE TRIGGER ... + * DROP TRIGGER ... + * + *****************************************************************************/ + +CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON + qualified_name TriggerForSpec + EXECUTE PROCEDURE + name '(' TriggerFuncArgs ')' + { $$ = cat_str(12, make_str("create trigger"), $3, $4, $5, make_str("on"), $7, $8, make_str("execute procedure"), $11, make_str("("), $13, make_str(")")); } + | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON + qualified_name OptConstrFromTable + ConstraintAttributeSpec + FOR EACH ROW EXECUTE PROCEDURE + func_name '(' TriggerFuncArgs ')' + { $$ = cat_str(13, make_str("create constraint trigger"), $4, make_str("after"), $6, make_str("on"), $8, $9, $10, make_str("for each row execute procedure"), $16, make_str("("), $18, make_str(")")); } + ; + +TriggerActionTime: BEFORE { $$ = make_str("before"); } + | AFTER { $$ = make_str("after"); } + ; + +TriggerEvents: TriggerOneEvent + { $$ = $1; } + | TriggerOneEvent OR TriggerOneEvent + { $$ = cat_str(3, $1, make_str("or"), $3); } + | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent + { $$ = cat_str(5, $1, make_str("or"), $3, make_str("or"), $5); } + ; + +TriggerOneEvent: INSERT { $$ = make_str("insert"); } + | DELETE_P { $$ = make_str("delete"); } + | UPDATE { $$ = make_str("update"); } + ; + +TriggerForSpec: FOR TriggerForOpt TriggerForType + { $$ = cat_str(3, make_str("for"), $2, $3); } + ; + +TriggerForOpt: EACH { $$ = make_str("each"); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +TriggerForType: ROW { $$ = make_str("row"); } + | STATEMENT { $$ = make_str("statement"); } + ; + +TriggerFuncArgs: TriggerFuncArg + { $$ = $1; } + | TriggerFuncArgs ',' TriggerFuncArg + { $$ = cat_str(3, $1, make_str(","), $3); } + | /*EMPTY*/ + { $$ = EMPTY; } + ; + +TriggerFuncArg: PosAllConst { $$ = $1; } + | ColId { $$ = $1; } + ; + +OptConstrFromTable: /* Empty */ { $$ = EMPTY; } + | FROM qualified_name { $$ = cat2_str(make_str("from"), $2); } + ; + +ConstraintAttributeSpec: ConstraintDeferrabilitySpec { $$ = $1; } + | ConstraintDeferrabilitySpec ConstraintTimeSpec + { + if (strcmp($1, "deferrable") != 0 && strcmp($2, "initially deferrable") == 0 ) + mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE"); + + $$ = cat2_str($1, $2); + } + | ConstraintTimeSpec { $$ = $1; } + | ConstraintTimeSpec ConstraintDeferrabilitySpec + { + if (strcmp($2, "deferrable") != 0 && strcmp($1, "initially deferrable") == 0 ) + mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE"); + + $$ = cat2_str($1, $2); + } + ; + +ConstraintDeferrabilitySpec: NOT DEFERRABLE + { $$ = make_str("not deferrable"); } + | DEFERRABLE + { $$ = make_str("deferrable"); } + ; + +ConstraintTimeSpec: INITIALLY IMMEDIATE + { $$ = make_str("initially immediate"); } + | INITIALLY DEFERRED + { $$ = make_str("initially deferred"); } + ; + +DropTrigStmt: DROP TRIGGER name ON qualified_name + { $$ = cat_str(4, make_str("drop trigger"), $3, make_str("on"), $5); } + ; + +/***************************************************************************** + * + * QUERIES : + * CREATE ASSERTION ... + * DROP ASSERTION ... + * + *****************************************************************************/ +CreateAssertStmt: CREATE ASSERTION name + CHECK '(' a_expr ')' ConstraintAttributeSpec + { + mmerror(PARSE_ERROR, ET_ERROR, "CREATE ASSERTION is not yet supported"); + $$ = cat_str(6, make_str("create assertion"), $3, make_str("check ("), $6, make_str(")"), $8); + } + ; + +DropAssertStmt: DROP ASSERTION name + { + mmerror(PARSE_ERROR, ET_ERROR, "DROP ASSERTION is not yet supported"); + $$ = cat2_str(make_str("drop assertion"), $3); + } + ; + + +/***************************************************************************** + * + * QUERY : + * define (type,operator,aggregate) + * + *****************************************************************************/ + +DefineStmt: CREATE AGGREGATE func_name definition + { $$ = cat_str(3, make_str("create aggregate"), $3, $4); } + | CREATE OPERATOR all_Op definition + { $$ = cat_str(3, make_str("create operator"), $3, $4); } + | CREATE TYPE_P any_name definition + { $$ = cat_str(3, make_str("create type"), $3, $4); } + ; + definition: '(' def_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } ; @@ -952,7 +1536,6 @@ drop_type: TABLE { $$ = make_str("table"); } | INDEX { $$ = make_str("index"); } | TYPE_P { $$ = make_str("type"); } | DOMAIN_P { $$ = make_str("domain"); } - | CONVERSION_P { $$ = make_str("conversion"); } ; any_name_list: any_name @@ -1032,6 +1615,137 @@ from_in: IN_P { $$ = make_str("in"); } | FROM { $$ = make_str("from"); } ; +/***************************************************************************** + * + * The COMMENT ON statement can take different forms based upon the type of + * the object associated with the comment. The form of the statement is: + * + * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ] + * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION + * <funcname> (arg1, arg2, ...) | OPERATOR <op> + * (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON + * <relname> | RULE <rulename> ON <relname> ] IS 'text' + * + *****************************************************************************/ +CommentStmt: COMMENT ON comment_type name IS comment_text + { $$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6); } + | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')' IS comment_text + { $$ = cat_str(6, make_str("comment on aggregate"), $4, make_str("("), $6, make_str(") is"), $9); } + | COMMENT ON FUNCTION func_name func_args IS comment_text + { $$ = cat_str(5, make_str("comment on function"), $4, $5, make_str("is"), $7); } + | COMMENT ON OPERATOR all_Op '(' oper_argtypes ')' IS comment_text + { $$ = cat_str(6, make_str("comment on operator"), $4, make_str("("), $6, make_str(") is"), $9); } + | COMMENT ON TRIGGER name ON qualified_name IS comment_text + { $$ = cat_str(6, make_str("comment on trigger"), $4, make_str("on"), $6, make_str("is"), $8); } + | COMMENT ON RULE name ON any_name IS comment_text + { $$ = cat_str(6, make_str("comment on rule"), $4, make_str("on"), $6, make_str("is"), $8); } + | COMMENT ON RULE name IS comment_text + { $$ = cat_str(4, make_str("comment on rule"), $4, make_str("is"), $6); } + ; + +comment_type: COLUMN { $$ = make_str("column"); } + | DATABASE { $$ = make_str("database"); } + | SCHEMA { $$ = make_str("schema"); } + | INDEX { $$ = make_str("idnex"); } + | SEQUENCE { $$ = make_str("sequence"); } + | TABLE { $$ = make_str("table"); } + | DOMAIN_P { $$ = make_str("domain"); } + | TYPE_P { $$ = make_str("type"); } + | VIEW { $$ = make_str("view"); } + ; + +comment_text: StringConst { $$ = $1; } + | NULL_P { $$ = make_str("null"); } + ; + +/***************************************************************************** + * + * QUERY: + * GRANT and REVOKE statements + * + *****************************************************************************/ + +GrantStmt: GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option + { $$ = cat_str(7, make_str("grant"), $2, make_str("on"), $4, make_str("to"), $6, $7); } + ; + +RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target FROM grantee_list + { $$ = cat_str(8, make_str("revoke"), $2, $3, make_str("on"), $5, make_str("from"), $7); } + ; + +privileges: ALL PRIVILEGES { $$ = make_str("all privileges"); } + | ALL { $$ = make_str("all"); } + | privilege_list { $$ = $1; } + ; + +privilege_list: privilege + { $$ = $1; } + | privilege_list ',' privilege + { $$ = cat_str(3, $1, make_str(","), $3); } + ; + +privilege: SELECT { $$ = make_str("select"); } + | INSERT { $$ = make_str("insert"); } + | UPDATE { $$ = make_str("update"); } + | DELETE_P { $$ = make_str("delete"); } + | RULE { $$ = make_str("rule"); } + | REFERENCES { $$ = make_str("references"); } + | TRIGGER { $$ = make_str("trigger"); } + | EXECUTE { $$ = make_str("execute"); } + | USAGE { $$ = make_str("usage"); } + | CREATE { $$ = make_str("create"); } + | TEMPORARY { $$ = make_str("temporary"); } + | TEMP { $$ = make_str("temp"); } + ; + +privilege_target: qualified_name_list + { $$ = $1; } + | TABLE qualified_name_list + { $$ = cat2_str(make_str("table"), $2); } + | FUNCTION function_with_argtypes_list + { $$ = cat2_str(make_str("function"), $2); } + | DATABASE name_list + { $$ = cat2_str(make_str("database"), $2); } + | LANGUAGE name_list + { $$ = cat2_str(make_str("language") , $2); } + | SCHEMA name_list + { $$ = cat2_str(make_str("schema") , $2); } + ; + +grantee_list: grantee + { $$ = $1; } + | grantee_list ',' grantee + { $$ = cat_str(3, $1, make_str(","), $3); } + ; + +grantee: ColId { $$ = $1; } + | GROUP_P ColId { $$ = cat2_str(make_str("group"), $2); } + ; + +opt_grant_grant_option: WITH GRANT OPTION + { + mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported GRANT/WITH GRANT OPTION will be passed to backend"); + $$ = make_str("with grant option"); + } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +opt_revoke_grant_option: GRANT OPTION FOR + { + mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported REVOKE/GRANT OPTION FOR will be passed to backend"); + $$ = make_str("with grant option"); + } + | /*EMPTY*/ { $$ = EMPTY; } + ; + +function_with_argtypes_list: function_with_argtypes + { $$ = $1; } + | function_with_argtypes_list ',' function_with_argtypes + { $$ = cat_str(3, $1, make_str(","), $3); } + ; + +function_with_argtypes: func_name func_args { $$ = cat2_str($1, $2); }; + /***************************************************************************** * * QUERY: @@ -1107,15 +1821,6 @@ RecipeStmt: EXECUTE RECIPE recipe_name CreateFunctionStmt: CREATE opt_or_replace FUNCTION func_name func_args RETURNS func_return createfunc_opt_list opt_with { $$ = cat_str(8, make_str("create"), $2, make_str("function"), $4, $5, make_str("returns"), $7, $8); } - | CREATE opt_or_replace CAST '(' func_type AS func_type ')' - WITH FUNCTION func_name func_args opt_assignment opt_definition - { $$ = cat_str(11, make_str("create"), $2, make_str("cast ("), $5, make_str("as"), $7, make_str(") with function"), $11, $12, $13, $14); } - | CREATE opt_or_replace CAST '(' func_type AS func_type ')' - WITH FUNCTION func_name func_args AS StringConst opt_definition - { $$ = cat_str(12, make_str("create"), $2, make_str("cast ("), $5, make_str("as"), $7, make_str(") with function"), $11, $12, make_str("as"), $14, $15); } - | CREATE opt_or_replace CAST '(' func_type AS func_type ')' - createfunc_opt_list opt_definition - { $$ = cat_str(9, make_str("create"), $2, make_str("cast ("), $5, make_str("as"), $7, make_str(")"), $9, $10); } ; opt_or_replace: OR REPLACE { $$ = make_str("or replace"); } @@ -1221,14 +1926,6 @@ createfunc_opt_item: AS func_as { $$ = make_str("implicit cast"); } ; -opt_definition: WITH definition { $$ = cat2_str(make_str("with"), $2); } - | /*EMPTY*/ { $$ = EMPTY; } - ; - -opt_assignment: AS ASSIGNMENT { $$ = make_str("as assignment"); } - | /*EMPTY*/ { $$ = EMPTY; } - ; - /***************************************************************************** * * QUERY: @@ -1239,14 +1936,12 @@ opt_assignment: AS ASSIGNMENT { $$ = make_str("as assignment"); } * *****************************************************************************/ -RemoveFuncStmt: DROP FUNCTION func_name func_args opt_drop_behavior - { $$ = cat_str(4, make_str("drop function"), $3, $4, $5); } - | DROP CAST '(' func_type AS func_type ')' opt_drop_behavior - { $$ = cat_str(6, make_str("drop cast ("), $4, make_str("as"), $6, make_str(")"), $8); } +RemoveFuncStmt: DROP FUNCTION func_name func_args + { $$ = cat_str(3, make_str("drop function"), $3, $4); } ; -RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior - { $$ = cat_str(6, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")"), $7); } +RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')' + { $$ = cat_str(5, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")")); } ; aggr_argtype: Typename { $$ = $1; } @@ -1254,8 +1949,8 @@ aggr_argtype: Typename { $$ = $1; } ; -RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' opt_drop_behavior - { $$ = cat_str(6, make_str("drop operator"), $3, make_str("("), $5, make_str(")"), $7); } +RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' + { $$ = cat_str(5, make_str("drop operator"), $3, make_str("("), $5, make_str(")")); } ; oper_argtypes: Typename @@ -1268,13 +1963,6 @@ oper_argtypes: Typename { $$ = cat2_str($1, make_str(", none")); } ; -any_operator: - all_Op - { $$ = $1; } - | ColId '.' any_operator - { $$ = cat_str(3, $1, make_str("."), $3); } - ; - /***************************************************************************** * * QUERY: @@ -1336,14 +2024,28 @@ RuleStmt: CREATE RULE name AS ; RuleActionList: NOTHING { $$ = make_str("nothing"); } + | RuleActionStmt { $$ = $1; } | '(' RuleActionMulti ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } ; /* the thrashing around here is to discard "empty" statements... */ -RuleActionMulti: RuleActionMulti ';' - { $$ = cat_str(2, $1, make_str(";")); } +RuleActionMulti: RuleActionMulti ';' RuleActionStmtOrEmpty + { $$ = cat_str(3, $1, make_str(";"), $3); } + | RuleActionStmtOrEmpty + { $$ = cat2_str($1, make_str(";")); } ; +RuleActionStmt: SelectStmt + | InsertStmt + | UpdateStmt + | DeleteStmt + | NotifyStmt + ; + +RuleActionStmtOrEmpty: RuleActionStmt { $$ = $1; } + | /*EMPTY*/ { $$ = EMPTY; } + ; + /* change me to select, update, etc. some day */ event: SELECT { $$ = make_str("select"); } | UPDATE { $$ = make_str("update"); } @@ -1355,8 +2057,8 @@ opt_instead: INSTEAD { $$ = make_str("instead"); } | /*EMPTY*/ { $$ = EMPTY; } ; -DropRuleStmt: DROP RULE name ON qualified_name opt_drop_behavior - { $$ = cat_str(5, make_str("drop rule"), $3, make_str("on"), $5, $6);} +DropRuleStmt: DROP RULE name ON qualified_name + { $$ = cat_str(4, make_str("drop rule"), $3, make_str("on"), $5);} ; /***************************************************************************** @@ -1511,20 +2213,16 @@ DropdbStmt: DROP DATABASE database_name * *****************************************************************************/ +CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate + { + $$ = cat_str(6, make_str("create domain"), $3, $4, $5, $6, $7); + } + ; + opt_as: AS {$$ = make_str("as"); } | /* EMPTY */ {$$ = EMPTY; } ; - -CreateConversionStmt: - CREATE opt_default CONVERSION_P any_name FOR StringConst - TO StringConst FROM any_name - { $$ = cat_str(10, make_str("create"), $2, make_str("conversion"), $4, make_str("for"), $6, make_str("to"), $8, make_str("from"), $10); } - ; - -opt_default: DEFAULT { $$ = make_str("default"); } - | /* EMPTY */ {$$ = EMPTY; } - ; - + /***************************************************************************** * * QUERY: @@ -2277,54 +2975,37 @@ opt_interval: YEAR_P { $$ = make_str("year"); } * 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 qual_all_Op sub_type select_with_parens %prec Op - { $$ = cat_str(4, $1, $2, $3, $4); } - | row qual_all_Op select_with_parens %prec Op - { $$ = cat_str(3, $1, $2, $3); } - | row qual_all_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 - { $$ = 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_expr: '(' row_descriptor ')' IN_P select_with_parens + { $$ = cat_str(4, make_str("("), $2, make_str(") in "), $5); } + | '(' row_descriptor ')' NOT IN_P select_with_parens + { $$ = cat_str(4, make_str("("), $2, make_str(") not in "), $6); } + | '(' row_descriptor ')' all_Op sub_type select_with_parens + { $$ = cat_str(6, make_str("("), $2, make_str(")"), $4, $5, $6); } + | '(' row_descriptor ')' all_Op select_with_parens + { $$ = cat_str(5, make_str("("), $2, make_str(")"), $4, $5); } + | '(' row_descriptor ')' all_Op '(' row_descriptor ')' + { $$ = cat_str(7, make_str("("), $2, make_str(")"), $4, make_str("("), $6, make_str(")")); } + | '(' row_descriptor ')' OVERLAPS '(' row_descriptor ')' + { $$ = cat_str(5, make_str("("), $2, make_str(") overlaps ("), $6, make_str(")")); } + ; row_descriptor: row_list ',' a_expr { $$ = cat_str(3, $1, make_str(","), $3); } ; +sub_type: ANY { $$ = make_str("ANY"); } + | SOME { $$ = make_str("SOME"); } + | ALL { $$ = make_str("ALL"); } + ; + + row_list: row_list ',' a_expr { $$ = cat_str(3, $1, make_str(","), $3); } | a_expr { $$ = $1; } ; - -sub_type: ANY { $$ = make_str("ANY"); } - | SOME { $$ = make_str("SOME"); } - | ALL { $$ = make_str("ALL"); } - ; -all_Op: Op { $$ = $1; } - | MathOp { $$ = $1; } - ; +all_Op: Op | MathOp; MathOp: '+' { $$ = make_str("+"); } | '-' { $$ = make_str("-"); } @@ -2337,14 +3018,6 @@ MathOp: '+' { $$ = 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(")")); } - ; - /* General expressions * This is the heart of the expression syntax. * @@ -2406,11 +3079,11 @@ a_expr: c_expr { $$ = cat_str(3, $1, make_str(">"), $3); } | a_expr '=' a_expr { $$ = cat_str(3, $1, make_str("="), $3); } - | a_expr qual_Op a_expr %prec Op + | a_expr Op a_expr { $$ = cat_str(3, $1, $2, $3); } - | qual_Op a_expr %prec Op + | Op a_expr { $$ = cat2_str($1, $2); } - | a_expr qual_Op %prec POSTFIXOP + | a_expr Op %prec POSTFIXOP { $$ = cat2_str($1, $2); } | a_expr AND a_expr { $$ = cat_str(3, $1, make_str("and"), $3); } @@ -2434,14 +3107,6 @@ a_expr: c_expr { $$ = cat_str(3, $1, make_str("not ilike"), $4); } | a_expr NOT ILIKE a_expr ESCAPE a_expr { $$ = cat_str(5, $1, make_str("not ilike"), $4, make_str("escape"), $6); } - | a_expr SIMILAR TO a_expr %prec SIMILAR - { $$ = cat_str(3, $1, make_str("similar to"), $4); } - | a_expr SIMILAR TO a_expr ESCAPE a_expr - { $$ = cat_str(5, $1, make_str("similar to"), $4, make_str("escape"), $6); } - | a_expr NOT SIMILAR TO a_expr %prec SIMILAR - { $$ = cat_str(3, $1, make_str("not similar to"), $5); } - | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr - { $$ = cat_str(5, $1, make_str("not similar to"), $5, make_str("escape"), $7); } | a_expr ISNULL { $$ = cat2_str($1, make_str("isnull")); } | a_expr IS NULL_P @@ -2471,27 +3136,20 @@ a_expr: c_expr { $$ = cat2_str($1, make_str("is unknown")); } | a_expr IS NOT UNKNOWN { $$ = cat2_str($1, make_str("is not unknown")); } - | a_expr IS DISTINCT FROM a_expr %prec DISTINCT - { $$ = cat_str(3, $1, make_str("is distinct from"), $5); } - | a_expr BETWEEN opt_symmetry b_expr AND b_expr %prec BETWEEN - { $$ = cat_str(6, $1, make_str("between"), $3, $4, make_str("and"), $6); } - | a_expr NOT BETWEEN opt_symmetry b_expr AND b_expr %prec BETWEEN - { $$ = cat_str(6, $1, make_str("not between"), $4, $5, make_str("and"), $7); } + | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN + { $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); } + | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN + { $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); } | a_expr IN_P in_expr - { $$ = cat_str(3, $1, make_str("in"), $3); } + { $$ = cat_str(3, $1, make_str(" in"), $3); } | a_expr NOT IN_P in_expr - { $$ = cat_str(3, $1, make_str("not in"), $4); } - | a_expr qual_all_Op sub_type select_with_parens %prec Op + { $$ = cat_str(3, $1, make_str(" not in "), $4); } + | a_expr all_Op sub_type select_with_parens %prec Op { $$ = cat_str(4, $1, $2, $3, $4); } - | r_expr + | row_expr { $$ = $1; } ; -opt_symmetry: SYMMETRIC { $$ = make_str("symmetric"); } - | ASYMMETRIC { $$ = make_str("asymmetric"); } - | /* EMPTY */ { $$ = EMPTY; } - ; - /* Restricted expressions * * b_expr is a subset of the complete expression syntax @@ -2534,12 +3192,10 @@ b_expr: c_expr { $$ = cat_str(3, $1, make_str("="), $3); } | b_expr Op b_expr { $$ = cat_str(3, $1, $2, $3); } - | qual_Op b_expr %prec Op + | Op b_expr { $$ = cat2_str($1, $2); } - | b_expr qual_Op %prec POSTFIXOP + | b_expr Op %prec POSTFIXOP { $$ = cat2_str($1, $2); } - | b_expr IS DISTINCT FROM b_expr %prec Op - { $$ = cat_str(3, $1, make_str("is distinct from"), $5); } ; /* @@ -2560,6 +3216,8 @@ c_expr: columnref { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | '(' a_expr ')' attrs opt_indirection { $$ = cat_str(5, make_str("("), $2, make_str(")"), $4, $5); } + | CAST '(' a_expr AS Typename ')' + { $$ = cat_str(5, make_str("cast("), $3, make_str("as"), $5, make_str(")")); } | case_expr { $$ = $1; } | func_name '(' ')' @@ -2588,18 +3246,12 @@ c_expr: columnref { $$ = cat2_str(make_str("session_user"), $2); } | USER opt_empty_parentheses { $$ = cat2_str(make_str("user"), $2); } - | CAST '(' a_expr AS Typename ')' - { $$ = cat_str(5, make_str("cast("), $3, make_str("as"), $5, make_str(")")); } | EXTRACT '(' extract_list ')' { $$ = cat_str(3, make_str("extract("), $3, make_str(")")); } - | OVERLAY '(' overlay_list ')' - { $$ = cat_str(3, make_str("overlay("), $3, make_str(")")); } | POSITION '(' position_list ')' { $$ = cat_str(3, make_str("position("), $3, make_str(")")); } | SUBSTRING '(' substr_list ')' { $$ = cat_str(3, make_str("substring("), $3, make_str(")")); } - | TREAT '(' a_expr AS Typename ')' - { $$ = cat_str(5, make_str("treat("), $3, make_str("as"), $5, make_str(")")); } /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */ | TRIM '(' BOTH trim_list ')' { $$ = cat_str(3, make_str("trim(both"), $4, make_str(")")); } @@ -2644,7 +3296,7 @@ extract_list: extract_arg FROM a_expr * - thomas 2001-04-12 */ -extract_arg: ident { $$ = $1; } +extract_arg: IDENT { $$ = $1; } | YEAR_P { $$ = make_str("year"); } | MONTH_P { $$ = make_str("month"); } | DAY_P { $$ = make_str("day"); } @@ -2654,17 +3306,6 @@ extract_arg: ident { $$ = $1; } | StringConst { $$ = $1; } ; -overlay_list: - a_expr overlay_placing substr_from substr_for - { $$ = cat_str(4, $1, 42, $3, $4); } - | a_expr overlay_placing substr_from - { $$ = cat_str(3, $1, $2, $3); } - ; - -overlay_placing: - PLACING a_expr { $$ = cat2_str(make_str("placing"), $2); } - ; - /* position_list uses b_expr not a_expr to avoid conflict with general IN */ position_list: b_expr IN_P b_expr { $$ = cat_str(3, $1, make_str("in"), $3); } @@ -4240,8 +4881,7 @@ unreserved_keyword: | AFTER { $$ = make_str("after"); } | AGGREGATE { $$ = make_str("aggregate"); } | ALTER { $$ = make_str("alter"); } - | ASSERTION { $$ = make_str("assertion"); } - | ASSIGNMENT { $$ = make_str("assignment"); } + | ASSERTION { $$ = make_str("assertion"); } | AT { $$ = make_str("at"); } | BACKWARD { $$ = make_str("backward"); } | BEFORE { $$ = make_str("before"); } @@ -4257,8 +4897,7 @@ unreserved_keyword: | COMMENT { $$ = make_str("comment"); } | COMMIT { $$ = make_str("commit"); } | COMMITTED { $$ = make_str("committed"); } - | CONSTRAINTS { $$ = make_str("constraints"); } - | CONVERSION_P { $$ = make_str("conversion"); } + | CONSTRAINTS { $$ = make_str("constraints"); } | COPY { $$ = make_str("copy"); } | CREATEDB { $$ = make_str("createdb"); } | CREATEUSER { $$ = make_str("createuser"); } @@ -4269,7 +4908,6 @@ unreserved_keyword: | DECLARE { $$ = make_str("declare"); } | DEFERRED { $$ = make_str("deferred"); } | DELETE_P { $$ = make_str("delete"); } - | DELIMITER { $$ = make_str("delimiter"); } | DELIMITERS { $$ = make_str("delimiters"); } | DOMAIN_P { $$ = make_str("domain"); } | DOUBLE { $$ = make_str("double"); } @@ -4346,6 +4984,7 @@ unreserved_keyword: | RETURNS { $$ = make_str("returns"); } | REVOKE { $$ = make_str("revoke"); } | ROLLBACK { $$ = make_str("rollback"); } + | ROW { $$ = make_str("row"); } | RULE { $$ = make_str("rule"); } | SCHEMA { $$ = make_str("schema"); } | SCROLL { $$ = make_str("scroll"); } @@ -4356,8 +4995,6 @@ unreserved_keyword: | SET { $$ = make_str("set"); } | SHARE { $$ = make_str("share"); } | SHOW { $$ = make_str("show"); } - | SIMPLE { $$ = make_str("simple"); } - | STABLE { $$ = make_str("stable"); } | START { $$ = make_str("start"); } | STATEMENT { $$ = make_str("statement"); } | STATISTICS { $$ = make_str("statistics"); } @@ -4388,7 +5025,6 @@ unreserved_keyword: | VIEW { $$ = make_str("view"); } | WITH { $$ = make_str("with"); } | WITHOUT { $$ = make_str("without"); } - | WRITE { $$ = make_str("write"); } | WORK { $$ = make_str("work"); } | YEAR_P { $$ = make_str("year"); } | ZONE { $$ = make_str("zone"); } @@ -4428,13 +5064,11 @@ col_name_keyword: | NUMERIC { $$ = make_str("numeric"); } | POSITION { $$ = make_str("position"); } | REAL { $$ = make_str("real"); } - | ROW { $$ = make_str("row"); } | SETOF { $$ = make_str("setof"); } | SMALLINT { $$ = make_str("smallint"); } | SUBSTRING { $$ = make_str("substring"); } | TIME { $$ = make_str("time"); } | TIMESTAMP { $$ = make_str("timestamp"); } - | TREAT { $$ = make_str("treat"); } | TRIM { $$ = make_str("trim"); } | VARCHAR { $$ = make_str("varchar"); } ; @@ -4469,7 +5103,6 @@ func_name_keyword: | OUTER_P { $$ = make_str("outer"); } | OVERLAPS { $$ = make_str("overlaps"); } | RIGHT { $$ = make_str("right"); } - | SIMILAR { $$ = make_str("similar"); } | VERBOSE { $$ = make_str("verbose"); } ; @@ -4588,7 +5221,7 @@ indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; } | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; } ; -ident: IDENT { $$ = $1; } +ident: IDENT { $$ = $1; } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } ;