From cf8da4e9f0784fed6fe81f824de4b384e6bbb832 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Mon, 21 Oct 2002 13:09:31 +0000
Subject: [PATCH] Merged ecpg_big_bison back into HEAD

---
 src/interfaces/ecpg/ChangeLog               |  30 +-
 src/interfaces/ecpg/lib/execute.c           |   4 +-
 src/interfaces/ecpg/preproc/Makefile        |   5 +-
 src/interfaces/ecpg/preproc/ecpg_keywords.c |   5 +-
 src/interfaces/ecpg/preproc/keywords.c      |  17 +-
 src/interfaces/ecpg/preproc/pgc.l           |  24 +-
 src/interfaces/ecpg/preproc/preproc.y       | 743 +++++++++++++-------
 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(")")); }
-- 
GitLab