Replaced manually synced preproc.y by the one created by the new script.
authorMichael Meskes <[email protected]>
Tue, 11 Nov 2008 11:41:24 +0000 (11:41 +0000)
committerMichael Meskes <[email protected]>
Tue, 11 Nov 2008 11:41:24 +0000 (11:41 +0000)
Adapted regression test files accordingly.

60 files changed:
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/test/expected/compat_informix-rnull.c
src/interfaces/ecpg/test/expected/compat_informix-rnull.stderr
src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
src/interfaces/ecpg/test/expected/compat_informix-test_informix.stderr
src/interfaces/ecpg/test/expected/compat_informix-test_informix2.c
src/interfaces/ecpg/test/expected/compat_informix-test_informix2.stderr
src/interfaces/ecpg/test/expected/connect-test1.c.in
src/interfaces/ecpg/test/expected/connect-test1.stderr
src/interfaces/ecpg/test/expected/connect-test2.c
src/interfaces/ecpg/test/expected/connect-test2.stderr
src/interfaces/ecpg/test/expected/connect-test3.c
src/interfaces/ecpg/test/expected/connect-test3.stderr
src/interfaces/ecpg/test/expected/connect-test5.c
src/interfaces/ecpg/test/expected/connect-test5.stderr
src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c
src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr
src/interfaces/ecpg/test/expected/pgtypeslib-num_test.c
src/interfaces/ecpg/test/expected/pgtypeslib-num_test.stderr
src/interfaces/ecpg/test/expected/preproc-array_of_struct.c
src/interfaces/ecpg/test/expected/preproc-autoprep.c
src/interfaces/ecpg/test/expected/preproc-define.c
src/interfaces/ecpg/test/expected/preproc-define.stderr
src/interfaces/ecpg/test/expected/preproc-init.c
src/interfaces/ecpg/test/expected/preproc-type.c
src/interfaces/ecpg/test/expected/preproc-variable.c
src/interfaces/ecpg/test/expected/preproc-variable.stderr
src/interfaces/ecpg/test/expected/preproc-whenever.c
src/interfaces/ecpg/test/expected/preproc-whenever.stderr
src/interfaces/ecpg/test/expected/sql-array.c
src/interfaces/ecpg/test/expected/sql-array.stderr
src/interfaces/ecpg/test/expected/sql-binary.c
src/interfaces/ecpg/test/expected/sql-code100.c
src/interfaces/ecpg/test/expected/sql-code100.stderr
src/interfaces/ecpg/test/expected/sql-copystdout.c
src/interfaces/ecpg/test/expected/sql-copystdout.stderr
src/interfaces/ecpg/test/expected/sql-define.c
src/interfaces/ecpg/test/expected/sql-desc.c
src/interfaces/ecpg/test/expected/sql-dynalloc2.c
src/interfaces/ecpg/test/expected/sql-dynalloc2.stderr
src/interfaces/ecpg/test/expected/sql-dyntest.c
src/interfaces/ecpg/test/expected/sql-execute.c
src/interfaces/ecpg/test/expected/sql-execute.stderr
src/interfaces/ecpg/test/expected/sql-fetch.c
src/interfaces/ecpg/test/expected/sql-func.c
src/interfaces/ecpg/test/expected/sql-func.stderr
src/interfaces/ecpg/test/expected/sql-indicators.c
src/interfaces/ecpg/test/expected/sql-indicators.stderr
src/interfaces/ecpg/test/expected/sql-insupd.c
src/interfaces/ecpg/test/expected/sql-insupd.stderr
src/interfaces/ecpg/test/expected/sql-oldexec.c
src/interfaces/ecpg/test/expected/sql-oldexec.stderr
src/interfaces/ecpg/test/expected/sql-parser.c
src/interfaces/ecpg/test/expected/sql-quote.c
src/interfaces/ecpg/test/expected/sql-quote.stderr
src/interfaces/ecpg/test/expected/sql-show.c
src/interfaces/ecpg/test/expected/thread-alloc.c
src/interfaces/ecpg/test/expected/thread-prep.c
src/interfaces/ecpg/test/expected/thread-thread.c
src/interfaces/ecpg/test/expected/thread-thread_implicit.c

index ebb8cf20687011b2927b5e644194fee58a9ac2d7..02604d830f51c520e4a49f1b36bcf8bfa305b13d 100644 (file)
@@ -1,3 +1,4 @@
+/* header */
 /* $PostgreSQL$ */
 
 /* Copyright comment */
@@ -388,4704 +389,9012 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
        struct  su_symbol       struct_union;
        struct  prep            prep;
 }
-
+/* tokens */
 /* special embedded SQL token */
-%token SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
-               SQL_CALL SQL_CARDINALITY SQL_CONNECT
-               SQL_COUNT
-               SQL_DATETIME_INTERVAL_CODE
-               SQL_DATETIME_INTERVAL_PRECISION SQL_DESCRIBE
-               SQL_DESCRIPTOR SQL_DISCONNECT SQL_FOUND
-               SQL_FREE SQL_GET SQL_GO SQL_GOTO SQL_IDENTIFIED
-               SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
-               SQL_LONG SQL_NULLABLE SQL_OCTET_LENGTH
-               SQL_OPEN SQL_OUTPUT 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
-               SQL_STRUCT SQL_UNSIGNED SQL_VAR SQL_WHENEVER
+%token  SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
+                SQL_CALL SQL_CARDINALITY SQL_CONNECT
+                SQL_COUNT 
+                SQL_DATETIME_INTERVAL_CODE
+                SQL_DATETIME_INTERVAL_PRECISION SQL_DESCRIBE
+                SQL_DESCRIPTOR SQL_DISCONNECT SQL_FOUND
+                SQL_FREE SQL_GET SQL_GO SQL_GOTO SQL_IDENTIFIED
+                SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
+                SQL_LONG SQL_NULLABLE SQL_OCTET_LENGTH
+                SQL_OPEN SQL_OUTPUT 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
+                SQL_STRUCT SQL_UNSIGNED SQL_VAR SQL_WHENEVER
 
 /* C token */
-%token S_ADD S_AND S_ANYTHING S_AUTO S_CONST S_DEC S_DIV
-               S_DOTPOINT S_EQUAL S_EXTERN S_INC S_LSHIFT S_MEMPOINT
-               S_MEMBER S_MOD S_MUL S_NEQUAL S_OR S_REGISTER S_RSHIFT
-               S_STATIC S_SUB S_VOLATILE
-               S_TYPEDEF
+%token  S_ADD S_AND S_ANYTHING S_AUTO S_CONST S_DEC S_DIV
+                S_DOTPOINT S_EQUAL S_EXTERN S_INC S_LSHIFT S_MEMPOINT
+                S_MEMBER S_MOD S_MUL S_NEQUAL S_OR S_REGISTER S_RSHIFT
+                S_STATIC S_SUB S_VOLATILE
+                S_TYPEDEF
+
+%token TYPECAST
+%token CSTRING CVARIABLE CPP_LINE IP 
+%token DOLCONST ECONST NCONST UCONST UIDENT
+
+/* types */
+%type <str> stmt
+%type <str> CreateRoleStmt
+%type <str> opt_with
+%type <str> OptRoleList
+%type <str> OptRoleElem
+%type <str> CreateUserStmt
+%type <str> AlterRoleStmt
+%type <str> AlterRoleSetStmt
+%type <str> AlterUserStmt
+%type <str> AlterUserSetStmt
+%type <str> DropRoleStmt
+%type <str> DropUserStmt
+%type <str> CreateGroupStmt
+%type <str> AlterGroupStmt
+%type <str> add_drop
+%type <str> DropGroupStmt
+%type <str> CreateSchemaStmt
+%type <str> OptSchemaName
+%type <str> OptSchemaEltList
+%type <str> schema_stmt
+%type <str> VariableSetStmt
+%type <str> set_rest
+%type <str> var_name
+%type <str> var_list
+%type <str> var_value
+%type <str> iso_level
+%type <str> opt_boolean
+%type <str> zone_value
+%type <str> opt_encoding
+%type <str> ColId_or_Sconst
+%type <str> VariableResetStmt
+%type <str> SetResetClause
+%type <str> VariableShowStmt
+%type <str> ConstraintsSetStmt
+%type <str> constraints_set_list
+%type <str> constraints_set_mode
+%type <str> CheckPointStmt
+%type <str> DiscardStmt
+%type <str> AlterTableStmt
+%type <str> alter_table_cmds
+%type <str> alter_table_cmd
+%type <str> alter_column_default
+%type <str> opt_drop_behavior
+%type <str> alter_using
+%type <str> ClosePortalStmt
+%type <str> CopyStmt
+%type <str> copy_from
+%type <str> copy_file_name
+%type <str> copy_opt_list
+%type <str> copy_opt_item
+%type <str> opt_binary
+%type <str> opt_oids
+%type <str> copy_delimiter
+%type <str> opt_using
+%type <str> CreateStmt
+%type <str> OptTemp
+%type <str> OptTableElementList
+%type <str> TableElementList
+%type <str> TableElement
+%type <str> columnDef
+%type <str> ColQualList
+%type <str> ColConstraint
+%type <str> ColConstraintElem
+%type <str> ConstraintAttr
+%type <str> TableLikeClause
+%type <str> TableLikeOptionList
+%type <str> TableLikeOption
+%type <str> TableConstraint
+%type <str> ConstraintElem
+%type <str> opt_column_list
+%type <str> columnList
+%type <str> columnElem
+%type <str> key_match
+%type <str> key_actions
+%type <str> key_update
+%type <str> key_delete
+%type <str> key_action
+%type <str> OptInherit
+%type <str> OptWith
+%type <str> OnCommitOption
+%type <str> OptTableSpace
+%type <str> OptConsTableSpace
+%type <str> create_as_target
+%type <str> OptCreateAs
+%type <str> CreateAsList
+%type <str> CreateAsElement
+%type <str> opt_with_data
+%type <str> CreateSeqStmt
+%type <str> AlterSeqStmt
+%type <str> OptSeqOptList
+%type <str> SeqOptList
+%type <str> SeqOptElem
+%type <str> opt_by
+%type <str> NumericOnly
+%type <str> FloatOnly
+%type <str> IntegerOnly
+%type <str> CreatePLangStmt
+%type <str> opt_trusted
+%type <str> handler_name
+%type <str> opt_validator
+%type <str> opt_lancompiler
+%type <str> DropPLangStmt
+%type <str> opt_procedural
+%type <str> CreateTableSpaceStmt
+%type <str> OptTableSpaceOwner
+%type <str> DropTableSpaceStmt
+%type <str> CreateTrigStmt
+%type <str> TriggerActionTime
+%type <str> TriggerEvents
+%type <str> TriggerOneEvent
+%type <str> TriggerForSpec
+%type <str> TriggerForOpt
+%type <str> TriggerForType
+%type <str> TriggerFuncArgs
+%type <str> TriggerFuncArg
+%type <str> OptConstrFromTable
+%type <str> ConstraintAttributeSpec
+%type <str> ConstraintDeferrabilitySpec
+%type <str> ConstraintTimeSpec
+%type <str> DropTrigStmt
+%type <str> CreateAssertStmt
+%type <str> DropAssertStmt
+%type <str> DefineStmt
+%type <str> definition
+%type <str> def_list
+%type <str> def_elem
+%type <str> def_arg
+%type <str> aggr_args
+%type <str> old_aggr_definition
+%type <str> old_aggr_list
+%type <str> old_aggr_elem
+%type <str> enum_val_list
+%type <str> CreateOpClassStmt
+%type <str> opclass_item_list
+%type <str> opclass_item
+%type <str> opt_default
+%type <str> opt_opfamily
+%type <str> opt_recheck
+%type <str> CreateOpFamilyStmt
+%type <str> AlterOpFamilyStmt
+%type <str> opclass_drop_list
+%type <str> opclass_drop
+%type <str> DropOpClassStmt
+%type <str> DropOpFamilyStmt
+%type <str> DropOwnedStmt
+%type <str> ReassignOwnedStmt
+%type <str> DropStmt
+%type <str> drop_type
+%type <str> any_name_list
+%type <str> any_name
+%type <str> attrs
+%type <str> TruncateStmt
+%type <str> opt_restart_seqs
+%type <str> CommentStmt
+%type <str> comment_type
+%type <str> comment_text
+%type <str> FetchStmt
+%type <str> fetch_direction
+%type <str> from_in
+%type <str> GrantStmt
+%type <str> RevokeStmt
+%type <str> privileges
+%type <str> privilege_list
+%type <str> privilege
+%type <str> privilege_target
+%type <str> grantee_list
+%type <str> grantee
+%type <str> opt_grant_grant_option
+%type <str> function_with_argtypes_list
+%type <str> function_with_argtypes
+%type <str> GrantRoleStmt
+%type <str> RevokeRoleStmt
+%type <str> opt_grant_admin_option
+%type <str> opt_granted_by
+%type <str> IndexStmt
+%type <str> index_opt_unique
+%type <str> access_method_clause
+%type <str> index_params
+%type <str> index_elem
+%type <str> opt_class
+%type <str> opt_asc_desc
+%type <str> opt_nulls_order
+%type <str> CreateFunctionStmt
+%type <str> opt_or_replace
+%type <str> func_args
+%type <str> func_args_list
+%type <str> func_arg
+%type <str> arg_class
+%type <str> param_name
+%type <str> func_return
+%type <str> func_type
+%type <str> createfunc_opt_list
+%type <str> common_func_opt_item
+%type <str> createfunc_opt_item
+%type <str> func_as
+%type <str> opt_definition
+%type <str> table_func_column
+%type <str> table_func_column_list
+%type <str> AlterFunctionStmt
+%type <str> alterfunc_opt_list
+%type <str> opt_restrict
+%type <str> RemoveFuncStmt
+%type <str> RemoveAggrStmt
+%type <str> RemoveOperStmt
+%type <str> oper_argtypes
+%type <str> any_operator
+%type <str> CreateCastStmt
+%type <str> cast_context
+%type <str> DropCastStmt
+%type <str> opt_if_exists
+%type <str> ReindexStmt
+%type <str> reindex_type
+%type <str> opt_force
+%type <str> RenameStmt
+%type <str> opt_column
+%type <str> opt_set_data
+%type <str> AlterObjectSchemaStmt
+%type <str> AlterOwnerStmt
+%type <str> RuleActionList
+%type <str> RuleActionMulti
+%type <str> RuleActionStmt
+%type <str> RuleActionStmtOrEmpty
+%type <str> event
+%type <str> opt_instead
+%type <str> DropRuleStmt
+%type <str> NotifyStmt
+%type <str> ListenStmt
+%type <str> UnlistenStmt
+%type <str> TransactionStmt
+%type <str> opt_transaction
+%type <str> transaction_mode_item
+%type <str> transaction_mode_list
+%type <str> transaction_mode_list_or_empty
+%type <str> ViewStmt
+%type <str> opt_check_option
+%type <str> LoadStmt
+%type <str> CreatedbStmt
+%type <str> createdb_opt_list
+%type <str> createdb_opt_item
+%type <str> opt_equal
+%type <str> AlterDatabaseStmt
+%type <str> AlterDatabaseSetStmt
+%type <str> alterdb_opt_list
+%type <str> alterdb_opt_item
+%type <str> DropdbStmt
+%type <str> CreateDomainStmt
+%type <str> AlterDomainStmt
+%type <str> opt_as
+%type <str> AlterTSDictionaryStmt
+%type <str> AlterTSConfigurationStmt
+%type <str> CreateConversionStmt
+%type <str> ClusterStmt
+%type <str> cluster_index_specification
+%type <str> VacuumStmt
+%type <str> AnalyzeStmt
+%type <str> analyze_keyword
+%type <str> opt_verbose
+%type <str> opt_full
+%type <str> opt_freeze
+%type <str> opt_name_list
+%type <str> ExplainStmt
+%type <str> ExplainableStmt
+%type <str> opt_analyze
+%type <prep> PrepareStmt
+%type <str> prep_type_clause
+%type <str> PreparableStmt
+%type <str> ExecuteStmt
+%type <str> execute_param_clause
+%type <str> InsertStmt
+%type <str> insert_rest
+%type <str> insert_column_list
+%type <str> insert_column_item
+%type <str> returning_clause
+%type <str> DeleteStmt
+%type <str> using_clause
+%type <str> LockStmt
+%type <str> opt_lock
+%type <str> lock_type
+%type <str> opt_nowait
+%type <str> UpdateStmt
+%type <str> set_clause_list
+%type <str> set_clause
+%type <str> single_set_clause
+%type <str> multiple_set_clause
+%type <str> set_target
+%type <str> set_target_list
+%type <str> DeclareCursorStmt
+%type <str> cursor_options
+%type <str> opt_hold
+%type <str> SelectStmt
+%type <str> select_with_parens
+%type <str> select_no_parens
+%type <str> select_clause
+%type <str> simple_select
+%type <str> with_clause
+%type <str> cte_list
+%type <str> common_table_expr
+%type <str> into_clause
+%type <str> OptTempTableName
+%type <str> opt_table
+%type <str> opt_all
+%type <str> opt_distinct
+%type <str> opt_sort_clause
+%type <str> sort_clause
+%type <str> sortby_list
+%type <str> sortby
+%type <str> select_limit
+%type <str> opt_select_limit
+%type <str> select_limit_value
+%type <str> opt_select_fetch_first_value
+%type <str> select_offset_value
+%type <str> select_offset_value2
+%type <str> row_or_rows
+%type <str> first_or_next
+%type <str> group_clause
+%type <str> having_clause
+%type <str> for_locking_clause
+%type <str> opt_for_locking_clause
+%type <str> for_locking_items
+%type <str> for_locking_item
+%type <str> locked_rels_list
+%type <str> values_clause
+%type <str> from_clause
+%type <str> from_list
+%type <str> table_ref
+%type <str> joined_table
+%type <str> alias_clause
+%type <str> join_type
+%type <str> join_outer
+%type <str> join_qual
+%type <str> relation_expr
+%type <str> relation_expr_opt_alias
+%type <str> func_table
+%type <str> where_clause
+%type <str> where_or_current_clause
+%type <str> TableFuncElementList
+%type <str> TableFuncElement
+%type <str> Typename
+%type <index> opt_array_bounds
+%type <str> SimpleTypename
+%type <str> ConstTypename
+%type <str> GenericType
+%type <str> opt_type_modifiers
+%type <str> Numeric
+%type <str> opt_float
+%type <str> Bit
+%type <str> ConstBit
+%type <str> BitWithLength
+%type <str> BitWithoutLength
+%type <str> Character
+%type <str> ConstCharacter
+%type <str> CharacterWithLength
+%type <str> CharacterWithoutLength
+%type <str> character
+%type <str> opt_varying
+%type <str> opt_charset
+%type <str> ConstDatetime
+%type <str> ConstInterval
+%type <str> opt_timezone
+%type <str> opt_interval
+%type <str> interval_second
+%type <str> a_expr
+%type <str> b_expr
+%type <str> c_expr
+%type <str> func_expr
+%type <str> xml_root_version
+%type <str> opt_xml_root_standalone
+%type <str> xml_attributes
+%type <str> xml_attribute_list
+%type <str> xml_attribute_el
+%type <str> document_or_content
+%type <str> xml_whitespace_option
+%type <str> row
+%type <str> sub_type
+%type <str> all_Op
+%type <str> MathOp
+%type <str> qual_Op
+%type <str> qual_all_Op
+%type <str> subquery_Op
+%type <str> expr_list
+%type <str> type_list
+%type <str> array_expr
+%type <str> array_expr_list
+%type <str> extract_list
+%type <str> extract_arg
+%type <str> overlay_list
+%type <str> overlay_placing
+%type <str> position_list
+%type <str> substr_list
+%type <str> substr_from
+%type <str> substr_for
+%type <str> trim_list
+%type <str> in_expr
+%type <str> case_expr
+%type <str> when_clause_list
+%type <str> when_clause
+%type <str> case_default
+%type <str> case_arg
+%type <str> columnref
+%type <str> indirection_el
+%type <str> indirection
+%type <str> opt_indirection
+%type <str> opt_asymmetric
+%type <str> ctext_expr
+%type <str> ctext_expr_list
+%type <str> ctext_row
+%type <str> target_list
+%type <str> target_el
+%type <str> relation_name
+%type <str> qualified_name_list
+%type <str> qualified_name
+%type <str> name_list
+%type <str> name
+%type <str> database_name
+%type <str> access_method
+%type <str> attr_name
+%type <str> index_name
+%type <str> file_name
+%type <str> func_name
+%type <str> AexprConst
+%type <str> RoleId
+%type <str> SignedIconst
+%type <str> ColId
+%type <str> type_function_name
+%type <str> col_name_keyword
+%type <str> type_func_name_keyword
+%type <str> reserved_keyword
+%type <str> SpecialRuleRelation
+/* ecpgtype */
+%type <str> ECPGAllocateDescr
+%type <str> ECPGCKeywords
+%type <str> ECPGColId
+%type <str> ECPGColLabel
+%type <str> ECPGColLabelCommon
+%type <str> ECPGConnect
+%type <str> ECPGCursorStmt
+%type <str> ECPGDeallocateDescr
+%type <str> ECPGDeclaration
+%type <str> ECPGDeclare
+%type <str> ECPGDescribe
+%type <str> ECPGDisconnect
+%type <str> ECPGExecuteImmediateStmt
+%type <str> ECPGFree
+%type <str> ECPGGetDescHeaderItem
+%type <str> ECPGGetDescItem
+%type <str> ECPGGetDescriptorHeader
+%type <str> ECPGKeywords
+%type <str> ECPGKeywords_rest
+%type <str> ECPGKeywords_vanames
+%type <str> ECPGOpen
+%type <str> ECPGSetAutocommit
+%type <str> ECPGSetConnection
+%type <str> ECPGSetDescHeaderItem
+%type <str> ECPGSetDescItem
+%type <str> ECPGSetDescriptorHeader
+%type <str> ECPGTypeName
+%type <str> ECPGTypedef
+%type <str> ECPGVar
+%type <str> ECPGVarDeclaration
+%type <str> ECPGWhenever
+%type <str> ECPGunreserved
+%type <str> ECPGunreserved_con
+%type <str> ECPGunreserved_interval
+%type <str> UsingConst
+%type <str> UsingValue
+%type <str> c_anything
+%type <str> c_args
+%type <str> c_list
+%type <str> c_stuff
+%type <str> c_stuff_item
+%type <str> c_term
+%type <str> c_thing
+%type <str> char_variable
+%type <str> civar
+%type <str> civarind
+%type <str> ColId_or_real_sconst
+%type <str> ColLabel
+%type <str> connect_options
+%type <str> connection_object
+%type <str> connection_target
+%type <str> coutputvariable
+%type <str> cvariable
+%type <str> db_prefix
+%type <str> CreateAsStmt
+%type <str> DeallocateStmt
+%type <str> dis_name
+%type <str> ecpg_bconst
+%type <str> ecpg_fconst
+%type <str> ecpg_iconst
+%type <str> ecpg_ident
+%type <str> ecpg_interval
+%type <str> ecpg_into
+%type <str> ecpg_param
+%type <str> ecpg_real_iconst
+%type <str> ecpg_real_sconst
+%type <str> ecpg_sconst
+%type <str> ecpg_using
+%type <str> ecpg_xconst
+%type <str> enum_definition
+%type <str> enum_type
+%type <str> execstring
+%type <str> execute_rest
+%type <str> indicator
+%type <str> into_descriptor
+%type <str> Iresult
+%type <str> on_off
+%type <str> opt_bit_field
+%type <str> opt_connection_name
+%type <str> opt_database_name
+%type <str> opt_ecpg_using
+%type <str> opt_initializer
+%type <str> opt_options
+%type <str> opt_output
+%type <str> opt_pointer
+%type <str> opt_port
+%type <str> opt_reference
+%type <str> opt_scale
+%type <str> opt_server
+%type <str> opt_user
+%type <str> opt_opt_value
+%type <str> ora_user
+%type <str> precision
+%type <str> prepared_name
+%type <str> quoted_ident_stringvar
+%type <str> RuleStmt
+%type <str> s_struct_union
+%type <str> server
+%type <str> server_name
+%type <str> single_vt_declaration
+%type <str> storage_clause
+%type <str> storage_declaration
+%type <str> storage_modifier
+%type <str> struct_union_type
+%type <str> struct_union_type_with_symbol
+%type <str> symbol
+%type <str> type_declaration
+%type <str> unreserved_keyword 
+%type <str> user_name
+%type <str> using_descriptor
+%type <str> var_declaration
+%type <str> var_type_declarations
+%type <str> variable
+%type <str> variable_declarations
+%type <str> variable_list
+%type <str> vt_declarations 
+
+%type <str> Op
+%type <str> IntConstVar
+%type <str> AllConstVar
+%type <str> CSTRING
+%type <str> CPP_LINE
+%type <str> CVARIABLE
+%type <str> DOLCONST
+%type <str> ECONST
+%type <str> NCONST
+%type <str> SCONST
+%type <str> UCONST
+%type <str> UIDENT
 
-/* I need this and don't know where it is defined inside the backend */
-%token TYPECAST
+%type  <struct_union> s_struct_union_symbol
 
-/* ordinary key words in alphabetical order */
-%token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
-       AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
-       ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION
+%type  <descriptor> ECPGGetDescriptor
+%type  <descriptor> ECPGSetDescriptor
 
-       BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
-       BOOLEAN_P BOTH BY
+%type  <type_enum> simple_type
+%type  <type_enum> signed_type
+%type  <type_enum> unsigned_type
 
-       CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
-       CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
-       CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
-       COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS 
-       CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB
-       CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P
-       CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
-       CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
+%type  <dtype_enum> descriptor_item
+%type  <dtype_enum> desc_header_item
 
-       DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
-       DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
-       DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
+%type  <type>   var_type
 
-       EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT EXCLUSIVE EXCLUDING
-       EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
+%type  <action> action
 
-       FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD FREEZE FROM
-       FULL FUNCTION
+/* orig_tokens */
+ %token ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
+ AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
+ ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION
 
-       GLOBAL GRANT GRANTED GREATEST GROUP_P
+ BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
+ BOOLEAN_P BOTH BY
 
-       HANDLER HAVING HEADER_P HOLD HOUR_P
+ CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
+ CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
+ CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
+ COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
+ CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB
+ CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P
+ CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
+ CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
 
-       IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P
-       INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY
-       INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
-       INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
+ DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
+ DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
+ DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
 
-       JOIN
+ EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT EXCLUDING
+ EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
 
-       KEY
+ FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
+ FREEZE FROM FULL FUNCTION
 
-       LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL
-       LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
-       LOCK_P LOGIN_P
+ GLOBAL GRANT GRANTED GREATEST GROUP_P
 
-       MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
+ HANDLER HAVING HEADER_P HOLD HOUR_P
 
-       NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
-       NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER
-       NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC
+ IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P
+ INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY
+ INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
+ INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
 
-       OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER
-       OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER
+ JOIN
 
-       PARSER PARTIAL PASSWORD PLACING PLANS POSITION
-       PRECISION PRESERVE PREPARE PREPARED PRIMARY
-       PRIOR PRIVILEGES PROCEDURAL PROCEDURE
+ KEY
 
-       QUOTE
+ LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL
+ LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
+ LOCK_P LOGIN_P
 
-       READ REAL REASSIGN RECHECK RECURSIVE REFERENCES REINDEX RELATIVE_P RELEASE RENAME
-       REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE
-       RIGHT ROLE ROLLBACK ROW ROWS RULE
+ MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
 
-       SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE
-       SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
-       SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT
-       STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
-       SYMMETRIC SYSID SYSTEM_P
+ NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
+ NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER
+ NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC
 
-       TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP TO 
-       TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P
+ OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
+ ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER
 
-       UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
-       UPDATE USER USING
+ PARSER PARTIAL PASSWORD PLACING PLANS POSITION
+ PRECISION PRESERVE PREPARE PREPARED PRIMARY
+ PRIOR PRIVILEGES PROCEDURAL PROCEDURE
 
-       VACUUM VALID VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
-       VERBOSE VERSION_P VIEW VOLATILE
-       WHEN WHERE WHITESPACE_P WITH WITHOUT WORK WRITE
+ QUOTE
 
-       XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLFOREST XMLPARSE
-       XMLPI XMLROOT XMLSERIALIZE
+ READ REAL REASSIGN RECHECK RECURSIVE REFERENCES REINDEX RELATIVE_P RELEASE
+ RENAME REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS
+ REVOKE RIGHT ROLE ROLLBACK ROW ROWS RULE
 
-       YEAR_P YES_P
+ SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE
+ SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
+ SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT
+ STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
+ SYMMETRIC SYSID SYSTEM_P
 
