aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interfaces/ecpg/ChangeLog30
-rw-r--r--src/interfaces/ecpg/lib/execute.c4
-rw-r--r--src/interfaces/ecpg/preproc/Makefile5
-rw-r--r--src/interfaces/ecpg/preproc/ecpg_keywords.c5
-rw-r--r--src/interfaces/ecpg/preproc/keywords.c17
-rw-r--r--src/interfaces/ecpg/preproc/pgc.l24
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y743
7 files changed, 549 insertions, 279 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index bfe58fe1a25..ae4bea358bb 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1271,11 +1271,39 @@ Mon Jun 17 15:23:51 CEST 2002
- Fixed parser bug in pgc.l. Octal numbers in single quotes are now
correctly handled.
-Sat Jul 20 10:09:58 CEST 2002
+Tue Jun 18 15:13:15 CEST 2002
+
+ - Fixed parser bug concerning foreign keys.
+ - Synced preproc.y with gram.y.
+ - Synced pgc.l with scan.l.
+ - Synced keywords.c.
+Sun Aug 18 16:09:06 CEST 2002
+
- Synced preproc.y with gram.y.
- Synced pgc.l with scan.l.
+ - Synced keywords.c.
+
+Tue Aug 20 14:13:34 CEST 2002
+
+ - Removed ',' from preproc.y for bison 1.49b.
+
+Sun Sep 1 11:13:04 CEST 2002
+
+ - Synced preproc.y with gram.y.
+ - Synced keywords.c.
+
+Wed Sep 11 10:43:17 CEST 2002
+
+ - Synced preproc.y with gram.y.
+
+
+Fri Sep 20 07:57:42 CEST 2002
+
+ - Synced preproc.y with gram.y.
- Synced keywords.c.
+ - Deactivated backend functions PREPARE, EXECUTE and DEALLOCATE for
+ the time being.
- Set ecpg version to 2.10.0.
- Set library version to 3.4.0.
diff --git a/src/interfaces/ecpg/lib/execute.c b/src/interfaces/ecpg/lib/execute.c
index bad48a750f7..70e1d633c80 100644
--- a/src/interfaces/ecpg/lib/execute.c
+++ b/src/interfaces/ecpg/lib/execute.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.39 2002/09/04 20:31:46 momjian Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.40 2002/10/21 13:09:31 meskes Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
@@ -89,7 +89,7 @@ quote_postgres(char *arg, int lineno)
res[ri++] = '\'';
res[ri] = '\0';
-
+
return res;
}
diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index 0057c0010bf..748d2c2bbd6 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.85 2002/07/27 20:10:05 petere Exp $
+# $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.86 2002/10/21 13:09:31 meskes Exp $
subdir = src/interfaces/ecpg/preproc
top_builddir = ../../../..
@@ -18,7 +18,8 @@ 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: submake-libpgport ecpg
diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.c b/src/interfaces/ecpg/preproc/ecpg_keywords.c
index 9010956fa88..fecf892cfc0 100644
--- a/src/interfaces/ecpg/preproc/ecpg_keywords.c
+++ b/src/interfaces/ecpg/preproc/ecpg_keywords.c
@@ -4,7 +4,7 @@
* lexical token lookup for reserved words in postgres embedded SQL
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.26 2002/05/19 20:00:53 meskes Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.27 2002/10/21 13:09:31 meskes Exp $
*
*-------------------------------------------------------------------------
*/
@@ -38,13 +38,11 @@ static ScanKeyword ScanKeywords[] = {
{"data", SQL_DATA},
{"datetime_interval_code", SQL_DATETIME_INTERVAL_CODE},
{"datetime_interval_precision", SQL_DATETIME_INTERVAL_PRECISION},
- {"deallocate", SQL_DEALLOCATE},
{"descriptor", SQL_DESCRIPTOR},
{"disconnect", SQL_DISCONNECT},
{"enum", SQL_ENUM},
{"found", SQL_FOUND},
{"free", SQL_FREE},
- {"get", SQL_GET},
{"go", SQL_GO},
{"goto", SQL_GOTO},
{"identified", SQL_IDENTIFIED},
@@ -56,7 +54,6 @@ static ScanKeyword ScanKeywords[] = {
{"nullable", SQL_NULLABLE},
{"octet_length", SQL_OCTET_LENGTH},
{"open", SQL_OPEN},
- {"prepare", SQL_PREPARE},
{"reference", SQL_REFERENCE},
{"release", SQL_RELEASE},
{"returned_length", SQL_RETURNED_LENGTH},
diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c
index e5df0c97a2d..e17af9298e2 100644
--- a/src/interfaces/ecpg/preproc/keywords.c
+++ b/src/interfaces/ecpg/preproc/keywords.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.54 2002/07/21 11:09:41 meskes Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.55 2002/10/21 13:09:31 meskes Exp $
*
*-------------------------------------------------------------------------
*/
@@ -44,6 +44,7 @@ static ScanKeyword ScanKeywords[] = {
{"as", AS},
{"asc", ASC},
{"assertion", ASSERTION},
+ {"assignment", ASSIGNMENT},
{"at", AT},
{"authorization", AUTHORIZATION},
{"backward", BACKWARD},
@@ -67,6 +68,7 @@ static ScanKeyword ScanKeywords[] = {
{"characteristics", CHARACTERISTICS},
{"check", CHECK},
{"checkpoint", CHECKPOINT},
+ {"class", CLASS},
{"close", CLOSE},
{"cluster", CLUSTER},
{"coalesce", COALESCE},
@@ -77,6 +79,8 @@ static ScanKeyword ScanKeywords[] = {
{"committed", COMMITTED},
{"constraint", CONSTRAINT},
{"constraints", CONSTRAINTS},
+ {"conversion", CONVERSION_P},
+ {"convert", CONVERT},
{"copy", COPY},
{"create", CREATE},
{"createdb", CREATEDB},
@@ -90,6 +94,7 @@ static ScanKeyword ScanKeywords[] = {
{"cycle", CYCLE},
{"database", DATABASE},
{"day", DAY_P},
+ {"deallocate", DEALLOCATE},
{"dec", DEC},
{"decimal", DECIMAL},
{"declare", DECLARE},
@@ -98,6 +103,7 @@ static ScanKeyword ScanKeywords[] = {
{"deferred", DEFERRED},
{"definer", DEFINER},
{"delete", DELETE_P},
+ {"delimiter", DELIMITER},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},
@@ -129,6 +135,7 @@ static ScanKeyword ScanKeywords[] = {
{"from", FROM},
{"full", FULL},
{"function", FUNCTION},
+ {"get", GET},
{"global", GLOBAL},
{"grant", GRANT},
{"group", GROUP_P},
@@ -138,7 +145,7 @@ static ScanKeyword ScanKeywords[] = {
{"ilike", ILIKE},
{"immediate", IMMEDIATE},
{"immutable", IMMUTABLE},
- {"implicit", IMPLICIT},
+ {"implicit", IMPLICIT_P},
{"in", IN_P},
{"increment", INCREMENT},
{"index", INDEX},
@@ -218,6 +225,7 @@ static ScanKeyword ScanKeywords[] = {
{"pendant", PENDANT},
{"position", POSITION},
{"precision", PRECISION},
+ {"prepare", PREPARE},
{"primary", PRIMARY},
{"prior", PRIOR},
{"privileges", PRIVILEGES},
@@ -225,6 +233,7 @@ static ScanKeyword ScanKeywords[] = {
{"procedure", PROCEDURE},
{"read", READ},
{"real", REAL},
+ {"recheck", RECHECK},
{"references", REFERENCES},
{"reindex", REINDEX},
{"relative", RELATIVE},
@@ -251,6 +260,8 @@ static ScanKeyword ScanKeywords[] = {
{"setof", SETOF},
{"share", SHARE},
{"show", SHOW},
+ {"similar", SIMILAR},
+ {"simple", SIMPLE},
{"smallint", SMALLINT},
{"some", SOME},
{"stable", STABLE},
@@ -274,6 +285,7 @@ static ScanKeyword ScanKeywords[] = {
{"toast", TOAST},
{"trailing", TRAILING},
{"transaction", TRANSACTION},
+ {"treat", TREAT},
{"trigger", TRIGGER},
{"trim", TRIM},
{"true", TRUE_P},
@@ -304,6 +316,7 @@ static ScanKeyword ScanKeywords[] = {
{"with", WITH},
{"without", WITHOUT},
{"work", WORK},
+ {"write", WRITE},
{"year", YEAR_P},
{"zone", ZONE},
};
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index d9d09d90f75..55758061f7a 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.99 2002/09/02 06:11:42 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.100 2002/10/21 13:09:31 meskes Exp $
*
*-------------------------------------------------------------------------
*/
@@ -117,7 +117,7 @@ xbcat {quote}{whitespace_with_newline}{quote}
*/
xhstart [xX]{quote}
xhstop {quote}
-xhinside [^']+
+xhinside [^']*
xhcat {quote}{whitespace_with_newline}{quote}
/* National character
@@ -333,7 +333,7 @@ cppline {space}*#(.*\\{space})*.*
if (literalbuf[strspn(literalbuf, "01") + 1] != '\0')
mmerror(PARSE_ERROR, ET_ERROR, "invalid bit string input.");
yylval.str = literalbuf;
- return BITCONST;
+ return BCONST;
}
<xh>{xhinside} |
@@ -346,23 +346,11 @@ cppline {space}*#(.*\\{space})*.*
token_start = yytext;
BEGIN(xh);
startlit();
+ addlitchar('x');
}
<xh>{xhstop} {
- long val;
- char* endptr;
-
- BEGIN(SQL);
- errno = 0;
- val = strtol(literalbuf, &endptr, 16);
- if (*endptr != '\0' || errno == ERANGE
-#ifdef HAVE_LONG_INT_64
- /* if long > 32 bits, check for overflow of int4 */
- || val != (long) ((int32) val)
-#endif
- )
- mmerror(PARSE_ERROR, ET_ERROR, "Bad hexadecimal integer input");
- yylval.ival = val;
- return ICONST;
+ yylval.str = literalbuf;
+ return XCONST;
}
<xh><<EOF>> { mmerror(PARSE_ERROR, ET_ERROR, "Unterminated hexadecimal integer"); }
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 2a8aefbfe57..18723954648 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.198 2002/09/22 21:54:31 tgl Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.199 2002/10/21 13:09:31 meskes Exp $ */
/* Copyright comment */
%{
@@ -155,12 +155,12 @@ make_name(void)
SQL_CALL SQL_CARDINALITY SQL_CONNECT SQL_CONNECTION
SQL_CONTINUE SQL_COUNT SQL_CURRENT SQL_DATA
SQL_DATETIME_INTERVAL_CODE
- SQL_DATETIME_INTERVAL_PRECISION SQL_DEALLOCATE
+ SQL_DATETIME_INTERVAL_PRECISION
SQL_DESCRIPTOR SQL_DISCONNECT SQL_ENUM SQL_FOUND
- SQL_FREE SQL_GET SQL_GO SQL_GOTO SQL_IDENTIFIED
+ SQL_FREE SQL_GO SQL_GOTO SQL_IDENTIFIED
SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
SQL_LONG SQL_NAME SQL_NULLABLE SQL_OCTET_LENGTH
- SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE
+ SQL_OPEN SQL_RELEASE SQL_REFERENCE
SQL_RETURNED_LENGTH SQL_RETURNED_OCTET_LENGTH SQL_SCALE
SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQL SQL_SQLERROR
SQL_SQLPRINT SQL_SQLWARNING SQL_START SQL_STOP
@@ -178,30 +178,32 @@ 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
- AT AUTHORIZATION
+ AGGREGATE ALL ALTER ANALYSE ANALYZE AND ANY AS ASC
+ ASSERTION ASSIGNMENT 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
+ CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
+ CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
+ CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
+ COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT 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
+ DATABASE DAY_P DEALLOCATE DEC DECIMAL DECLARE DEFAULT
+ DEFERRABLE DEFERRED 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
FALSE_P FETCH FLOAT_P FOR FORCE FOREIGN FORWARD FREEZE FROM
FULL FUNCTION
- GLOBAL GRANT GROUP_P
+ GET GLOBAL GRANT GROUP_P
HANDLER HAVING HOUR_P
- ILIKE IMMEDIATE IMMUTABLE IMPLICIT IN_P INCREMENT INDEX INHERITS
+ ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCREMENT INDEX INHERITS
INITIALLY INNER_P INOUT INPUT INSENSITIVE INSERT INSTEAD INT
INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
@@ -218,26 +220,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
- PRIOR PRIVILEGES PROCEDURE PROCEDURAL
+ PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION PRECISION PREPARE
+ PRIMARY PRIOR PRIVILEGES PROCEDURE PROCEDURAL
- READ REAL REFERENCES REINDEX RELATIVE RENAME REPLACE RESET
- RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW RULE
+ READ REAL RECHECK 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
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
@@ -248,29 +250,25 @@ make_name(void)
%token UNIONJOIN
/* Special keywords, not in the query language - see the "lex" file */
-%token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BITCONST
+%token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
%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
-%left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
%left OR
%left AND
%right NOT
%right '='
%nonassoc '<' '>'
-%nonassoc LIKE ILIKE
+%nonassoc LIKE ILIKE SIMILAR
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
%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
@@ -284,14 +282,15 @@ make_name(void)
%left '(' ')'
%left TYPECAST
%left '.'
+%left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
%type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
%type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
-%type <str> key_reference comment_text ConstraintDeferrabilitySpec
+%type <str> comment_text ConstraintDeferrabilitySpec TableElementList
%type <str> key_match ColLabel SpecialRuleRelation ColId columnDef
-%type <str> ColConstraint ColConstraintElem drop_type Bitconst
-%type <str> OptTableElementList OptTableElement TableConstraint
-%type <str> ConstraintElem key_actions ColQualList type_name DropSchemaStmt
+%type <str> ColConstraint ColConstraintElem drop_type Bconst
+%type <str> TableConstraint OptTableElementList Xconst
+%type <str> ConstraintElem key_actions ColQualList type_name
%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
@@ -299,11 +298,11 @@ make_name(void)
%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 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> trim_list in_expr substr_for attrs TableFuncElement
+%type <str> Typename SimpleTypename 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_expr row_descriptor row_list ConstDatetime opt_chain
+%type <str> opt_collate opt_timezone opt_interval table_ref
+%type <str> row_descriptor row_list ConstDatetime trans_options
%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
@@ -311,44 +310,44 @@ make_name(void)
%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 copy_dirn UnlistenStmt copy_null
+%type <str> NotifyStmt columnElem UnlistenStmt TableElement rowdefinition
%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> FetchStmt direction fetch_how_many from_in CreateOpClassStmt
%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
+%type <str> func_args_list func_args opt_with def_arg overlay_placing
%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> RuleStmt opt_column opt_name oper_argtypes NumConst
%type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
-%type <str> RemoveAggrStmt opt_procedural select_no_parens
+%type <str> RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt
%type <str> RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler
%type <str> VariableSetStmt var_value zone_value VariableShowStmt
-%type <str> VariableResetStmt AlterTableStmt from_list
+%type <str> VariableResetStmt AlterTableStmt from_list overlay_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> TriggerActionTime CreateTrigStmt DropPLangStmt DropCastStmt
%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> 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> DropdbStmt ClusterStmt grantee RevokeStmt Bit DropOpClassStmt
%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> select_clause opt_select_limit select_limit_value opt_recheck
%type <str> ConstraintTimeSpec AlterDatabaseSetStmt DropAssertStmt
%type <str> select_offset_value ReindexStmt join_type opt_boolean
-%type <str> join_qual update_list AlterSchemaStmt joined_table
-%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
+%type <str> join_qual update_list joined_table opclass_item
+%type <str> 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
@@ -361,17 +360,25 @@ make_name(void)
%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> DropUserStmt
+%type <str> DropUserStmt copy_from copy_opt_list opt_mode copy_opt_item
+%type <str> opt_oids TableLikeClause key_action opt_definition
+%type <str> cast_context row r_expr qual_Op qual_all_Op opt_default
+%type <str> CreateConversionStmt any_operator opclass_item_list
+%type <str> iso_level convert_list
+%type <str> convert_args type_list CharacterWithLength ConstCharacter
+%type <str> CharacterWithoutLength BitWithLength BitWithoutLength
+%type <str> ConstBit GenericType TableFuncElementList
+%type <str> opt_sort_clause
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
-%type <str> indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into
+%type <str> indicator ECPGExecute ECPGPrepare opt_ecpg_using ecpg_into
%type <str> storage_clause opt_initializer c_anything
%type <str> variable_list variable c_thing c_term
%type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
%type <str> stmt ECPGRelease execstring server_name
%type <str> connection_object opt_server opt_port c_stuff c_stuff_item
%type <str> user_name opt_user char_variable ora_user ident opt_reference
-%type <str> quoted_ident_stringvar var_type_declarations
+%type <str> var_type_declarations quoted_ident_stringvar
%type <str> db_prefix server opt_options opt_connection_name c_list
%type <str> ECPGSetConnection ECPGTypedef c_args ECPGKeywords
%type <str> enum_type civar civarind ECPGCursorStmt ECPGDeallocate
@@ -398,6 +405,7 @@ make_name(void)
%type <index> opt_array_bounds opt_type_array_bounds
%type <ival> Iresult
+
%%
prog: statements;
@@ -428,7 +436,6 @@ 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); }
@@ -437,6 +444,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
| CopyStmt { output_statement($1, 0, connection); }
| CreateStmt { output_statement($1, 0, connection); }
| CreateAsStmt { output_statement($1, 0, connection); }
+ | CreateCastStmt { output_statement($1, 0, connection); }
| CreateDomainStmt { output_statement($1, 0, connection); }
| CreateFunctionStmt { output_statement($1, 0, connection); }
| CreateSchemaStmt { output_statement($1, 0, connection); }
@@ -444,20 +452,23 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
| CreateSeqStmt { output_statement($1, 0, connection); }
| CreatePLangStmt { output_statement($1, 0, connection); }
| CreateAssertStmt { output_statement($1, 0, connection); }
+ | CreateOpClassStmt { output_statement($1, 0, connection); }
| CreateTrigStmt { output_statement($1, 0, connection); }
| CreateUserStmt { output_statement($1, 0, connection); }
| ClusterStmt { output_statement($1, 0, connection); }
+ /*| DeallocateStmt { 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); }
+ | DropCastStmt { output_statement($1, 0, connection); }
| DropGroupStmt { output_statement($1, 0, connection); }
+ | DropOpClassStmt { 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); }
+ | ExplainStmt { output_statement($1, 0, connection); }/* | ExecuteStmt { output_statement($1, 0, connection); }*/
| FetchStmt { output_statement($1, 1, connection); }
| GrantStmt { output_statement($1, 0, connection); }
| IndexStmt { output_statement($1, 0, connection); }
@@ -465,6 +476,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
| UnlistenStmt { output_statement($1, 0, connection); }
| LockStmt { output_statement($1, 0, connection); }
| NotifyStmt { output_statement($1, 0, connection); }
+/* | PrepareStmt { output_statement($1, 0, connection); }*/
| ReindexStmt { output_statement($1, 0, connection); }
| RemoveAggrStmt { output_statement($1, 0, connection); }
| RemoveOperStmt { output_statement($1, 0, connection); }
@@ -496,6 +508,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);
@@ -657,12 +670,15 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
*
*****************************************************************************/
-CreateUserStmt: CREATE USER UserId OptUserList
- { $$ = cat_str(3, make_str("create user"), $3, $4); }
- | CREATE USER UserId WITH OptUserList
+CreateUserStmt: CREATE USER UserId opt_with OptUserList
{ $$ = cat_str(4, make_str("create user"), $3, make_str("with"), $5); }
;
+opt_with: WITH { $$ = make_str("with"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+
/*****************************************************************************
*
* Alter a postgresql DBMS user
@@ -701,7 +717,7 @@ OptUserList: OptUserList OptUserElem { $$ = cat2_str($1, $2); }
OptUserElem: PASSWORD Sconst
{ $$ = cat2_str(make_str("password"), $2); }
- | SYSID Iconst
+ | SYSID PosIntConst
{ $$ = cat2_str(make_str("sysid"), $2); }
| CREATEDB
{ $$ = make_str("createdb"); }
@@ -744,7 +760,7 @@ OptGroupList: OptGroupList OptGroupElem { $$ = cat2_str($1, $2); }
OptGroupElem: USER user_list
{ $$ = cat2_str(make_str("user"), $2); }
- | SYSID Iconst
+ | SYSID PosIntConst
{ $$ = cat2_str(make_str("sysid"), $2); }
;
@@ -784,14 +800,6 @@ CreateSchemaStmt: CREATE SCHEMA UserId OptSchemaName AUTHORIZATION UserId OptSc
{ $$ = 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; }
;
@@ -833,9 +841,9 @@ 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); }
- | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level
+ | TRANSACTION ISOLATION LEVEL iso_level opt_mode
+ { $$ = cat_str(3, make_str("transaction isolation level"), $4, $5); }
+ | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL iso_level
{ $$ = cat2_str(make_str("session characteristics as transaction isolation level"), $7); }
| NAMES opt_encoding
{ $$ = cat2_str(make_str("names"), $2); }
@@ -857,11 +865,16 @@ var_list: var_value
{ $$ = cat_str(3, $1, make_str(","), $3); }
;
-opt_level: READ COMMITTED { $$ = make_str("read committed"); }
+iso_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; }
@@ -881,7 +894,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
@@ -965,20 +978,20 @@ AlterTableStmt:
/* 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
+/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
+ | ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS PosIntConst
{ $$ = 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
+ | 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 <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
+ | 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 <name> CREATE TOAST TABLE */
| ALTER TABLE qualified_name CREATE TOAST TABLE
@@ -993,10 +1006,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; }
@@ -1024,11 +1033,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"); }
;
@@ -1042,14 +1052,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
*/
@@ -1063,12 +1086,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 :
@@ -1079,6 +1096,9 @@ copy_null: WITH NULL_P AS StringConst
CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
OptInherit OptWithOids
{ $$ = cat_str(9, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9); }
+ | CREATE OptTemp TABLE qualified_name OF qualified_name
+ '(' OptTableElementList ')' OptWithOids
+ { $$ = cat_str(10, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10); }
;
/*
@@ -1103,16 +1123,21 @@ OptTemp: TEMPORARY { $$ = make_str("temporary"); }
| /*EMPTY*/ { $$ = EMPTY; }
;
-OptTableElementList: OptTableElementList ',' OptTableElement
- { $$ = cat_str(3, $1, make_str(","), $3); }
- | OptTableElement
+
+OptTableElementList: TableElementList
{ $$ = $1; }
| /*EMPTY*/
{ $$ = EMPTY; }
;
-
-OptTableElement: columnDef { $$ = $1; }
- | TableConstraint { $$ = $1; }
+TableElementList: TableElement
+ { $$ = $1; }
+ | TableElementList ',' TableElement
+ { $$ = cat_str(3, $1, make_str(","), $3); }
+ ;
+
+TableElement: columnDef { $$ = $1; }
+ | TableLikeClause { $$ = $1; }
+ | TableConstraint { $$ = $1; }
;
columnDef: ColId Typename ColQualList opt_collate
@@ -1180,6 +1205,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
@@ -1232,15 +1264,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"); }
@@ -1352,8 +1384,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"); }
@@ -1418,8 +1450,8 @@ TriggerFuncArgs: TriggerFuncArg
{ $$ = EMPTY; }
;
-TriggerFuncArg: PosAllConst { $$ = $1; }
- | ColId { $$ = $1; }
+TriggerFuncArg: PosAllConst { $$ = $1; }
+ | ColId { $$ = $1; }
;
OptConstrFromTable: /* Empty */ { $$ = EMPTY; }
@@ -1456,8 +1488,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); }
;
/*****************************************************************************
@@ -1496,6 +1528,14 @@ DefineStmt: CREATE AGGREGATE func_name 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); }
+ | CREATE TYPE_P any_name AS rowdefinition
+ { $$ = cat_str(4, make_str("create type"), $3, make_str("as"), $5); }
+ | CREATE CHARACTER SET opt_as any_name GET definition opt_collate
+ { $$ = cat_str(6, make_str("create character set"), $4, $5, make_str("get"), $7, $8); }
+ ;
+
+rowdefinition: '(' TableFuncElementList ')'
+ { $$ = cat_str(3, make_str("("), $2, make_str(")"));}
;
definition: '(' def_list ')'
@@ -1512,10 +1552,43 @@ def_elem: ColLabel '=' def_arg { $$ = cat_str(3, $1, make_str("="), $3); }
/* Note: any simple identifier will be returned as a type name! */
def_arg: func_return { $$ = $1; }
- | all_Op { $$ = $1; }
+ | qual_all_Op { $$ = $1; }
| AllConst { $$ = $1; }
;
+CreateOpClassStmt: CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
+ USING access_method AS opclass_item_list
+ {
+ $$ = cat_str(9, make_str("create operator class"), $4, $5, make_str("for type"), $8, make_str("using"), $10, make_str("as"), $12);
+ }
+ ;
+
+opclass_item_list: opclass_item { $$ = $1; }
+ | opclass_item_list ',' opclass_item { $$ = cat_str(3, $1, make_str(","), $3); }
+ ;
+
+opclass_item: OPERATOR PosIntConst any_operator opt_recheck
+ { $$ = cat_str(4, make_str("operator"), $2, $3, $4); }
+ | OPERATOR PosIntConst any_operator '(' oper_argtypes ')' opt_recheck
+ { $$ = cat_str(7, make_str("operator"), $2, $3, make_str("("), $5, make_str(")"), $7); }
+ | FUNCTION PosIntConst func_name func_args
+ { $$ = cat_str(4, make_str("function"), $2, $3, $4); }
+ | STORAGE Typename
+ { $$ = cat2_str(make_str("storage"), $2); }
+ ;
+
+opt_default: DEFAULT { $$ = make_str("default"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+opt_recheck: RECHECK { $$ = make_str("recheck"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+DropOpClassStmt: DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
+ { $$ = cat_str(5,make_str("drop operator class"), $4, make_str("using"), $6, $7); }
+ ;
+
/*****************************************************************************
*
* QUERY:
@@ -1534,6 +1607,8 @@ 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"); }
+ | SCHEMA { $$ = make_str("schema"); }
;
any_name_list: any_name
@@ -1633,7 +1708,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); }
@@ -1791,33 +1866,8 @@ opt_class: any_name { $$ = $1; }
| /*EMPTY*/ { $$ = EMPTY; }
;
-
-/*****************************************************************************
- *
- * QUERY:
- * execute recipe <recipeName>
- *
- *****************************************************************************/
-/* NOT USED
-RecipeStmt: EXECUTE RECIPE recipe_name
- {
- $$ = cat2_str(make_str("execute recipe"), $3);
- }
- ;
-*/
-/*****************************************************************************
- *
- * QUERY:
- * create [or replace] function <fname>
- * [(<type-1> { , <type-n>})]
- * returns <type-r>
- * as <filename or code in language as appropriate>
- * language <lang> [with parameters]
- *
- *****************************************************************************/
-
CreateFunctionStmt: CREATE opt_or_replace FUNCTION func_name func_args
- RETURNS func_return createfunc_opt_list opt_with
+ RETURNS func_return createfunc_opt_list opt_definition
{ $$ = cat_str(8, make_str("create"), $2, make_str("function"), $4, $5, make_str("returns"), $7, $8); }
;
@@ -1825,10 +1875,6 @@ opt_or_replace: OR REPLACE { $$ = make_str("or replace"); }
| /*EMPTY*/ { $$ = EMPTY; }
;
-opt_with: WITH definition { $$ = cat2_str(make_str("with"), $2); }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
-
func_args: '(' func_args_list ')'
{ $$ = cat_str(3, make_str("("), $2, make_str(")")); }
| '(' ')'
@@ -1920,10 +1966,12 @@ createfunc_opt_item: AS func_as
{ $$ = make_str("security definer"); }
| SECURITY INVOKER
{ $$ = make_str("security invoker"); }
- | IMPLICIT CAST
- { $$ = make_str("implicit cast"); }
;
+opt_definition: WITH definition { $$ = cat2_str(make_str("with"), $2); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
/*****************************************************************************
*
* QUERY:
@@ -1934,12 +1982,12 @@ 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); }
;
-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; }
@@ -1947,8 +1995,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
@@ -1961,6 +2009,30 @@ oper_argtypes: Typename
{ $$ = cat2_str($1, make_str(", none")); }
;
+any_operator:
+ all_Op
+ { $$ = $1; }
+ | ColId '.' any_operator
+ { $$ = cat_str(3, $1, make_str("."), $3); }
+ ;
+
+CreateCastStmt: CREATE CAST '(' ConstTypename AS ConstTypename ')'
+ WITH FUNCTION function_with_argtypes cast_context
+ { $$ = cat_str(6, make_str("create cast ("), $4, make_str("as"), $6, make_str(") with function"), $10); }
+ | CREATE CAST '(' ConstTypename AS ConstTypename ')'
+ WITHOUT FUNCTION cast_context
+ { $$ = cat_str(6, make_str("create cast ("), $4, make_str("as"), $6, make_str(") without function"), $10); }
+ ;
+
+cast_context: AS ASSIGNMENT { $$ = make_str("as assignment"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+
+DropCastStmt: DROP CAST '(' ConstTypename AS ConstTypename ')' opt_drop_behavior
+ { $$ = cat_str(6, make_str("drop cast ("), $4, make_str("as"), $6, make_str(")"), $8); }
+ ;
+
/*****************************************************************************
*
* QUERY:
@@ -2011,13 +2083,13 @@ opt_column: COLUMN { $$ = make_str("column"); }
*
*****************************************************************************/
-RuleStmt: CREATE RULE name AS
+RuleStmt: CREATE opt_or_replace RULE name AS
{ QueryIsRule=1; }
ON event TO qualified_name where_clause
DO opt_instead RuleActionList
{
QueryIsRule=0;
- $$ = cat_str(10, make_str("create rule"), $3, make_str("as on"), $7, make_str("to"), $9, $10, make_str("do"), $12, $13);
+ $$ = cat_str(12, make_str("create"), $2, make_str("rule"), $4, make_str("as on"), $8, make_str("to"), $10, $11, make_str("do"), $13, $14);
}
;
@@ -2055,8 +2127,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);}
;
/*****************************************************************************
@@ -2090,30 +2162,22 @@ UnlistenStmt: UNLISTEN qualified_name
* (also older versions END / ABORT)
*
*****************************************************************************/
-TransactionStmt: ABORT_TRANS opt_trans { $$ = make_str("rollback"); }
- | BEGIN_TRANS opt_trans { $$ = make_str("begin transaction"); }
- | COMMIT opt_trans { $$ = make_str("commit"); }
- | COMMIT opt_trans opt_chain { $$ = cat2_str(make_str("commit"), $3); }
- | END_TRANS opt_trans { $$ = make_str("commit"); }
- | ROLLBACK opt_trans { $$ = make_str("rollback"); }
- | ROLLBACK opt_trans opt_chain { $$ = cat2_str(make_str("rollback"), $3); }
+TransactionStmt: ABORT_TRANS opt_trans { $$ = make_str("rollback"); }
+ | BEGIN_TRANS opt_trans { $$ = make_str("begin transaction"); }
+ | START TRANSACTION trans_options { $$ = cat2_str(make_str("start transaction"), $3); }
+ | COMMIT opt_trans { $$ = make_str("commit"); }
+ | END_TRANS opt_trans { $$ = make_str("commit"); }
+ | ROLLBACK opt_trans { $$ = make_str("rollback"); }
;
+trans_options: ISOLATION LEVEL iso_level { $$ = cat2_str(make_str("isolation level"), $3); }
+ ;
+
opt_trans: WORK { $$ = EMPTY; }
| TRANSACTION { $$ = EMPTY; }
| /*EMPTY*/ { $$ = EMPTY; }
;
-opt_chain: AND NO CHAIN
- { $$ = make_str("and no chain"); }
- | AND CHAIN
- {
- mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported COMMIT/CHAIN will be passed to backend");
-
- $$ = make_str("and chain");
- }
- ;
-
/*****************************************************************************
*
* QUERY:
@@ -2121,8 +2185,8 @@ opt_chain: AND NO CHAIN
*
*****************************************************************************/
-ViewStmt: CREATE VIEW qualified_name opt_column_list AS SelectStmt
- { $$ = cat_str(5, make_str("create view"), $3, $4, make_str("as"), $6); }
+ViewStmt: CREATE opt_or_replace VIEW qualified_name opt_column_list AS SelectStmt
+ { $$ = cat_str(7, make_str("create"), $2, make_str("view"), $4, $5, make_str("as"), $7); }
;
@@ -2220,7 +2284,13 @@ 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); }
+ ;
+
/*****************************************************************************
*
* QUERY:
@@ -2291,6 +2361,38 @@ ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
{ $$ = cat_str(4, make_str("explain"), $2, $3, $4); }
;
+/*
+
+conflicts with ecpg
+
+PrepareStmt: PREPARE name prep_type_clause AS OptimizableStmt
+ { $$ = cat_str(5, make_str("prepare"), $2, $3, make_str("as"), $5); }
+ ;
+
+prep_type_clause: '(' prep_type_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
+ | /* EMPTY * / { $$ = EMPTY; }
+ ;
+
+prep_type_list: Typename { $$ = $1; }
+ | prep_type_list ',' Typename { $$ = cat_str(3, $1, make_str(","), $3); }
+ ;
+
+ExecuteStmt: EXECUTE name execute_param_clause into_clause
+ { $$ = cat_str(4, make_str("execute"), $2, $3, $4); }
+ ;
+
+execute_param_clause: '(' execute_param_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
+ | /* EMPTY * / { $$ = EMPTY; }
+ ;
+
+execute_param_list: a_expr { $$ = $1; }
+ | execute_param_list ',' a_expr { $$ = cat_str(3, $1, make_str(","), $3); }
+ ;
+
+DeallocateStmt: DEALLOCATE name { $$ = cat2_str(make_str("deallocate"), $2); }
+ | DEALLOCATE PREPARE name { $$ = cat2_str(make_str("deallocate prepare"), $3); }
+ ;
+*/
/*****************************************************************************
* *
@@ -2456,12 +2558,12 @@ select_with_parens: '(' select_no_parens ')'
select_no_parens: simple_select
{ $$ = $1; }
- | select_clause sort_clause opt_for_update_clause opt_select_limit
- { $$ = cat_str(4, $1, $2, $3, $4); }
- | select_clause for_update_clause opt_select_limit
- { $$ = cat_str(3, $1, $2, $3); }
- | select_clause select_limit
+ | select_clause sort_clause
{ $$ = cat2_str($1, $2); }
+ | select_clause opt_sort_clause for_update_clause opt_select_limit
+ { $$ = cat_str(4, $1, $2, $3, $4); }
+ | select_clause opt_sort_clause select_limit opt_for_update_clause
+ { $$ = cat_str(4, $1, $2, $3, $4); }
;
select_clause: simple_select { $$ = $1; }
@@ -2538,6 +2640,10 @@ opt_distinct: DISTINCT
{ $$ = EMPTY; }
;
+opt_sort_clause: sort_clause { $$ = $1; }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
sort_clause: ORDER BY sortby_list
{ $$ = cat2_str(make_str("order by"), $3); }
;
@@ -2654,7 +2760,13 @@ table_ref: relation_expr
| func_table
{ $$ = $1; }
| func_table alias_clause
- { $$= cat2_str($1, $2); }
+ { $$= cat2_str($1, $2); }
+ | func_table AS '(' TableFuncElementList ')'
+ { $$=cat_str(4, $1, make_str("as ("), $4, make_str(")")); }
+ | func_table AS ColId '(' TableFuncElementList ')'
+ { $$=cat_str(6, $1, make_str("as"), $3, make_str("("), $5, make_str(")")); }
+ | func_table ColId '(' TableFuncElementList ')'
+ { $$=cat_str(5, $1, $2, make_str("("), $4, make_str(")")); }
| select_with_parens
{mmerror(PARSE_ERROR, ET_ERROR, "sub-SELECT in FROM must have an alias");}
| select_with_parens alias_clause
@@ -2737,7 +2849,9 @@ relation_expr: qualified_name
| qualified_name '*'
{ /* inheritance query */ $$ = cat2_str($1, make_str("*")); }
| ONLY qualified_name
- { /* inheritance query */ $$ = cat2_str(make_str("ONLY "), $2); }
+ { /* inheritance query */ $$ = cat2_str(make_str("only "), $2); }
+ | ONLY '(' qualified_name ')'
+ { /* inheritance query */ $$ = cat_str(3, make_str("only ("), $3, make_str(")")); }
;
func_table: func_name '(' ')'
@@ -2750,6 +2864,14 @@ where_clause: WHERE a_expr { $$ = cat2_str(make_str("where"), $2); }
| /*EMPTY*/ { $$ = EMPTY; /* no qualifiers */ }
;
+TableFuncElementList: TableFuncElement
+ { $$ = $1; }
+ | TableFuncElementList ',' TableFuncElement
+ { $$ = cat_str(3, $1, ',', $3); }
+ ;
+
+TableFuncElement: ColId Typename { $$ = cat2_str($1, $2); }
+ ;
/*****************************************************************************
*
@@ -2800,8 +2922,11 @@ Iresult: PosIntConst { $$ = atol($1); }
| Iresult '%' Iresult { $$ = $1 % $3; }
;
-SimpleTypename: ConstTypename
- { $$ = $1; }
+SimpleTypename: GenericType { $$ = $1; }
+ | ConstDatetime { $$ = $1; }
+ | Numeric { $$ = $1; }
+ | Bit { $$ = $1; }
+ | Character { $$ = $1; }
| ConstInterval opt_interval
{ $$ = cat2_str($1, $2); }
| ConstInterval '(' PosIntConst ')' opt_interval
@@ -2810,14 +2935,14 @@ SimpleTypename: ConstTypename
{ $$ = cat2_str($1, $2);}
;
-ConstTypename: Generic { $$ = $1; }
+ConstTypename: GenericType { $$ = $1; }
| ConstDatetime { $$ = $1; }
- | Numeric { $$ = $1; }
- | Bit { $$ = $1; }
- | Character { $$ = $1; }
+ | Numeric { $$ = $1; }
+ | ConstBit { $$ = $1; }
+ | ConstCharacter { $$ = $1; }
;
-Generic: type_name { $$ = $1; }
+GenericType: type_name { $$ = $1; }
;
/* SQL92 numeric data types
@@ -2875,9 +3000,20 @@ opt_decimal: '(' PosIntConst ',' PosIntConst ')'
* SQL92 bit-field data types
* The following implements BIT() and BIT VARYING().
*/
-Bit: BIT opt_varying '(' PosIntConst ')'
+
+Bit: BitWithLength { $$ = $1; }
+ | BitWithoutLength { $$ = $1; }
+ ;
+
+ConstBit: BitWithLength { $$ = $1; }
+ | BitWithoutLength { $$ = $1; }
+ ;
+
+BitWithLength: BIT opt_varying '(' PosIntConst ')'
{ $$ = cat_str(5, make_str("bit"), $2, make_str("("), $4, make_str(")")); }
- | BIT opt_varying
+ ;
+
+BitWithoutLength: BIT opt_varying
{ $$ = cat2_str(make_str("bit"), $2); }
;
@@ -2886,9 +3022,19 @@ Bit: BIT opt_varying '(' PosIntConst ')'
* The following implements CHAR() and VARCHAR().
* - ay 6/95
*/
-Character: character '(' PosIntConst ')' opt_charset
+Character: CharacterWithLength { $$ = $1; }
+ | CharacterWithoutLength { $$ = $1; }
+ ;
+
+ConstCharacter: CharacterWithLength { $$ = $1; }
+ | CharacterWithoutLength { $$ = $1; }
+ ;
+
+CharacterWithLength: character '(' PosIntConst ')' opt_charset
{ $$ = cat_str(5, $1, make_str("("), $3, make_str(")"), $5); }
- | character opt_charset
+ ;
+
+CharacterWithoutLength: character opt_charset
{ $$ = cat2_str($1, $2); }
;
@@ -2973,37 +3119,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 %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: 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("-"); }
@@ -3016,6 +3179,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.
*
@@ -3077,11 +3248,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); }
@@ -3105,6 +3276,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
@@ -3134,17 +3313,25 @@ 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 IS
+ { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
+ | a_expr IS OF '(' type_list ')' %prec IS
+ { $$ = cat_str(4, $1, make_str("is of ("), $5, make_str(")")); }
+ | a_expr IS NOT OF '(' type_list ')' %prec IS
+ { $$ = cat_str(4, $1, make_str("is not of ("), $6, make_str(")")); }
| 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 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
+ | UNIQUE select_with_parens %prec Op
+ { $$ = cat2_str(make_str("unique"), $2); }
+ | r_expr
{ $$ = $1; }
;
@@ -3190,10 +3377,16 @@ 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 IS
+ { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
+ | b_expr IS OF '(' b_expr ')' %prec IS
+ { $$ = cat_str(4, $1, make_str("is of ("), $5, make_str(")")); }
+ | b_expr IS NOT OF '(' b_expr ')' %prec IS
+ { $$ = cat_str(4, $1, make_str("is not of ("), $6, make_str(")")); }
;
/*
@@ -3214,8 +3407,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 '(' ')'
@@ -3244,12 +3435,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(")")); }
@@ -3259,6 +3456,8 @@ c_expr: columnref
{ $$ = cat_str(3, make_str("trim(trailing"), $4, make_str(")")); }
| TRIM '(' trim_list ')'
{ $$ = cat_str(3, make_str("trim("), $3, make_str(")")); }
+ | CONVERT '(' convert_list ')'
+ { $$ = cat_str(3, make_str("convert("), $3, make_str(")")); }
| select_with_parens %prec UMINUS
{ $$ = $1; }
| EXISTS select_with_parens
@@ -3290,11 +3489,17 @@ extract_list: extract_arg FROM a_expr
{ $$ = EMPTY; }
;
+type_list: type_list ',' Typename
+ { $$ = cat_str(3, $1, ',', $3); }
+ | Typename
+ { $$ = $1; }
+ ;
+
/* Allow delimited string SCONST in extract_arg as an SQL extension.
* - 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"); }
@@ -3304,6 +3509,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); }
@@ -3341,6 +3557,19 @@ trim_list: a_expr FROM expr_list
{ $$ = $1; }
;
+convert_list:
+ a_expr USING any_name
+ { $$ = cat_str(3, $1, make_str("using"), $3); }
+ | convert_args
+ { $$ = $1; }
+ | /* EMPTY */
+ { $$ = EMPTY; }
+ ;
+
+convert_args: a_expr { $$ = $1; }
+ | convert_args ',' a_expr { $$ = cat_str(3, $1, ',', $3); }
+ ;
+
in_expr: select_with_parens
{ $$ = $1; }
| '(' in_expr_nodes ')'
@@ -3542,7 +3771,8 @@ AexprConst: PosAllConst
Iconst: ICONST { $$ = make_name();};
Fconst: FCONST { $$ = make_name();};
-Bitconst: BITCONST { $$ = make_name();};
+Bconst: BCONST { $$ = make_name();};
+Xconst: XCONST { $$ = make_name();};
Sconst: SCONST
{
$$ = (char *)mm_alloc(strlen($1) + 3);
@@ -3583,10 +3813,11 @@ AllConst: Sconst { $$ = $1; }
;
PosAllConst: Sconst { $$ = $1; }
- | Fconst { $$ = $1; }
- | Iconst { $$ = $1; }
- | Bitconst { $$ = $1; }
- | civar { $$ = make_str("?"); }
+ | Fconst { $$ = $1; }
+ | Iconst { $$ = $1; }
+ | Bconst { $$ = $1; }
+ | Xconst { $$ = $1; }
+ | civar { $$ = make_str("?"); }
;
UserId: ColId { $$ = $1;};
@@ -3863,8 +4094,11 @@ ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident
* the exec sql deallocate prepare command to deallocate a previously
* prepared statement
*/
-ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident
- { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); };
+ECPGDeallocate: DEALLOCATE PREPARE ident
+ { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); }
+ | DEALLOCATE ident
+ { $$ = cat_str(2, make_str("ECPGdeallocate(__LINE__, \""), $2, make_str("\");")); }
+ ;
/*
* variable declaration inside the exec sql declare block
@@ -4317,7 +4551,7 @@ ECPGExecute : EXECUTE IMMEDIATE execstring
$$ = make_str("?");
}
- | EXECUTE ident
+ | EXECUTE name
{
struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
@@ -4329,7 +4563,7 @@ ECPGExecute : EXECUTE IMMEDIATE execstring
add_variable(&argsinsert, thisquery, &no_indicator);
}
- ecpg_using opt_ecpg_into
+ opt_ecpg_using opt_ecpg_into
{
$$ = make_str("?");
}
@@ -4345,14 +4579,14 @@ execstring: char_variable
* the exec sql free command to deallocate a previously
* prepared statement
*/
-ECPGFree: SQL_FREE ident { $$ = $2; };
+ECPGFree: SQL_FREE name { $$ = $2; };
/*
* open is an open cursor, at the moment this has to be removed
*/
-ECPGOpen: SQL_OPEN name ecpg_using { $$ = $2; };
+ECPGOpen: SQL_OPEN name opt_ecpg_using { $$ = $2; };
-ecpg_using: /*EMPTY*/ { $$ = EMPTY; }
+opt_ecpg_using: /*EMPTY*/ { $$ = EMPTY; }
| USING variablelist
{
/* mmerror ("open cursor with variables not implemented yet"); */
@@ -4385,7 +4619,7 @@ variablelist: variable | variable ',' variablelist;
* As long as the prepare statement is not supported by the backend, we will
* try to simulate it here so we get dynamic SQL
*/
-ECPGPrepare: SQL_PREPARE ident FROM execstring
+ECPGPrepare: PREPARE name FROM execstring
{ $$ = cat2_str(make3_str(make_str("\""), $2, make_str("\",")), $4); }
;
@@ -4397,7 +4631,7 @@ ECPGPrepare: SQL_PREPARE ident FROM execstring
/*
* deallocate a descriptor
*/
-ECPGDeallocateDescr: SQL_DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
+ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
{
drop_descriptor($3,connection);
$$ = $3;
@@ -4451,15 +4685,14 @@ ECPGGetDescItems: ECPGGetDescItem
| ECPGGetDescItems ',' ECPGGetDescItem
;
-ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar
+ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar
ECPGGetDescHeaderItems
{ $$ = $3; }
;
-ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar
- SQL_VALUE CVARIABLE ECPGGetDescItems
+ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE CVARIABLE ECPGGetDescItems
{ $$.str = $5; $$.name = $3; }
- | SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
+ | GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
{ $$.str = $5; $$.name = $3; }
;
@@ -4762,7 +4995,6 @@ ECPGKeywords: SQL_BREAK { $$ = make_str("break"); }
| SQL_DATA { $$ = make_str("data"); }
| SQL_DATETIME_INTERVAL_CODE { $$ = make_str("datetime_interval_code"); }
| SQL_DATETIME_INTERVAL_PRECISION { $$ = make_str("datetime_interval_precision"); }
- | SQL_DEALLOCATE { $$ = make_str("deallocate"); }
| SQL_DISCONNECT { $$ = make_str("disconnect"); }
| SQL_FOUND { $$ = make_str("found"); }
| SQL_GO { $$ = make_str("go"); }
@@ -4775,7 +5007,6 @@ ECPGKeywords: SQL_BREAK { $$ = make_str("break"); }
| SQL_NULLABLE { $$ = make_str("nullable"); }
| SQL_OCTET_LENGTH { $$ = make_str("octet_length"); }
| SQL_OPEN { $$ = make_str("open"); }
- | SQL_PREPARE { $$ = make_str("prepare"); }
| SQL_RELEASE { $$ = make_str("release"); }
| SQL_RETURNED_LENGTH { $$ = make_str("returned_length"); }
| SQL_RETURNED_OCTET_LENGTH { $$ = make_str("returned_octet_length"); }
@@ -4880,7 +5111,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"); }
@@ -4891,12 +5123,14 @@ unreserved_keyword:
| CHAIN { $$ = make_str("chain"); }
| CHARACTERISTICS { $$ = make_str("characteristics"); }
| CHECKPOINT { $$ = make_str("checkpoint"); }
+ | CLASS { $$ = make_str("class"); }
| CLOSE { $$ = make_str("close"); }
| CLUSTER { $$ = make_str("cluster"); }
| 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"); }
@@ -4904,9 +5138,11 @@ unreserved_keyword:
| CYCLE { $$ = make_str("cycle"); }
| DATABASE { $$ = make_str("database"); }
| DAY_P { $$ = make_str("day"); }
+ | DEALLOCATE { $$ = make_str("deallocate"); }
| 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"); }
@@ -4926,6 +5162,8 @@ unreserved_keyword:
| HANDLER { $$ = make_str("handler"); }
| HOUR_P { $$ = make_str("hour"); }
| IMMEDIATE { $$ = make_str("immediate"); }
+ | IMMUTABLE { $$ = make_str("immutable"); }
+ | IMPLICIT_P { $$ = make_str("implicit"); }
| INCREMENT { $$ = make_str("increment"); }
| INDEX { $$ = make_str("index"); }
| INHERITS { $$ = make_str("inherits"); }
@@ -4969,11 +5207,13 @@ unreserved_keyword:
| PATH_P { $$ = make_str("path"); }
| PENDANT { $$ = make_str("pendant"); }
| PRECISION { $$ = make_str("precision"); }
+ | PREPARE { $$ = make_str("prepare"); }
| PRIOR { $$ = make_str("prior"); }
| PRIVILEGES { $$ = make_str("privileges"); }
| PROCEDURAL { $$ = make_str("procedural"); }
| PROCEDURE { $$ = make_str("procedure"); }
| READ { $$ = make_str("read"); }
+ | RECHECK { $$ = make_str("recheck"); }
| REINDEX { $$ = make_str("reindex"); }
| RELATIVE { $$ = make_str("relative"); }
| RENAME { $$ = make_str("rename"); }
@@ -4983,7 +5223,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"); }
@@ -4994,6 +5233,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"); }
@@ -5024,6 +5265,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"); }
@@ -5063,11 +5305,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"); }
;
@@ -5102,6 +5346,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"); }
;
@@ -5220,13 +5465,11 @@ 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("\"")); }
;
-quoted_ident_stringvar: IDENT
- { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
- | CSTRING
+quoted_ident_stringvar: name
{ $$ = make3_str(make_str("\""), $1, make_str("\"")); }
| char_variable
{ $$ = make3_str(make_str("("), $1, make_str(")")); }