Merged ecpg_big_bison back into HEAD
authorMichael Meskes <meskes@postgresql.org>
Mon, 21 Oct 2002 13:09:31 +0000 (13:09 +0000)
committerMichael Meskes <meskes@postgresql.org>
Mon, 21 Oct 2002 13:09:31 +0000 (13:09 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/lib/execute.c
src/interfaces/ecpg/preproc/Makefile
src/interfaces/ecpg/preproc/ecpg_keywords.c
src/interfaces/ecpg/preproc/keywords.c
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/preproc.y

index bfe58fe1a25643456f369c7d15a3e987d23fe8fd..ae4bea358bb6e2f318ad6d6cac03c4dac4710bd8 100644 (file)
@@ -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.
 
index bad48a750f7603006f7c85c660c1ff1ef4f8149e..70e1d633c80c1c91180419068aed7722242c1476 100644 (file)
@@ -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;
 }
 
index 0057c0010bfd77354231d29eb53f66be2e830311..748d2c2bbd6b929885d52841b0036dbe4efec4f9 100644 (file)
@@ -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
 
index 9010956fa8865711af7e945e6e32e4766a61d0f8..fecf892cfc08ef32d387d85111870bc2d265a885 100644 (file)
@@ -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},
index e5df0c97a2d0ce4007d55b33b211778f83487ece..e17af9298e250f4d42b8bd0fd3767527d32faca9 100644 (file)
@@ -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},
 };
index d9d09d90f75821939c83c48c76a1204ccd831378..55758061f7a359528242614f87edd23ba37a69e9 100644 (file)
@@ -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"); }
index 2a8aefbfe5744d72ca9bdf90240f2511c10c83e3..187239546488acb202f6f6b16081bc32d61e63f5 100644 (file)
@@ -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(")")); }