-       ZONE
+ TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP
+ TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
+ TRUNCATE TRUSTED TYPE_P
 
-/* The grammar thinks these are keywords, but they are not in the keywords.c
- * list and so can never be entered directly.  The filter in parser.c
- * creates these tokens when required.
- */
-%token           NULLS_FIRST NULLS_LAST WITH_TIME
-
-/* Special token types, not actually keywords - see the "lex" file */
-%token <str>   IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST
-%token <str>   XCONST DOLCONST ECONST NCONST UCONST UIDENT
-%token <ival>  ICONST PARAM
-%token <dval>  FCONST
-
-/* precedence: lowest to highest */
-%nonassoc      SET                             /* see relation_expr_opt_alias */
-%left          UNION EXCEPT
-%left          INTERSECT
-%left          OR
-%left          AND
-%right         NOT
-%right         '='
-%nonassoc      '<' '>'
-%nonassoc      LIKE ILIKE SIMILAR
-%nonassoc      ESCAPE
-%nonassoc      OVERLAPS
-%nonassoc      BETWEEN
-%nonassoc      IN_P
-%left          POSTFIXOP               /* dummy for postfix Op rules */
-%nonassoc      IDENT                   /* to support target_el without AS */
-%left          Op OPERATOR             /* multi-character ops and user-defined operators */
-%nonassoc      NOTNULL
-%nonassoc      ISNULL
-%nonassoc      IS NULL_P TRUE_P FALSE_P UNKNOWN
-%left          '+' '-'
-%left          '*' '/' '%'
-%left          '^'
-/* Unary Operators */
-%left          AT ZONE
-%right         UMINUS
-%left          '[' ']'
-%left          '(' ')'
-%left          TYPECAST
-%left          '.'
-%left          JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
-/* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
-%right         PRESERVE STRIP_P
-
-%type  <str>   Iconst Fconst Sconst TransactionStmt CreateStmt RoleId
-%type  <str>   CreateAsElement OptCreateAs CreateAsList CreateAsStmt
-%type  <str>   comment_text ConstraintDeferrabilitySpec TableElementList
-%type  <str>   key_match ColLabel SpecialRuleRelation ColId columnDef
-%type  <str>   ColConstraint ColConstraintElem drop_type Bconst Iresult
-%type  <str>   TableConstraint OptTableElementList Xconst opt_transaction
-%type  <str>   ConstraintElem key_actions ColQualList cluster_index_specification
-%type  <str>   target_list target_el alias_clause type_func_name_keyword
-%type  <str>   qualified_name database_name alter_using type_function_name
-%type  <str>   access_method attr_name index_name name func_name opt_restart_seqs
-%type  <str>   file_name AexprConst c_expr ConstTypename var_list 
-%type  <str>   a_expr b_expr TruncateStmt CommentStmt OnCommitOption opt_by
-%type  <str>   opt_indirection expr_list extract_list extract_arg OptSeqOptList
-%type  <str>   position_list substr_list substr_from alter_column_default
-%type  <str>   trim_list in_expr substr_for attrs TableFuncElement
-%type  <str>   Typename SimpleTypename Numeric opt_float DiscardStmt
-%type  <str>   Character character opt_varying opt_charset enum_val_list
-%type  <str>   opt_timezone opt_interval table_ref fetch_direction
-%type  <str>   ConstDatetime AlterDomainStmt AlterSeqStmt table_func_column
-%type  <str>   SelectStmt into_clause OptTemp ConstraintAttributeSpec
-%type  <str>   opt_table opt_all sort_clause sortby_list ConstraintAttr
-%type  <str>   sortby qualified_name_list name_list ColId_or_Sconst
-%type  <str>   group_clause having_clause from_clause opt_distinct opt_hold
-%type  <str>   join_outer where_clause relation_expr sub_type arg_class
-%type  <str>   opt_column_list insert_rest InsertStmt param_name
-%type  <str>   columnList DeleteStmt UpdateStmt DeclareCursorStmt
-%type  <str>   NotifyStmt columnElem UnlistenStmt TableElement fetch_count
-%type  <str>   copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
-%type  <str>   FetchStmt from_in CreateOpClassStmt returning_clause
-%type  <str>   ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose
-%type  <str>   opt_full func_arg OptWith opt_freeze alter_table_cmd
-%type  <str>   analyze_keyword opt_name_list ExplainStmt index_params
-%type  <str>   index_elem opt_class access_method_clause alter_table_cmds
-%type  <str>   index_opt_unique IndexStmt func_return ConstInterval
-%type  <str>   func_args_list func_args opt_with def_arg overlay_placing
-%type  <str>   def_elem def_list definition 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_set_data oper_argtypes NumConst var_name
-%type  <str>   MathOp RemoveFuncStmt ECPGunreserved_con opt_database_name
-%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 overlay_list
-%type  <str>   relation_name OptTableSpace LockStmt opt_lock table_func_column_list
-%type  <str>   CreateUserStmt AlterUserStmt CreateSeqStmt SeqOptList
-%type  <str>   SeqOptElem TriggerForSpec TriggerForOpt TriggerForType
-%type  <str>   DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
-%type  <str>   TriggerActionTime CreateTrigStmt DropPLangStmt DropCastStmt
-%type  <str>   CreatePLangStmt TriggerFuncArgs TriggerFuncArg simple_select
-%type  <str>   ViewStmt LoadStmt CreatedbStmt createdb_opt_item ExplainableStmt
-%type  <str>   createdb_opt_list opt_encoding OptInherit opt_equal
-%type  <str>   privilege_list privilege privilege_target opt_if_exists
-%type  <str>   opt_grant_grant_option cursor_options DropOwnedStmt
-%type  <str>   transaction_mode_list_or_empty transaction_mode_list
-%type  <str>   function_with_argtypes_list function_with_argtypes IntConstVar
-%type  <str>   DropdbStmt ClusterStmt grantee RevokeStmt Bit DropOpClassStmt
-%type  <str>   GrantStmt privileges PosAllConst constraints_set_list
-%type  <str>   ConstraintsSetStmt AllConst CreateDomainStmt opt_nowait
-%type  <str>   case_expr when_clause_list case_default case_arg when_clause
-%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 joined_table opclass_item relation_expr_opt_alias
-%type  <str>   lock_type array_expr_list ReassignOwnedStmt for_locking_item
-%type  <str>   OptConstrFromTable OptTempTableName StringConst array_expr
-%type  <str>   constraints_set_mode comment_type opt_check_option
-%type  <str>   CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete
-%type  <str>   opt_force key_update CreateSchemaStmt PosIntStringConst
-%type  <str>   IntConst PosIntConst grantee_list func_type opt_or_replace
-%type  <str>   select_limit CheckPointStmt ECPGColId old_aggr_list
-%type  <str>   OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
-%type  <str>   handler_name any_name_list any_name opt_as insert_column_list
-%type  <str>   columnref values_clause AllConstVar prep_type_clause ExecuteStmt
-%type  <str>   insert_column_item DropRuleStmt ctext_expr execute_param_clause 
-%type  <str>   createfunc_opt_item set_rest with_clause common_table_expr
-%type  <str>   CreateFunctionStmt createfunc_opt_list func_table cte_list
-%type  <str>   DropUserStmt copy_from copy_opt_list copy_opt_item
-%type  <str>   opt_oids TableLikeClause key_action opt_definition
-%type  <str>   cast_context row qual_Op qual_all_Op opt_default
-%type  <str>   CreateConversionStmt any_operator opclass_item_list
-%type  <str>   iso_level type_list CharacterWithLength ConstCharacter
-%type  <str>   CharacterWithoutLength BitWithLength BitWithoutLength
-%type  <str>   ConstBit GenericType TableFuncElementList opt_analyze
-%type  <str>   opt_sort_clause subquery_Op transaction_mode_item
-%type  <str>   ECPGWhenever ECPGConnect connection_target ECPGOpen
-%type  <str>   indicator ecpg_using ecpg_into DeallocateStmt interval_second
-%type  <str>   storage_declaration storage_clause opt_initializer c_anything
-%type  <str>   variable_list variable c_thing c_term ECPGKeywords_vanames
-%type  <str>   opt_pointer ECPGDisconnect dis_name storage_modifier
-%type  <str>   execstring server_name ECPGVarDeclaration func_expr
-%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>   var_type_declarations quoted_ident_stringvar ECPGKeywords_rest
-%type  <str>   db_prefix server connect_options opt_options opt_connection_name c_list
-%type  <str>   ECPGSetConnection ECPGTypedef c_args ECPGKeywords ECPGCKeywords
-%type  <str>   enum_type civar civarind ECPGCursorStmt PreparableStmt
-%type  <str>   ECPGFree ECPGDeclare ECPGVar at enum_definition opt_opt_value
-%type  <str>   struct_union_type s_struct_union vt_declarations execute_rest
-%type  <str>   var_declaration type_declaration single_vt_declaration
-%type  <str>   ECPGSetAutocommit on_off variable_declarations ECPGDescribe
-%type  <str>   ECPGAllocateDescr ECPGDeallocateDescr symbol opt_output
-%type  <str>   ECPGGetDescriptorHeader ECPGColLabel SetResetClause AlterUserSetStmt
-%type  <str>   reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
-%type  <str>   col_name_keyword precision opt_scale ECPGExecuteImmediateStmt
-%type  <str>   ECPGTypeName using_list ECPGColLabelCommon UsingConst 
-%type  <str>   using_descriptor into_descriptor opt_nulls_order opt_asc_desc
-%type  <str>   prepared_name struct_union_type_with_symbol OptConsTableSpace
-%type  <str>   ECPGunreserved ECPGunreserved_interval cvariable opt_bit_field
-%type  <str>   AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
-%type  <str>   DropTableSpaceStmt indirection indirection_el ECPGSetDescriptorHeader
-%type  <str>   AlterDatabaseStmt CreateRoleStmt OptRoleList AlterRoleStmt AlterRoleSetStmt
-%type  <str>   DropRoleStmt add_drop opt_validator common_func_opt_item Param
-%type  <str>   opt_grant_admin_option AlterFunctionStmt alterfunc_opt_list opt_restrict
-%type  <str>   AlterObjectSchemaStmt alterdb_opt_list for_locking_clause opt_for_locking_clause
-%type  <str>   locked_rels_list opt_granted_by RevokeRoleStmt alterdb_opt_item using_clause
-%type  <str>   GrantRoleStmt opt_asymmetric aggr_args old_aggr_definition
-%type  <str>   old_aggr_elem for_locking_items TableLikeOptionList TableLikeOption
-%type  <str>   set_target_list set_clause_list set_clause multiple_set_clause
-%type  <str>   ctext_expr_list ctext_row single_set_clause set_target opt_type_modifiers
-%type  <str>   opclass_drop_list opclass_drop DropOpFamilyStmt opt_opfamily
-%type  <str>   CreateOpFamilyStmt AlterOpFamilyStmt create_as_target
-%type  <str>   xml_attributes xml_attribute_list document_or_content xml_whitespace_option
-%type  <str>   opt_xml_root_standalone xml_root_version xml_attribute_el 
-%type  <str>   where_or_current_clause AlterTSConfigurationStmt AlterTSDictionaryStmt
+ UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
+ UPDATE USER USING
 
-%type  <struct_union> s_struct_union_symbol
+ VACUUM VALID VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
+ VERBOSE VERSION_P VIEW VOLATILE
 
-%type  <descriptor> ECPGGetDescriptor ECPGSetDescriptor
+ WHEN WHERE WHITESPACE_P WITH WITHOUT WORK WRITE
 
-%type  <type_enum> simple_type signed_type unsigned_type
+ XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLFOREST XMLPARSE
+ XMLPI XMLROOT XMLSERIALIZE
 
-%type  <dtype_enum> descriptor_item desc_header_item
+ YEAR_P YES_P
 
-%type  <type>  var_type
+ ZONE
 
-%type  <prep>  PrepareStmt
 
-%type  <action> action
 
-%type  <index> opt_array_bounds
 
-%%
-prog: statements;
 
-statements: /*EMPTY*/
-               | statements statement
-               ;
+ %token NULLS_FIRST NULLS_LAST WITH_TIME
 
-statement: ecpgstart at stmt ';'       { connection = NULL; }
-               | ecpgstart stmt ';'
-               | ecpgstart ECPGVarDeclaration
-               {
-                       fprintf(yyout, "%s", $2);
-                       free($2);
-                       output_line_number();
-               }
-               | ECPGDeclaration
-               | c_thing               { fprintf(yyout, "%s", $1); free($1); }
-               | CPP_LINE              { fprintf(yyout, "%s", $1); free($1); }
-               | '{'                   { braces_open++; fputs("{", yyout); }
-               | '}'                   { remove_typedefs(braces_open); remove_variables(braces_open--); fputs("}", yyout); }
-               ;
 
-at: AT connection_object
-               {
-                       connection = $2;
-                       /*
-                        *      Do we have a variable as connection target?
-                        *      Remove the variable from the variable
-                        *      list or else it will be used twice
-                        */
-                       if (argsinsert != NULL)
-                               argsinsert = NULL;
-               }
-       ;
+ %token IDENT FCONST SCONST BCONST XCONST Op
+ %token ICONST PARAM
 
-stmt:  AlterDatabaseStmt               { output_statement($1, 0, ECPGst_normal); }
-               | AlterDatabaseSetStmt  { output_statement($1, 0, ECPGst_normal); }
-               | AlterDomainStmt       { output_statement($1, 0, ECPGst_normal); }
-               | AlterFunctionStmt     { output_statement($1, 0, ECPGst_normal); }
-               | AlterGroupStmt        { output_statement($1, 0, ECPGst_normal); }
-               | AlterObjectSchemaStmt { output_statement($1, 0, ECPGst_normal); }
-               | AlterOwnerStmt        { output_statement($1, 0, ECPGst_normal); }
-               | AlterSeqStmt          { output_statement($1, 0, ECPGst_normal); }
-               | AlterTableStmt        { output_statement($1, 0, ECPGst_normal); }
-               | AlterRoleSetStmt      { output_statement($1, 0, ECPGst_normal); }
-               | AlterRoleStmt         { output_statement($1, 0, ECPGst_normal); }
-               | AlterTSConfigurationStmt      { output_statement($1, 0, ECPGst_normal); }
-               | AlterTSDictionaryStmt { output_statement($1, 0, ECPGst_normal); }
-               | AlterUserStmt         { output_statement($1, 0, ECPGst_normal); }
-               | AlterUserSetStmt      { output_statement($1, 0, ECPGst_normal); }
-               | AnalyzeStmt           { output_statement($1, 0, ECPGst_normal); }
-               | CheckPointStmt        { output_statement($1, 0, ECPGst_normal); }
-               | ClosePortalStmt
-               {
-                       if (INFORMIX_MODE)
-                       {
-                               /*
-                                *      Informix also has a CLOSE DATABASE command that
-                                *      essantially works like a DISCONNECT CURRENT
-                                *      as far as I know.
-                                */
-                               if (pg_strcasecmp($1+strlen("close "), "database") == 0)
-                               {
-                                       if (connection)
-                                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for close database statement\n");
 
-                                       fprintf(yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
-                                       whenever_action(2);
-                                       free($1);
-                               }
-                               else
-                                       output_statement($1, 0, ECPGst_normal);
-                       }
-                       else
-                               output_statement($1, 0, ECPGst_normal);
-               }
-               | ClusterStmt           { output_statement($1, 0, ECPGst_normal); }
-               | CommentStmt           { output_statement($1, 0, ECPGst_normal); }
-               | ConstraintsSetStmt    { output_statement($1, 0, ECPGst_normal); }
-               | CopyStmt              { output_statement($1, 0, ECPGst_normal); }
-               | CreateAsStmt          { output_statement($1, 0, ECPGst_normal); }
-               | CreateAssertStmt      { output_statement($1, 0, ECPGst_normal); }
-               | CreateCastStmt        { output_statement($1, 0, ECPGst_normal); }
-               | CreateConversionStmt  { output_statement($1, 0, ECPGst_normal); }
-               | CreateDomainStmt      { output_statement($1, 0, ECPGst_normal); }
-               | CreateFunctionStmt    { output_statement($1, 0, ECPGst_normal); }
-               | CreateGroupStmt       { output_statement($1, 0, ECPGst_normal); }
-               | CreatePLangStmt       { output_statement($1, 0, ECPGst_normal); }
-               | CreateOpClassStmt     { output_statement($1, 0, ECPGst_normal); }
-               | CreateOpFamilyStmt    { output_statement($1, 0, ECPGst_normal); }
-               | AlterOpFamilyStmt     { output_statement($1, 0, ECPGst_normal); }
-               | CreateRoleStmt        { output_statement($1, 0, ECPGst_normal); }
-               | CreateSchemaStmt      { output_statement($1, 0, ECPGst_normal); }
-               | CreateSeqStmt         { output_statement($1, 0, ECPGst_normal); }
-               | CreateStmt            { output_statement($1, 0, ECPGst_normal); }
-               | CreateTableSpaceStmt  { output_statement($1, 0, ECPGst_normal); }
-               | CreateTrigStmt        { output_statement($1, 0, ECPGst_normal); }
-               | CreateUserStmt        { output_statement($1, 0, ECPGst_normal); }
-               | CreatedbStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DeallocateStmt
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement\n");
-                               
-                       output_deallocate_prepare_statement($1);
-               }
-               | DeclareCursorStmt     { output_simple_statement($1); }
-               | DefineStmt            { output_statement($1, 0, ECPGst_normal); }
-               | DeleteStmt            { output_statement($1, 1, ECPGst_normal); }
-               | DiscardStmt           { output_statement($1, 1, ECPGst_normal); }
-               | DropAssertStmt        { output_statement($1, 0, ECPGst_normal); }
-               | DropCastStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DropGroupStmt         { output_statement($1, 0, ECPGst_normal); }
-               | DropOpClassStmt       { output_statement($1, 0, ECPGst_normal); }
-               | DropOpFamilyStmt      { output_statement($1, 0, ECPGst_normal); }
-               | DropOwnedStmt         { output_statement($1, 0, ECPGst_normal); }
-               | DropPLangStmt         { output_statement($1, 0, ECPGst_normal); }
-               | DropRoleStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DropRuleStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DropStmt              { output_statement($1, 0, ECPGst_normal); }
-               | DropTableSpaceStmt    { output_statement($1, 0, ECPGst_normal); }
-               | DropTrigStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DropUserStmt          { output_statement($1, 0, ECPGst_normal); }
-               | DropdbStmt            { output_statement($1, 0, ECPGst_normal); }
-               | ExplainStmt           { output_statement($1, 0, ECPGst_normal); }
-               | ExecuteStmt           { output_statement($1, 1, ECPGst_execute); }
-               | FetchStmt             { output_statement($1, 1, ECPGst_normal); }
-               | GrantStmt             { output_statement($1, 0, ECPGst_normal); }
-               | GrantRoleStmt         { output_statement($1, 0, ECPGst_normal); }
-               | IndexStmt             { output_statement($1, 0, ECPGst_normal); }
-               | InsertStmt            { output_statement($1, 1, ECPGst_normal); }
-               | ListenStmt            { output_statement($1, 0, ECPGst_normal); }
-               | LoadStmt              { output_statement($1, 0, ECPGst_normal); }
-               | LockStmt              { output_statement($1, 0, ECPGst_normal); }
-               | NotifyStmt            { output_statement($1, 0, ECPGst_normal); }
-               | PrepareStmt           { 
-                                               if ($1.type == NULL || strlen($1.type) == 0) /* use PQprepare without type parameters */
-                                                       output_prepare_statement($1.name, $1.stmt);  
-                                               else    /* use PQexec and let backend do its stuff */
-                                               {
-                                                       char *txt = cat_str(5, make_str("prepare"), $1.name, $1.type, make_str("as"), $1.stmt);
-                                                       output_statement(txt, 0, ECPGst_normal);
-                                               }
-                                       }               
-               | ReassignOwnedStmt     { output_statement($1, 0, ECPGst_normal); }
-               | ReindexStmt           { output_statement($1, 0, ECPGst_normal); }
-               | RemoveAggrStmt        { output_statement($1, 0, ECPGst_normal); }
-               | RemoveOperStmt        { output_statement($1, 0, ECPGst_normal); }
-               | RemoveFuncStmt        { output_statement($1, 0, ECPGst_normal); }
-               | RenameStmt            { output_statement($1, 0, ECPGst_normal); }
-               | RevokeStmt            { output_statement($1, 0, ECPGst_normal); }
-               | RevokeRoleStmt        { output_statement($1, 0, ECPGst_normal); }
-               | RuleStmt              { output_statement($1, 0, ECPGst_normal); }
-               | SelectStmt            { output_statement($1, 1, ECPGst_normal); }
-               | TransactionStmt
-               {
-                       fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
-                       whenever_action(2);
-                       free($1);
-               }
-               | TruncateStmt          { output_statement($1, 0, ECPGst_normal); }
-               | UnlistenStmt          { output_statement($1, 0, ECPGst_normal); }
-               | UpdateStmt            { output_statement($1, 1, ECPGst_normal); }
-               | VacuumStmt            { output_statement($1, 0, ECPGst_normal); }
-               | VariableSetStmt       { output_statement($1, 0, ECPGst_normal); }
-               | VariableShowStmt      { output_statement($1, 0, ECPGst_normal); }
-               | VariableResetStmt     { output_statement($1, 0, ECPGst_normal); }
-               | ViewStmt              { output_statement($1, 0, ECPGst_normal); }
-               | ECPGAllocateDescr
-               {
-                       fprintf(yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
-                       whenever_action(0);
-                       free($1);
-               }
-               | ECPGConnect
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for connect statement\n");
+ %nonassoc SET
+ %left UNION EXCEPT
+ %left INTERSECT
+ %left OR
+ %left AND
+ %right NOT
+ %right '='
+ %nonassoc '<' '>'
+ %nonassoc LIKE ILIKE SIMILAR
+ %nonassoc ESCAPE
+ %nonassoc OVERLAPS
+ %nonassoc BETWEEN
+ %nonassoc IN_P
+ %left POSTFIXOP
+ %nonassoc IDENT
+%nonassoc CSTRING
+%nonassoc UIDENT
+ %left Op OPERATOR
+ %nonassoc NOTNULL
+ %nonassoc ISNULL
+ %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN
+ %left '+' '-'
+ %left '*' '/' '%'
+ %left '^'
 
-                       fprintf(yyout, "{ ECPGconnect(__LINE__, %d, %s, %d); ", compat, $1, autocommit);
-                       reset_variables();
-                       whenever_action(2);
-                       free($1);
-               }
-               | ECPGCursorStmt
-               {
-                       output_simple_statement($1);
-               }
-               | ECPGDeallocateDescr
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement\n");
-                       fprintf(yyout,"ECPGdeallocate_desc(__LINE__, %s);",$1);
-                       whenever_action(0);
-                       free($1);
-               }
-               | ECPGDeclare
-               {
-                       output_simple_statement($1);
-               }
-               | ECPGDescribe
-               {
-                       fprintf(yyout, "{ ECPGdescribe(__LINE__, %s,", $1);
-                       dump_variables(argsresult, 1);
-                       fputs("ECPGt_EORT);", yyout);
-                       fprintf(yyout, "}");
-                       output_line_number();
+ %left AT ZONE
+ %right UMINUS
+ %left '[' ']'
+ %left '(' ')'
+ %left TYPECAST
+ %left '.'
 
-                       /* whenever_action(2); */
-                       free($1);
-               }
-               | ECPGDisconnect
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for disconnect statement\n");
 
-                       fprintf(yyout, "{ ECPGdisconnect(__LINE__, %s);",
-                                       $1 ? $1 : "\"CURRENT\"");
-                       whenever_action(2);
-                       free($1);
-               }
-               | ECPGExecuteImmediateStmt      { output_statement($1, 0, ECPGst_exec_immediate); }
-               | ECPGFree
-               {
-                       const char *con = connection ? connection : "NULL";
-                       if (strcmp($1, "all"))
-                               fprintf(yyout, "{ ECPGdeallocate(__LINE__, %d, %s, \"%s\");", compat, con, $1);
-                       else
-                               fprintf(yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
 
-                       whenever_action(2);
-                       free($1);
-               }
-               | ECPGGetDescriptor
-               {
-                       lookup_descriptor($1.name, connection);
-                       output_get_descr($1.name, $1.str);
-                       free($1.name);
-                       free($1.str);
-               }
-               | ECPGGetDescriptorHeader
-               {
-                       lookup_descriptor($1, connection);
-                       output_get_descr_header($1);
-                       free($1);
-               }
-               | ECPGOpen
-               {
-                       struct cursor *ptr;
 
-                       if ((ptr = add_additional_variables($1, true)) != NULL)
-                       {
-                               connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
-                               output_statement(mm_strdup(ptr->command), 0, 0);
-                               ptr->opened = true;
-                       }
-               }
-               | ECPGSetAutocommit
-               {
-                       fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
-                       whenever_action(2);
-                       free($1);
-               }
-               | ECPGSetConnection
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for set connection statement\n");
 
-                       fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
-                       whenever_action(2);
-                       free($1);
-               }
-               | ECPGSetDescriptor
-               {
-                       lookup_descriptor($1.name, connection);
-                       output_set_descr($1.name, $1.str);
-                       free($1.name);
-                       free($1.str);
-               }
-               | ECPGSetDescriptorHeader
-               {
-                       lookup_descriptor($1, connection);
-                       output_set_descr_header($1);
-                       free($1);
-               }
-               | ECPGTypedef
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for typedef statement\n");
 
-                       fprintf(yyout, "%s", $1);
-                       free($1);
-                       output_line_number();
-               }
-               | ECPGVar
-               {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for var statement\n");
 
-                       output_simple_statement($1);
-               }
-               | ECPGWhenever
+ %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
+
+ %right PRESERVE STRIP_P
+%%
+prog: statements;
+/* rules */
+ stmt:
+ AlterDatabaseStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterDatabaseSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterDomainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterFunctionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterGroupStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterObjectSchemaStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterOwnerStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterSeqStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterTableStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterRoleSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterTSConfigurationStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterTSDictionaryStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterUserSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterUserStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AnalyzeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CheckPointStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  ClosePortalStmt
+       {
+               if (INFORMIX_MODE)
                {
-                       if (connection)
-                               mmerror(PARSE_ERROR, ET_ERROR, "no at option for whenever statement\n");
+                       if (pg_strcasecmp($1+strlen("close "), "database") == 0)
+                       {
+                               if (connection)
+                                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for close database statement\n");
 
-                       output_simple_statement($1);
+                               fprintf(yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+                               whenever_action(2);
+                               free($1);
+                               break;
+                       }
                }
-               ;
 
+               output_statement($1, 0, ECPGst_normal);
+       }
+|  ClusterStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CommentStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  ConstraintsSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CopyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateAsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateAssertStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateCastStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateConversionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateDomainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateFunctionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateGroupStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateOpClassStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  AlterOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreatePLangStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateSchemaStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateSeqStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateTableSpaceStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateTrigStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreateUserStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  CreatedbStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DeallocateStmt
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement\n");
 
-/*
- * We start with a lot of stuff that's very similar to the backend's parsing
- */
-
-/*****************************************************************************
- *
- * Create a new Postgres DBMS role
- *
- *
- *****************************************************************************/
+               output_deallocate_prepare_statement($1);
+       }
+|  DeclareCursorStmt
+       { output_simple_statement($1); }
+|  DefineStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DeleteStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  DiscardStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  DropAssertStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropCastStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropGroupStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropOpClassStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropOwnedStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropPLangStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropRuleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropTableSpaceStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropTrigStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropUserStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  DropdbStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  ExecuteStmt
+       { output_statement($1, 1, ECPGst_execute); }
+|  ExplainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  FetchStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  GrantStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  GrantRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  IndexStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  InsertStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  ListenStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  LoadStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  LockStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  NotifyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  PrepareStmt
+       {
+               if ($1.type == NULL || strlen($1.type) == 0)
+                       output_prepare_statement($1.name, $1.stmt);
+               else    
+                       output_statement(cat_str(5, make_str("prepare"), $1.name, $1.type, make_str("as"), $1.stmt), 0, ECPGst_normal);
+       }
+|  ReassignOwnedStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  ReindexStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RemoveAggrStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RemoveFuncStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RemoveOperStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RenameStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RevokeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RevokeRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  RuleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  SelectStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  TransactionStmt
+       {
+               fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
+               whenever_action(2);
+               free($1);
+       }
+|  TruncateStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  UnlistenStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  UpdateStmt
+       { output_statement($1, 1, ECPGst_normal); }
+|  VacuumStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  VariableResetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  VariableSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  VariableShowStmt
+ { output_statement($1, 0, ECPGst_normal); }
+|  ViewStmt
+ { output_statement($1, 0, ECPGst_normal); }
+       | ECPGAllocateDescr
+       {
+               fprintf(yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
+               whenever_action(0);
+               free($1);
+       }
+       | ECPGConnect
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for connect statement\n");
 
-CreateRoleStmt: CREATE ROLE RoleId opt_with OptRoleList
-                       { $$ = cat_str(4, make_str("create role"), $3, $4, $5); }
-               ;
+               fprintf(yyout, "{ ECPGconnect(__LINE__, %d, %s, %d); ", compat, $1, autocommit);
+               reset_variables();
+               whenever_action(2);
+               free($1);
+       }
+       | ECPGCursorStmt
+       {
+               output_simple_statement($1);
+       }
+       | ECPGDeallocateDescr
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement\n");
+               fprintf(yyout,"ECPGdeallocate_desc(__LINE__, %s);",$1);
+               whenever_action(0);
+               free($1);
+       }
+       | ECPGDeclare
+       {
+               output_simple_statement($1);
+       }
+       | ECPGDescribe
+       {
+               fprintf(yyout, "{ ECPGdescribe(__LINE__, %s,", $1);
+               dump_variables(argsresult, 1);
+               fputs("ECPGt_EORT);", yyout);
+               fprintf(yyout, "}");
+               output_line_number();
 
-opt_with:  WITH                { $$ = make_str("with"); }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
+               free($1);
+       }
+       | ECPGDisconnect
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for disconnect statement\n");
 
