From: Michael Meskes Date: Sun, 21 Jul 2002 11:16:07 +0000 (+0000) Subject: Corrected Makefile and preproc.y for big_bison branch. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fa5c512e6016c9a9242739a662a7c3e1ebc8dc05;p=thirdparty%2Fpostgresql.git Corrected Makefile and preproc.y for big_bison branch. --- diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 823ace5929f..f9c7d532d8b 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -1,4 +1,4 @@ -# $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.83 2002/03/11 12:56:02 meskes Exp $ +# $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.83.2.1 2002/07/21 11:16:07 meskes Exp $ subdir = src/interfaces/ecpg/preproc top_builddir = ../../../.. @@ -18,24 +18,11 @@ override CFLAGS += -Wno-error endif OBJS=preproc.o pgc.o type.o ecpg.o ecpg_keywords.o output.o\ - keywords.o c_keywords.o ../lib/typename.o descriptor.o variable.o + keywords.o c_keywords.o ../lib/typename.o descriptor.o variable.o \ + $(SNPRINTF) $(STRDUP) all: ecpg -ifdef SNPRINTF -OBJS+=$(top_builddir)/src/backend/port/snprintf.o - -$(top_builddir)/src/backend/port/snprintf.o: - $(MAKE) -C $(top_builddir)/src/backend/port snprintf.o -endif - -ifdef STRDUP -OBJS+=$(top_builddir)/src/utils/strdup.o - -$(top_builddir)/src/utils/strdup.o: - $(MAKE) -C $(top_builddir)/src/utils strdup.o -endif - ecpg: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LIBS) -o $@ diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 1a58a2096d4..2c0d350b7bf 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.190.2.1 2002/07/01 07:10:10 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.190.2.2 2002/07/21 11:16:07 meskes Exp $ */ /* Copyright comment */ %{ @@ -179,19 +179,19 @@ make_name(void) /* ordinary key words in alphabetical order */ %token ABORT_TRANS, ABSOLUTE, ACCESS, ACTION, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYSE, ANALYZE, AND, ANY, AS, ASC, ASSERTION, - AT, AUTHORIZATION, + ASSIGNMENT, ASYMMETRIC, 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, COPY, + COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, 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, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP, + DEFINER, DELETE_P, DELIMITER, 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, OWNER, + OUT_P, OUTER_P, OVERLAPS, OVERLAY, OWNER, - PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY, + PARTIAL, PASSWORD, PATH_P, PENDANT, PLACING, 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, SMALLINT, SOME, + SESSION, SESSION_USER, SET, SETOF, SHARE, SHOW, SIMILAR, SIMPLE, SMALLINT, SOME, STABLE, START, STATEMENT, STATISTICS, STDIN, STDOUT, STORAGE, STRICT, - SUBSTRING, SYSID, + SUBSTRING, SYMMETRIC, SYSID, TABLE, TEMP, TEMPLATE, TEMPORARY, THEN, TIME, TIMESTAMP, TO, TOAST, - TRAILING, TRANSACTION, TRIGGER, TRIM, TRUE_P, TRUNCATE, TRUSTED, TYPE_P, + TRAILING, TRANSACTION, TREAT, 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, + WHEN, WHERE, WITH, WITHOUT, WORK, WRITE, YEAR_P, ZONE @@ -252,9 +252,6 @@ make_name(void) %token ICONST PARAM %token 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 @@ -264,13 +261,13 @@ make_name(void) %right NOT %right '=' %nonassoc '<' '>' -%nonassoc LIKE ILIKE +%nonassoc LIKE ILIKE SIMILAR %nonassoc ESCAPE %nonassoc OVERLAPS -%nonassoc BETWEEN +%nonassoc BETWEEN DISTINCT %nonassoc IN_P -%left POSTFIXOP /* dummy for postfix Op rules */ -%left Op /* multi-character ops and user-defined operators */ +%left POSTFIXOP /* dummy for postfix Op rules */ +%left Op OPERATOR /* multi-character ops and user-defined operators */ %nonassoc NOTNULL %nonassoc ISNULL %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN @@ -287,7 +284,7 @@ make_name(void) %type Iconst Fconst Sconst TransactionStmt CreateStmt UserId %type CreateAsElement OptCreateAs CreateAsList CreateAsStmt -%type key_reference comment_text ConstraintDeferrabilitySpec +%type comment_text ConstraintDeferrabilitySpec %type key_match ColLabel SpecialRuleRelation ColId columnDef %type ColConstraint ColConstraintElem drop_type Bitconst %type OptTableElementList OptTableElement TableConstraint @@ -299,11 +296,11 @@ make_name(void) %type in_expr_nodes a_expr b_expr TruncateStmt CommentStmt %type opt_indirection expr_list extract_list extract_arg %type position_list substr_list substr_from alter_column_default -%type trim_list in_expr substr_for attrs drop_behavior +%type trim_list in_expr substr_for attrs opt_symmetry %type Typename SimpleTypename Generic Numeric opt_float opt_numeric %type opt_decimal Character character opt_varying opt_charset %type opt_collate opt_timezone opt_interval table_ref -%type row_expr row_descriptor row_list ConstDatetime opt_chain +%type row_descriptor row_list ConstDatetime opt_chain %type SelectStmt into_clause OptTemp ConstraintAttributeSpec %type opt_table opt_all sort_clause sortby_list ConstraintAttr %type sortby OptUseOp qualified_name_list name_list ColId_or_Sconst @@ -311,15 +308,15 @@ make_name(void) %type join_outer where_clause relation_expr sub_type opt_arg %type opt_column_list insert_rest InsertStmt OptimizableStmt %type columnList DeleteStmt LockStmt UpdateStmt CursorStmt -%type NotifyStmt columnElem copy_dirn UnlistenStmt copy_null +%type NotifyStmt columnElem UnlistenStmt %type copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary -%type opt_with_copy FetchStmt direction fetch_how_many from_in +%type FetchStmt direction fetch_how_many from_in %type ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose %type opt_full func_arg OptWithOids opt_freeze opt_ecpg_into %type analyze_keyword opt_name_list ExplainStmt index_params %type index_list func_index index_elem opt_class access_method_clause %type index_opt_unique IndexStmt func_return ConstInterval -%type func_args_list func_args opt_with def_arg +%type func_args_list func_args opt_with def_arg overlay_placing %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 @@ -328,7 +325,7 @@ make_name(void) %type RemoveAggrStmt opt_procedural select_no_parens %type RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler %type VariableSetStmt var_value zone_value VariableShowStmt -%type VariableResetStmt AlterTableStmt from_list +%type VariableResetStmt AlterTableStmt from_list overlay_list %type opt_trans user_list OptUserList OptUserElem relation_name %type CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList %type OptSeqElem TriggerForSpec TriggerForOpt TriggerForType @@ -361,7 +358,10 @@ make_name(void) %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 +%type DropUserStmt copy_from copy_opt_list opt_mode copy_opt_item +%type opt_oids TableLikeClause key_action opt_definition +%type opt_assignment row r_expr qual_Op qual_all_Op opt_default +%type CreateConversionStmt any_operator %type ECPGWhenever ECPGConnect connection_target ECPGOpen %type indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into @@ -399,7 +399,6 @@ make_name(void) %type Iresult -%token YYERROR_VERBOSE %% prog: statements; @@ -498,6 +497,7 @@ stmt: AlterDatabaseSetStmt { 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); @@ -790,8 +790,8 @@ AlterSchemaStmt: ALTER SCHEMA ColId { $$ = cat2_str(make_str("alter scheme"), $3); } ; -DropSchemaStmt: DROP SCHEMA ColId - { $$ = cat2_str(make_str("drop scheme"), $3); } +DropSchemaStmt: DROP SCHEMA ColId opt_drop_behavior + { $$ = cat_str(3, make_str("drop scheme"), $3, $4); } ; OptSchemaName: ColId { $$ = $1; } @@ -835,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 - { $$ = cat2_str(make_str("transaction isolation level"), $4); } + | TRANSACTION ISOLATION LEVEL opt_level opt_mode + { $$ = cat_str(3, make_str("transaction isolation level"), $4, $5); } | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level { $$ = cat2_str(make_str("session characteristics as transaction isolation level"), $7); } | NAMES opt_encoding @@ -863,7 +863,12 @@ 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; } @@ -883,7 +888,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 @@ -974,13 +979,13 @@ AlterTableStmt: | 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 DROP [COLUMN] {RESTRICT|CASCADE} */ - | ALTER TABLE relation_expr DROP opt_column ColId drop_behavior + | ALTER TABLE relation_expr DROP opt_column ColId opt_drop_behavior { $$ = cat_str(6, make_str("alter table"), $3, make_str("drop"), $5, $6, $7); } /* ALTER TABLE ADD CONSTRAINT ... */ | ALTER TABLE relation_expr ADD TableConstraint { $$ = cat_str(4, make_str("alter table"), $3, make_str("add"), $5); } /* ALTER TABLE DROP CONSTRAINT ... */ - | ALTER TABLE relation_expr DROP CONSTRAINT name drop_behavior + | ALTER TABLE relation_expr DROP CONSTRAINT name opt_drop_behavior { $$ = cat_str(5, make_str("alter table"), $3, make_str("drop constraint"), $6, $7); } /* ALTER TABLE CREATE TOAST TABLE */ | ALTER TABLE qualified_name CREATE TOAST TABLE @@ -995,10 +1000,6 @@ alter_column_default: | 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; } @@ -1026,11 +1027,12 @@ opt_id: ColId { $$ = $1; } * *****************************************************************************/ -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); } +CopyStmt: COPY opt_binary qualified_name opt_oids copy_from + copy_file_name copy_delimiter opt_with copy_opt_list + { $$ = cat_str(9, make_str("copy"), $2, $3, $4, $5, $6, $7, $8, $9); } ; -copy_dirn: TO { $$ = make_str("to"); } +copy_from: TO { $$ = make_str("to"); } | FROM { $$ = make_str("from"); } ; @@ -1044,14 +1046,27 @@ copy_file_name: StringConst { $$ = $1; } | STDOUT { $$ = make_str("stdout"); } ; -opt_binary: BINARY { $$ = make_str("binary"); } - | /*EMPTY*/ { $$ = EMPTY; } +copy_opt_list: copy_opt_list copy_opt_item { $$ = cat2_str($1, $2); } + | /* EMPTY */ { $$ = EMPTY; } + ; + +copy_opt_item: BINARY { $$ = make_str("binary"); } + | OIDS { $$ = make_str("oids"); } + | DELIMITER opt_as StringConst + { $$ = cat_str(3, make_str("delimiter"), $2, $3); } + | NULL_P opt_as StringConst + { $$ = cat_str(3, make_str("null"), $2, $3); } ; -opt_with_copy: WITH OIDS { $$ = make_str("with oids"); } - | /*EMPTY*/ { $$ = EMPTY; } +opt_binary: BINARY { $$ = make_str("binary"); } + | /* EMPTY */ { $$ = EMPTY; } ; +opt_oids: WITH OIDS { $$ = make_str("with oids"); } + | /* EMPTY */ { $$ = EMPTY; } + ; + + /* * the default copy delimiter is tab but the user can configure it */ @@ -1065,12 +1080,6 @@ 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 : @@ -1114,7 +1123,8 @@ OptTableElementList: OptTableElementList ',' OptTableElement ; OptTableElement: columnDef { $$ = $1; } - | TableConstraint { $$ = $1; } + | TableLikeClause { $$ = $1; } + | TableConstraint { $$ = $1; } ; columnDef: ColId Typename ColQualList opt_collate @@ -1182,6 +1192,13 @@ ConstraintAttr: DEFERRABLE { $$ = make_str("deferrable"); } | INITIALLY IMMEDIATE { $$ = make_str("initially immediate"); } ; +TableLikeClause: LIKE any_name + { + mmerror(PARSE_ERROR, ET_ERROR, "LIKE in table definitions not yet supported"); + $$ = cat2_str(make_str("like"), $2); + } + ; + /* ConstraintElem specifies constraint syntax which is not embedded into * a column definition. ColConstraintElem specifies the embedded form. * - thomas 1997-12-03 @@ -1234,15 +1251,15 @@ key_actions: key_delete { $$ = $1; } | /*EMPTY*/ { $$ = EMPTY; } ; -key_delete: ON DELETE_P key_reference +key_delete: ON DELETE_P key_action { $$ = cat2_str(make_str("on delete"), $3); } ; -key_update: ON UPDATE key_reference +key_update: ON UPDATE key_action { $$ = cat2_str(make_str("on update"), $3); } ; -key_reference: NO ACTION { $$ = make_str("no action"); } +key_action: NO ACTION { $$ = make_str("no action"); } | RESTRICT { $$ = make_str("restrict"); } | CASCADE { $$ = make_str("cascade"); } | SET DEFAULT { $$ = make_str("set default"); } @@ -1354,8 +1371,8 @@ opt_lancompiler: LANCOMPILER StringConst { $$ = ""; } ; -DropPLangStmt: DROP opt_procedural LANGUAGE StringConst - { $$ = cat_str(4, make_str("drop"), $2, make_str("language"), $4); } +DropPLangStmt: DROP opt_procedural LANGUAGE StringConst opt_drop_behavior + { $$ = cat_str(5, make_str("drop"), $2, make_str("language"), $4, $5); } ; opt_procedural: PROCEDURAL { $$ = make_str("prcedural"); } @@ -1458,8 +1475,8 @@ ConstraintTimeSpec: INITIALLY IMMEDIATE { $$ = make_str("initially deferred"); } ; -DropTrigStmt: DROP TRIGGER name ON qualified_name - { $$ = cat_str(4, make_str("drop trigger"), $3, make_str("on"), $5); } +DropTrigStmt: DROP TRIGGER name ON qualified_name opt_drop_behavior + { $$ = cat_str(5, make_str("drop trigger"), $3, make_str("on"), $5, $6); } ; /***************************************************************************** @@ -1536,6 +1553,7 @@ 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 @@ -1635,7 +1653,7 @@ CommentStmt: COMMENT ON comment_type name 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 + | COMMENT ON TRIGGER name ON any_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); } @@ -1821,6 +1839,15 @@ 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"); } @@ -1926,6 +1953,14 @@ 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: @@ -1936,12 +1971,14 @@ createfunc_opt_item: AS func_as * *****************************************************************************/ -RemoveFuncStmt: DROP FUNCTION func_name func_args - { $$ = cat_str(3, make_str("drop function"), $3, $4); } +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); } ; -RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')' - { $$ = cat_str(5, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")")); } +RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior + { $$ = cat_str(6, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")"), $7); } ; aggr_argtype: Typename { $$ = $1; } @@ -1949,8 +1986,8 @@ aggr_argtype: Typename { $$ = $1; } ; -RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' - { $$ = cat_str(5, make_str("drop operator"), $3, make_str("("), $5, make_str(")")); } +RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' opt_drop_behavior + { $$ = cat_str(6, make_str("drop operator"), $3, make_str("("), $5, make_str(")"), $7); } ; oper_argtypes: Typename @@ -1963,6 +2000,13 @@ 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: @@ -2057,8 +2101,8 @@ opt_instead: INSTEAD { $$ = make_str("instead"); } | /*EMPTY*/ { $$ = EMPTY; } ; -DropRuleStmt: DROP RULE name ON qualified_name - { $$ = cat_str(4, make_str("drop rule"), $3, make_str("on"), $5);} +DropRuleStmt: DROP RULE name ON qualified_name opt_drop_behavior + { $$ = cat_str(5, make_str("drop rule"), $3, make_str("on"), $5, $6);} ; /***************************************************************************** @@ -2222,7 +2266,17 @@ CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_coll 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: @@ -2975,37 +3029,54 @@ opt_interval: YEAR_P { $$ = make_str("year"); } * Define row_descriptor to allow yacc to break the reduce/reduce conflict * with singleton expressions. */ -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(")")); } - ; +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_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 | MathOp; +all_Op: Op { $$ = $1; } + | MathOp { $$ = $1; } + ; MathOp: '+' { $$ = make_str("+"); } | '-' { $$ = make_str("-"); } @@ -3018,6 +3089,14 @@ 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. * @@ -3079,11 +3158,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 Op a_expr + | a_expr qual_Op a_expr %prec Op { $$ = cat_str(3, $1, $2, $3); } - | Op a_expr + | qual_Op a_expr %prec Op { $$ = cat2_str($1, $2); } - | a_expr Op %prec POSTFIXOP + | a_expr qual_Op %prec POSTFIXOP { $$ = cat2_str($1, $2); } | a_expr AND a_expr { $$ = cat_str(3, $1, make_str("and"), $3); } @@ -3107,6 +3186,14 @@ 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 @@ -3136,20 +3223,27 @@ 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 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 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 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 all_Op sub_type select_with_parens %prec Op + { $$ = cat_str(3, $1, make_str("not in"), $4); } + | a_expr qual_all_Op sub_type select_with_parens %prec Op { $$ = cat_str(4, $1, $2, $3, $4); } - | row_expr + | r_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 @@ -3192,10 +3286,12 @@ b_expr: c_expr { $$ = cat_str(3, $1, make_str("="), $3); } | b_expr Op b_expr { $$ = cat_str(3, $1, $2, $3); } - | Op b_expr + | qual_Op b_expr %prec Op { $$ = cat2_str($1, $2); } - | b_expr Op %prec POSTFIXOP + | b_expr qual_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); } ; /* @@ -3216,8 +3312,6 @@ 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 '(' ')' @@ -3246,12 +3340,18 @@ 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(")")); } @@ -3296,7 +3396,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"); } @@ -3306,6 +3406,17 @@ 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); } @@ -4881,7 +4992,8 @@ unreserved_keyword: | AFTER { $$ = make_str("after"); } | AGGREGATE { $$ = make_str("aggregate"); } | ALTER { $$ = make_str("alter"); } - | ASSERTION { $$ = make_str("assertion"); } + | ASSERTION { $$ = make_str("assertion"); } + | ASSIGNMENT { $$ = make_str("assignment"); } | AT { $$ = make_str("at"); } | BACKWARD { $$ = make_str("backward"); } | BEFORE { $$ = make_str("before"); } @@ -4897,7 +5009,8 @@ unreserved_keyword: | COMMENT { $$ = make_str("comment"); } | COMMIT { $$ = make_str("commit"); } | COMMITTED { $$ = make_str("committed"); } - | CONSTRAINTS { $$ = make_str("constraints"); } + | CONSTRAINTS { $$ = make_str("constraints"); } + | CONVERSION_P { $$ = make_str("conversion"); } | COPY { $$ = make_str("copy"); } | CREATEDB { $$ = make_str("createdb"); } | CREATEUSER { $$ = make_str("createuser"); } @@ -4908,6 +5021,7 @@ 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"); } @@ -4984,7 +5098,6 @@ 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"); } @@ -4995,6 +5108,8 @@ 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"); } @@ -5025,6 +5140,7 @@ 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"); } @@ -5064,11 +5180,13 @@ 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"); } ; @@ -5103,6 +5221,7 @@ func_name_keyword: | OUTER_P { $$ = make_str("outer"); } | OVERLAPS { $$ = make_str("overlaps"); } | RIGHT { $$ = make_str("right"); } + | SIMILAR { $$ = make_str("similar"); } | VERBOSE { $$ = make_str("verbose"); } ; @@ -5221,7 +5340,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("\"")); } ;