-/*
- * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
- * for backwards compatibility).  Note: the only option required by SQL99
- * is "WITH ADMIN name".
- */
-OptRoleList:
-       PASSWORD Sconst                 { $$ = cat2_str(make_str("password"), $2); }
-       | PASSWORD NULL_P               { $$ = make_str("password null"); }
-       | ENCRYPTED PASSWORD Sconst     { $$ = cat2_str(make_str("encrypted password"), $3); }
-       | UNENCRYPTED PASSWORD Sconst   { $$ = cat2_str(make_str("unencrypted password"), $3); }
-       | SUPERUSER_P                   { $$ = make_str("superuser"); }
-       | NOSUPERUSER                   { $$ = make_str("nosuperuser"); }
-       | INHERIT                               { $$ = make_str("inherit"); }
-       | NOINHERIT                             { $$ = make_str("noinherit"); }
-       | CREATEDB                              { $$ = make_str("createdb"); }
-       | NOCREATEDB                    { $$ = make_str("nocreatedb"); }
-       | CREATEROLE                    { $$ = make_str("createrole"); }
-       | NOCREATEROLE                  { $$ = make_str("nocreaterole"); }
-       | LOGIN_P                               { $$ = make_str("login"); }
-       | NOLOGIN_P                             { $$ = make_str("nologin"); }
-       | CONNECTION LIMIT IntConst     { $$ = cat2_str(make_str("connection limit"), $3); }
-       | VALID UNTIL Sconst            { $$ = cat2_str(make_str("valid until"), $3); }
-       | USER name_list                { $$ = cat2_str(make_str("user"), $2); }
-       | SYSID PosIntConst             { $$ = cat2_str(make_str("sysid"), $2); }
-       | ADMIN name_list               { $$ = cat2_str(make_str("admin"), $2); }
-       | ROLE name_list                { $$ = cat2_str(make_str("role"), $2); }
-       | IN_P ROLE name_list   { $$ = cat2_str(make_str("in role"), $3); }
-       | IN_P GROUP_P name_list        { $$ = cat2_str(make_str("in group"), $3); }
-       ;
+               fprintf(yyout, "{ ECPGdisconnect(__LINE__, %s);",
+                               $1 ? $1 : "\"CURRENT\"");
+               whenever_action(2);
+               free($1);
+       }
+       | ECPGExecuteImmediateStmt      { output_statement($1, 0, ECPGst_exec_immediate); }
+       | ECPGFree
+       {
+               const char *con = connection ? connection : "NULL";
+               if (strcmp($1, "all"))
+                       fprintf(yyout, "{ ECPGdeallocate(__LINE__, %d, %s, \"%s\");", compat, con, $1);
+               else
+                       fprintf(yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
 
-/*****************************************************************************
- *
- * Create a new Postgres DBMS user (role with implied login ability)
- *
- *****************************************************************************/
+               whenever_action(2);
+               free($1);
+       }
+       | ECPGGetDescriptor
+       {
+               lookup_descriptor($1.name, connection);
+               output_get_descr($1.name, $1.str);
+               free($1.name);
+               free($1.str);
+       }
+       | ECPGGetDescriptorHeader
+       {
+               lookup_descriptor($1, connection);
+               output_get_descr_header($1);
+               free($1);
+       }
+       | ECPGOpen
+       {
+               struct cursor *ptr;
 
-CreateUserStmt:
-       CREATE USER RoleId opt_with OptRoleList
-               {$$ = cat_str(4, make_str("create user"), $3, $4, $5); }
-       ;
+               if ((ptr = add_additional_variables($1, true)) != NULL)
+               {
+                       connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
+                       output_statement(mm_strdup(ptr->command), 0, 0);
+                       ptr->opened = true;
+               }
+       }
+       | ECPGSetAutocommit
+       {
+               fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
+               whenever_action(2);
+               free($1);
+       }
+       | ECPGSetConnection
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for set connection statement\n");
 
-       /*****************************************************************************
-        *
-        * Alter a postgresql DBMS role
-        *
-        *
-        *****************************************************************************/
+               fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
+               whenever_action(2);
+               free($1);
+       }
+       | ECPGSetDescriptor
+       {
+               lookup_descriptor($1.name, connection);
+               output_set_descr($1.name, $1.str);
+               free($1.name);
+               free($1.str);
+       }
+       | ECPGSetDescriptorHeader
+       {
+               lookup_descriptor($1, connection);
+               output_set_descr_header($1);
+               free($1);
+       }
+       | ECPGTypedef
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for typedef statement\n");
 
-       AlterRoleStmt: ALTER ROLE RoleId opt_with OptRoleList
-                       { $$ = cat_str(4, make_str("alter role"), $3, $4, $5); }
-               ;
+               fprintf(yyout, "%s", $1);
+               free($1);
+               output_line_number();
+       }
+       | ECPGVar
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for var statement\n");
 
-       AlterRoleSetStmt: ALTER ROLE RoleId SetResetClause
-                       { $$ = cat_str(3, make_str("alter role"), $3, $4); }
-               ;
+               output_simple_statement($1);
+       }
+       | ECPGWhenever
+       {
+               if (connection)
+                       mmerror(PARSE_ERROR, ET_ERROR, "no at option for whenever statement\n");
 
-       /*****************************************************************************
-        *
-        * Alter a postgresql DBMS user
-        *
-        *****************************************************************************/
+               output_simple_statement($1);
+       }
+| 
+ { $$ = NULL; }
+;
 
-       AlterUserStmt: ALTER USER RoleId opt_with OptRoleList
-               { $$ = cat_str(4, make_str("alter user"), $3, $4, $5); };
 
-       AlterUserSetStmt: ALTER USER RoleId SetResetClause
-                       { $$ = cat_str(3, make_str("alter user"), $3, $4); }
-               ;
+ CreateRoleStmt:
+ CREATE ROLE RoleId opt_with OptRoleList
+ { 
+ $$ = cat_str(4,make_str("create role"),$3,$4,$5);
+}
+;
 
-       /*****************************************************************************
-        *
-        * Drop a postgresql DBMS role
-        *
-        *
-        *****************************************************************************/
-       DropRoleStmt:  DROP ROLE name_list
-                       { $$ = cat2_str(make_str("drop role"), $3);}
-                    | DROP ROLE IF_P EXISTS name_list
-                       { $$ = cat2_str(make_str("drop role if exists"), $5);}
-               ;
 
-       /*****************************************************************************
-        *
-        * Drop a postgresql DBMS user
-        *
-        *
-        *****************************************************************************/
-       DropUserStmt:  DROP USER name_list
-                       { $$ = cat2_str(make_str("drop user"), $3);}
-                    | DROP USER IF_P EXISTS name_list
-                       { $$ = cat2_str(make_str("drop user if exists"), $5);}
+ opt_with:
+ WITH
+ { 
+ $$ = make_str("with");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-               ;
 
-       /*****************************************************************************
-        *
-        * Create a postgresql group
-        *
-        *
-        ****************************************************************************/
-       CreateGroupStmt:  CREATE GROUP_P RoleId opt_with OptRoleList
                      { $$ = cat_str(4, make_str("create group"), $3, $4, $5); }
-               ;
+ OptRoleList:
+ OptRoleList OptRoleElem
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
$$=EMPTY; }
+;
 
-       /*****************************************************************************
-        *
-        * Alter a postgresql group
-        *
-        *
-        *****************************************************************************/
-       AlterGroupStmt: ALTER GROUP_P RoleId add_drop USER name_list
-                       { $$ = cat_str(5, make_str("alter group"), $3, $4, make_str("user"), $6); }
-               ;
 
-       add_drop: ADD_P         { $$ = make_str("add"); }
-               | DROP          { $$ = make_str("drop"); }
-               ;
+ OptRoleElem:
+ PASSWORD ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("password"),$2);
+}
+|  PASSWORD NULL_P
+ { 
+ $$ = make_str("password null");
+}
+|  ENCRYPTED PASSWORD ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("encrypted password"),$3);
+}
+|  UNENCRYPTED PASSWORD ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("unencrypted password"),$3);
+}
+|  SUPERUSER_P
+ { 
+ $$ = make_str("superuser");
+}
+|  NOSUPERUSER
+ { 
+ $$ = make_str("nosuperuser");
+}
+|  INHERIT
+ { 
+ $$ = make_str("inherit");
+}
+|  NOINHERIT
+ { 
+ $$ = make_str("noinherit");
+}
+|  CREATEDB
+ { 
+ $$ = make_str("createdb");
+}
+|  NOCREATEDB
+ { 
+ $$ = make_str("nocreatedb");
+}
+|  CREATEROLE
+ { 
+ $$ = make_str("createrole");
+}
+|  NOCREATEROLE
+ { 
+ $$ = make_str("nocreaterole");
+}
+|  CREATEUSER
+ { 
+ $$ = make_str("createuser");
+}
+|  NOCREATEUSER
+ { 
+ $$ = make_str("nocreateuser");
+}
+|  LOGIN_P
+ { 
+ $$ = make_str("login");
+}
+|  NOLOGIN_P
+ { 
+ $$ = make_str("nologin");
+}
+|  CONNECTION LIMIT SignedIconst
+ { 
+ $$ = cat_str(2,make_str("connection limit"),$3);
+}
+|  VALID UNTIL ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("valid until"),$3);
+}
+|  USER name_list
+ { 
+ $$ = cat_str(2,make_str("user"),$2);
+}
+|  SYSID ecpg_iconst
+ { 
+ $$ = cat_str(2,make_str("sysid"),$2);
+}
+|  ADMIN name_list
+ { 
+ $$ = cat_str(2,make_str("admin"),$2);
+}
+|  ROLE name_list
+ { 
+ $$ = cat_str(2,make_str("role"),$2);
+}
+|  IN_P ROLE name_list
+ { 
+ $$ = cat_str(2,make_str("in role"),$3);
+}
+|  IN_P GROUP_P name_list
+ { 
+ $$ = cat_str(2,make_str("in group"),$3);
+}
+;
 
-       /*****************************************************************************
-        *
-        * Drop a postgresql group
-        *
-        *
-        *****************************************************************************/
-       DropGroupStmt: DROP GROUP_P name_list
-                       { $$ = cat2_str(make_str("drop group"), $3); }
-                    | DROP GROUP_P IF_P EXISTS name_list
-                       { $$ = cat2_str(make_str("drop group if exists"), $5); }
-               ;
 
-       /*****************************************************************************
-        *
-        * Manipulate a schema
-        *
-        *
-        *****************************************************************************/
+ CreateUserStmt:
+ CREATE USER RoleId opt_with OptRoleList
+ { 
+ $$ = cat_str(4,make_str("create user"),$3,$4,$5);
+}
+;
 
-       CreateSchemaStmt:  CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
-                       { $$ = cat_str(5, make_str("create schema"), $3, make_str("authorization"), $5, $6); }
-               | CREATE SCHEMA ColId OptSchemaEltList
-                       { $$ = cat_str(3, make_str("create schema"), $3, $4); }
-               ;
 
-       OptSchemaName: ColId            { $$ = $1; }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
+ AlterRoleStmt:
+ ALTER ROLE RoleId opt_with OptRoleList
+ { 
+ $$ = cat_str(4,make_str("alter role"),$3,$4,$5);
+}
+;
 
-OptSchemaEltList: OptSchemaEltList schema_stmt         { $$ = cat2_str($1, $2); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
 
-/*
- *     schema_stmt are the ones that can show up inside a CREATE SCHEMA
- *     statement (in addition to by themselves).
- */
-schema_stmt: CreateStmt                { $$ = $1; }
-                  | IndexStmt          { $$ = $1; }
-                  | CreateSeqStmt      { $$ = $1; }
-                  | CreateTrigStmt { $$ = $1; }
-                  | GrantStmt          { $$ = $1; }
-                  | ViewStmt           { $$ = $1; }
-                  ;
+ AlterRoleSetStmt:
+ ALTER ROLE RoleId SetResetClause
+ { 
+ $$ = cat_str(3,make_str("alter role"),$3,$4);
+}
+;
 
 
+ AlterUserStmt:
+ ALTER USER RoleId opt_with OptRoleList
+ { 
+ $$ = cat_str(4,make_str("alter user"),$3,$4,$5);
+}
+;
 
-/*****************************************************************************
- *
- * Set PG internal variable
- *       SET name TO 'var_value'
- * Include SQL92 syntax (thomas 1997-10-22):
- *       SET TIME ZONE 'var_value'
- *
- *****************************************************************************/
-VariableSetStmt:  SET set_rest
-                       { $$ = cat2_str(make_str("set"), $2 ); }
-               | SET LOCAL set_rest
-                       { $$ = cat2_str(make_str("set local"), $3 ); }
-               | SET SESSION set_rest
-                       { $$ = cat2_str(make_str("set session"), $3 ); }
-               ;
 
-set_rest:      /* Generic SET syntaxes: */
-               var_name TO var_list
-                       { $$ = cat_str(3, $1, make_str("to"), $3); }
-               | var_name "=" var_list
-                       { $$ = cat_str(3, $1, make_str("="), $3); }
-               | var_name TO DEFAULT
-                       { $$ = cat2_str($1, make_str("to default")); }
-               | var_name "=" DEFAULT
-                       { $$ = cat2_str($1, make_str("= default")); }
-               | var_name FROM CURRENT_P
-                       { $$ = cat2_str($1, make_str("from current")); }
-               /* Special syntaxes mandated by SQL standard: */
-               | TIME ZONE zone_value
-                       { $$ = cat2_str(make_str("time zone"), $3); }
-               | TRANSACTION transaction_mode_list
-                       { $$ = cat2_str(make_str("transaction"), $2); }
-               | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
-                       { $$ = cat2_str(make_str("session characteristics as transaction"), $5); }
-               | CATALOG_P Sconst
-                       { $$ = cat2_str(make_str("catalog"), $2); }
-               | SCHEMA Sconst
-                       { $$ = cat2_str(make_str("schema"), $2); }
-               | NAMES opt_encoding
-                       { $$ = cat2_str(make_str("names"), $2); }
-               | ROLE ColId_or_Sconst
-                       { $$ = cat2_str(make_str("role"), $2); }
-               | SESSION AUTHORIZATION ColId_or_Sconst
-                       { $$ = cat2_str(make_str("session authorization"), $3); }
-               | SESSION AUTHORIZATION DEFAULT
-                       { $$ = make_str("session authorization default"); }
-               | XML_P OPTION document_or_content
-                       { $$ = cat2_str(make_str("xml option"), $3); }
-               ;
+ AlterUserSetStmt:
+ ALTER USER RoleId SetResetClause
+ { 
+ $$ = cat_str(3,make_str("alter user"),$3,$4);
+}
+;
 
-var_name:      ECPGColId               { $$ = $1; }
-               | var_name '.' ColId    { $$ = cat_str(3, $1, make_str("."), $3); }
-               ;
 
+ DropRoleStmt:
+ DROP ROLE name_list
+ { 
+ $$ = cat_str(2,make_str("drop role"),$3);
+}
+|  DROP ROLE IF_P EXISTS name_list
+ { 
+ $$ = cat_str(2,make_str("drop role if exists"),$5);
+}
+;
 
-var_list:  var_value
-                       { $$ = $1; }
-               | var_list ',' var_value
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-iso_level:     READ UNCOMMITTED        { $$ = make_str("read uncommitted"); }
-               | READ COMMITTED                { $$ = make_str("read committed"); }
-               | REPEATABLE READ               { $$ = make_str("repeatable read"); }
-               | SERIALIZABLE                  { $$ = make_str("serializable"); }
-               ;
+ DropUserStmt:
+ DROP USER name_list
+ { 
+ $$ = cat_str(2,make_str("drop user"),$3);
+}
+|  DROP USER IF_P EXISTS name_list
+ { 
+ $$ = cat_str(2,make_str("drop user if exists"),$5);
+}
+;
 
-var_value:     opt_boolean             { $$ = $1; }
-               | AllConst                      {       /* we have to check for a variable here because it has to be
-                                                       replaced with its value on the client side */
-                                                       if ($1[1] == '$')
-                                                       {
-                                                               $$ = make_str("$0");
-                                                               free($1);
-                                                       }
-                                                       else
-                                                               $$ = $1;
-                                               }
-               | ColId                         { $$ = $1; }
-               ;
 
-opt_boolean:  TRUE_P           { $$ = make_str("true"); }
-               | FALSE_P                       { $$ = make_str("false"); }
-               | ON                            { $$ = make_str("on"); }
-               | OFF                           { $$ = make_str("off"); }
-               ;
-/* Timezone values can be:
- * - a string such as 'pst8pdt'
- * - a column identifier such as "pst8pdt"
- * - an integer or floating point number
- * - a time interval per SQL99
- * ConstInterval and ColId give shift/reduce errors,
- * so use IDENT and reject anything which is a reserved word.
- */
-zone_value:  AllConst          { $$ = $1; }
-               | ident         { $$ = $1; }
-               | ConstInterval StringConst opt_interval
-                       { $$ = cat_str(3, $1, $2, $3); }
-               | ConstInterval '(' PosIntConst ')' StringConst opt_interval
-                       { $$ = cat_str(6, $1, make_str("("), $3, make_str(")"), $5, $6); }
-               | DEFAULT
-                       { $$ = make_str("default"); }
-               | LOCAL
-                       { $$ = make_str("local"); }
-               ;
+ CreateGroupStmt:
+ CREATE GROUP_P RoleId opt_with OptRoleList
+ { 
+ $$ = cat_str(4,make_str("create group"),$3,$4,$5);
+}
+;
 
-opt_encoding:  StringConst             { $$ = $1; }
-               | DEFAULT                               { $$ = make_str("default"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
 
-ColId_or_Sconst: ColId                 { $$ = $1; }
-               | StringConst                   { $$ = $1; }
-               ;
+ AlterGroupStmt:
+ ALTER GROUP_P RoleId add_drop USER name_list
+ { 
+ $$ = cat_str(5,make_str("alter group"),$3,$4,make_str("user"),$6);
+}
+;
 
-VariableShowStmt:  SHOW var_name ecpg_into
-                       { $$ = cat2_str(make_str("show"), $2); }
-               | SHOW TIME ZONE ecpg_into
-                       { $$ = make_str("show time zone"); }
-               | SHOW TRANSACTION ISOLATION LEVEL ecpg_into
-                       { $$ = make_str("show transaction isolation level"); }
-               | SHOW SESSION AUTHORIZATION ecpg_into
-                       { $$ = make_str("show session authorization"); }
-               | SHOW ALL
-                       {
-                               mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL not implemented");
-                               $$ = EMPTY;
-                       }
-               ;
 
-VariableResetStmt:     RESET var_name
-                       { $$ = cat2_str(make_str("reset"), $2); }
-               | RESET TIME ZONE
-                       { $$ = make_str("reset time zone"); }
-               | RESET TRANSACTION ISOLATION LEVEL
-                       { $$ = make_str("reset transaction isolation level"); }
-               | RESET SESSION AUTHORIZATION
-                       { $$ = make_str("reset session authorization"); }
-               | RESET ALL
-                       { $$ = make_str("reset all"); }
-               ;
+ add_drop:
+ ADD_P
+ { 
+ $$ = make_str("add");
+}
+|  DROP
+ { 
+ $$ = make_str("drop");
+}
+;
 
-/* SetResetClause allows SET or RESET without LOCAL */
-SetResetClause:
-               SET set_rest            { $$ = cat2_str(make_str("set"), $2); }
-               | VariableResetStmt     { $$ = $1; }
-               ;
 
-ConstraintsSetStmt:    SET CONSTRAINTS constraints_set_list constraints_set_mode
-                       { $$ = cat_str(3, make_str("set constraints"), $3, $4); }
-               ;
+ DropGroupStmt:
+ DROP GROUP_P name_list
+ { 
+ $$ = cat_str(2,make_str("drop group"),$3);
+}
+|  DROP GROUP_P IF_P EXISTS name_list
+ { 
+ $$ = cat_str(2,make_str("drop group if exists"),$5);
+}
+;
 
-constraints_set_list:  ALL
-                       { $$ = make_str("all"); }
-               | qualified_name_list
-                       { $$ = $1; }
-               ;
 
-constraints_set_mode:  DEFERRED                { $$ = make_str("deferred"); }
-               | IMMEDIATE             { $$ = make_str("immediate"); }
-               ;
+ CreateSchemaStmt:
+ CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
+ { 
+ $$ = cat_str(5,make_str("create schema"),$3,make_str("authorization"),$5,$6);
+}
+|  CREATE SCHEMA ColId OptSchemaEltList
+ { 
+ $$ = cat_str(3,make_str("create schema"),$3,$4);
+}
+;
 
-/*
- * Checkpoint statement
- */
-CheckPointStmt: CHECKPOINT        { $$= make_str("checkpoint"); }
-               ;
 
-DiscardStmt:
-               DISCARD ALL             { $$ = make_str("discard all"); }
-               | DISCARD TEMP          { $$ = make_str("discard temp"); }
-               | DISCARD TEMPORARY     { $$ = make_str("discard temporary"); }
-               | DISCARD PLANS         { $$ = make_str("discard plans"); }
-               ;
+ OptSchemaName:
+ ColId
+ { 
+ $$ = $1;
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *     ALTER [ TABLE | INDEX | SEQUENCE | VIEW ] variations
- *
- *****************************************************************************/
-
-AlterTableStmt:
-               ALTER TABLE relation_expr alter_table_cmds
-                       { $$ = cat_str(3, make_str("alter table"), $3, $4); }
-               |       ALTER INDEX relation_expr alter_table_cmds
-                       { $$ = cat_str(3, make_str("alter index"), $3, $4); }
-               |       ALTER SEQUENCE relation_expr alter_table_cmds
-                       { $$ = cat_str(3, make_str("alter sequence"), $3, $4); }
-               |       ALTER VIEW relation_expr alter_table_cmds
-                       { $$ = cat_str(3, make_str("alter view"), $3, $4); }
-               ;
 
-alter_table_cmds:
-               alter_table_cmd                         { $$ = $1; }
-               | alter_table_cmds ',' alter_table_cmd  { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ OptSchemaEltList:
+ OptSchemaEltList schema_stmt
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-alter_table_cmd:
-/* ALTER TABLE <name> ADD [COLUMN] <coldef> */
-               ADD_P opt_column columnDef
-                       { $$ = cat_str(3, make_str("add"), $2, $3); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
-               | ALTER opt_column ColId alter_column_default
-                       { $$ = cat_str(4, make_str("alter"), $2, $3, $4); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
-               | ALTER opt_column ColId DROP NOT NULL_P
-                       { $$ = cat_str(4, make_str("alter"), $2, $3, make_str("drop not null")); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
-               | ALTER opt_column ColId SET NOT NULL_P
-                       { $$ = cat_str(4, make_str("alter"), $2, $3, make_str("set not null")); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
-               | ALTER opt_column ColId SET STATISTICS PosIntConst
-                       { $$ = cat_str(5, make_str("alter"), $2, $3, make_str("set statistics"), $6); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
-               | ALTER opt_column ColId SET STORAGE ColId
-                       { $$ = cat_str(5, make_str("alter"), $2, $3, make_str("set storage"), $6); }
-/* ALTER TABLE <name> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */
-               | DROP opt_column ColId opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop"), $2, $3, $4); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename> [ USING <expression> ] */
-               | ALTER opt_column ColId opt_set_data TYPE_P Typename alter_using
-                       { $$ = cat_str(7, make_str("alter"), $2, $3, $4, make_str("type"), $6, $7); }
-/* ALTER TABLE <name> ADD CONSTRAINT ... */
-               | ADD_P TableConstraint
-                       { $$ = cat_str(2, make_str("add"), $2); }
-/* ALTER TABLE <name> DROP CONSTRAINT ... */
-               | DROP CONSTRAINT name opt_drop_behavior
-                       { $$ = cat_str(3, make_str("drop constraint"), $3, $4); }
-/* ALTER TABLE <name> SET WITHOUT OIDS  */
-               | SET WITHOUT OIDS
-                       { $$ = make_str("set without oids"); }
-/* ALTER TABLE <name> CLUSTER ON <indexname> */
-               | CLUSTER ON name
-                       { $$ = cat_str(2, make_str("cluster on"), $3); }
-/* ALTER TABLE <name> SET WITHOUT CLUSTER */
-               | SET WITHOUT CLUSTER
-                       { $$ = make_str("set without cluster"); }
-/* ALTER TABLE <name> ENABLE TRIGGER <trig> */
-               | ENABLE_P TRIGGER name
-                       { $$ = cat2_str(make_str("enable trigger"), $3); }
-/* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
-               | ENABLE_P ALWAYS TRIGGER name
-                       { $$ = cat2_str(make_str("enable always trigger"), $4); }
-/* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
-               | ENABLE_P REPLICA TRIGGER name
-                       { $$ = cat2_str(make_str("enable replica trigger"), $4); }
-/* ALTER TABLE <name> ENABLE TRIGGER ALL */
-               | ENABLE_P TRIGGER ALL
-                       { $$ = make_str("enable trigger all"); }
-/* ALTER TABLE <name> ENABLE TRIGGER USER */
-               | ENABLE_P TRIGGER USER
-                       { $$ = make_str("enable trigger user"); }
-/* ALTER TABLE <name> DISABLE TRIGGER <trig> */
-               | DISABLE_P TRIGGER name
-                       { $$ = cat2_str(make_str("disable trigger"), $3); }
-/* ALTER TABLE <name> DISABLE TRIGGER ALL */
-               | DISABLE_P TRIGGER ALL
-                       { $$ = make_str("disable trigger all"); }
-/* ALTER TABLE <name> DISABLE TRIGGER USER */
-               | DISABLE_P TRIGGER USER
-                       { $$ = make_str("disable trigger user"); }
-/* ALTER TABLE <name> ENABLE RULE <rule> */
-               | ENABLE_P RULE name
-                       { $$ = cat2_str(make_str("enable rule"), $3); }
-/* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
-               | ENABLE_P ALWAYS RULE name
-                       { $$ = cat2_str(make_str("enable always rule"), $4); }
-/* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
-               | ENABLE_P REPLICA RULE name
-                       { $$ = cat2_str(make_str("enable replica rule"), $4); }
-/* ALTER TABLE <name> DISABLE RULE <rule> */
-               | DISABLE_P RULE name
-                       { $$ = cat2_str(make_str("disable rule"), $3); }
-/* ALTER TABLE <name> ALTER INHERITS ADD <parent> */
-               | INHERIT qualified_name
-                       { $$ = cat2_str(make_str("inherit"), $2); }
-/* ALTER TABLE <name> NO INHERITS <parent> */
-               | NO INHERIT qualified_name
-                       { $$ = cat2_str(make_str("no inherit"), $3); }
-               /* ALTER <name> OWNER TO RoleId */
-               | OWNER TO RoleId
-                       { $$ = cat2_str(make_str("owner to"), $3); }
-               /* ALTER <name> SET TABLESPACE <tablespacename> */
-               | SET TABLESPACE name
-                       { $$ = cat2_str(make_str("set tablespace"), $3); }
-               | SET definition
-                       { $$ = cat2_str(make_str("set"), $2); }
-               | RESET definition
-                       { $$ = cat2_str(make_str("reset"), $2); }
-               ;
 
-alter_column_default:
-               SET DEFAULT a_expr              { $$ = cat2_str(make_str("set default"), $3); }
-               | DROP DEFAULT                  { $$ = make_str("drop default"); }
-               ;
+ schema_stmt:
+ CreateStmt
+ { 
+ $$ = $1;
+}
+|  IndexStmt
+ { 
+ $$ = $1;
+}
+|  CreateSeqStmt
+ { 
+ $$ = $1;
+}
+|  CreateTrigStmt
+ { 
+ $$ = $1;
+}
+|  GrantStmt
+ { 
+ $$ = $1;
+}
+|  ViewStmt
+ { 
+ $$ = $1;
+}
+;
 
-opt_drop_behavior: CASCADE             { $$ = make_str("cascade"); }
-               | RESTRICT                              { $$ = make_str("restrict"); }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
 
-alter_using:   USING a_expr    { $$ = cat2_str(make_str("using"), $2); }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
+ VariableSetStmt:
+ SET set_rest
+ { 
+ $$ = cat_str(2,make_str("set"),$2);
+}
+|  SET LOCAL set_rest
+ { 
+ $$ = cat_str(2,make_str("set local"),$3);
+}
+|  SET SESSION set_rest
+ { 
+ $$ = cat_str(2,make_str("set session"),$3);
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY :
- *                             close <portalname>
- *
- *****************************************************************************/
 
-ClosePortalStmt:  CLOSE name
-                       { $$ = cat2_str(make_str("close"), $2); }
-               | CLOSE ALL
-                       { $$ = make_str("close all"); }
-               ;
+ set_rest:
+ var_name TO var_list
+ { 
+ $$ = cat_str(3,$1,make_str("to"),$3);
+}
+|  var_name '=' var_list
+ { 
+ $$ = cat_str(3,$1,make_str("="),$3);
+}
+|  var_name TO DEFAULT
+ { 
+ $$ = cat_str(2,$1,make_str("to default"));
+}
+|  var_name '=' DEFAULT
+ { 
+ $$ = cat_str(2,$1,make_str("= default"));
+}
+|  var_name FROM CURRENT_P
+ { 
+ $$ = cat_str(2,$1,make_str("from current"));
+}
+|  TIME ZONE zone_value
+ { 
+ $$ = cat_str(2,make_str("time zone"),$3);
+}
+|  TRANSACTION transaction_mode_list
+ { 
+ $$ = cat_str(2,make_str("transaction"),$2);
+}
+|  SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
+ { 
+ $$ = cat_str(2,make_str("session characteristics as transaction"),$5);
+}
+|  CATALOG_P ecpg_sconst
+ { 
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to backend\n");
+ $$ = cat_str(2,make_str("catalog"),$2);
+}
+|  SCHEMA ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("schema"),$2);
+}
+|  NAMES opt_encoding
+ { 
+ $$ = cat_str(2,make_str("names"),$2);
+}
+|  ROLE ColId_or_Sconst
+ { 
+ $$ = cat_str(2,make_str("role"),$2);
+}
+|  SESSION AUTHORIZATION ColId_or_Sconst
+ { 
+ $$ = cat_str(2,make_str("session authorization"),$3);
+}
+|  SESSION AUTHORIZATION DEFAULT
+ { 
+ $$ = make_str("session authorization default");
+}
+|  XML_P OPTION document_or_content
+ { 
+ $$ = cat_str(2,make_str("xml option"),$3);
+}
+;
 
-CopyStmt:  COPY opt_binary qualified_name opt_oids copy_from
-               copy_file_name copy_delimiter opt_with copy_opt_list
-                       {
-                               if (strcmp($5, "to") == 0 && strcmp($6, "stdin") == 0)
-                                       mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin not possible\n");
-                               else if (strcmp($5, "from") == 0 && strcmp($6, "stdout") == 0)
-                                       mmerror(PARSE_ERROR, ET_ERROR, "copy from stdout not possible\n");
-                               else if (strcmp($5, "from") == 0 && strcmp($6, "stdin") == 0)
-                                       mmerror(PARSE_ERROR, ET_WARNING, "copy from stdin not implemented\n");
-                               
-                               $$ = cat_str(9, make_str("copy"), $2, $3, $4, $5, $6, $7, $8, $9);
-                       }
-               | COPY select_with_parens TO copy_file_name opt_with copy_opt_list
-                       {
-                               if (strcmp($4, "stdin") == 0)
-                                       mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin is not possible\n");
-                               
-                               $$ = cat_str(6, make_str("copy"), $2, make_str("to"), $4, $5, $6);
-                       }
-               ;
 
-copy_from:     TO                                      { $$ = make_str("to"); }
-               | FROM                                  { $$ = make_str("from"); }
-               ;
+ var_name:
+ECPGColId
+ { 
+ $$ = $1;
+}
+|  var_name '.' ColId
+ { 
+ $$ = cat_str(3,$1,make_str("."),$3);
+}
+;
 
-copy_file_name:  StringConst                           { $$ = $1; }
-               | STDIN                                 { $$ = make_str("stdin"); }
-               | STDOUT                                { $$ = make_str("stdout"); }
-               ;
 
-copy_opt_list: copy_opt_list copy_opt_item     { $$ = cat2_str($1, $2); }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
+ var_list:
+ var_value
+ { 
+ $$ = $1;
+}
+|  var_list ',' var_value
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-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); }
-               | CSV           { $$ = make_str("csv"); }
-               | HEADER_P      { $$ = make_str("header"); }
-               | QUOTE opt_as Sconst
-                       { $$ = cat_str(3, make_str("quote"), $2, $3); }
-               | ESCAPE opt_as Sconst
-                       { $$ = cat_str(3, make_str("escape"), $2, $3); }
-               | FORCE QUOTE columnList
-                       { $$ = cat2_str(make_str("force quote"), $3); }
-               | FORCE NOT NULL_P columnList
-                       { $$ = cat2_str(make_str("force not null"), $4); }
 
-               ;
+ var_value:
+ opt_boolean
+ { 
+ $$ = $1;
+}
+| ColId_or_real_sconst
+ { 
+ $$ = $1;
+}
+|  NumericOnly
+ { 
+               if ($1[1] == '$')
+               {
+                       free($1);
+                       $1 = make_str("$0");
+               }
 
-opt_binary:    BINARY          { $$ = make_str("binary"); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
+ $$ = $1;
+}
+;
 
-opt_oids:      WITH OIDS       { $$ = make_str("with oids"); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
 
+ iso_level:
+ READ UNCOMMITTED
+ { 
+ $$ = make_str("read uncommitted");
+}
+|  READ COMMITTED
+ { 
+ $$ = make_str("read committed");
+}
+|  REPEATABLE READ
+ { 
+ $$ = make_str("repeatable read");
+}
+|  SERIALIZABLE
+ { 
+ $$ = make_str("serializable");
+}
+;
 
-/*
- * the default copy delimiter is tab but the user can configure it
- */
-copy_delimiter:  opt_using DELIMITERS StringConst
-                       { $$ = cat_str(3, $1, make_str("delimiters"), $3); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
 
-opt_using:     USING           { $$ = make_str("using"); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
+ opt_boolean:
+ TRUE_P
+ { 
+ $$ = make_str("true");
+}
+|  FALSE_P
+ { 
+ $$ = make_str("false");
+}
+|  ON
+ { 
+ $$ = make_str("on");
+}
+|  OFF
+ { 
+ $$ = make_str("off");
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY :
- *                             CREATE TABLE relname
- *
- *****************************************************************************/
-
-CreateStmt:  CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
-                               OptInherit OptWith OnCommitOption OptTableSpace
-                       { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10, $11); }
-               | CREATE OptTemp TABLE qualified_name OF qualified_name
-                       '(' OptTableElementList ')' OptWith OnCommitOption OptTableSpace
-                       { $$ = cat_str(12, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11, $12); }
-               ;
 
-/*
- * Redundancy here is needed to avoid shift/reduce conflicts,
- * since TEMP is not a reserved word.  See also OptTempTableName.
- */
+ zone_value:
+ecpg_real_sconst
+ { 
+ $$ = $1;
+}
+|  ecpg_ident
+ { 
+ $$ = $1;
+}
+|  ConstInterval ecpg_sconst opt_interval
+ { 
+ $$ = cat_str(3,$1,$2,$3);
+}
+|  ConstInterval '(' ecpg_iconst ')' ecpg_sconst opt_interval
+ { 
+ $$ = cat_str(6,$1,make_str("("),$3,make_str(")"),$5,$6);
+}
+|  NumericOnly
+ { 
+ $$ = $1;
+}
+|  DEFAULT
+ { 
+ $$ = make_str("default");
+}
+|  LOCAL
+ { 
+ $$ = make_str("local");
+}
+;
 
-OptTemp: TEMPORARY                     { $$ = make_str("temporary"); }
-               | TEMP                          { $$ = make_str("temp"); }
-               | LOCAL TEMPORARY       { $$ = make_str("local temporary"); }
-               | LOCAL TEMP            { $$ = make_str("local temp"); }
-               | GLOBAL TEMPORARY      { $$ = make_str("global temporary"); }
-               | GLOBAL TEMP           { $$ = make_str("global temp"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
 
+ opt_encoding:
+ ecpg_sconst
+ { 
+ $$ = $1;
+}
+|  DEFAULT
+ { 
+ $$ = make_str("default");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-OptTableElementList:  TableElementList
-                       { $$ = $1; }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
-TableElementList: TableElement
-                       { $$ = $1; }
-               | TableElementList ',' TableElement
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-TableElement:  columnDef               { $$ = $1; }
-               | TableLikeClause       { $$ = $1; }
-               | TableConstraint       { $$ = $1; }
-               ;
+ ColId_or_Sconst:
+ ColId
+ { 
+ $$ = $1;
+}
+|  ecpg_sconst
+ { 
+ $$ = $1;
+}
+;
 
-columnDef:     ColId Typename ColQualList
-                       {$$ = cat_str(3, $1, $2, $3); }
-               ;
 
-ColQualList:  ColQualList ColConstraint { $$ = cat2_str($1,$2); }
-               | /*EMPTY*/                                             { $$ = EMPTY; }
-               ;
+ VariableResetStmt:
+ RESET var_name
+ { 
+ $$ = cat_str(2,make_str("reset"),$2);
+}
+|  RESET TIME ZONE
+ { 
+ $$ = make_str("reset time zone");
+}
+|  RESET TRANSACTION ISOLATION LEVEL
+ { 
+ $$ = make_str("reset transaction isolation level");
+}
+|  RESET SESSION AUTHORIZATION
+ { 
+ $$ = make_str("reset session authorization");
+}
+|  RESET ALL
+ { 
+ $$ = make_str("reset all");
+}
+;
 
-ColConstraint: CONSTRAINT name ColConstraintElem
-                       { $$ = cat_str(3, make_str("constraint"), $2, $3); }
-               | ColConstraintElem             { $$ = $1; }
-               | ConstraintAttr                { $$ = $1; }
-               ;
 
-/* DEFAULT NULL is already the default for Postgres.
- * But define it here and carry it forward into the system
- * to make it explicit.
- * - thomas 1998-09-13
- *
- * WITH NULL and NULL are not SQL92-standard syntax elements,
- * so leave them out. Use DEFAULT NULL to explicitly indicate
- * that a column may have that value. WITH NULL leads to
- * shift/reduce conflicts with WITH TIME ZONE anyway.
- * - thomas 1999-01-08
- */
-ColConstraintElem:     NOT NULL_P
-                       { $$ = make_str("not null"); }
-               | NULL_P
-                       { $$ = make_str("null"); }
-               | UNIQUE opt_definition OptConsTableSpace
-                       { $$ = cat_str(3, make_str("unique"), $2, $3); }
-               | PRIMARY KEY opt_definition OptConsTableSpace
-                       { $$ = cat_str(3, make_str("primary key"), $3, $4); }
-               | CHECK '(' a_expr ')'
-                       { $$ = cat_str(3, make_str("check ("), $3, make_str(")")); }
-               | DEFAULT b_expr
-                       { $$ = cat2_str(make_str("default"), $2); }
-               |  REFERENCES qualified_name opt_column_list key_match key_actions
-                       { $$ = cat_str(5, make_str("references"), $2, $3, $4, $5); }
-               ;
+ SetResetClause:
+ SET set_rest
+ { 
+ $$ = cat_str(2,make_str("set"),$2);
+}
+|  VariableResetStmt
+ { 
+ $$ = $1;
+}
+;
 
-/*
- * ConstraintAttr represents constraint attributes, which we parse as if
- * they were independent constraint clauses, in order to avoid shift/reduce
- * conflicts (since NOT might start either an independent NOT NULL clause
- * or an attribute).  analyze.c is responsible for attaching the attribute
- * information to the preceding "real" constraint node, and for complaining
- * if attribute clauses appear in the wrong place or wrong combinations.
- *
- * See also ConstraintAttributeSpec, which can be used in places where
- * there is no parsing conflict.
- */
-ConstraintAttr: DEFERRABLE             { $$ = make_str("deferrable"); }
-               | NOT DEFERRABLE        { $$ = make_str("not deferrable"); }
-               | INITIALLY DEFERRED    { $$ = make_str("initially deferred"); }
-               | INITIALLY IMMEDIATE   { $$ = make_str("initially immediate"); }
-               ;
 
-TableLikeClause:  LIKE qualified_name TableLikeOptionList
-                       {$$ = cat_str(3, make_str("like"), $2, $3); }
-               ;
+ VariableShowStmt:
+SHOW var_name ecpg_into
+ { 
+ $$ = cat_str(2,make_str("show"),$2);
+}
+| SHOW TIME ZONE ecpg_into
+ { 
+ $$ = make_str("show time zone");
+}
+| SHOW TRANSACTION ISOLATION LEVEL ecpg_into
+ { 
+ $$ = make_str("show transaction isolation level");
+}
+| SHOW SESSION AUTHORIZATION ecpg_into
+ { 
+ $$ = make_str("show session authorization");
+}
+|  SHOW ALL
+       {
+               mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL not implemented\n");
+               $$ = EMPTY;
+       }
+;
 
-TableLikeOptionList: TableLikeOptionList TableLikeOption
-                               { $$ = cat2_str($1, $2); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
 
-TableLikeOption:
-               INCLUDING DEFAULTS      { $$ = make_str("including defaults"); }
-               | EXCLUDING DEFAULTS    { $$ = make_str("excluding defaults"); }
-               | INCLUDING CONSTRAINTS { $$ = make_str("including constraints"); }
-               | EXCLUDING CONSTRAINTS { $$ = make_str("excluding constraints"); }
-               | INCLUDING INDEXES     { $$ = make_str("including indexes"); }
-               | EXCLUDING INDEXES     { $$ = make_str("excluding indexes"); }
-               ;
+ ConstraintsSetStmt:
+ SET CONSTRAINTS constraints_set_list constraints_set_mode
+ { 
+ $$ = cat_str(3,make_str("set constraints"),$3,$4);
+}
+;
 
-/* ConstraintElem specifies constraint syntax which is not embedded into
- *     a column definition. ColConstraintElem specifies the embedded form.
- * - thomas 1997-12-03
- */
-TableConstraint:  CONSTRAINT name ConstraintElem
-                       { $$ = cat_str(3, make_str("constraint"), $2, $3); }
-               | ConstraintElem
-                       { $$ = $1; }
-               ;
 
-ConstraintElem:  CHECK '(' a_expr ')'
-                       { $$ = cat_str(3, make_str("check("), $3, make_str(")")); }
-               | UNIQUE '(' columnList ')' opt_definition OptConsTableSpace
-                       { $$ = cat_str(5, make_str("unique("), $3, make_str(")"), $5, $6); }
-               | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace
-                       { $$ = cat_str(5, make_str("primary key("), $4, make_str(")"), $6, $7); }
-               | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list
-                       key_match key_actions ConstraintAttributeSpec
-                       { $$ = cat_str(8, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10, $11); }
-               ;
+ constraints_set_list:
+ ALL
+ { 
+ $$ = make_str("all");
+}
+|  qualified_name_list
+ { 
+ $$ = $1;
+}
+;
 
-opt_column_list:  '(' columnList ')'   { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
 
-columnList:  columnList ',' columnElem
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               | columnElem
-                       { $$ = $1; }
-               ;
+ constraints_set_mode:
+ DEFERRED
+ { 
+ $$ = make_str("deferred");
+}
+|  IMMEDIATE
+ { 
+ $$ = make_str("immediate");
+}
+;
 
-columnElem:  ColId     { $$ = $1; }
-               ;
 
-key_match:     MATCH FULL
-                       { $$ = make_str("match full"); }
-               | MATCH PARTIAL
-               {
-                       mmerror(PARSE_ERROR, ET_WARNING, "currently unsupported FOREIGN KEY/MATCH PARTIAL will be passed to backend");
-                       $$ = make_str("match partial");
-               }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
+ CheckPointStmt:
+ CHECKPOINT
+ { 
+ $$ = make_str("checkpoint");
+}
+;
 
-key_actions:  key_delete                       { $$ = $1; }
-               | key_update                            { $$ = $1; }
-               | key_delete key_update         { $$ = cat2_str($1, $2); }
-               | key_update key_delete         { $$ = cat2_str($1, $2); }
-               | /*EMPTY*/                                     { $$ = EMPTY; }
-               ;
 
-key_delete: ON DELETE_P key_action
-                       { $$ = cat2_str(make_str("on delete"), $3); }
-               ;
+ DiscardStmt:
+ DISCARD ALL
+ { 
+ $$ = make_str("discard all");
+}
+|  DISCARD TEMP
+ { 
+ $$ = make_str("discard temp");
+}
+|  DISCARD TEMPORARY
+ { 
+ $$ = make_str("discard temporary");
+}
+|  DISCARD PLANS
+ { 
+ $$ = make_str("discard plans");
+}
+;
 
-key_update: ON UPDATE key_action
-                       { $$ = cat2_str(make_str("on update"), $3); }
-               ;
 
-key_action:    NO ACTION                               { $$ = make_str("no action"); }
-               | RESTRICT                                      { $$ = make_str("restrict"); }
-               | CASCADE                                       { $$ = make_str("cascade"); }
-               | SET DEFAULT                           { $$ = make_str("set default"); }
-               | SET NULL_P                            { $$ = make_str("set null"); }
-               ;
+ AlterTableStmt:
+ ALTER TABLE relation_expr alter_table_cmds
+ { 
+ $$ = cat_str(3,make_str("alter table"),$3,$4);
+}
+|  ALTER INDEX relation_expr alter_table_cmds
+ { 
+ $$ = cat_str(3,make_str("alter index"),$3,$4);
+}
+|  ALTER SEQUENCE relation_expr alter_table_cmds
+ { 
+ $$ = cat_str(3,make_str("alter sequence"),$3,$4);
+}
+|  ALTER VIEW relation_expr alter_table_cmds
+ { 
+ $$ = cat_str(3,make_str("alter view"),$3,$4);
+}
+;
 
-OptInherit:  INHERITS '(' qualified_name_list ')'
-                       { $$ = cat_str(3, make_str("inherits ("), $3, make_str(")")); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
 
-OptWith:       WITH definition                 { $$ = cat2_str(make_str("with"), $2); }
-               | WITH OIDS                     { $$ = make_str("with oids"); }
-               | WITHOUT OIDS                  { $$ = make_str("without oids"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ alter_table_cmds:
+ alter_table_cmd
+ { 
+ $$ = $1;
+}
+|  alter_table_cmds ',' alter_table_cmd
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-OnCommitOption:   ON COMMIT DROP       { $$ = make_str("on commit drop"); }
-               | ON COMMIT DELETE_P ROWS       { $$ = make_str("on commit delete rows"); }
-               | ON COMMIT PRESERVE ROWS       { $$ = make_str("on commit preserve rows"); }
-               | /*EMPTY*/                                     { $$ = EMPTY; }
-               ;
 
-OptTableSpace:  TABLESPACE name        { $$ = cat2_str(make_str("tablespace"), $2); }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
+ alter_table_cmd:
+ ADD_P opt_column columnDef
+ { 
+ $$ = cat_str(3,make_str("add"),$2,$3);
+}
+|  ALTER opt_column ColId alter_column_default
+ { 
+ $$ = cat_str(4,make_str("alter"),$2,$3,$4);
+}
+|  ALTER opt_column ColId DROP NOT NULL_P
+ { 
+ $$ = cat_str(4,make_str("alter"),$2,$3,make_str("drop not null"));
+}
+|  ALTER opt_column ColId SET NOT NULL_P
+ { 
+ $$ = cat_str(4,make_str("alter"),$2,$3,make_str("set not null"));
+}
+|  ALTER opt_column ColId SET STATISTICS IntegerOnly
+ { 
+ $$ = cat_str(5,make_str("alter"),$2,$3,make_str("set statistics"),$6);
+}
+|  ALTER opt_column ColId SET STORAGE ColId
+ { 
+ $$ = cat_str(5,make_str("alter"),$2,$3,make_str("set storage"),$6);
+}
+|  DROP opt_column ColId opt_drop_behavior
+ { 
+ $$ = cat_str(4,make_str("drop"),$2,$3,$4);
+}
+|  ALTER opt_column ColId opt_set_data TYPE_P Typename alter_using
+ { 
+ $$ = cat_str(7,make_str("alter"),$2,$3,$4,make_str("type"),$6,$7);
+}
+|  ADD_P TableConstraint
+ { 
+ $$ = cat_str(2,make_str("add"),$2);
+}
+|  DROP CONSTRAINT name opt_drop_behavior
+ { 
+ $$ = cat_str(3,make_str("drop constraint"),$3,$4);
+}
+|  SET WITHOUT OIDS
+ { 
+ $$ = make_str("set without oids");
+}
+|  CLUSTER ON name
+ { 
+ $$ = cat_str(2,make_str("cluster on"),$3);
+}
+|  SET WITHOUT CLUSTER
+ { 
+ $$ = make_str("set without cluster");
+}
+|  ENABLE_P TRIGGER name
+ { 
+ $$ = cat_str(2,make_str("enable trigger"),$3);
+}
+|  ENABLE_P ALWAYS TRIGGER name
+ { 
+ $$ = cat_str(2,make_str("enable always trigger"),$4);
+}
+|  ENABLE_P REPLICA TRIGGER name
+ { 
+ $$ = cat_str(2,make_str("enable replica trigger"),$4);
+}
+|  ENABLE_P TRIGGER ALL
+ { 
+ $$ = make_str("enable trigger all");
+}
+|  ENABLE_P TRIGGER USER
+ { 
+ $$ = make_str("enable trigger user");
+}
+|  DISABLE_P TRIGGER name
+ { 
+ $$ = cat_str(2,make_str("disable trigger"),$3);
+}
+|  DISABLE_P TRIGGER ALL
+ { 
+ $$ = make_str("disable trigger all");
+}
+|  DISABLE_P TRIGGER USER
+ { 
+ $$ = make_str("disable trigger user");
+}
+|  ENABLE_P RULE name
+ { 
+ $$ = cat_str(2,make_str("enable rule"),$3);
+}
+|  ENABLE_P ALWAYS RULE name
+ { 
+ $$ = cat_str(2,make_str("enable always rule"),$4);
+}
+|  ENABLE_P REPLICA RULE name
+ { 
+ $$ = cat_str(2,make_str("enable replica rule"),$4);
+}
+|  DISABLE_P RULE name
+ { 
+ $$ = cat_str(2,make_str("disable rule"),$3);
+}
+|  INHERIT qualified_name
+ { 
+ $$ = cat_str(2,make_str("inherit"),$2);
+}
+|  NO INHERIT qualified_name
+ { 
+ $$ = cat_str(2,make_str("no inherit"),$3);
+}
+|  OWNER TO RoleId
+ { 
+ $$ = cat_str(2,make_str("owner to"),$3);
+}
+|  SET TABLESPACE name
+ { 
+ $$ = cat_str(2,make_str("set tablespace"),$3);
+}
+|  SET definition
+ { 
+ $$ = cat_str(2,make_str("set"),$2);
+}
+|  RESET definition
+ { 
+ $$ = cat_str(2,make_str("reset"),$2);
+}
+;
 
-OptConsTableSpace: USING INDEX TABLESPACE name { $$ = cat2_str(make_str("using index tablespace"), $4); }
-                       | /*EMPTY*/             { $$ = EMPTY; }
-                       ;
 
-/*
- * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
- * SELECT ... INTO.
- */
+ alter_column_default:
+ SET DEFAULT a_expr
+ { 
+ $$ = cat_str(2,make_str("set default"),$3);
+}
+|  DROP DEFAULT
+ { 
+ $$ = make_str("drop default");
+}
+;
 
-CreateAsStmt:  CREATE OptTemp TABLE create_as_target AS
-               { FoundInto = 0; }
-               SelectStmt
-               {
-                       if (FoundInto == 1)
-                               mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE / AS SELECT cannot specify INTO");
 
-                       $$ = cat_str(6, make_str("create"), $2, make_str("table"), $4, make_str("as"), $7);
-               }
-               ;
+ opt_drop_behavior:
+ CASCADE
+ { 
+ $$ = make_str("cascade");
+}
+|  RESTRICT
+ { 
+ $$ = make_str("restrict");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-create_as_target:  qualified_name OptCreateAs OptWith OnCommitOption OptTableSpace
-               {
-                       $$ = cat_str(5, $1, $2, $3, $4, $5);
-               }
-               ;
 
-OptCreateAs:  '(' CreateAsList ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
+ alter_using:
+ USING a_expr
+ { 
+ $$ = cat_str(2,make_str("using"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-CreateAsList:  CreateAsList ',' CreateAsElement
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               | CreateAsElement
-                       { $$ = $1; }
-               ;
 
-CreateAsElement:  ColId { $$ = $1; }
-               ;
+ ClosePortalStmt:
+ CLOSE name
+ { 
+ $$ = cat_str(2,make_str("close"),$2);
+}
+|  CLOSE ALL
+ { 
+ $$ = make_str("close all");
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY :
- *                             CREATE SEQUENCE seqname
- *                              ALTER SEQUENCE seqname
- *
- *****************************************************************************/
 
-CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
-                       { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5); }
-               ;
+ CopyStmt:
+ COPY opt_binary qualified_name opt_column_list opt_oids copy_from copy_file_name copy_delimiter opt_with copy_opt_list
+ { 
+                       if (strcmp($6, "to") == 0 && strcmp($7, "stdin") == 0)
+                               mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin not possible\n");
+                       else if (strcmp($6, "from") == 0 && strcmp($7, "stdout") == 0)
+                               mmerror(PARSE_ERROR, ET_ERROR, "copy from stdout not possible\n");
+                       else if (strcmp($6, "from") == 0 && strcmp($7, "stdin") == 0)
+                               mmerror(PARSE_ERROR, ET_WARNING, "copy from stdin not implemented\n");
 
-AlterSeqStmt: ALTER SEQUENCE relation_expr SeqOptList
-                       { $$ = cat_str(3,make_str("alter sequence"), $3, $4); }
-               ;
+ $$ = cat_str(10,make_str("copy"),$2,$3,$4,$5,$6,$7,$8,$9,$10);
+}
+|  COPY select_with_parens TO copy_file_name opt_with copy_opt_list
+ { 
+                       if (strcmp($4, "stdin") == 0)
+                               mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin not possible\n");
 
-OptSeqOptList:  SeqOptList     { $$ = $1; }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
+ $$ = cat_str(6,make_str("copy"),$2,make_str("to"),$4,$5,$6);
+}
+;
 
-SeqOptList:    SeqOptElem              { $$ = $1; }
-               | SeqOptList SeqOptElem { $$ = cat2_str($1, $2); }
-               ;
 
-SeqOptElem:  CACHE NumConst
-                       { $$ = cat2_str(make_str("cache"), $2); }
-               | CYCLE
-                       { $$ = make_str("cycle"); }
-               | NO CYCLE
-                       { $$ = make_str("no cycle"); }
-               | INCREMENT opt_by NumConst
-                       { $$ = cat_str(3, make_str("increment"), $2, $3); }
-               | MAXVALUE NumConst
-                       { $$ = cat2_str(make_str("maxvalue"), $2); }
-               | MINVALUE NumConst
-                       { $$ = cat2_str(make_str("minvalue"), $2); }
-               | NO MAXVALUE
-                       { $$ = make_str("no maxvalue"); }
-               | NO MINVALUE
-                       { $$ = make_str("no minvalue"); }
-               | OWNED BY any_name
-                       { $$ = cat2_str(make_str("owned by"), $3); }
-               | START opt_with NumConst
-                       { $$ = cat_str(3, make_str("start"), $2, $3); }
-               | RESTART
-                       { $$ = make_str("restart"); }
-               | RESTART opt_with NumConst
-                       { $$ = cat_str(3, make_str("restart"), $2, $3); }
-               ;
+ copy_from:
+ FROM
+ { 
+ $$ = make_str("from");
+}
+|  TO
+ { 
+ $$ = make_str("to");
+}
+;
 
-opt_by:                BY      { $$ = make_str("by"); }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *             QUERIES :
- *                             CREATE PROCEDURAL LANGUAGE ...
- *                             DROP PROCEDURAL LANGUAGE ...
- *
- *****************************************************************************/
+ copy_file_name:
+ ecpg_sconst
+ { 
+ $$ = $1;
+}
+|  STDIN
+ { 
+ $$ = make_str("stdin");
+}
+|  STDOUT
+ { 
+ $$ = make_str("stdout");
+}
+;
 
-CreatePLangStmt:  CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
-                       { $$ = cat_str(5, make_str("create"), $2, $3, make_str("language"), $5); }
-               | CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
-                       HANDLER handler_name opt_validator opt_lancompiler
-                       { $$ = cat_str(9, make_str("create"), $2, $3, make_str("language"), $5, make_str("handler"), $7, $8, $9); }
-               ;
 
-opt_trusted:   TRUSTED { $$ = make_str("trusted"); }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
+ copy_opt_list:
+ copy_opt_list copy_opt_item
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/* This ought to be just func_name, but that causes reduce/reduce conflicts
- * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
- * Work around by using simple names instead.
- */
-handler_name: name     { $$ = $1; }
-               | name attrs    { $$ = cat2_str($1, $2); }
-               ;
 
-opt_validator: VALIDATOR handler_name
-                       { $$ = cat2_str(make_str("validator"), $2); }
-               | /*EMPTY*/
-                       { $$ = ""; }
-               ;
-opt_lancompiler: LANCOMPILER StringConst
-                       { $$ = cat2_str(make_str("lancompiler"), $2); }
-               | /*EMPTY*/
-                       { $$ = ""; }
-               ;
+ copy_opt_item:
+ BINARY
+ { 
+ $$ = make_str("binary");
+}
+|  OIDS
+ { 
+ $$ = make_str("oids");
+}
+|  DELIMITER opt_as ecpg_sconst
+ { 
+ $$ = cat_str(3,make_str("delimiter"),$2,$3);
+}
+|  NULL_P opt_as ecpg_sconst
+ { 
+ $$ = cat_str(3,make_str("null"),$2,$3);
+}
+|  CSV
+ { 
+ $$ = make_str("csv");
+}
+|  HEADER_P
+ { 
+ $$ = make_str("header");
+}
+|  QUOTE opt_as ecpg_sconst
+ { 
+ $$ = cat_str(3,make_str("quote"),$2,$3);
+}
+|  ESCAPE opt_as ecpg_sconst
+ { 
+ $$ = cat_str(3,make_str("escape"),$2,$3);
+}
+|  FORCE QUOTE columnList
+ { 
+ $$ = cat_str(2,make_str("force quote"),$3);
+}
+|  FORCE NOT NULL_P columnList
+ { 
+ $$ = cat_str(2,make_str("force not null"),$4);
+}
+;
 
-DropPLangStmt: DROP opt_procedural LANGUAGE StringConst opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop"), $2, make_str("language"), $4, $5); }
-               | DROP opt_procedural LANGUAGE IF_P EXISTS StringConst opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop"), $2, make_str("language if exists"), $6, $7); }
-               ;
 
-opt_procedural: PROCEDURAL     { $$ = make_str("prcedural"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ opt_binary:
+ BINARY
+ { 
+ $$ = make_str("binary");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *             CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
- *
- *****************************************************************************/
 
-CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
-                       { $$ = cat_str(5,make_str("create tablespace"), $3, $4, make_str("location"), $6); }
-               ;
+ opt_oids:
+ WITH OIDS
+ { 
+ $$ = make_str("with oids");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-OptTableSpaceOwner: OWNER name { $$ = cat2_str(make_str("owner"), $2); }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY :
- *                             DROP TABLESPACE <tablespace>
- *
- *             No need for drop behaviour as we cannot implement dependencies for
- *             objects in other databases; we can only support RESTRICT.
- *
- ****************************************************************************/
+ copy_delimiter:
+ opt_using DELIMITERS ecpg_sconst
+ { 
+ $$ = cat_str(3,$1,make_str("delimiters"),$3);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
 
-DropTableSpaceStmt: DROP TABLESPACE name
-                       { $$ = cat2_str(make_str("drop tablespace"), $3); }
-               | DROP TABLESPACE IF_P EXISTS name
-                       { $$ = cat2_str(make_str("drop tablespace if exists"), $5); }
-               ;
+ opt_using:
+ USING
+ { 
+ $$ = make_str("using");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
 
-/*****************************************************************************
- *
- *             QUERIES :
- *                             CREATE TRIGGER ...
- *                             DROP TRIGGER ...
- *
- *****************************************************************************/
-
-CreateTrigStmt:  CREATE TRIGGER name TriggerActionTime TriggerEvents ON
-                               qualified_name TriggerForSpec EXECUTE PROCEDURE name
-                               '(' TriggerFuncArgs ')'
-                       { $$ = cat_str(12, make_str("create trigger"), $3, $4, $5, make_str("on"), $7, $8, make_str("execute procedure"), $11, make_str("("), $13, make_str(")")); }
-               |       CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
-                               qualified_name OptConstrFromTable ConstraintAttributeSpec
-                               FOR EACH ROW EXECUTE PROCEDURE
-                               func_name '(' TriggerFuncArgs ')'
-                       { $$ = cat_str(13, make_str("create constraint trigger"), $4, make_str("after"), $6, make_str("on"), $8, $9, $10, make_str("for each row execute procedure"), $16, make_str("("), $18, make_str(")")); }
-               ;
+ CreateStmt:
+ CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' OptInherit OptWith OnCommitOption OptTableSpace
+ { 
+ $$ = cat_str(11,make_str("create"),$2,make_str("table"),$4,make_str("("),$6,make_str(")"),$8,$9,$10,$11);
+}
+|  CREATE OptTemp TABLE qualified_name OF qualified_name '(' OptTableElementList ')' OptWith OnCommitOption OptTableSpace
+ { 
+ $$ = cat_str(12,make_str("create"),$2,make_str("table"),$4,make_str("of"),$6,make_str("("),$8,make_str(")"),$10,$11,$12);
+}
+;
 
-TriggerActionTime:     BEFORE          { $$ = make_str("before"); }
-               | AFTER                                 { $$ = make_str("after"); }
-               ;
 
-TriggerEvents: TriggerOneEvent
-                       { $$ = $1; }
-               | TriggerOneEvent OR TriggerOneEvent
-                       { $$ = cat_str(3, $1, make_str("or"), $3); }
-               | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
-                       { $$ = cat_str(5, $1, make_str("or"), $3, make_str("or"), $5); }
-               ;
+ OptTemp:
+ TEMPORARY
+ { 
+ $$ = make_str("temporary");
+}
+|  TEMP
+ { 
+ $$ = make_str("temp");
+}
+|  LOCAL TEMPORARY
+ { 
+ $$ = make_str("local temporary");
+}
+|  LOCAL TEMP
+ { 
+ $$ = make_str("local temp");
+}
+|  GLOBAL TEMPORARY
+ { 
+ $$ = make_str("global temporary");
+}
+|  GLOBAL TEMP
+ { 
+ $$ = make_str("global temp");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-TriggerOneEvent:  INSERT       { $$ = make_str("insert"); }
-               | DELETE_P                      { $$ = make_str("delete"); }
-               | UPDATE                        { $$ = make_str("update"); }
-               ;
 
-TriggerForSpec:  FOR TriggerForOpt TriggerForType
-                       { $$ = cat_str(3, make_str("for"), $2, $3); }
-               | /* EMPTY */
-                       { $$ = EMPTY; }
-               ;
+ OptTableElementList:
+ TableElementList
+ { 
+ $$ = $1;
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-TriggerForOpt: EACH            { $$ = make_str("each"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
 
-TriggerForType:  ROW           { $$ = make_str("row"); }
-               | STATEMENT                     { $$ = make_str("statement"); }
-               ;
+ TableElementList:
+ TableElement
+ { 
+ $$ = $1;
+}
+|  TableElementList ',' TableElement
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-TriggerFuncArgs:  TriggerFuncArg
-                       { $$ = $1; }
-               | TriggerFuncArgs ',' TriggerFuncArg
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
 
-TriggerFuncArg:  PosAllConst   { $$ = $1; }
-               | ColId         { $$ = $1; }
-               ;
+ TableElement:
+ columnDef
+ { 
+ $$ = $1;
+}
+|  TableLikeClause
+ { 
+ $$ = $1;
+}
+|  TableConstraint
+ { 
+ $$ = $1;
+}
+;
 
-OptConstrFromTable: /* Empty */                { $$ = EMPTY; }
-               | FROM qualified_name           { $$ = cat2_str(make_str("from"), $2); }
-               ;
 
-ConstraintAttributeSpec: ConstraintDeferrabilitySpec   { $$ = $1; }
-               | ConstraintDeferrabilitySpec ConstraintTimeSpec
-               {
-                       if (strcmp($1, "deferrable") != 0 && strcmp($2, "initially deferrable") == 0 )
-                               mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE");
+ columnDef:
+ ColId Typename ColQualList
+ { 
+ $$ = cat_str(3,$1,$2,$3);
+}
+;
 
-                       $$ = cat2_str($1, $2);
-               }
-               | ConstraintTimeSpec            { $$ = $1; }
-               | ConstraintTimeSpec ConstraintDeferrabilitySpec
-               {
-                       if (strcmp($2, "deferrable") != 0 && strcmp($1, "initially deferrable") == 0 )
-                               mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE");
 
-                       $$ = cat2_str($1, $2);
-               }
-               | /* EMPTY */
-               {
-                       $$ = EMPTY;
-               }
-               ;
+ ColQualList:
+ ColQualList ColConstraint
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-ConstraintDeferrabilitySpec: NOT DEFERRABLE
-                       { $$ = make_str("not deferrable"); }
-               | DEFERRABLE
-                       { $$ = make_str("deferrable"); }
-               ;
 
-ConstraintTimeSpec: INITIALLY IMMEDIATE
-                       { $$ = make_str("initially immediate"); }
-               | INITIALLY DEFERRED
-                       { $$ = make_str("initially deferred"); }
-               ;
+ ColConstraint:
+ CONSTRAINT name ColConstraintElem
+ { 
+ $$ = cat_str(3,make_str("constraint"),$2,$3);
+}
+|  ColConstraintElem
+ { 
+ $$ = $1;
+}
+|  ConstraintAttr
+ { 
+ $$ = $1;
+}
+;
 
-DropTrigStmt:  DROP TRIGGER name ON qualified_name opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop trigger"), $3, make_str("on"), $5, $6); }
-               | DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop trigger if exists"), $5, make_str("on"), $7, $8); }
-               ;
 
-/*****************************************************************************
- *
- *             QUERIES :
- *                             CREATE ASSERTION ...
- *                             DROP ASSERTION ...
- *
- *****************************************************************************/
-CreateAssertStmt:  CREATE ASSERTION name
-               CHECK '(' a_expr ')' ConstraintAttributeSpec
-               {
-                       mmerror(PARSE_ERROR, ET_ERROR, "CREATE ASSERTION is not yet supported");
-                       $$ = cat_str(6, make_str("create assertion"), $3, make_str("check ("), $6, make_str(")"), $8);
-               }
-               ;
+ ColConstraintElem:
+ NOT NULL_P
+ { 
+ $$ = make_str("not null");
+}
+|  NULL_P
+ { 
+ $$ = make_str("null");
+}
+|  UNIQUE opt_definition OptConsTableSpace
+ { 
+ $$ = cat_str(3,make_str("unique"),$2,$3);
+}
+|  PRIMARY KEY opt_definition OptConsTableSpace
+ { 
+ $$ = cat_str(3,make_str("primary key"),$3,$4);
+}
+|  CHECK '(' a_expr ')'
+ { 
+ $$ = cat_str(3,make_str("check ("),$3,make_str(")"));
+}
+|  DEFAULT b_expr
+ { 
+ $$ = cat_str(2,make_str("default"),$2);
+}
+|  REFERENCES qualified_name opt_column_list key_match key_actions
+ { 
+ $$ = cat_str(5,make_str("references"),$2,$3,$4,$5);
+}
+;
 
-DropAssertStmt:  DROP ASSERTION name
-               {
-                       mmerror(PARSE_ERROR, ET_ERROR, "DROP ASSERTION is not yet supported");
-                       $$ = cat2_str(make_str("drop assertion"), $3);
-               }
-               ;
 
+ ConstraintAttr:
+ DEFERRABLE
+ { 
+ $$ = make_str("deferrable");
+}
+|  NOT DEFERRABLE
+ { 
+ $$ = make_str("not deferrable");
+}
+|  INITIALLY DEFERRED
+ { 
+ $$ = make_str("initially deferred");
+}
+|  INITIALLY IMMEDIATE
+ { 
+ $$ = make_str("initially immediate");
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY :
- *                             define (type,operator,aggregate)
- *
- *****************************************************************************/
-
-DefineStmt:  CREATE AGGREGATE func_name aggr_args definition
-                       { $$ = cat_str(4, make_str("create aggregate"), $3, $4, $5); }
-               | CREATE AGGREGATE func_name old_aggr_definition
-                       { $$ = cat_str(3, make_str("create aggregate"), $3, $4); }
-               | CREATE OPERATOR any_operator 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
-                       { $$ = cat2_str(make_str("create type"), $3); }
-               | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
-                       { $$ = cat_str(5, make_str("create type"), $3, make_str("as ("), $6, make_str(")")); }
-               | CREATE TYPE_P any_name AS ENUM_P '(' enum_val_list ')'
-                       { $$ = cat_str(5, make_str("create type"), $3, make_str("as enum ("), $7, make_str(")")); }
-               | CREATE TEXT_P SEARCH PARSER any_name definition
-                       { $$ = cat_str(3, make_str("create text search parser"), $5, $6); }
-               | CREATE TEXT_P SEARCH DICTIONARY any_name definition
-                       { $$ = cat_str(3, make_str("create text search dictionary"), $5, $6); }
-               | CREATE TEXT_P SEARCH TEMPLATE any_name definition
-                       { $$ = cat_str(3, make_str("create text search template"), $5, $6); }
-               | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
-                       { $$ = cat_str(3, make_str("create text search configuration"), $5, $6); }
-               ;
 
-definition:  '(' def_list ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               ;
+ TableLikeClause:
+ LIKE qualified_name TableLikeOptionList
+ { 
+ $$ = cat_str(3,make_str("like"),$2,$3);
+}
+;
 
-def_list:  def_elem                                    { $$ = $1; }
-               | def_list ',' def_elem         { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-def_elem:  ColLabel '=' def_arg                { $$ = cat_str(3, $1, make_str("="), $3); }
-               | ColLabel                                      { $$ = $1; }
-               ;
+ TableLikeOptionList:
+ TableLikeOptionList TableLikeOption
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/* Note: any simple identifier will be returned as a type name! */
-def_arg:  func_type                            { $$ = $1; }
-               | reserved_keyword              { $$ = $1; }
-               | qual_all_Op                   { $$ = $1; }
-               | AllConst                      { $$ = $1; }
-               ;
 
-aggr_args:      '(' type_list ')'              { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | '(' '*' ')'                   { $$ = make_str("(*)"); }
-               ;
+ TableLikeOption:
+ INCLUDING DEFAULTS
+ { 
+ $$ = make_str("including defaults");
+}
+|  EXCLUDING DEFAULTS
+ { 
+ $$ = make_str("excluding defaults");
+}
+|  INCLUDING CONSTRAINTS
+ { 
+ $$ = make_str("including constraints");
+}
+|  EXCLUDING CONSTRAINTS
+ { 
+ $$ = make_str("excluding constraints");
+}
+|  INCLUDING INDEXES
+ { 
+ $$ = make_str("including indexes");
+}
+|  EXCLUDING INDEXES
+ { 
+ $$ = make_str("excluding indexes");
+}
+;
 
-old_aggr_definition: '(' old_aggr_list ')'     { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               ;
 
-old_aggr_list: old_aggr_elem                           { $$ = $1; }
-                | old_aggr_list ',' old_aggr_elem      { $$ = cat_str(3, $1, make_str(","), $3); }
-                ;
+ TableConstraint:
+ CONSTRAINT name ConstraintElem
+ { 
+ $$ = cat_str(3,make_str("constraint"),$2,$3);
+}
+|  ConstraintElem
+ { 
+ $$ = $1;
+}
+;
 
-old_aggr_elem:  ident '=' def_arg      { $$ = cat_str(3, $1, make_str("="), $3); }
-               ;
 
-enum_val_list:  StringConst                    { $$ = $1; }
-               | enum_val_list ',' StringConst { $$ = cat_str(3, $1, make_str(","), $3);}
-               ;
+ ConstraintElem:
+ CHECK '(' a_expr ')'
+ { 
+ $$ = cat_str(3,make_str("check ("),$3,make_str(")"));
+}
+|  UNIQUE '(' columnList ')' opt_definition OptConsTableSpace
+ { 
+ $$ = cat_str(5,make_str("unique ("),$3,make_str(")"),$5,$6);
+}
+|  PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace
+ { 
+ $$ = cat_str(5,make_str("primary key ("),$4,make_str(")"),$6,$7);
+}
+|  FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions ConstraintAttributeSpec
+ { 
+ $$ = cat_str(8,make_str("foreign key ("),$4,make_str(") references"),$7,$8,$9,$10,$11);
+}
+;
 
-CreateOpClassStmt:      CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
-                                               USING access_method opt_opfamily AS opclass_item_list
-               {
-                       $$ = cat_str(10, make_str("create operator class"), $4, $5, make_str("for type"), $8, make_str("using"), $10, $11, make_str("as"), $13);
-               }
-               ;
 
-opclass_item_list:     opclass_item            { $$ = $1; }
-               | opclass_item_list ',' opclass_item    { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ opt_column_list:
+ '(' columnList ')'
+ { 
+ $$ = cat_str(3,make_str("("),$2,make_str(")"));
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-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(5, make_str("operator"), $2, $3, $4, $5); }
-               | FUNCTION PosIntConst func_name func_args
-                       { $$ = cat_str(4, make_str("function"), $2, $3, $4); }
-               | FUNCTION PosIntConst '(' type_list ')' func_name func_args
-                       { $$ = cat_str(7, make_str("function"), $2, make_str("("), $4, make_str(")"), $6, $7); }
-               | STORAGE Typename
-                       { $$ = cat2_str(make_str("storage"), $2); }
-               ;
 
-opt_default:   DEFAULT { $$ = make_str("default"); }
-               |  /*EMPTY*/    { $$ = EMPTY; }
-               ;
+ columnList:
+ columnElem
+ { 
+ $$ = $1;
+}
+|  columnList ',' columnElem
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-opt_opfamily:  FAMILY any_name         { $$ = cat2_str(make_str("family"), $2); }
-                       | /*EMPTY*/     { $$ = EMPTY; }
-               ;
 
-opt_recheck:   RECHECK         { 
-                                       mmerror(PARSE_ERROR, ET_WARNING, "no longer supported RECHECK OPTION will be passed to backend");
-                                       $$ = make_str("recheck");
-                               }
-               |  /*EMPTY*/    { $$ = EMPTY; }
-               ;
+ columnElem:
+ ColId
+ { 
+ $$ = $1;
+}
+;
 
-CreateOpFamilyStmt: CREATE OPERATOR FAMILY any_name USING access_method
-               { $$ = cat_str(4, make_str("create operator family"), $4, make_str("using"), $6); }
-               ;
 
-AlterOpFamilyStmt: ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list
-                       { $$ = cat_str(6, make_str("alter operator family"), $4, make_str("using"), $6, make_str("add"), $8); }
-                | ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list
-                       { $$ = cat_str(6, make_str("alter operator family"), $4, make_str("using"), $6, make_str("drop"), $8); }
-                ;
+ key_match:
+ MATCH FULL
+ { 
+ $$ = make_str("match full");
+}
+|  MATCH PARTIAL
+ { 
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to backend\n");
+ $$ = make_str("match partial");
+}
+|  MATCH SIMPLE
+ { 
+ $$ = make_str("match simple");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-opclass_drop_list: opclass_drop                                { $$ = $1; }
-               | opclass_drop_list ',' opclass_drop    { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-opclass_drop:
-               OPERATOR PosIntConst '(' type_list ')'
-                       { $$ = cat_str(5, make_str("operator"), $2, make_str("("), $4, make_str(")")); }
-               | FUNCTION PosIntConst '(' type_list ')'
-                       { $$ = cat_str(5, make_str("function"), $2, make_str("("), $4, make_str(")")); }
-               ;
+ key_actions:
+ key_update
+ { 
+ $$ = $1;
+}
+|  key_delete
+ { 
+ $$ = $1;
+}
+|  key_update key_delete
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+|  key_delete key_update
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
+ $$=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); }
-               | DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
-                       { $$ = cat_str(5,make_str("drop operator class if exists"), $6, make_str("using"), $8, $9); }
-               ;
 
-DropOpFamilyStmt: DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
-                       { $$ = cat_str(5,make_str("drop operator family"), $4, make_str("using"), $6, $7); }
-               | DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
-                       { $$ = cat_str(5,make_str("drop operator family if exists"), $6, make_str("using"), $8, $9); }
-               ;
+ key_update:
+ ON UPDATE key_action
+ { 
+ $$ = cat_str(2,make_str("on update"),$3);
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *
- *             DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
- *             REASSIGN OWNED BY username [, username ...] TO username
- *
- *****************************************************************************/
-DropOwnedStmt:
-       DROP OWNED BY name_list opt_drop_behavior
-                       {$$ = cat_str(3, make_str("drop owned by"), $4, $5); }
-               ;
 
-ReassignOwnedStmt:
-       REASSIGN OWNED BY name_list TO name
-                       {$$ = cat_str(4, make_str("reassign owned by"), $4, make_str("to"), $6); }
-               ;
+ key_delete:
+ ON DELETE_P key_action
+ { 
+ $$ = cat_str(2,make_str("on delete"),$3);
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *
- *                        DROP itemtype [ IF EXISTS ] itemname [, itemname ...] [ RESTRICT | CASCADE ]
- *
- *****************************************************************************/
 
-DropStmt:  DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop"), $2, make_str("if exists"), $5, $6); }
-               | DROP drop_type any_name_list opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop"), $2, $3, $4); }
-               ;
+ key_action:
+ NO ACTION
+ { 
+ $$ = make_str("no action");
+}
+|  RESTRICT
+ { 
+ $$ = make_str("restrict");
+}
+|  CASCADE
+ { 
+ $$ = make_str("cascade");
+}
+|  SET NULL_P
+ { 
+ $$ = make_str("set null");
+}
+|  SET DEFAULT
+ { 
+ $$ = make_str("set default");
+}
+;
 
-drop_type:     TABLE                           { $$ = make_str("table"); }
-               | SEQUENCE                      { $$ = make_str("sequence"); }
-               | VIEW                          { $$ = make_str("view"); }
-               | INDEX                         { $$ = make_str("index"); }
-               | TYPE_P                        { $$ = make_str("type"); }
-               | DOMAIN_P                      { $$ = make_str("domain"); }
-               | CONVERSION_P                  { $$ = make_str("conversion"); }
-               | SCHEMA                        { $$ = make_str("schema"); }
-               | TEXT_P SEARCH PARSER          { $$ = make_str("text search parser"); }
-               | TEXT_P SEARCH DICTIONARY      { $$ = make_str("text search dictionary"); }
-               | TEXT_P SEARCH TEMPLATE        { $$ = make_str("text search template"); }
-               | TEXT_P SEARCH CONFIGURATION   { $$ = make_str("text search configuration"); }
-               ;
 
-any_name_list:  any_name
-                       { $$ = $1; }
-               | any_name_list ',' any_name
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ OptInherit:
+ INHERITS '(' qualified_name_list ')'
+ { 
+ $$ = cat_str(3,make_str("inherits ("),$3,make_str(")"));
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-any_name: ColId        { $$ = $1; }
-               | ColId attrs  { $$ = cat2_str($1, $2); }
-               ;
 
-attrs: '.' attr_name           { $$ = cat2_str(make_str("."), $2); }
-               | attrs '.' attr_name   { $$ = cat_str(3, $1, make_str("."), $3); }
-               ;
+ OptWith:
+ WITH definition
+ { 
+ $$ = cat_str(2,make_str("with"),$2);
+}
+|  WITH OIDS
+ { 
+ $$ = make_str("with oids");
+}
+|  WITHOUT OIDS
+ { 
+ $$ = make_str("without oids");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *                        QUERY:
- *                                truncate table relname1, relname2, ....
- *
- *****************************************************************************/
-TruncateStmt:  TRUNCATE opt_table qualified_name_list opt_restart_seqs opt_drop_behavior
-                       { $$ = cat_str(5, make_str("truncate table"), $2, $3, $4, $5); }
-               ;
 
-opt_restart_seqs:
-                       CONTINUE_P IDENTITY_P   { $$ = cat2_str(make_str("continue"), make_str("identity")); }
-                       | RESTART IDENTITY_P    { $$ = cat2_str(make_str("restart"), make_str("identity")); }
-                       | /* EMPTY */           { $$ = EMPTY; }
-                       ;
+ OnCommitOption:
+ ON COMMIT DROP
+ { 
+ $$ = make_str("on commit drop");
+}
+|  ON COMMIT DELETE_P ROWS
+ { 
+ $$ = make_str("on commit delete rows");
+}
+|  ON COMMIT PRESERVE ROWS
+ { 
+ $$ = make_str("on commit preserve rows");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                     fetch/move
- *
- *****************************************************************************/
 
-/* This is different from the backend as we try to be compatible with many other
- * embedded SQL implementations. So we accept their syntax as well and
- * translate it to the PGSQL syntax. */
+ OptTableSpace:
+ TABLESPACE name
+ { 
+ $$ = cat_str(2,make_str("tablespace"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-FetchStmt: FETCH fetch_direction from_in name ecpg_into
-                       {
-                               add_additional_variables($4, false);
-                               $$ = cat_str(4, make_str("fetch"), $2, $3, $4);
-                       }
-               | FETCH fetch_direction name ecpg_into
-                       {
-                               add_additional_variables($3, false);
-                               $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3);
-                       }
-               | FETCH from_in name ecpg_into
-                       {
-                               add_additional_variables($3, false);
-                               $$ = cat_str(3, make_str("fetch"), $2, $3);
-                       }
-               | FETCH name ecpg_into
-                       {
-                               add_additional_variables($2, false);
-                               $$ = cat2_str(make_str("fetch"), $2);
-                       }
-               | FETCH fetch_direction from_in name
-                       {
-                               add_additional_variables($4, false);
-                               $$ = cat_str(4, make_str("fetch"), $2, $3, $4);
-                       }
-               | FETCH fetch_direction name
-                       {
-                               add_additional_variables($3, false);
-                               $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3);
-                       }
-               | FETCH from_in name
-                       {
-                               add_additional_variables($3, false);
-                               $$ = cat_str(3, make_str("fetch"), $2, $3);
-                       }
-               | FETCH name
-                       {
-                               add_additional_variables($2, false);
-                               $$ = cat2_str(make_str("fetch"), $2);
-                       }
-               | MOVE fetch_direction from_in name
-                       { $$ = cat_str(4, make_str("move"), $2, $3, $4); }
-               | MOVE name
-                       { $$ = cat2_str(make_str("move"), $2); }
-               ;
 
-fetch_direction:  NEXT                         { $$ = make_str("next"); }
-               | PRIOR                         { $$ = make_str("prior"); }
-               | FIRST_P                       { $$ = make_str("first"); }
-               | LAST_P                        { $$ = make_str("last"); }
-               | ABSOLUTE_P fetch_count        { $$ = cat2_str(make_str("absolute"), $2); }
-               | RELATIVE_P fetch_count        { $$ = cat2_str(make_str("relative"), $2); }
-               | fetch_count                   { $$ = $1; }
-               | ALL                           { $$ = make_str("all"); }
-               | FORWARD                       { $$ = make_str("forward"); }
-               | FORWARD fetch_count           { $$ = cat2_str(make_str("forward"), $2); }
-               | FORWARD ALL                   { $$ = make_str("forward all"); }
-               | BACKWARD                      { $$ = make_str("backward"); }
-               | BACKWARD fetch_count          { $$ = cat2_str(make_str("backward"), $2); }
-               | BACKWARD ALL                  { $$ = make_str("backward all"); }
-               ;
+ OptConsTableSpace:
+ USING INDEX TABLESPACE name
+ { 
+ $$ = cat_str(2,make_str("using index tablespace"),$4);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-fetch_count:   IntConst        {
-                                       if ($1[1] == '$')
-                                       {
-                                               /* a variable here has to be replaced on the client side, thus we have to use '$0' here */
-                                               $$ = make_str("$0");
-                                               free($1);
-                                       }
-                                       else
-                                               $$ = $1;
-                               }
 
-from_in: IN_P                          { $$ = make_str("in"); }
-               | FROM                  { $$ = make_str("from"); }
-               ;
+ create_as_target:
+ qualified_name OptCreateAs OptWith OnCommitOption OptTableSpace
+ { 
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+;
 
-CommentStmt:   COMMENT ON comment_type name IS comment_text
-                       { $$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6); }
-               | COMMENT ON AGGREGATE func_name aggr_args IS comment_text
-                       { $$ = cat_str(5, make_str("comment on aggregate"), $4, $5, make_str("is"), $7); }
-               | COMMENT ON FUNCTION func_name func_args IS comment_text
-                       { $$ = cat_str(5, make_str("comment on function"), $4, $5, make_str("is"), $7); }
-               | COMMENT ON OPERATOR any_operator oper_argtypes IS comment_text
-                       { $$ = cat_str(5, make_str("comment on operator"), $4, $5, make_str("is"), $7); }
-               | 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); }
-               | COMMENT ON RULE name IS comment_text
-                       { $$ = cat_str(4, make_str("comment on rule"), $4, make_str("is"), $6); }
-               | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
-                       { $$ = cat_str(6, make_str("comment on operator class"), $5, make_str("using"), $7, make_str("is"), $9); }
-               | COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text
-                       { $$ = cat_str(6, make_str("comment on operator family"), $5, make_str("using"), $7, make_str("is"), $9); }
-               | COMMENT ON LARGE_P OBJECT_P NumConst IS comment_text
-                       { $$ = cat_str(4, make_str("comment on large object"), $5, make_str("is"), $7); }
-               | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
-                       { $$ = cat_str(6, make_str("comment on cast ("), $5, make_str("as"), $7, make_str(") is"), $10); }
-               | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
-                       { $$ = cat_str(6, make_str("comment on"), $3, make_str("language"), $5, make_str("is"), $7); }
-               | COMMENT ON TEXT_P SEARCH PARSER any_name IS comment_text
-                       { $$ = cat_str(4, make_str("comment on test search parser"), $6, make_str("is"), $8); }
-               | COMMENT ON TEXT_P SEARCH DICTIONARY any_name IS comment_text
-                       { $$ = cat_str(4, make_str("comment on test search dictionary"), $6, make_str("is"), $8); }
-               | COMMENT ON TEXT_P SEARCH TEMPLATE any_name IS comment_text
-                       { $$ = cat_str(4, make_str("comment on test search template"), $6, make_str("is"), $8); }
-               | COMMENT ON TEXT_P SEARCH CONFIGURATION any_name IS comment_text
-                       { $$ = cat_str(4, make_str("comment on test search configuration"), $6, make_str("is"), $8); }
-               ;
 
-comment_type:  COLUMN          { $$ = make_str("column"); }
-               | DATABASE                      { $$ = make_str("database"); }
-               | SCHEMA                        { $$ = make_str("schema"); }
-               | INDEX                         { $$ = make_str("idnex"); }
-               | SEQUENCE                      { $$ = make_str("sequence"); }
-               | TABLE                         { $$ = make_str("table"); }
-               | DOMAIN_P                      { $$ = make_str("domain"); }
-               | TYPE_P                        { $$ = make_str("type"); }
-               | VIEW                          { $$ = make_str("view"); }
-               | CONVERSION_P                  { $$ = make_str("conversion"); }
-               | TABLESPACE                    { $$ = make_str("tablespace"); }
-               | ROLE                          { $$ = make_str("role"); }
-               ;
+ OptCreateAs:
+ '(' CreateAsList ')'
+ { 
+ $$ = cat_str(3,make_str("("),$2,make_str(")"));
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-comment_text:  StringConst { $$ = $1; }
-               | NULL_P                        { $$ = make_str("null"); }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- * GRANT and REVOKE statements
- *
- *****************************************************************************/
+ CreateAsList:
+ CreateAsElement
+ { 
+ $$ = $1;
+}
+|  CreateAsList ',' CreateAsElement
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-GrantStmt:     GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option
-                       { $$ = cat_str(7, make_str("grant"), $2, make_str("on"), $4, make_str("to"), $6, $7); }
-               ;
 
-RevokeStmt:  REVOKE privileges ON privilege_target FROM grantee_list opt_drop_behavior
-                       {$$ = cat_str(7, make_str("revoke"), $2, make_str("on"), $4, make_str("from"), $6, $7); }
-               | REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_drop_behavior
-                       {$$ = cat_str(7, make_str("revoke grant option for"), $5, make_str("on"), $7, make_str("from"), $9, $10); }
-               ;
+ CreateAsElement:
+ ColId
+ { 
+ $$ = $1;
+}
+;
 
-privileges:  ALL PRIVILEGES            { $$ = make_str("all privileges"); }
-               | ALL                                   { $$ = make_str("all"); }
-               | privilege_list                { $$ = $1; }
-               ;
 
-privilege_list:  privilege
-                       { $$ = $1; }
-               | privilege_list ',' privilege
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ opt_with_data:
+ WITH DATA_P
+ { 
+ $$ = make_str("with data");
+}
+|  WITH NO DATA_P
+ { 
+ $$ = make_str("with no data");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-privilege:     SELECT                  { $$ = make_str("select"); }
-               | REFERENCES            { $$ = make_str("references"); }
-               | CREATE                        { $$ = make_str("create"); }
-               | ColId                         { $$ = $1; }
-               ;
 
-privilege_target: qualified_name_list
-                       { $$ = $1; }
-               | TABLE qualified_name_list
-                       { $$ = cat2_str(make_str("table"), $2); }
-               | SEQUENCE qualified_name_list
-                       { $$ = cat2_str(make_str("sequence"), $2); }
-               | FUNCTION function_with_argtypes_list
-                       { $$ = cat2_str(make_str("function"), $2); }
-               | DATABASE name_list
-                       { $$ = cat2_str(make_str("database"), $2); }
-               | LANGUAGE name_list
-                       { $$ = cat2_str(make_str("language") , $2); }
-               | SCHEMA name_list
-                       { $$ = cat2_str(make_str("schema") , $2); }
-               | TABLESPACE name_list
-                       { $$ = cat2_str(make_str("tablespace") , $2); }
-               ;
+ CreateSeqStmt:
+ CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
+ { 
+ $$ = cat_str(5,make_str("create"),$2,make_str("sequence"),$4,$5);
+}
+;
 
-grantee_list: grantee
-                       { $$ = $1; }
-               | grantee_list ',' grantee
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-grantee:  RoleId                       { $$ = $1; }
-               | GROUP_P RoleId        { $$ = cat2_str(make_str("group"), $2); }
-               ;
+ AlterSeqStmt:
+ ALTER SEQUENCE relation_expr SeqOptList
+ { 
+ $$ = cat_str(3,make_str("alter sequence"),$3,$4);
+}
+;
 
-opt_grant_grant_option:  WITH GRANT OPTION
-               {
-                       mmerror(PARSE_ERROR, ET_WARNING, "currently unsupported GRANT/WITH GRANT OPTION will be passed to backend");
-                       $$ = make_str("with grant option");
-               }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
-
-function_with_argtypes_list: function_with_argtypes
-                       { $$ = $1; }
-               | function_with_argtypes_list ',' function_with_argtypes
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-function_with_argtypes: func_name func_args { $$ = cat2_str($1, $2); };
+ OptSeqOptList:
+ SeqOptList
+ { 
+ $$ = $1;
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- * GRANT and REVOKE ROLE statements
- *
- *****************************************************************************/
 
-GrantRoleStmt:
-               GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
-                       { $$ = cat_str(6, make_str("grant"), $2, make_str("to"), $4, $5, $6); }
-               ;
+ SeqOptList:
+ SeqOptElem
+ { 
+ $$ = $1;
+}
+|  SeqOptList SeqOptElem
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+;
 
-RevokeRoleStmt:
-               REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
-                       { $$ = cat_str(6, make_str("revoke"), $2, make_str("from"), $4, $5, $6); }
-               ;
 
-opt_grant_admin_option: WITH ADMIN OPTION      { $$ = make_str("with admin option"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ SeqOptElem:
+ CACHE NumericOnly
+ { 
+ $$ = cat_str(2,make_str("cache"),$2);
+}
+|  CYCLE
+ { 
+ $$ = make_str("cycle");
+}
+|  NO CYCLE
+ { 
+ $$ = make_str("no cycle");
+}
+|  INCREMENT opt_by NumericOnly
+ { 
+ $$ = cat_str(3,make_str("increment"),$2,$3);
+}
+|  MAXVALUE NumericOnly
+ { 
+ $$ = cat_str(2,make_str("maxvalue"),$2);
+}
+|  MINVALUE NumericOnly
+ { 
+ $$ = cat_str(2,make_str("minvalue"),$2);
+}
+|  NO MAXVALUE
+ { 
+ $$ = make_str("no maxvalue");
+}
+|  NO MINVALUE
+ { 
+ $$ = make_str("no minvalue");
+}
+|  OWNED BY any_name
+ { 
+ $$ = cat_str(2,make_str("owned by"),$3);
+}
+|  START opt_with NumericOnly
+ { 
+ $$ = cat_str(3,make_str("start"),$2,$3);
+}
+|  RESTART
+ { 
+ $$ = make_str("restart");
+}
+|  RESTART opt_with NumericOnly
+ { 
+ $$ = cat_str(3,make_str("restart"),$2,$3);
+}
+;
 
-opt_granted_by: GRANTED BY RoleId       { $$ = cat2_str(make_str("granted by"), $3); }
-               | /*EMPTY*/              { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *             QUERY: CREATE INDEX
- *
- * Note: we can't factor CONCURRENTLY into a separate production without
- * making it a reserved word.
- *
- * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
- * willing to make TABLESPACE a fully reserved word.
- *
- *****************************************************************************/
-
-IndexStmt:     CREATE index_opt_unique INDEX index_name ON qualified_name
-                               access_method_clause '(' index_params ')' opt_definition OptTableSpace where_clause
-                       { $$ = cat_str(13, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11, $12, $13); }
-               | CREATE index_opt_unique INDEX CONCURRENTLY index_name ON qualified_name
-                               access_method_clause '(' index_params ')' opt_definition OptTableSpace where_clause
-                       { $$ = cat_str(13, make_str("create"), $2, make_str("index concurrently"), $5, make_str("on"), $7, $8, make_str("("), $10, make_str(")"), $12, $13, $14); }
-               ;
+ opt_by:
+ BY
+ { 
+ $$ = make_str("by");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-index_opt_unique:  UNIQUE      { $$ = make_str("unique"); }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
 
-access_method_clause:  USING access_method
-                       { $$ = cat2_str(make_str("using"), $2); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
+ NumericOnly:
+ FloatOnly
+ { 
+ $$ = $1;
+}
+|  IntegerOnly
+ { 
+ $$ = $1;
+}
+;
 
-index_params:  index_elem                      { $$ = $1; }
-               | index_params ',' index_elem   { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-index_elem:  ColId opt_class opt_asc_desc opt_nulls_order
-                       { $$ = cat_str(4, $1, $2, $3, $4); }
-               | func_expr opt_class opt_asc_desc opt_nulls_order
-                       { $$ = cat_str(4, $1, $2, $3, $4); }
-               | '(' a_expr ')' opt_class opt_asc_desc opt_nulls_order
-                       { $$ = cat_str(6, make_str("("), $2, make_str(")"), $4, $5, $6); }
-               ;
+ FloatOnly:
+ ecpg_fconst
+ { 
+ $$ = $1;
+}
+|  '-' ecpg_fconst
+ { 
+ $$ = cat_str(2,make_str("-"),$2);
+}
+;
 
-opt_class:     any_name        { $$ = $1; }
-               | USING any_name        { $$ = cat2_str(make_str("using"), $2); }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
 
-opt_asc_desc:  ASC             { $$ = make_str("asc"); }
-               | DESC          { $$ = make_str("desc"); } 
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
+ IntegerOnly:
+ SignedIconst
+ { 
+ $$ = $1;
+}
+;
 
-opt_nulls_order:       NULLS_FIRST             { $$ = make_str("nulls first"); }
-                       | NULLS_LAST            { $$ = make_str("nulls last"); } 
-                       | /*EMPTY*/     { $$ = EMPTY; }
-                       ;
-
-CreateFunctionStmt:    CREATE opt_or_replace FUNCTION func_name func_args
-                                       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); }
-               | CREATE opt_or_replace FUNCTION func_name func_args
-                                       RETURNS TABLE '(' table_func_column_list ')' createfunc_opt_list opt_definition
-                       { $$ = cat_str(9, make_str("create"), $2, make_str("function"), $4, $5, make_str("returns table ("), $9, make_str(")"), $11, $12); }
-               | CREATE opt_or_replace FUNCTION func_name func_args
-                                       createfunc_opt_list opt_definition
-                       { $$ = cat_str(6, make_str("create"), $2, make_str("function"), $4, $5, $6, $7); }
-               ;
 
-opt_or_replace:  OR REPLACE            { $$ = make_str("or replace"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
+ CreatePLangStmt:
+ CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
+ { 
+ $$ = cat_str(5,make_str("create"),$2,$3,make_str("language"),$5);
+}
+|  CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst HANDLER handler_name opt_validator opt_lancompiler
+ { 
+ $$ = cat_str(9,make_str("create"),$2,$3,make_str("language"),$5,make_str("handler"),$7,$8,$9);
+}
+;
 
-func_args:     '(' func_args_list ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | '(' ')'
-                       { $$ = make_str("()"); }
-               ;
 
-func_args_list:  func_arg
-                       { $$ = $1; }
-               | func_args_list ',' func_arg
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ opt_trusted:
+ TRUSTED
+ { 
+ $$ = make_str("trusted");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-func_arg:  arg_class param_name func_type              { $$ = cat_str(3, $1, $2, $3); }
-               | param_name arg_class func_type        { $$ = cat_str(3, $1, $2, $3); }
-               | param_name func_type                  { $$ = cat2_str($1, $2); }
-               | arg_class func_type                   { $$ = cat2_str($1, $2); }
-               | func_type                             { $$ = $1; }
-               ;
 
-arg_class:  IN_P               { $$ = make_str("in"); }
-               | OUT_P         { $$ = make_str("out"); }
-               | INOUT         { $$ = make_str("inout"); }
-               | IN_P OUT_P    { $$ = make_str("in out"); }
-               | VARIADIC      { $$ = make_str("variadic"); }
-               ;
+ handler_name:
+ name
+ { 
+ $$ = $1;
+}
+|  name attrs
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+;
 
-func_as: StringConst
-                       { $$ = $1; }
-               | StringConst ',' StringConst
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-param_name:    type_function_name      { $$ = $1; };
+ opt_validator:
+ VALIDATOR handler_name
+ { 
+ $$ = cat_str(2,make_str("validator"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-func_return:  func_type
-               {
-                       /* We can catch over-specified arguments here if we want to,
-                        * but for now better to silently swallow typmod, etc.
-                        * - thomas 2000-03-22
-                        */
-                       $$ = $1;
-               }
-               ;
 
-func_type:     Typename
-                       { $$ = $1; }
-               | type_function_name attrs '%' TYPE_P
-                       { $$ = cat_str(3, $1, $2, make_str("% type")); }
-               | SETOF type_function_name attrs '%' TYPE_P
-                       { $$ = cat_str(4, make_str("setof"), $2, $3, make_str("% type")); }
-               ;
+ opt_lancompiler:
+ LANCOMPILER ecpg_sconst
+ { 
+ $$ = cat_str(2,make_str("lancompiler"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
 
-createfunc_opt_list: createfunc_opt_item
-                       { $$ = $1; }
-               | createfunc_opt_list createfunc_opt_item
-                       { $$ = cat2_str($1, $2); }
-               ;
+ DropPLangStmt:
+ DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop"),$2,make_str("language"),$4,$5);
+}
+|  DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop"),$2,make_str("language if exists"),$6,$7);
+}
+;
 
-common_func_opt_item:
-               CALLED ON NULL_P INPUT_P
-                               { $$ = make_str("called on null input"); }
-               | RETURNS NULL_P ON NULL_P INPUT_P
-                               { $$ = make_str("returns null on null input"); }
-               | STRICT_P
-                               { $$ = make_str("strict"); }
-               | IMMUTABLE
-                               { $$ = make_str("immutable"); }
-               | STABLE
-                               { $$ = make_str("stable"); }
-               | VOLATILE
-                               { $$ = make_str("volatile"); }
-               | EXTERNAL SECURITY DEFINER
-                               { $$ = make_str("external security definer"); }
-               | EXTERNAL SECURITY INVOKER
-                               { $$ = make_str("external security invoker"); }
-               | SECURITY DEFINER
-                               { $$ = make_str("security definer"); }
-               | SECURITY INVOKER
-                               { $$ = make_str("security invoker"); }
-               | COST NumConst
-                               { $$ = cat2_str(make_str("cost"), $2); }
-               | ROWS NumConst
-                               { $$ = cat2_str(make_str("rows"), $2); }
-               | SetResetClause
-                               { $$ = $1; }
-               ;
 
-createfunc_opt_item: AS func_as
-                               { $$ = cat2_str(make_str("as"), $2); }
-               | LANGUAGE ColId_or_Sconst
-                               { $$ = cat2_str(make_str("language"), $2); }
-               | common_func_opt_item
-                               { $$ = $1; }
-               ;
+ opt_procedural:
+ PROCEDURAL
+ { 
+ $$ = make_str("procedural");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-opt_definition: WITH definition        { $$ = cat2_str(make_str("with"), $2); }
-               | /*EMPTY*/     { $$ = EMPTY; }
-               ;
 
-table_func_column:      param_name func_type   { $$ = cat2_str($1, $2); }
-                       ;
+ CreateTableSpaceStmt:
+ CREATE TABLESPACE name OptTableSpaceOwner LOCATION ecpg_sconst
+ { 
+ $$ = cat_str(5,make_str("create tablespace"),$3,$4,make_str("location"),$6);
+}
+;
 
-table_func_column_list:
-                       table_func_column                               { $$ = $1; }
-                       | table_func_column_list ',' table_func_column  { $$ = cat_str(3, $1, make_str(","), $3); }
-                       ; 
 
-AlterFunctionStmt:
-               ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
-                       { $$ = cat_str(4, make_str("alter function"), $3, $4, $5); }
-               ;
+ OptTableSpaceOwner:
+ OWNER name
+ { 
+ $$ = cat_str(2,make_str("owner"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-alterfunc_opt_list: common_func_opt_item                       { $$ = $1; }
-               | alterfunc_opt_list common_func_opt_item       { $$ = cat2_str($1, $2);}
-               ;
 
-opt_restrict:  RESTRICT        { $$ = make_str("restrict"); }
-               | /*EMPTY*/       { $$ = EMPTY; }
-               ;
+ DropTableSpaceStmt:
+ DROP TABLESPACE name
+ { 
+ $$ = cat_str(2,make_str("drop tablespace"),$3);
+}
+|  DROP TABLESPACE IF_P EXISTS name
+ { 
+ $$ = cat_str(2,make_str("drop tablespace if exists"),$5);
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *
- *                        DROP FUNCTION funcname (arg1, arg2, ...)
- *                        DROP AGGREGATE (arg1, ...) [ RESTRICT | CASCADE ]
- *                        DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
- *
- *****************************************************************************/
 
-RemoveFuncStmt:  DROP FUNCTION func_name func_args opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop function"), $3, $4, $5); }
-               | DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop function if exists"), $5, $6, $7); }
-               ;
+ CreateTrigStmt:
+ CREATE TRIGGER name TriggerActionTime TriggerEvents ON qualified_name TriggerForSpec EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
+ { 
+ $$ = cat_str(12,make_str("create trigger"),$3,$4,$5,make_str("on"),$7,$8,make_str("execute procedure"),$11,make_str("("),$13,make_str(")"));
+}
+|  CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON qualified_name OptConstrFromTable ConstraintAttributeSpec FOR EACH ROW EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
+ { 
+ $$ = cat_str(13,make_str("create constraint trigger"),$4,make_str("after"),$6,make_str("on"),$8,$9,$10,make_str("for each row execute procedure"),$16,make_str("("),$18,make_str(")"));
+}
+;
 
-RemoveAggrStmt:  DROP AGGREGATE func_name aggr_args opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop aggregate"), $3, $4, $5); }
-               | DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop aggregate if exists"), $5, $6, $7); }
-               ;
 
-RemoveOperStmt:  DROP OPERATOR any_operator oper_argtypes opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop operator"), $3, $4, $5); }
-               | DROP OPERATOR IF_P EXISTS any_operator oper_argtypes opt_drop_behavior
-                       { $$ = cat_str(4, make_str("drop operator if exists"), $5, $6, $7); }
-               ;
+ TriggerActionTime:
+ BEFORE
+ { 
+ $$ = make_str("before");
+}
+|  AFTER
+ { 
+ $$ = make_str("after");
+}
+;
 
-oper_argtypes: '(' Typename ')'
-                       {
-                               mmerror(PARSE_ERROR, ET_ERROR, "parser: argument type missing (use NONE for unary operators)");
-                               $$ = make_str("none");
-                       }
-               | '(' Typename ',' Typename ')'
-                       { $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); }
-               | '(' NONE ',' Typename ')'             /* left unary */
-                       { $$ = cat_str(3, make_str("(none,"), $4, make_str(")")); }
-               | '(' Typename ',' NONE ')'             /* right unary */
-                       { $$ = cat_str(3, make_str("("), $2, make_str(", none)")); }
-               ;
 
-any_operator:
-               all_Op
-                       { $$ = $1; }
-               | ColId '.' any_operator
-                       { $$ = cat_str(3, $1, make_str("."), $3); }
-               ;
+ TriggerEvents:
+ TriggerOneEvent
+ { 
+ $$ = $1;
+}
+|  TriggerOneEvent OR TriggerOneEvent
+ { 
+ $$ = cat_str(3,$1,make_str("or"),$3);
+}
+|  TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
+ { 
+ $$ = cat_str(5,$1,make_str("or"),$3,make_str("or"),$5);
+}
+;
 
-CreateCastStmt:                CREATE CAST '(' Typename AS Typename ')'
-                               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 '(' Typename AS Typename ')'
-                               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; }
-               ;
+ TriggerOneEvent:
+ INSERT
+ { 
+ $$ = make_str("insert");
+}
+|  DELETE_P
+ { 
+ $$ = make_str("delete");
+}
+|  UPDATE
+ { 
+ $$ = make_str("update");
+}
+|  TRUNCATE
+ { 
+ $$ = make_str("truncate");
+}
+;
 
 
-DropCastStmt: DROP CAST opt_if_exists  '(' Typename AS Typename ')' opt_drop_behavior
-                       { $$ = cat_str(8, make_str("drop cast"), $3, make_str("("), $5, make_str("as"), $7, make_str(")"), $9); }
-               ;
+ TriggerForSpec:
+ FOR TriggerForOpt TriggerForType
+ { 
+ $$ = cat_str(3,make_str("for"),$2,$3);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-opt_if_exists: IF_P EXISTS     { $$ = make_str("if exists"); }
-               | /* EMPTY */   { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *                             QUERY:
- *
- *                             REINDEX type <typename> [FORCE] [ALL]
- *
- *****************************************************************************/
-ReindexStmt:  REINDEX reindex_type qualified_name opt_force
-                       { $$ = cat_str(4, make_str("reindex"), $2, $3, $4); }
-               | REINDEX SYSTEM_P name opt_force
-                       { $$ = cat_str(3, make_str("reindex system"), $3, $4); }
-               | REINDEX DATABASE name opt_force
-                       { $$ = cat_str(3, make_str("reindex database"), $3, $4); }
-               ;
+ TriggerForOpt:
+ EACH
+ { 
+ $$ = make_str("each");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-reindex_type:  INDEX           { $$ = make_str("index"); }
-               | TABLE         { $$ = make_str("table"); }
-               ;
 
-opt_force: FORCE                       { $$ = make_str("force"); }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
+ TriggerForType:
+ ROW
+ { 
+ $$ = make_str("row");
+}
+|  STATEMENT
+ { 
+ $$ = make_str("statement");
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             rename <attrname1> in <relname> [*] to <attrname2>
- *                             rename <relname1> to <relname2>
- *
- *****************************************************************************/
-
-RenameStmt:  ALTER AGGREGATE func_name aggr_args RENAME TO name
-                       { $$ = cat_str(5, make_str("alter aggregate"), $3, $4, make_str("rename to"), $7); }
-               | ALTER CONVERSION_P any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter conversion"), $3, make_str("rename to"), $6); }
-               | ALTER DATABASE database_name RENAME TO database_name
-                       { $$ = cat_str(4, make_str("alter database"), $3, make_str("rename to"), $6); }
-               | ALTER FUNCTION function_with_argtypes RENAME TO name
-                       { $$ = cat_str(4, make_str("alter function"), $3, make_str("rename to"), $6); }
-               | ALTER GROUP_P RoleId RENAME TO RoleId
-                       { $$ = cat_str(4, make_str("alter group"), $3, make_str("rename to"), $6); }
-               | ALTER opt_procedural LANGUAGE name RENAME TO name
-                       { $$ = cat_str(6, make_str("alter"), $2, make_str("language"), $4, make_str("rename to"), $7); }
-               | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
-                       { $$ = cat_str(6, make_str("alter operator class"), $4, make_str("using"), $6, make_str("rename to"), $9); }
-               | ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name
-                       { $$ = cat_str(6, make_str("alter operator family"), $4, make_str("using"), $6, make_str("rename to"), $9); }
-               | ALTER SCHEMA name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter schema"), $3, make_str("rename to"), $6); }
-               | ALTER TABLE relation_expr RENAME TO name
-                       { $$ = cat_str(4, make_str("alter table"), $3, make_str("rename to"), $6); }
-               | ALTER TABLE relation_expr SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter table"), $3, make_str("set schema"), $6); }
-               | ALTER SEQUENCE relation_expr RENAME TO name
-                       { $$ = cat_str(4, make_str("alter sequence"), $3, make_str("rename to"), $6); }
-               | ALTER VIEW relation_expr RENAME TO name
-                       { $$ = cat_str(4, make_str("alter view"), $3, make_str("rename to"), $6); }
-               | ALTER INDEX relation_expr RENAME TO name
-                       { $$ = cat_str(4, make_str("alter index"), $3, make_str("rename to"), $6); }
-               | ALTER TABLE relation_expr RENAME opt_column name TO name
-                       { $$ = cat_str(7, make_str("alter table"), $3, make_str("rename"), $5, $6, make_str("to"), $8); }
-               | ALTER TRIGGER name ON relation_expr RENAME TO name
-                       { $$ = cat_str(6, make_str("alter trigger"), $3, make_str("on"), $5, make_str("rename to"), $8); }
-               | ALTER USER RoleId RENAME TO RoleId
-                       { $$ = cat_str(4, make_str("alter user"), $3, make_str("rename to"), $6); }
-               | ALTER TABLESPACE name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter tablespace"), $3, make_str("rename to"), $6); }
-               | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter text search parser"), $5, make_str("rename to"), $8); }
-               | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter text search dictionary"), $5, make_str("rename to"), $8); }
-               | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter text search template"), $5, make_str("rename to"), $8); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter text search configuration"), $5, make_str("rename to"), $8); }
-               | ALTER TYPE_P any_name RENAME TO name
-                       { $$ = cat_str(4, make_str("alter type"), $3, make_str("rename to"), $6); }
-               ;
 
-opt_column:  COLUMN                    { $$ = make_str("column"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ TriggerFuncArgs:
+ TriggerFuncArg
+ { 
+ $$ = $1;
+}
+|  TriggerFuncArgs ',' TriggerFuncArg
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-opt_set_data:  SET DATA_P                      { $$ = make_str("set data"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- * ALTER THING name SET SCHEMA name
- *
- *****************************************************************************/
-
-AlterObjectSchemaStmt:
-               ALTER AGGREGATE func_name aggr_args SET SCHEMA name
-                       { $$ = cat_str(5, make_str("alter aggregate"), $3, $4, make_str("set schema"), $7); }
-               | ALTER DOMAIN_P any_name SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter domain"), $3, make_str("set schema"), $6); }
-               | ALTER FUNCTION function_with_argtypes SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter function"), $3, make_str("set schema"), $6); }
-               | ALTER SEQUENCE relation_expr SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter sequence"), $3, make_str("set schema"), $6); }
-               | ALTER VIEW relation_expr SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter sequence"), $3, make_str("set schema"), $6); }
-               | ALTER TYPE_P any_name SET SCHEMA name
-                       { $$ = cat_str(4, make_str("alter type"), $3, make_str("set schema"), $6); }
-               ;
+ TriggerFuncArg:
+ ecpg_iconst
+ { 
+ $$ = $1;
+}
+|  ecpg_fconst
+ { 
+ $$ = $1;
+}
+| ecpg_real_sconst
+ { 
+ $$ = $1;
+}
+|  ecpg_bconst
+ { 
+ $$ = $1;
+}
+|  XCONST
+ { 
+ $$ = make_str("xconst");
+}
+|  ColId
+ { 
+ $$ = $1;
+}
+;
 
-/*****************************************************************************
- *
- * ALTER THING name OWNER TO newname
- *
- *****************************************************************************/
-
-AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
-                       { $$ = cat_str(5, make_str("alter aggregate"), $3, $4, make_str("owner to"), $7); }
-               | ALTER CONVERSION_P any_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter conversion"), $3, make_str("owner to"), $6); }
-               | ALTER DATABASE database_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter database"), $3, make_str("owner to"), $6); }
-               | ALTER DOMAIN_P database_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter domain"), $3, make_str("owner to"), $6); }
-               | ALTER FUNCTION function_with_argtypes OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter function"), $3, make_str("owner to"), $6); }
-               | ALTER opt_procedural LANGUAGE name OWNER TO RoleId
-                       { $$ = cat_str(6, make_str("alter"), $2, make_str("language"), $4, make_str("owner to"), $7); }
-               | ALTER OPERATOR any_operator oper_argtypes OWNER TO RoleId
-                       { $$ = cat_str(5, make_str("alter operator"), $3, $4, make_str("owner to"), $7); }
-               | ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
-                       { $$ = cat_str(6, make_str("alter operator class"), $4, make_str("using"), $6, make_str("owner to"), $9); }
-               | ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
-                       { $$ = cat_str(6, make_str("alter operator family"), $4, make_str("using"), $6, make_str("owner to"), $9); }
-               | ALTER SCHEMA name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter schema"), $3, make_str("owner to"), $6); }
-               | ALTER TYPE_P any_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter type"), $3, make_str("owner to"), $6); }
-               | ALTER TABLESPACE name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter tablespace"), $3, make_str("owner to"), $6); }
-               | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter text search dictionary"), $5, make_str("owner to"), $8); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleId
-                       { $$ = cat_str(4, make_str("alter text search configuration"), $5, make_str("owner to"), $8); }
-               ;
 
+ OptConstrFromTable:
+ FROM qualified_name
+ { 
+ $$ = cat_str(2,make_str("from"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:  Define Rewrite Rule
- *
- *****************************************************************************/
 
-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(12, make_str("create"), $2, make_str("rule"), $4, make_str("as on"), $8, make_str("to"), $10, $11, make_str("do"), $13, $14);
-               }
-               ;
+ ConstraintAttributeSpec:
+ ConstraintDeferrabilitySpec
+ { 
+ $$ = $1;
+}
+|  ConstraintDeferrabilitySpec ConstraintTimeSpec
+ { 
+                       if (strcmp($1, "deferrable") != 0 && strcmp($2, "initially deferrable") == 0 )
+                               mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE\n");
 
-RuleActionList:  NOTHING                               { $$ = make_str("nothing"); }
-               | RuleActionStmt                                { $$ = $1; }
-               | '(' RuleActionMulti ')'               { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-                               ;
+ $$ = cat_str(2,$1,$2);
+}
+|  ConstraintTimeSpec
+ { 
+ $$ = $1;
+}
+|  ConstraintTimeSpec ConstraintDeferrabilitySpec
+ { 
+                       if (strcmp($2, "deferrable") != 0 && strcmp($1, "initially deferrable") == 0 )
+                               mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE\n");
 
-/* the thrashing around here is to discard "empty" statements... */
-RuleActionMulti:  RuleActionMulti ';' RuleActionStmtOrEmpty
-                       {  $$ = cat_str(3, $1, make_str(";"), $3); }
-               | RuleActionStmtOrEmpty
                      { $$ = cat2_str($1, make_str(";")); }
-               ;
+ $$ = cat_str(2,$1,$2);
+}
+| 
+ { 
$$=EMPTY; }
+;
 
-RuleActionStmt:   SelectStmt
-               | InsertStmt
-               | UpdateStmt
-               | DeleteStmt
-               | NotifyStmt
-               ;
 
-RuleActionStmtOrEmpty: RuleActionStmt  { $$ = $1; }
-               | /*EMPTY*/                                             { $$ = EMPTY; }
-               ;
+ ConstraintDeferrabilitySpec:
+ NOT DEFERRABLE
+ { 
+ $$ = make_str("not deferrable");
+}
+|  DEFERRABLE
+ { 
+ $$ = make_str("deferrable");
+}
+;
 
-/* change me to select, update, etc. some day */
-event: SELECT                          { $$ = make_str("select"); }
-               | UPDATE                        { $$ = make_str("update"); }
-               | DELETE_P                      { $$ = make_str("delete"); }
-               | INSERT                        { $$ = make_str("insert"); }
-               | TRUNCATE                      { $$ = make_str("truncate"); }
-               ;
 
-opt_instead:  INSTEAD          { $$ = make_str("instead"); }
-               | ALSO          { $$ = make_str("also"); }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ ConstraintTimeSpec:
+ INITIALLY IMMEDIATE
+ { 
+ $$ = make_str("initially immediate");
+}
+|  INITIALLY DEFERRED
+ { 
+ $$ = make_str("initially deferred");
+}
+;
 
-DropRuleStmt:  DROP RULE name ON qualified_name opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop rule"), $3, make_str("on"), $5, $6);}
-               | DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
-                       { $$ = cat_str(5, make_str("drop rule if exists"), $5, make_str("on"), $7, $8);}
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             NOTIFY <qualified_name> can appear both in rule bodies and
- *                             as a query-level command
- *
- *****************************************************************************/
+ DropTrigStmt:
+ DROP TRIGGER name ON qualified_name opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop trigger"),$3,make_str("on"),$5,$6);
+}
+|  DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop trigger if exists"),$5,make_str("on"),$7,$8);
+}
+;
 
-NotifyStmt:  NOTIFY ColId
-                       { $$ = cat2_str(make_str("notify"), $2); }
-               ;
 
-ListenStmt:  LISTEN ColId
-                       { $$ = cat2_str(make_str("listen"), $2); }
-               ;
+ CreateAssertStmt:
+ CREATE ASSERTION name CHECK '(' a_expr ')' ConstraintAttributeSpec
+ { 
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to backend\n");
+ $$ = cat_str(6,make_str("create assertion"),$3,make_str("check ("),$6,make_str(")"),$8);
+}
+;
 
-UnlistenStmt:  UNLISTEN ColId
-                       { $$ = cat2_str(make_str("unlisten"), $2); }
-               | UNLISTEN '*'
-                       { $$ = make_str("unlisten *"); }
-               ;
 
+ DropAssertStmt:
+ DROP ASSERTION name opt_drop_behavior
+ { 
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to backend\n");
+ $$ = cat_str(3,make_str("drop assertion"),$3,$4);
+}
+;
 
-/*****************************************************************************
- *
- *                             Transactions:
- *
- *       BEGIN / COMMIT / ROLLBACK
- *             (also older versions END / ABORT)
- *
- *****************************************************************************/
-TransactionStmt:  ABORT_P opt_transaction       { $$ = make_str("rollback"); }
-               | BEGIN_P opt_transaction transaction_mode_list_or_empty { $$ = cat2_str(make_str("begin transaction"), $3); }
-               | START TRANSACTION transaction_mode_list_or_empty       { $$ = cat2_str(make_str("start transaction"), $3); }
-               | COMMIT opt_transaction                         { $$ = make_str("commit"); }
-               | END_P opt_transaction                          { $$ = make_str("commit"); }
-               | ROLLBACK opt_transaction                       { $$ = make_str("rollback"); }
-               | SAVEPOINT ColId                                        { $$ = cat2_str(make_str("savepoint"), $2); }
-               | RELEASE SAVEPOINT ColId                        { $$ = cat2_str(make_str("release savepoint"), $3); }
-               | RELEASE ColId                                          { $$ = cat2_str(make_str("release"), $2); }
-               | ROLLBACK opt_transaction TO SAVEPOINT ColId            { $$ = cat_str(4, make_str("rollback"), $2, make_str("to savepoint"), $5); }
-               | ROLLBACK opt_transaction TO ColId      { $$ = cat_str(4, make_str("rollback"), $2, make_str("to"), $4); }
-               | PREPARE TRANSACTION StringConst        { $$ = cat2_str(make_str("prepare transaction"), $3); }
-               | COMMIT PREPARED StringConst            { $$ = cat2_str(make_str("commit prepared"), $3); }
-               | ROLLBACK PREPARED StringConst          { $$ = cat2_str(make_str("rollback prepared"), $3); }
-               ;
 
-opt_transaction: WORK  { $$ = EMPTY; }
-               | TRANSACTION   { $$ = EMPTY; }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
+ DefineStmt:
+ CREATE AGGREGATE func_name aggr_args definition
+ { 
+ $$ = cat_str(4,make_str("create aggregate"),$3,$4,$5);
+}
+|  CREATE AGGREGATE func_name old_aggr_definition
+ { 
+ $$ = cat_str(3,make_str("create aggregate"),$3,$4);
+}
+|  CREATE OPERATOR any_operator 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
+ { 
+ $$ = cat_str(2,make_str("create type"),$3);
+}
+|  CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
+ { 
+ $$ = cat_str(5,make_str("create type"),$3,make_str("as ("),$6,make_str(")"));
+}
+|  CREATE TYPE_P any_name AS ENUM_P '(' enum_val_list ')'
+ { 
+ $$ = cat_str(5,make_str("create type"),$3,make_str("as enum ("),$7,make_str(")"));
+}
+|  CREATE TEXT_P SEARCH PARSER any_name definition
+ { 
+ $$ = cat_str(3,make_str("create text search parser"),$5,$6);
+}
+|  CREATE TEXT_P SEARCH DICTIONARY any_name definition
+ { 
+ $$ = cat_str(3,make_str("create text search dictionary"),$5,$6);
+}
+|  CREATE TEXT_P SEARCH TEMPLATE any_name definition
+ { 
+ $$ = cat_str(3,make_str("create text search template"),$5,$6);
+}
+|  CREATE TEXT_P SEARCH CONFIGURATION any_name definition
+ { 
+ $$ = cat_str(3,make_str("create text search configuration"),$5,$6);
+}
+;
 
-transaction_mode_item:
-               ISOLATION LEVEL iso_level
-                       { $$ = cat2_str(make_str("isolation level"), $3); }
-               | READ ONLY     { $$ = make_str("read only"); }
-               | READ WRITE    { $$ = make_str("read write"); }
-               ;
 
-transaction_mode_list:
-               transaction_mode_item                                   { $$ = $1; }
-               | transaction_mode_list ',' transaction_mode_item       { $$ = cat_str(3, $1, make_str(","), $3); }
-               | transaction_mode_list transaction_mode_item           { $$ = cat_str(3, $1, make_str(" "), $2); }
-               ;
+ definition:
+ '(' def_list ')'
+ { 
+ $$ = cat_str(3,make_str("("),$2,make_str(")"));
+}
+;
 
-transaction_mode_list_or_empty:
-               transaction_mode_list   { $$ = $1; }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *     QUERY:
- *             CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
- *                     AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
- *
- *****************************************************************************/
+ def_list:
+ def_elem
+ { 
+ $$ = $1;
+}
+|  def_list ',' def_elem
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-ViewStmt:  CREATE OptTemp VIEW qualified_name opt_column_list AS SelectStmt opt_check_option
-                       { $$ = cat_str(8, make_str("create"), $2, make_str("view"), $4, $5, make_str("as"), $7, $8); }
-               | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list AS SelectStmt opt_check_option
-                       { $$ = cat_str(8, make_str("create or replace"), $4, make_str("view"), $6, $7, make_str("as"), $9, $10); }
-               ;
 
-opt_check_option:
-                   WITH CHECK OPTION
-                  { 
-                       mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented");
-                       $$ = EMPTY;
-                  }
-                   | WITH CASCADED CHECK OPTION
-                  { 
-                       mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented");
-                       $$ = EMPTY;
-                  }
-                  | WITH LOCAL CHECK OPTION
-                  {
-                       mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented");
-                       $$ = EMPTY;
-                  }
-                  | /* EMPTY */
-                  { $$ = EMPTY; } 
-                  ;
+ def_elem:
+ ColLabel '=' def_arg
+ { 
+ $$ = cat_str(3,$1,make_str("="),$3);
+}
+|  ColLabel
+ { 
+ $$ = $1;
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             load make_str("filename")
- *
- *****************************************************************************/
 
-LoadStmt:  LOAD file_name
-                       { $$ = cat2_str(make_str("load"), $2); }
-               ;
+ def_arg:
+ func_type
+ { 
+ $$ = $1;
+}
+|  reserved_keyword
+ { 
+ $$ = $1;
+}
+|  qual_all_Op
+ { 
+ $$ = $1;
+}
+|  NumericOnly
+ { 
+ $$ = $1;
+}
+| ecpg_real_sconst
+ { 
+ $$ = $1;
+}
+;
 
 
-/*****************************************************************************
- *
- *             CREATE DATABASE
- *
- *
- *****************************************************************************/
+ aggr_args:
+ '(' type_list ')'
+ { 
+ $$ = cat_str(3,make_str("("),$2,make_str(")"));
+}
+|  '(' '*' ')'
+ { 
+ $$ = make_str("( * )");
+}
+;
 
-CreatedbStmt:  CREATE DATABASE database_name WITH createdb_opt_list
-                       { $$ = cat_str(4, make_str("create database"), $3, make_str("with"), $5); }
-               | CREATE DATABASE database_name
-                       { $$ = cat2_str(make_str("create database"), $3); }
-               ;
 
-createdb_opt_list:     createdb_opt_item
-                       { $$ = $1; }
-               | createdb_opt_list createdb_opt_item
-                       { $$ = cat2_str($1, $2); }
-               ;
+ old_aggr_definition:
+ '(' old_aggr_list ')'
+ { 
+ $$ = cat_str(3,make_str("("),$2,make_str(")"));
+}
+;
 
-createdb_opt_item:     TABLESPACE opt_equal name
-                       { $$ = cat_str(3,make_str("tablespace"), $2, $3); }
-               | TABLESPACE opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("tablespace"), $2, make_str("default")); }
-               | LOCATION opt_equal StringConst
-                       { $$ = cat_str(3,make_str("location"), $2, $3); }
-               | LOCATION opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("location"), $2, make_str("default")); }
-               | TEMPLATE opt_equal name
-                       { $$ = cat_str(3, make_str("template"), $2, $3); }
-               | TEMPLATE opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("template"), $2, make_str("default")); }
-               | ENCODING opt_equal PosIntStringConst
-                       { $$ = cat_str(3, make_str("encoding"), $2, $3); }
-               | ENCODING opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("encoding"), $2, make_str("default")); }
-               | COLLATE opt_equal StringConst
-                       { $$ = cat_str(3, make_str("collate"), $2, $3); }
-               | COLLATE opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("collate"), $2, make_str("default")); }
-               | CTYPE opt_equal StringConst
-                       { $$ = cat_str(3, make_str("ctype"), $2, $3); }
-               | CTYPE opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("ctype"), $2, make_str("default")); }
-               | CONNECTION LIMIT opt_equal PosIntConst
-                       { $$ = cat_str(3, make_str("connection limit"), $3, $4); }
-               | OWNER opt_equal name
-                       { $$ = cat_str(3, make_str("owner"), $2, $3); }
-               | OWNER opt_equal DEFAULT
-                       { $$ = cat_str(3, make_str("owner"), $2, make_str("default")); }
-               ;
 
-opt_equal: '='                                 { $$ = make_str("="); }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
+ old_aggr_list:
+ old_aggr_elem
+ { 
+ $$ = $1;
+}
+|  old_aggr_list ',' old_aggr_elem
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
 
-/*****************************************************************************
- *
- *                             ALTER DATABASE
- *
- *
- *****************************************************************************/
+ old_aggr_elem:
+ ecpg_ident '=' def_arg
+ { 
+ $$ = cat_str(3,$1,make_str("="),$3);
+}
+;
 
-AlterDatabaseStmt: ALTER DATABASE database_name opt_with alterdb_opt_list
-                       { $$ = cat_str(4, make_str("alter database"), $3, $4, $5); }
-               ;
 
-AlterDatabaseSetStmt: ALTER DATABASE database_name SetResetClause
-                       { $$ = cat_str(3, make_str("alter database"), $3, $4); }
-               ;
+ enum_val_list:
+ ecpg_sconst
+ { 
+ $$ = $1;
+}
+|  enum_val_list ',' ecpg_sconst
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-alterdb_opt_list:
-               alterdb_opt_list alterdb_opt_item       { $$ = cat2_str($1, $2);}
-               | /* EMPTY */                           { $$ = EMPTY; }
-               ;
 
-alterdb_opt_item:
-               CONNECTION LIMIT opt_equal PosIntConst { $$ = cat_str(3, make_str("connection limit"), $3, $4); }
-               ;
+ CreateOpClassStmt:
+ CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename USING access_method opt_opfamily AS opclass_item_list
+ { 
+ $$ = cat_str(10,make_str("create operator class"),$4,$5,make_str("for type"),$8,make_str("using"),$10,$11,make_str("as"),$13);
+}
+;
 
-/*****************************************************************************
- *
- *             DROP DATABASE [ IF EXISTS ]
- *
- *
- *****************************************************************************/
 
-DropdbStmt: DROP DATABASE database_name
-                       { $$ = cat2_str(make_str("drop database"), $3); }
-               | DROP DATABASE IF_P EXISTS database_name
-                       { $$ = cat2_str(make_str("drop database if exists"), $5); }
-               ;
+ opclass_item_list:
+ opclass_item
+ { 
+ $$ = $1;
+}
+|  opclass_item_list ',' opclass_item
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
 
-/*****************************************************************************
- *
- * Manipulate a domain
- *
- *****************************************************************************/
-
-CreateDomainStmt:  CREATE DOMAIN_P any_name opt_as Typename ColQualList
-               {
-                       $$ = cat_str(5, make_str("create domain"), $3, $4, $5, $6);
-               }
-               ;
-
-AlterDomainStmt:
-               ALTER DOMAIN_P any_name alter_column_default
-                       { $$ = cat_str(3, make_str("alter domain"), $3, $4); }
-               | ALTER DOMAIN_P any_name DROP NOT NULL_P
-                       { $$ = cat_str(3, make_str("alter domain"), $3, make_str("drop not null")); }
-               | ALTER DOMAIN_P any_name SET NOT NULL_P
-                       { $$ = cat_str(3, make_str("alter domain"), $3, make_str("set not null")); }
-               | ALTER DOMAIN_P any_name ADD_P TableConstraint
-                       { $$ = cat_str(4, make_str("alter domain"), $3, make_str("add"), $5); }
-               | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
-                       { $$ = cat_str(5, make_str("alter domain"), $3, make_str("drop constraint"), $6, $7); }
-               ;
+ opclass_item:
+ OPERATOR ecpg_iconst any_operator opt_recheck
+ { 
+ $$ = cat_str(4,make_str("operator"),$2,$3,$4);
+}
+|  OPERATOR ecpg_iconst any_operator oper_argtypes opt_recheck
+ { 
+ $$ = cat_str(5,make_str("operator"),$2,$3,$4,$5);
+}
+|  FUNCTION ecpg_iconst func_name func_args
+ { 
+ $$ = cat_str(4,make_str("function"),$2,$3,$4);
+}
+|  FUNCTION ecpg_iconst '(' type_list ')' func_name func_args
+ { 
+ $$ = cat_str(7,make_str("function"),$2,make_str("("),$4,make_str(")"),$6,$7);
+}
+|  STORAGE Typename
+ { 
+ $$ = cat_str(2,make_str("storage"),$2);
+}
+;
 
-opt_as:        AS      {$$ = make_str("as"); }
-               | /* EMPTY */   {$$ = EMPTY; }
-               ;
 
-AlterTSDictionaryStmt:
-               ALTER TEXT_P SEARCH DICTIONARY any_name definition
-                       { $$ = cat_str(3, make_str("alter text search dictionary"), $5, $6); }
-               ;
+ opt_default:
+ DEFAULT
+ { 
+ $$ = make_str("default");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-AlterTSConfigurationStmt:
-               ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
-                       { $$ = cat_str(6, make_str("alter text search configuration"), $5, make_str("add mapping for"), $9, make_str("with"), $11); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list WITH any_name_list
-                       { $$ = cat_str(6, make_str("alter text search configuration"), $5, make_str("alter mapping for"), $9, make_str("with"), $11); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name WITH any_name
-                       { $$ = cat_str(6, make_str("alter text search configuration"), $5, make_str("alter mapping replace"), $9, make_str("with"), $11); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name WITH any_name
-                       { $$ = cat_str(8, make_str("alter text search configuration"), $5, make_str("alter mapping for"), $9, make_str("replace"), $11, make_str("with"), $13); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
-                       { $$ = cat_str(4, make_str("alter text search configuration"), $5, make_str("drop mapping for"), $9); }
-               | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
-                       { $$ = cat_str(4, make_str("alter text search configuration"), $5, make_str("drop mapping if exists for"), $11); }
-               ;
 
-CreateConversionStmt:
-          CREATE opt_default CONVERSION_P any_name FOR StringConst
-          TO StringConst FROM any_name
-                  { $$ = cat_str(10, make_str("create"), $2, make_str("conversion"), $4, make_str("for"), $6, make_str("to"), $8, make_str("from"), $10); }
-          ;
+ opt_opfamily:
+ FAMILY any_name
+ { 
+ $$ = cat_str(2,make_str("family"),$2);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                            cluster <index_name> on <qualified_name>
- *                             cluster <qualified_name>
- *                             cluster
- *
- *****************************************************************************/
-
-ClusterStmt:  CLUSTER qualified_name cluster_index_specification
-                               { $$ = cat_str(3,make_str("cluster"), $2, $3); }
-               | CLUSTER
-                               { $$ = make_str("cluster"); }
-               | CLUSTER qualified_name ON qualified_name
-                               { $$ = cat_str(4, make_str("cluster"), $2, make_str("on"), $4); }
-               ;
 
-cluster_index_specification:
-               USING index_name        { $$ = cat2_str(make_str("using"), $2); }
-               | /*EMPTY*/             { $$ = EMPTY; }
-               ;
+ opt_recheck:
+ RECHECK
+ { 
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to backend\n");
+ $$ = make_str("recheck");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             vacuum
- *                             analyze
- *
- *****************************************************************************/
-
-VacuumStmt:  VACUUM opt_full opt_freeze opt_verbose
-                       { $$ = cat_str(4, make_str("vacuum"), $2, $3, $4); }
-               | VACUUM opt_full opt_freeze opt_verbose qualified_name
-                       { $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5); }
-               | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
-                       { $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5); }
-               ;
 
-AnalyzeStmt:  analyze_keyword opt_verbose
-                       { $$ = cat_str(2, $1, $2); }
-               | analyze_keyword opt_verbose qualified_name opt_name_list
-                       { $$ = cat_str(4, $1, $2, $3, $4); }
-               ;
+ CreateOpFamilyStmt:
+ CREATE OPERATOR FAMILY any_name USING access_method
+ { 
+ $$ = cat_str(4,make_str("create operator family"),$4,make_str("using"),$6);
+}
+;
 
-analyze_keyword:  ANALYZE              { $$ = make_str("analyze"); }
-               | ANALYSE               { $$ = make_str("analyse"); }
-               ;
 
-opt_verbose:  VERBOSE                  { $$ = make_str("verbose"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
+ AlterOpFamilyStmt:
+ ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list
+ { 
+ $$ = cat_str(6,make_str("alter operator family"),$4,make_str("using"),$6,make_str("add"),$8);
+}
+|  ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list
+ { 
+ $$ = cat_str(6,make_str("alter operator family"),$4,make_str("using"),$6,make_str("drop"),$8);
+}
+;
 
-opt_full:  FULL                                        { $$ = make_str("full"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
 
-opt_freeze:  FREEZE                            { $$ = make_str("freeze"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
+ opclass_drop_list:
+ opclass_drop
+ { 
+ $$ = $1;
+}
+|  opclass_drop_list ',' opclass_drop
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-opt_name_list: '(' name_list ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
 
+ opclass_drop:
+ OPERATOR ecpg_iconst '(' type_list ')'
+ { 
+ $$ = cat_str(5,make_str("operator"),$2,make_str("("),$4,make_str(")"));
+}
+|  FUNCTION ecpg_iconst '(' type_list ')'
+ { 
+ $$ = cat_str(5,make_str("function"),$2,make_str("("),$4,make_str(")"));
+}
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             EXPLAIN query
- *
- *****************************************************************************/
 
-ExplainStmt:  EXPLAIN opt_analyze opt_verbose ExplainableStmt
-                       { $$ = cat_str(4, make_str("explain"), $2, $3, $4); }
-               ;
+ 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);
+}
+|  DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop operator class if exists"),$6,make_str("using"),$8,$9);
+}
+;
 
-ExplainableStmt:
-               SelectStmt
-               | InsertStmt
-               | UpdateStmt
-               | DeleteStmt
-               | DeclareCursorStmt
-               | ExecuteStmt
-               ;
-opt_analyze:
-               analyze_keyword                 { $$ = $1; }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
 
-PrepareStmt: PREPARE prepared_name prep_type_clause AS PreparableStmt
-               {
-                       $$.name = $2;
-                       $$.type = $3;
-                       $$.stmt = cat_str(3, make_str("\""), $5, make_str("\""));
-               }
-               | PREPARE prepared_name FROM execstring /* ECPG addon */
-               {
-                       $$.name = $2;
-                       $$.type = NULL;
-                       $$.stmt = $4;
-               }
-               ;
+ DropOpFamilyStmt:
+ DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop operator family"),$4,make_str("using"),$6,$7);
+}
+|  DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop operator family if exists"),$6,make_str("using"),$8,$9);
+}
+;
 
-PreparableStmt:
-               SelectStmt
-               | InsertStmt
-               | UpdateStmt
-               | DeleteStmt
-               ;
 
-prep_type_clause: '(' type_list ')'    { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | /* EMPTY */           { $$ = EMPTY; }
-                       ;
+ DropOwnedStmt:
+ DROP OWNED BY name_list opt_drop_behavior
+ { 
+ $$ = cat_str(3,make_str("drop owned by"),$4,$5);
+}
+;
 
-ExecuteStmt: EXECUTE prepared_name execute_param_clause execute_rest /* execute_rest is an ecpg addon */
-                       {
-                               /* $$ = cat_str(3, make_str("ECPGprepared_statement("), connection, $2, make_str("__LINE__)"));*/
-                               $$ = $2;
-                       }
-               | CREATE OptTemp TABLE create_as_target AS
-                       EXECUTE prepared_name execute_param_clause
-                       { $$ = cat_str(7, make_str("create"), $2, make_str("table"), $4,  make_str("as execute"), $7, $8); }
-               ;
 
-execute_param_clause: '(' expr_list ')'        { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
+ ReassignOwnedStmt:
+ REASSIGN OWNED BY name_list TO name
+ { 
+ $$ = cat_str(4,make_str("reassign owned by"),$4,make_str("to"),$6);
+}
+;
 
-DeallocateStmt: DEALLOCATE prepared_name               { $$ = $2; }
-               | DEALLOCATE PREPARE prepared_name      { $$ = $3; }
-               | DEALLOCATE ALL                        { $$ = make_str("all"); }
-               | DEALLOCATE PREPARE ALL                { $$ = make_str("all"); }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             INSERT STATEMENTS
- *
- *****************************************************************************/
+ DropStmt:
+ DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("drop"),$2,make_str("if exists"),$5,$6);
+}
+|  DROP drop_type any_name_list opt_drop_behavior
+ { 
+ $$ = cat_str(4,make_str("drop"),$2,$3,$4);
+}
+;
 
-InsertStmt:  INSERT INTO qualified_name insert_rest returning_clause
-                       { $$ = cat_str(4, make_str("insert into"), $3, $4, $5); }
-               ;
 
-insert_rest:  
-               SelectStmt
-                       { $$ = $1; }
-               | '(' insert_column_list ')' SelectStmt
-                       { $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); }
-               | DEFAULT VALUES
-                       { $$ = make_str("default values"); }
-               ;
+ drop_type:
+ TABLE
+ { 
+ $$ = make_str("table");
+}
+|  SEQUENCE
+ { 
+ $$ = make_str("sequence");
+}
+|  VIEW
+ { 
+ $$ = make_str("view");
+}
+|  INDEX
+ { 
+ $$ = make_str("index");
+}
+|  TYPE_P
+ { 
+ $$ = make_str("type");
+}
+|  DOMAIN_P
+ { 
+ $$ = make_str("domain");
+}
+|  CONVERSION_P
+ { 
+ $$ = make_str("conversion");
+}
+|  SCHEMA
+ { 
+ $$ = make_str("schema");
+}
+|  TEXT_P SEARCH PARSER
+ { 
+ $$ = make_str("text search parser");
+}
+|  TEXT_P SEARCH DICTIONARY
+ { 
+ $$ = make_str("text search dictionary");
+}
+|  TEXT_P SEARCH TEMPLATE
+ { 
+ $$ = make_str("text search template");
+}
+|  TEXT_P SEARCH CONFIGURATION
+ { 
+ $$ = make_str("text search configuration");
+}
+;
 
-insert_column_list: insert_column_list ',' insert_column_item
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               | insert_column_item
-                       { $$ = $1; }
-               ;
 
-insert_column_item:  ColId opt_indirection
-                       { $$ = cat2_str($1, $2); }
-               ;
+ any_name_list:
+ any_name
+ { 
+ $$ = $1;
+}
+|  any_name_list ',' any_name
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-returning_clause:  RETURNING target_list       { $$ = cat2_str(make_str("returning"), $2); }
-               | /* EMPTY */                   { $$ = EMPTY; }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             DELETE STATEMENTS
- *
- *****************************************************************************/
+ any_name:
+ ColId
+ { 
+ $$ = $1;
+}
+|  ColId attrs
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+;
 
-DeleteStmt:  DELETE_P FROM relation_expr_opt_alias using_clause where_or_current_clause returning_clause
-                       { $$ = cat_str(5, make_str("delete from"), $3, $4, $5, $6); }
-               ;
 
-using_clause: USING from_list  { $$ = cat2_str(make_str("using"), $2); }
-                       | /* EMPTY */           { $$ = EMPTY; }
-               ;
+ attrs:
+ '.' attr_name
+ { 
+ $$ = cat_str(2,make_str("."),$2);
+}
+|  attrs '.' attr_name
+ { 
+ $$ = cat_str(3,$1,make_str("."),$3);
+}
+;
 
-LockStmt:  LOCK_P opt_table qualified_name_list opt_lock opt_nowait
-                       { $$ = cat_str(5, make_str("lock"), $2, $3, $4, $5); }
-               ;
 
-opt_lock:  IN_P lock_type MODE
-                       { $$ = cat_str(3, make_str("in"), $2, make_str("mode")); }
-               | /*EMPTY*/
-                       { $$ = EMPTY;}
-               ;
+ TruncateStmt:
+ TRUNCATE opt_table qualified_name_list opt_restart_seqs opt_drop_behavior
+ { 
+ $$ = cat_str(5,make_str("truncate"),$2,$3,$4,$5);
+}
+;
 
-lock_type:     ACCESS SHARE            { $$ = make_str("access share"); }
-               | ROW SHARE                             { $$ = make_str("access share"); }
-               | ROW EXCLUSIVE                 { $$ = make_str("row exclusive"); }
-               | SHARE UPDATE EXCLUSIVE { $$ = make_str("share update exclusive"); }
-               | SHARE                                 { $$ = make_str("share"); }
-               | SHARE ROW EXCLUSIVE   { $$ = make_str("share row exclusive"); }
-               | EXCLUSIVE                             { $$ = make_str("exclusive"); }
-               | ACCESS EXCLUSIVE              { $$ = make_str("access exclusive"); }
-               ;
 
-opt_nowait:    NOWAIT                   { $$ = make_str("nowait"); }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
+ opt_restart_seqs:
+ CONTINUE_P IDENTITY_P
+ { 
+ $$ = make_str("continue identity");
+}
+|  RESTART IDENTITY_P
+ { 
+ $$ = make_str("restart identity");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             UpdateStmt (UPDATE)
- *
- *****************************************************************************/
-
-UpdateStmt:  UPDATE relation_expr_opt_alias
-                               SET set_clause_list
-                               from_clause
-                               where_or_current_clause
-                               returning_clause
-                       {$$ = cat_str(7, make_str("update"), $2, make_str("set"), $4, $5, $6, $7); }
-               ;
 
-set_clause_list:
-               set_clause                              { $$ = $1; }
-               | set_clause_list ',' set_clause        { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ CommentStmt:
+ COMMENT ON comment_type any_name IS comment_text
+ { 
+ $$ = cat_str(5,make_str("comment on"),$3,$4,make_str("is"),$6);
+}
+|  COMMENT ON AGGREGATE func_name aggr_args IS comment_text
+ { 
+ $$ = cat_str(5,make_str("comment on aggregate"),$4,$5,make_str("is"),$7);
+}
+|  COMMENT ON FUNCTION func_name func_args IS comment_text
+ { 
+ $$ = cat_str(5,make_str("comment on function"),$4,$5,make_str("is"),$7);
+}
+|  COMMENT ON OPERATOR any_operator oper_argtypes IS comment_text
+ { 
+ $$ = cat_str(5,make_str("comment on operator"),$4,$5,make_str("is"),$7);
+}
+|  COMMENT ON CONSTRAINT name ON any_name IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on constraint"),$4,make_str("on"),$6,make_str("is"),$8);
+}
+|  COMMENT ON RULE name ON any_name IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on rule"),$4,make_str("on"),$6,make_str("is"),$8);
+}
+|  COMMENT ON RULE name IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on rule"),$4,make_str("is"),$6);
+}
+|  COMMENT 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 OPERATOR CLASS any_name USING access_method IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on operator class"),$5,make_str("using"),$7,make_str("is"),$9);
+}
+|  COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on operator family"),$5,make_str("using"),$7,make_str("is"),$9);
+}
+|  COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on large object"),$5,make_str("is"),$7);
+}
+|  COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on cast ("),$5,make_str("as"),$7,make_str(") is"),$10);
+}
+|  COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
+ { 
+ $$ = cat_str(6,make_str("comment on"),$3,make_str("language"),$5,make_str("is"),$7);
+}
+|  COMMENT ON TEXT_P SEARCH PARSER any_name IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on text search parser"),$6,make_str("is"),$8);
+}
+|  COMMENT ON TEXT_P SEARCH DICTIONARY any_name IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on text search dictionary"),$6,make_str("is"),$8);
+}
+|  COMMENT ON TEXT_P SEARCH TEMPLATE any_name IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on text search template"),$6,make_str("is"),$8);
+}
+|  COMMENT ON TEXT_P SEARCH CONFIGURATION any_name IS comment_text
+ { 
+ $$ = cat_str(4,make_str("comment on text search configuration"),$6,make_str("is"),$8);
+}
+;
 
-set_clause:
-               single_set_clause               { $$ = $1; }
-               | multiple_set_clause           { $$ = $1; }
-               ;
 
-single_set_clause:
-               set_target '=' ctext_expr       { $$ = cat_str(3, $1, make_str("="), $3); };
+ comment_type:
+ COLUMN
+ { 
+ $$ = make_str("column");
+}
+|  DATABASE
+ { 
+ $$ = make_str("database");
+}
+|  SCHEMA
+ { 
+ $$ = make_str("schema");
+}
+|  INDEX
+ { 
+ $$ = make_str("index");
+}
+|  SEQUENCE
+ { 
+ $$ = make_str("sequence");
+}
+|  TABLE
+ { 
+ $$ = make_str("table");
+}
+|  DOMAIN_P
+ { 
+ $$ = make_str("domain");
+}
+|  TYPE_P
+ { 
+ $$ = make_str("type");
+}
+|  VIEW
+ { 
+ $$ = make_str("view");
+}
+|  CONVERSION_P
+ { 
+ $$ = make_str("conversion");
+}
+|  TABLESPACE
+ { 
+ $$ = make_str("tablespace");
+}
+|  ROLE
+ { 
+ $$ = make_str("role");
+}
+;
 
-multiple_set_clause:
-               '(' set_target_list ')' '=' ctext_row   { $$ = cat_str(4, make_str("("), $2, make_str(")="), $5); };
 
-set_target:
-               ColId opt_indirection           { $$ = cat2_str($1, $2); };
+ comment_text:
+ ecpg_sconst
+ { 
+ $$ = $1;
+}
+|  NULL_P
+ { 
+ $$ = make_str("null");
+}
+;
 
-set_target_list:
-               set_target                              { $$ = $1; }
-               | set_target_list ',' set_target        { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             CURSOR STATEMENTS
- *
- *****************************************************************************/
-DeclareCursorStmt:  DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
+ FetchStmt:
+ FETCH fetch_direction from_in name
+       {
+               add_additional_variables($4, false);
+               $$ = cat_str(4, make_str("fetch"), $2, $3, $4);
+       }
+|  FETCH name
+       {
+               add_additional_variables($2, false);
+               $$ = cat_str(2, make_str("fetch"), $2);
+       }
+|  MOVE fetch_direction from_in name
+ { 
+ $$ = cat_str(4,make_str("move"),$2,$3,$4);
+}
+|  MOVE name
+ { 
+ $$ = cat_str(2,make_str("move"),$2);
+}
+       | FETCH fetch_direction from_in name ecpg_into
                {
-                       struct cursor *ptr, *this;
+                       add_additional_variables($4, false);
+                       $$ = cat_str(4, make_str("fetch"), $2, $3, $4);
+               }
+       | FETCH fetch_direction name ecpg_into
+               {
+                       add_additional_variables($3, false);
+                       $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3);
+               }
+       | FETCH from_in name ecpg_into
+               {
+                       add_additional_variables($3, false);
+                       $$ = cat_str(3, make_str("fetch"), $2, $3);
+               }
+       | FETCH name ecpg_into
+               {
+                       add_additional_variables($2, false);
+                       $$ = cat2_str(make_str("fetch"), $2);
+               }
+       | FETCH fetch_direction name
+               {
+                       add_additional_variables($3, false);
+                       $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3);
+               }
+       | FETCH from_in name
+               {
+                       add_additional_variables($3, false);
+                       $$ = cat_str(3, make_str("fetch"), $2, $3);
+               }
+;
 
-                       for (ptr = cur; ptr != NULL; ptr = ptr->next)
-                       {
-                               if (strcmp($2, ptr->name) == 0)
-                                       /* re-definition is a bug */
-                                       mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" already defined", $2);
-                       }
 
-                       this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ fetch_direction:
+ NEXT
+ { 
+ $$ = make_str("next");
+}
+|  PRIOR
+ { 
+ $$ = make_str("prior");
+}
+|  FIRST_P
+ { 
+ $$ = make_str("first");
+}
+|  LAST_P
+ { 
+ $$ = make_str("last");
+}
+|  ABSOLUTE_P SignedIconst
+ { 
+               if ($2[1] == '$')
+               {
+                       free($2);
+                       $2 = make_str("$0");
+               }
 
-                       /* initial definition */
-                       this->next = cur;
-                       this->name = $2;
-                       this->connection = connection;
-                       this->opened = false;
-                       this->command =  cat_str(7, make_str("declare"), mm_strdup($2), $3, make_str("cursor"), $5, make_str("for"), $7);
-                       this->argsinsert = argsinsert;
-                       this->argsresult = argsresult;
-                       argsinsert = argsresult = NULL;
-                       cur = this;
+ $$ = cat_str(2,make_str("absolute"),$2);
+}
+|  RELATIVE_P SignedIconst
+ { 
+               if ($2[1] == '$')
+               {
+                       free($2);
+                       $2 = make_str("$0");
+               }
 
-                       if (INFORMIX_MODE)
-                               $$ = cat_str(5, adjust_informix(this->argsinsert), adjust_informix(this->argsresult), make_str("/*"), mm_strdup(this->command), make_str("*/"));
-                       else
-                               $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/"));
+ $$ = cat_str(2,make_str("relative"),$2);
+}
+|  SignedIconst
+ { 
+               if ($1[1] == '$')
+               {
+                       free($1);
+                       $1 = make_str("$0");
                }
-               ;
 
-cursor_options:  /* EMPTY */           { $$ = EMPTY; }
-               | cursor_options BINARY         { $$ = cat2_str($1, make_str("binary")); }
-               | cursor_options INSENSITIVE    { $$ = cat2_str($1, make_str("insensitive")); }
-               | cursor_options SCROLL         { $$ = cat2_str($1, make_str("scroll")); }
-               | cursor_options NO SCROLL      { $$ = cat2_str($1, make_str("no scroll")); }
-               ;
+ $$ = $1;
+}
+|  ALL
+ { 
+ $$ = make_str("all");
+}
+|  FORWARD
+ { 
+ $$ = make_str("forward");
+}
+|  FORWARD SignedIconst
+ { 
+               if ($2[1] == '$')
+               {
+                       free($2);
+                       $2 = make_str("$0");
+               }
 
-opt_hold:      /* EMPTY */
+ $$ = cat_str(2,make_str("forward"),$2);
+}
+|  FORWARD ALL
+ { 
+ $$ = make_str("forward all");
+}
+|  BACKWARD
+ { 
+ $$ = make_str("backward");
+}
+|  BACKWARD SignedIconst
+ { 
+               if ($2[1] == '$')
                {
-                       if (compat == ECPG_COMPAT_INFORMIX_SE && autocommit == true)
-                               $$ = make_str("with hold");
-                       else
-                                $$ = EMPTY;
+                       free($2);
+                       $2 = make_str("$0");
                }
-               | WITH HOLD                     { $$ = make_str("with hold"); }
-               | WITHOUT HOLD                  { $$ = make_str("without hold"); }
-               ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *                             SELECT STATEMENTS
- *
- *****************************************************************************/
+ $$ = cat_str(2,make_str("backward"),$2);
+}
+|  BACKWARD ALL
+ { 
+ $$ = make_str("backward all");
+}
+;
 
-SelectStmt: select_no_parens           %prec UMINUS
-                       { $$ = $1; }
-               |       select_with_parens              %prec UMINUS
-                       { $$ = $1; }
-               ;
 
-select_with_parens: '(' select_no_parens ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | '(' select_with_parens ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               ;
+ from_in:
+ FROM
+ { 
+ $$ = make_str("from");
+}
+|  IN_P
+ { 
+ $$ = make_str("in");
+}
+;
 
-select_no_parens:         simple_select
-                       { $$ = $1; }
-               | select_clause sort_clause
-                       { $$ = cat2_str($1, $2); }
-               | select_clause opt_sort_clause for_locking_clause opt_select_limit
-                       { $$ = cat_str(4, $1, $2, $3, $4); }
-               | select_clause opt_sort_clause select_limit opt_for_locking_clause
-                       { $$ = cat_str(4, $1, $2, $3, $4); }
-               | with_clause simple_select
-                       { $$ = cat2_str($1, $2); }
-               | with_clause select_clause sort_clause
-                       { $$ = cat_str(3, $1, $2, $3); }
-               | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
-                       { $$ = cat_str(5, $1, $2, $3, $4, $5); }
-               | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
-                       { $$ = cat_str(5, $1, $2, $3, $4, $5); }
-               ;
 
-select_clause: simple_select           { $$ = $1; }
-               | select_with_parens            { $$ = $1; }
-               ;
+ GrantStmt:
+ GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option
+ { 
+ $$ = cat_str(7,make_str("grant"),$2,make_str("on"),$4,make_str("to"),$6,$7);
+}
+;
 
-simple_select: SELECT opt_distinct target_list
-                                       into_clause from_clause where_clause
-                                       group_clause having_clause
-                       { $$ = cat_str(8, make_str("select"), $2, $3, $4, $5, $6, $7, $8); }
-               | values_clause
-                       { $$ = $1; }
-               | select_clause UNION opt_all select_clause
-                       { $$ = cat_str(4, $1, make_str("union"), $3, $4); }
-               | select_clause INTERSECT opt_all select_clause
-                       { $$ = cat_str(4, $1, make_str("intersect"), $3, $4); }
-               | select_clause EXCEPT opt_all select_clause
-                       { $$ = cat_str(4, $1, make_str("except"), $3, $4); }
-               ;
 
-with_clause:
-               WITH cte_list                   { $$ = cat2_str(make_str("with"), $2); }
-               | WITH RECURSIVE cte_list       { $$ = cat2_str(make_str("with recursive"), $3); }
-               ;
+ RevokeStmt:
+ REVOKE privileges ON privilege_target FROM grantee_list opt_drop_behavior
+ { 
+ $$ = cat_str(7,make_str("revoke"),$2,make_str("on"),$4,make_str("from"),$6,$7);
+}
+|  REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_drop_behavior
+ { 
+ $$ = cat_str(7,make_str("revoke grant option for"),$5,make_str("on"),$7,make_str("from"),$9,$10);
+}
+;
 
-cte_list:
-               common_table_expr                       { $$ = $1; }
-               | cte_list ',' common_table_expr        { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
+ privileges:
+ privilege_list
+ { 
+ $$ = $1;
+}
+|  ALL
+ { 
+ $$ = make_str("all");
+}
+|  ALL PRIVILEGES
+ { 
+ $$ = make_str("all privileges");
+}
+;
 
-common_table_expr:  name opt_name_list AS select_with_parens
-                       { $$ = cat_str(4, $1, $2, make_str("as"), $4); }
-               ;
 
-into_clause:  INTO OptTempTableName
-               {
-                       FoundInto = 1;
-                       $$= cat2_str(make_str("into"), $2);
-               }
-               | ecpg_into                     { $$ = EMPTY; }
-               | /*EMPTY*/                     { $$ = EMPTY; }
-               ;
+ privilege_list:
+ privilege
+ { 
+ $$ = $1;
+}
+|  privilege_list ',' privilege
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-/*
- * Redundancy here is needed to avoid shift/reduce conflicts,
- * since TEMP is not a reserved word.  See also OptTemp.
- *
- * The result is a cons cell (not a true list!) containing
- * a boolean and a table name.
- */
-OptTempTableName:  TEMPORARY opt_table qualified_name
-                       { $$ = cat_str(3, make_str("temporary"), $2, $3); }
-               | TEMP opt_table qualified_name
-                       { $$ = cat_str(3, make_str("temp"), $2, $3); }
-               | LOCAL TEMPORARY opt_table qualified_name
-                       { $$ = cat_str(3, make_str("local temporary"), $3, $4); }
-               | LOCAL TEMP opt_table qualified_name
-                       { $$ = cat_str(3, make_str("local temp"), $3, $4); }
-               | GLOBAL TEMPORARY opt_table qualified_name
-                       { $$ = cat_str(3, make_str("global temporary"), $3, $4); }
-               | GLOBAL TEMP opt_table qualified_name
-                       { $$ = cat_str(3, make_str("global temp"), $3, $4); }
-               | TABLE qualified_name
-                       { $$ = cat2_str(make_str("table"), $2); }
-               | qualified_name
-                       { $$ = $1; }
-               ;
 
-opt_table:     TABLE                           { $$ = make_str("table"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
+ privilege:
+ SELECT
+ { 
+ $$ = make_str("select");
+}
+|  REFERENCES
+ { 
+ $$ = make_str("references");
+}
+|  CREATE
+ { 
+ $$ = make_str("create");
+}
+|  ColId
+ { 
+ $$ = $1;
+}
+;
 
-opt_all:  ALL                                  { $$ = make_str("all"); }
-               | /*EMPTY*/                             { $$ = EMPTY; }
-               ;
 
-opt_distinct:  DISTINCT
-                       { $$ = make_str("distinct"); }
-               | DISTINCT ON '(' expr_list ')'
-                       { $$ = cat_str(3, make_str("distinct on ("), $4, make_str(")")); }
-               | ALL
-                       { $$ = make_str("all"); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
+ privilege_target:
+ qualified_name_list
+ { 
+ $$ = $1;
+}
+|  TABLE qualified_name_list
+ { 
+ $$ = cat_str(2,make_str("table"),$2);
+}
+|  SEQUENCE qualified_name_list
+ { 
+ $$ = cat_str(2,make_str("sequence"),$2);
+}
+|  FUNCTION function_with_argtypes_list
+ { 
+ $$ = cat_str(2,make_str("function"),$2);
+}
+|  DATABASE name_list
+ { 
+ $$ = cat_str(2,make_str("database"),$2);
+}
+|  LANGUAGE name_list
+ { 
+ $$ = cat_str(2,make_str("language"),$2);
+}
+|  SCHEMA name_list
+ { 
+ $$ = cat_str(2,make_str("schema"),$2);
+}
+|  TABLESPACE name_list
+ { 
+ $$ = cat_str(2,make_str("tablespace"),$2);
+}
+;
 
-opt_sort_clause:       sort_clause     { $$ = $1; }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
 
-sort_clause:  ORDER BY sortby_list
-                       { $$ = cat2_str(make_str("order by"), $3); }
-               ;
+ grantee_list:
+ grantee
+ { 
+ $$ = $1;
+}
+|  grantee_list ',' grantee
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-sortby_list:  sortby                                   { $$ = $1; }
-               | sortby_list ',' sortby                { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
 
-sortby: a_expr USING qual_all_Op opt_nulls_order
-                       { $$ = cat_str(4, $1, make_str("using"), $3, $4); }
-               | a_expr opt_asc_desc opt_nulls_order
-                       { $$ = cat_str(3, $1, $2, $3); }
-               ;
+ grantee:
+ RoleId
+ { 
+ $$ = $1;
+}
+|  GROUP_P RoleId
+ { 
+ $$ = cat_str(2,make_str("group"),$2);
+}
+;
 
-select_limit:  LIMIT select_limit_value OFFSET select_offset_value
-                  { $$ = cat_str(4, make_str("limit"), $2, make_str("offset"), $4); }
-               | OFFSET select_offset_value LIMIT select_limit_value
-                  { $$ = cat_str(4, make_str("offset"), $2, make_str("limit"), $4); }
-               | LIMIT select_limit_value
-                  { $$ = cat2_str(make_str("limit"), $2); }
-               | OFFSET select_offset_value
-                  { $$ = cat2_str(make_str("offset"), $2); }
-               | LIMIT select_limit_value ',' select_offset_value
-                  {
-                       mmerror(PARSE_ERROR, ET_WARNING, "no longer supported LIMIT #,# syntax passed to backend");
-                       $$ = cat_str(4, make_str("limit"), $2, make_str(","), $4);
-                  }
-               ;
 
-opt_select_limit:      select_limit    { $$ = $1; }
-               | /*EMPTY*/                                     { $$ = EMPTY; }
-               ;
+ opt_grant_grant_option:
+ WITH GRANT OPTION
+ { 
+ $$ = make_str("with grant option");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-select_limit_value: a_expr     { $$ = $1; }
-               | ALL           { $$ = make_str("all"); }
-               ;
 
-select_offset_value: a_expr { $$ = $1; }
-               ;
+ function_with_argtypes_list:
+ function_with_argtypes
+ { 
+ $$ = $1;
+}
+|  function_with_argtypes_list ',' function_with_argtypes
+ { 
+ $$ = cat_str(3,$1,make_str(","),$3);
+}
+;
 
-/*
- *     jimmy bell-style recursive queries aren't supported in the
- *     current system.
- *
- *     ...however, recursive addattr and rename supported.  make special
- *     cases for these.
- */
-group_clause:  GROUP_P BY expr_list
-                       { $$ = cat2_str(make_str("group by"), $3); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
 
-having_clause: HAVING a_expr
-                       { $$ = cat2_str(make_str("having"), $2); }
-               | /*EMPTY*/
-                       { $$ = EMPTY; }
-               ;
+ function_with_argtypes:
+ func_name func_args
+ { 
+ $$ = cat_str(2,$1,$2);
+}
+;
 
-for_locking_clause:
-               for_locking_items       { $$ = $1; }
-               | FOR READ ONLY         { $$ = make_str("for read only");}
-               ;
 
-opt_for_locking_clause:        
-               for_locking_clause      { $$ = $1; }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
+ GrantRoleStmt:
+ GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
+ { 
+ $$ = cat_str(6,make_str("grant"),$2,make_str("to"),$4,$5,$6);
+}
+;
 
-for_locking_items:
-               for_locking_item                        { $$ = $1; }
-               | for_locking_items for_locking_item    { $$ = cat2_str($1, $2); }
-               ;
 
-for_locking_item:
-               FOR UPDATE locked_rels_list opt_nowait
-                       { $$ = cat_str(3, make_str("for update"), $3, $4); }
-               | FOR SHARE locked_rels_list opt_nowait
-                       { $$ = cat_str(3, make_str("for share"), $3, $4); }
-               ;
+ RevokeRoleStmt:
+ REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
+ { 
+ $$ = cat_str(6,make_str("revoke"),$2,make_str("from"),$4,$5,$6);
+}
+|  REVOKE ADMIN OPTION FOR privilege_list FROM name_list opt_granted_by opt_drop_behavior
+ { 
+ $$ = cat_str(6,make_str("revoke admin option for"),$5,make_str("from"),$7,$8,$9);
+}
+;
 
-locked_rels_list:
-               OF qualified_name_list  { $$ = cat2_str(make_str("of"), $2); }
-               | /* EMPTY */           { $$ = EMPTY; }
-               ;
 
-values_clause:  VALUES ctext_row
-                       { $$ = cat2_str(make_str("values"), $2); }
-               | values_clause ',' ctext_row
-                       { $$ = cat_str(3, $1, make_str(","), $3); }
-               ;
+ opt_grant_admin_option:
+ WITH ADMIN OPTION
+ { 
+ $$ = make_str("with admin option");
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-/*****************************************************************************
- *
- *     clauses common to all Optimizable Stmts:
- *             from_clause - allow list of both JOIN expressions and table names
- *             where_clause    - qualifications for joins or restrictions
- *
- *****************************************************************************/
 
-from_clause:   FROM from_list          { $$ = cat2_str(make_str("from"), $2); }
-               | /* EMPTY */                           { $$ = EMPTY; }
-               ;
+ opt_granted_by:
+ GRANTED BY RoleId
+ { 
+ $$ = cat_str(2,make_str("granted by"),$3);
+}
+| 
+ { 
+ $$=EMPTY; }
+;
 
-from_list:     from_list ',' table_ref { $$ = cat_str(3, $1, make_str(","), $3); }
-               | table_ref                                     { $$ = $1; }
-               ;
 
-/*
- * table_ref is where an alias clause can be attached. Note we cannot make
- * alias_clause have an empty production because that causes parse conflicts
- * between table_ref := '(' joined_table ')' alias_clause
- * and joined_table := '(' joined_table ')'.  So, we must have the
- * redundant-looking productions here instead.
- */
-table_ref:     relation_expr
-                       { $$ = $1; }
-               | relation_expr alias_clause
-                       { $$ = cat2_str($1, $2); }
-               | func_table
-                       { $$ = $1; }
-               | func_table alias_clause
-                       { $$ = 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");
-                               $$ = $1;
-                       }
-               | select_with_parens alias_clause
-                       { $$ = cat2_str($1, $2); }
-               | joined_table
-                       { $$ = $1; }
-               | '(' joined_table ')' alias_clause
-                       { $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); }
-               ;
+ IndexStmt:
+ CREATE index_opt_unique INDEX index_name ON qualified_name access_method_clause '(' index_params ')' opt_definition OptTableSpace where_clause
+ { 
+ $$ = cat_str(13,make_str("create"),$2,make_str("index"),$4,make_str("on"),$6,$7,make_str("("),$9,make_str(")"),$11,$12,$13);
+}
+|  CREATE index_opt_unique INDEX CONCURRENTLY index_name ON qualified_name access_method_clause '(' index_params ')' opt_definition OptTableSpace where_clause
+ { 
+ $$ = cat_str(13,make_str("create"),$2,make_str("index concurrently"),$5,make_str("on"),$7,$8,make_str("("),$10,make_str(")"),$12,$13,$14);
+}
+;
 
-/*
- * It may seem silly to separate joined_table from table_ref, but there is
- * method in SQL92's madness: if you don't do it this way you get reduce-
- * reduce conflicts, because it's not clear to the parser generator whether
- * to expect alias_clause after ')' or not.  For the same reason we must
- * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
- * join_type to expand to empty; if we try it, the parser generator can't
- * figure out when to reduce an empty join_type right after table_ref.
- *
- * Note that a CROSS JOIN is the same as an unqualified
- * INNER JOIN, and an INNER JOIN/ON has the same shape
- * but a qualification expression to limit membership.
- * A NATURAL JOIN implicitly matches column names between
- * tables and the shape is determined by which columns are
- * in common. We'll collect columns during the later transformations.
- */
 
-joined_table:  '(' joined_table ')'
-                       { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-               | table_ref CROSS JOIN table_ref
-                       { $$ = cat_str(3, $1, make_str("cross join"), $4); }
-               | table_ref join_type JOIN table_ref join_qual
-                       { $$ = cat_str(5, $1, $2, make_str("join"), $4, $5); }
-               | table_ref JOIN table_ref join_qual
-                   &nb