eviscerate-parser.patch

application/octet-stream

Filename: eviscerate-parser.patch
Type: application/octet-stream
Part: 0
Message: eviscerating the parser

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/parser/gram.y 78 8004
src/include/parser/kwlist.h 0 182
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 1d39674..fa6612d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -109,15 +109,12 @@ static Node *makeIntConst(int val, int location);
 static Node *makeFloatConst(char *str, int location);
 static Node *makeBitStringConst(char *str, int location);
 static Node *makeNullAConst(int location);
-static Node *makeAConst(Value *v, int location);
 static Node *makeBoolAConst(bool state, int location);
 static FuncCall *makeOverlaps(List *largs, List *rargs,
 							  int location, core_yyscan_t yyscanner);
 static void check_qualified_name(List *names, core_yyscan_t yyscanner);
 static List *check_func_name(List *names, core_yyscan_t yyscanner);
 static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
-static List *extractArgTypes(List *parameters);
-static SelectStmt *findLeftmostSelect(SelectStmt *node);
 static void insertSelectOptions(SelectStmt *stmt,
 								List *sortClause, List *lockingClause,
 								Node *limitOffset, Node *limitCount,
@@ -129,12 +126,6 @@ static void doNegateFloat(Value *v);
 static Node *makeAArrayExpr(List *elements, int location);
 static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args,
 						 List *args, int location);
-static List *mergeTableFuncParameters(List *func_args, List *columns);
-static TypeName *TableFuncTypeName(List *columns);
-static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner);
-static void SplitColQualList(List *qualList,
-							 List **constraintList, CollateClause **collClause,
-							 core_yyscan_t yyscanner);
 
 %}
 
@@ -184,148 +175,48 @@ static void SplitColQualList(List *qualList,
 	VariableSetStmt		*vsetstmt;
 }
 
-%type <node>	stmt schema_stmt
-		AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
-		AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
-		AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt
-		AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
-		AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt
-		AlterRoleStmt AlterRoleSetStmt
-		AlterDefaultPrivilegesStmt DefACLAction
-		AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
-		ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
-		CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
-		CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
-		CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
-		CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
-		CreateAssertStmt CreateTrigStmt
-		CreateUserStmt CreateUserMappingStmt CreateRoleStmt
-		CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
-		DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
-		DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
-		DropUserStmt DropdbStmt DropTableSpaceStmt DropFdwStmt
-		DropForeignServerStmt DropUserMappingStmt ExplainStmt FetchStmt
-		GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
-		LockStmt NotifyStmt ExplainableStmt PreparableStmt
-		CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
-		RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt
-		RuleActionStmt RuleActionStmtOrEmpty RuleStmt
-		SecLabelStmt SelectStmt TransactionStmt TruncateStmt
-		UnlistenStmt UpdateStmt VacuumStmt
-		VariableResetStmt VariableSetStmt VariableShowStmt
-		ViewStmt CheckPointStmt CreateConversionStmt
-		DeallocateStmt PrepareStmt ExecuteStmt
-		DropOwnedStmt ReassignOwnedStmt
-		AlterTSConfigurationStmt AlterTSDictionaryStmt
+%type <node>	stmt
+		DeleteStmt
+		InsertStmt
+		PreparableStmt
+		SelectStmt
+		UpdateStmt
 
 %type <node>	select_no_parens select_with_parens select_clause
 				simple_select values_clause
 
-%type <node>	alter_column_default opclass_item opclass_drop alter_using
-%type <ival>	add_drop opt_asc_desc opt_nulls_order
+%type <ival>	opt_asc_desc opt_nulls_order
 
-%type <node>	alter_table_cmd alter_type_cmd opt_collate_clause
-%type <list>	alter_table_cmds alter_type_cmds
+%type <node>	opt_collate_clause
 
-%type <dbehavior>	opt_drop_behavior
+%type <boolean>	opt_nowait
 
-%type <list>	createdb_opt_list alterdb_opt_list copy_opt_list
-				transaction_mode_list
-				create_extension_opt_list alter_extension_opt_list
-%type <defelt>	createdb_opt_item alterdb_opt_item copy_opt_item
-				transaction_mode_item
-				create_extension_opt_item alter_extension_opt_item
+%type <str>		attr_name
+				name cursor_name
 
-%type <ival>	opt_lock lock_type cast_context
-%type <ival>	vacuum_option_list vacuum_option_elem
-%type <boolean>	opt_force opt_or_replace
-				opt_grant_grant_option opt_grant_admin_option
-				opt_nowait opt_if_exists opt_with_data
+%type <list>	func_name qual_Op qual_all_Op subquery_Op
 
-%type <list>	OptRoleList AlterOptRoleList
-%type <defelt>	CreateOptRoleElem AlterOptRoleElem
-
-%type <str>		opt_type
-%type <str>		foreign_server_version opt_foreign_server_version
-%type <str>		auth_ident
-%type <str>		opt_in_database
-
-%type <str>		OptSchemaName
-%type <list>	OptSchemaEltList
-
-%type <boolean> TriggerForSpec TriggerForType
-%type <ival>	TriggerActionTime
-%type <list>	TriggerEvents TriggerOneEvent
-%type <value>	TriggerFuncArg
-%type <node>	TriggerWhen
-
-%type <str>		copy_file_name
-				database_name access_method_clause access_method attr_name
-				name cursor_name file_name
-				index_name opt_index_name cluster_index_specification
-
-%type <list>	func_name handler_name qual_Op qual_all_Op subquery_Op
-				opt_class opt_inline_handler opt_validator validator_clause
-				opt_collate
-
-%type <range>	qualified_name OptConstrFromTable
+%type <range>	qualified_name
 
 %type <str>		all_Op MathOp
 
-%type <str>		iso_level opt_encoding
-%type <node>	grantee
-%type <list>	grantee_list
-%type <accesspriv> privilege
-%type <list>	privileges privilege_list
-%type <privtarget> privilege_target
-%type <funwithargs> function_with_argtypes
-%type <list>	function_with_argtypes_list
-%type <ival>	defacl_privilege_target
-%type <defelt>	DefACLOption
-%type <list>	DefACLOptionList
-
 %type <list>	stmtblock stmtmulti
-				OptTableElementList TableElementList OptInherit definition
-				OptTypedTableElementList TypedTableElementList
-				OptForeignTableElementList ForeignTableElementList
-				reloptions opt_reloptions
-				OptWith opt_distinct opt_definition func_args func_args_list
-				func_args_with_defaults func_args_with_defaults_list
-				func_as createfunc_opt_list alterfunc_opt_list
-				aggr_args old_aggr_definition old_aggr_list
-				oper_argtypes RuleActionList RuleActionMulti
-				opt_column_list columnList opt_name_list
-				sort_clause opt_sort_clause sortby_list index_params
+				opt_distinct
+				opt_name_list
+				sort_clause opt_sort_clause sortby_list
 				name_list from_clause from_list opt_array_bounds
-				qualified_name_list any_name any_name_list
+				qualified_name_list any_name
 				any_operator expr_list attrs
 				target_list insert_column_list set_target_list
 				set_clause_list set_clause multiple_set_clause
-				ctext_expr_list ctext_row def_list indirection opt_indirection
-				reloption_list group_clause TriggerFuncArgs select_limit
-				opt_select_limit opclass_item_list opclass_drop_list
-				opclass_purpose opt_opfamily transaction_mode_list_or_empty
-				OptTableFuncElementList TableFuncElementList opt_type_modifiers
-				prep_type_clause
-				execute_param_clause using_clause returning_clause
-				opt_enum_val_list enum_val_list table_func_column_list
-				create_generic_options alter_generic_options
-				relation_expr_list dostmt_opt_list
-
-%type <list>	opt_fdw_options fdw_options
-%type <defelt>	fdw_option
+				ctext_expr_list ctext_row indirection opt_indirection
+				group_clause select_limit
+				opt_select_limit
+				TableFuncElementList opt_type_modifiers
+				using_clause returning_clause
 
 %type <range>	OptTempTableName
-%type <into>	into_clause create_as_target
-
-%type <defelt>	createfunc_opt_item common_func_opt_item dostmt_opt_item
-%type <fun_param> func_arg func_arg_with_default table_func_column
-%type <fun_param_mode> arg_class
-%type <typnam>	func_return func_type
-
-%type <boolean>  opt_trusted opt_restart_seqs
-%type <ival>	 OptTemp
-%type <oncommit> OnCommitOption
+%type <into>	into_clause
 
 %type <node>	for_locking_item
 %type <list>	for_locking_clause opt_for_locking_clause for_locking_items
@@ -340,69 +231,32 @@ static void SplitColQualList(List *qualList,
 %type <list>	opt_interval interval_second
 %type <node>	overlay_placing substr_from substr_for
 
-%type <boolean> opt_instead
-%type <boolean> opt_unique opt_concurrently opt_verbose opt_full
-%type <boolean> opt_freeze opt_default opt_recheck
-%type <defelt>	opt_binary opt_oids copy_delimiter
-
-%type <boolean> copy_from
-
-%type <ival>	opt_column event cursor_options opt_hold opt_set_data
-%type <objtype>	reindex_type drop_type comment_type security_label_type
-
-%type <node>	fetch_args limit_clause select_limit_value
+%type <node>	limit_clause select_limit_value
 				offset_clause select_offset_value
 				select_offset_value2 opt_select_fetch_first_value
 %type <ival>	row_or_rows first_or_next
 
-%type <list>	OptSeqOptList SeqOptList
-%type <defelt>	SeqOptElem
-
 %type <istmt>	insert_rest
 
-%type <vsetstmt> set_rest SetResetClause
-
-%type <node>	TableElement TypedTableElement ConstraintElem TableFuncElement
-				ForeignTableElement
-%type <node>	columnDef columnOptions
-%type <defelt>	def_elem reloption_elem old_aggr_elem
-%type <node>	def_arg columnElem where_clause where_or_current_clause
+%type <node>	TableFuncElement
+%type <node>	where_clause where_or_current_clause
 				a_expr b_expr c_expr func_expr AexprConst indirection_el
 				columnref in_expr having_clause func_table array_expr
-				ExclusionWhereClause
-%type <list>	ExclusionConstraintList ExclusionConstraintElem
 %type <list>	func_arg_list
 %type <node>	func_arg_expr
 %type <list>	row type_list array_expr_list
 %type <node>	case_expr case_arg when_clause case_default
 %type <list>	when_clause_list
 %type <ival>	sub_type
-%type <list>	OptCreateAs CreateAsList
-%type <node>	CreateAsElement ctext_expr
-%type <value>	NumericOnly
-%type <list>	NumericOnly_list
+%type <node>	ctext_expr
 %type <alias>	alias_clause
 %type <sortby>	sortby
-%type <ielem>	index_elem
 %type <node>	table_ref
 %type <jexpr>	joined_table
 %type <range>	relation_expr
 %type <range>	relation_expr_opt_alias
 %type <target>	target_el single_set_clause set_target insert_column_item
 
-%type <str>		generic_option_name
-%type <node>	generic_option_arg
-%type <defelt>	generic_option_elem alter_generic_option_elem
-%type <list>	generic_option_list alter_generic_option_list
-%type <str>		explain_option_name
-%type <node>	explain_option_arg
-%type <defelt>	explain_option_elem
-%type <list>	explain_option_list
-%type <node>	copy_generic_opt_arg copy_generic_opt_arg_list_item
-%type <defelt>	copy_generic_opt_elem
-%type <list>	copy_generic_opt_list copy_generic_opt_arg_list
-%type <list>	copy_options
-
 %type <typnam>	Typename SimpleTypename ConstTypename
 				GenericType Numeric opt_float
 				Character ConstCharacter
@@ -415,31 +269,12 @@ static void SplitColQualList(List *qualList,
 %type <boolean> opt_varying opt_timezone
 
 %type <ival>	Iconst SignedIconst
-%type <str>		Sconst comment_text notify_payload
-%type <str>		RoleId opt_granted_by opt_boolean_or_string ColId_or_Sconst
-%type <list>	var_list
-%type <str>		ColId ColLabel var_name type_function_name param_name
-%type <node>	var_value zone_value
+%type <str>		Sconst
+%type <str>		ColId ColLabel type_function_name param_name
 
 %type <keyword> unreserved_keyword type_func_name_keyword
 %type <keyword> col_name_keyword reserved_keyword
 
-%type <node>	TableConstraint TableLikeClause
-%type <ival>	TableLikeOptionList TableLikeOption
-%type <list>	ColQualList
-%type <node>	ColConstraint ColConstraintElem ConstraintAttr
-%type <ival>	key_actions key_delete key_match key_update key_action
-%type <ival>	ConstraintAttributeSpec ConstraintDeferrabilitySpec
-				ConstraintTimeSpec
-%type <str>		ExistingIndex
-
-%type <list>	constraints_set_list
-%type <boolean> constraints_set_mode
-%type <str>		OptTableSpace OptConsTableSpace OptTableSpaceOwner
-%type <list>	opt_check_option
-
-%type <str>		opt_provider security_label
-
 %type <target>	xml_attribute_el
 %type <list>	xml_attribute_list xml_attributes
 %type <node>	xml_root_version opt_xml_root_standalone
@@ -478,82 +313,75 @@ static void SplitColQualList(List *qualList,
  */
 
 /* 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 ATTRIBUTE AUTHORIZATION
+%token <keyword>
+	ALL ANALYSE ANALYZE AND ANY ARRAY AS ASC
+	ASYMMETRIC AT AUTHORIZATION
 
-	BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
+	BETWEEN BIGINT BINARY BIT
 	BOOLEAN_P BOTH BY
 
-	CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
-	CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
-	CLUSTER COALESCE COLLATE COLLATION COLUMN COMMENT COMMENTS COMMIT
-	COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
-	CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE
-	CROSS CSV CURRENT_P
+	CASE CAST CHAR_P
+	CHARACTER CHECK
+	COALESCE COLLATE COLUMN
+	CONCURRENTLY CONSTRAINT
+	CONTENT_P CREATE
+	CROSS CURRENT_P
 	CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
-	CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
+	CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR
 
-	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
+	DAY_P DEC DECIMAL_P DEFAULT
+	DEFERRABLE DELETE_P DELIMITER DELIMITERS DESC
+	DISTINCT DO DOCUMENT_P DOUBLE_P
 
-	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT
-	EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
-	EXTENSION EXTERNAL EXTRACT
+	ELSE END_P ESCAPE EXCEPT
+	EXISTS
+	EXTRACT
 
-	FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOLLOWING FOR FORCE FOREIGN FORWARD
-	FREEZE FROM FULL FUNCTION FUNCTIONS
+	FALSE_P FETCH FIRST_P FLOAT_P FOLLOWING FOR FOREIGN
+	FREEZE FROM FULL
 
-	GLOBAL GRANT GRANTED GREATEST GROUP_P
+	GLOBAL GRANT GREATEST GROUP_P
 
-	HANDLER HAVING HEADER_P HOLD HOUR_P
+	HAVING HOUR_P
 
-	IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P
-	INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
-	INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
-	INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
+	ILIKE IN_P
+	INITIALLY
+	INNER_P INOUT INSERT INT_P INTEGER
+	INTERSECT INTERVAL INTO IS ISNULL
 
 	JOIN
 
-	KEY
-
-	LABEL LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING
-	LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP
-	LOCATION LOCK_P
+	LAST_P LEADING
+	LEAST LEFT LIKE LIMIT LISTEN LOCAL LOCALTIME LOCALTIMESTAMP
 
-	MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
+	MINUTE_P MONTH_P
 
-	NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NO NONE
-	NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
+	NAME_P NATIONAL NATURAL NCHAR NEXT NO NONE
+	NOT NOTNULL NOWAIT NULL_P NULLIF
 	NULLS_P NUMERIC
 
-	OBJECT_P OF OFF OFFSET OIDS ON ONLY OPERATOR OPTION OPTIONS OR
-	ORDER OUT_P OUTER_P OVER OVERLAPS OVERLAY OWNED OWNER
-
-	PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POSITION
-	PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
-	PRIOR PRIVILEGES PROCEDURAL PROCEDURE
+	OF OFFSET ON ONLY OPERATOR OR
+	ORDER OUT_P OUTER_P OVER OVERLAPS OVERLAY
 
-	QUOTE
+	PARTITION PASSING PLACING POSITION
+	PRECEDING PRECISION PRESERVE PRIMARY
 
-	RANGE READ REAL REASSIGN RECHECK RECURSIVE REF REFERENCES REINDEX
-	RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
-	RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK
-	ROW ROWS RULE
+	RANGE READ REAL RECURSIVE REF REFERENCES
+	RETURNING RIGHT
+	ROW ROWS
 
-	SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
-	SERIALIZABLE SERVER 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
-	SYMMETRIC SYSID SYSTEM_P
+	SECOND_P SELECT
+	SESSION_USER SET SETOF SHARE
+	SIMILAR SMALLINT SOME STANDALONE_P
+	STRIP_P SUBSTRING
+	SYMMETRIC
 
-	TABLE TABLES TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP
-	TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
-	TRUNCATE TRUSTED TYPE_P
+	TABLE TEMP TEMPORARY TEXT_P THEN TIME TIMESTAMP
+	TO TRAILING TREAT TRIM TRUE_P
+	TYPE_P
 
-	UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNLOGGED
-	UNTIL UPDATE USER USING
+	UNBOUNDED UNION UNIQUE UNKNOWN UNLOGGED
+	UPDATE USER USING
 
 	VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
 	VERBOSE VERSION_P VIEW VOLATILE
@@ -667,1342 +495,14 @@ stmtmulti:	stmtmulti ';' stmt
 		;
 
 stmt :
-			AlterDatabaseStmt
-			| AlterDatabaseSetStmt
-			| AlterDefaultPrivilegesStmt
-			| AlterDomainStmt
-			| AlterEnumStmt
-			| AlterExtensionStmt
-			| AlterExtensionContentsStmt
-			| AlterFdwStmt
-			| AlterForeignServerStmt
-			| AlterForeignTableStmt
-			| AlterFunctionStmt
-			| AlterGroupStmt
-			| AlterObjectSchemaStmt
-			| AlterOwnerStmt
-			| AlterSeqStmt
-			| AlterTableStmt
-			| AlterCompositeTypeStmt
-			| AlterRoleSetStmt
-			| AlterRoleStmt
-			| AlterTSConfigurationStmt
-			| AlterTSDictionaryStmt
-			| AlterUserMappingStmt
-			| AlterUserSetStmt
-			| AlterUserStmt
-			| AnalyzeStmt
-			| CheckPointStmt
-			| ClosePortalStmt
-			| ClusterStmt
-			| CommentStmt
-			| ConstraintsSetStmt
-			| CopyStmt
-			| CreateAsStmt
-			| CreateAssertStmt
-			| CreateCastStmt
-			| CreateConversionStmt
-			| CreateDomainStmt
-			| CreateExtensionStmt
-			| CreateFdwStmt
-			| CreateForeignServerStmt
-			| CreateForeignTableStmt
-			| CreateFunctionStmt
-			| CreateGroupStmt
-			| CreateOpClassStmt
-			| CreateOpFamilyStmt
-			| AlterOpFamilyStmt
-			| CreatePLangStmt
-			| CreateSchemaStmt
-			| CreateSeqStmt
-			| CreateStmt
-			| CreateTableSpaceStmt
-			| CreateTrigStmt
-			| CreateRoleStmt
-			| CreateUserStmt
-			| CreateUserMappingStmt
-			| CreatedbStmt
-			| DeallocateStmt
-			| DeclareCursorStmt
-			| DefineStmt
-			| DeleteStmt
-			| DiscardStmt
-			| DoStmt
-			| DropAssertStmt
-			| DropCastStmt
-			| DropFdwStmt
-			| DropForeignServerStmt
-			| DropGroupStmt
-			| DropOpClassStmt
-			| DropOpFamilyStmt
-			| DropOwnedStmt
-			| DropPLangStmt
-			| DropRuleStmt
-			| DropStmt
-			| DropTableSpaceStmt
-			| DropTrigStmt
-			| DropRoleStmt
-			| DropUserStmt
-			| DropUserMappingStmt
-			| DropdbStmt
-			| ExecuteStmt
-			| ExplainStmt
-			| FetchStmt
-			| GrantStmt
-			| GrantRoleStmt
-			| IndexStmt
+			DeleteStmt
 			| InsertStmt
-			| ListenStmt
-			| LoadStmt
-			| LockStmt
-			| NotifyStmt
-			| PrepareStmt
-			| ReassignOwnedStmt
-			| ReindexStmt
-			| RemoveAggrStmt
-			| RemoveFuncStmt
-			| RemoveOperStmt
-			| RenameStmt
-			| RevokeStmt
-			| RevokeRoleStmt
-			| RuleStmt
-			| SecLabelStmt
 			| SelectStmt
-			| TransactionStmt
-			| TruncateStmt
-			| UnlistenStmt
 			| UpdateStmt
-			| VacuumStmt
-			| VariableResetStmt
-			| VariableSetStmt
-			| VariableShowStmt
-			| ViewStmt
 			| /*EMPTY*/
 				{ $$ = NULL; }
 		;
 
-/*****************************************************************************
- *
- * Create a new Postgres DBMS role
- *
- *****************************************************************************/
-
-CreateRoleStmt:
-			CREATE ROLE RoleId opt_with OptRoleList
-				{
-					CreateRoleStmt *n = makeNode(CreateRoleStmt);
-					n->stmt_type = ROLESTMT_ROLE;
-					n->role = $3;
-					n->options = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-
-opt_with:	WITH									{}
-			| /*EMPTY*/								{}
-		;
-
-/*
- * 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:
-			OptRoleList CreateOptRoleElem			{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-AlterOptRoleList:
-			AlterOptRoleList AlterOptRoleElem		{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-AlterOptRoleElem:
-			PASSWORD Sconst
-				{
-					$$ = makeDefElem("password",
-									 (Node *)makeString($2));
-				}
-			| PASSWORD NULL_P
-				{
-					$$ = makeDefElem("password", NULL);
-				}
-			| ENCRYPTED PASSWORD Sconst
-				{
-					$$ = makeDefElem("encryptedPassword",
-									 (Node *)makeString($3));
-				}
-			| UNENCRYPTED PASSWORD Sconst
-				{
-					$$ = makeDefElem("unencryptedPassword",
-									 (Node *)makeString($3));
-				}
-			| INHERIT
-				{
-					$$ = makeDefElem("inherit", (Node *)makeInteger(TRUE));
-				}
-			| CONNECTION LIMIT SignedIconst
-				{
-					$$ = makeDefElem("connectionlimit", (Node *)makeInteger($3));
-				}
-			| VALID UNTIL Sconst
-				{
-					$$ = makeDefElem("validUntil", (Node *)makeString($3));
-				}
-		/*	Supported but not documented for roles, for use by ALTER GROUP. */
-			| USER name_list
-				{
-					$$ = makeDefElem("rolemembers", (Node *)$2);
-				}
-			| IDENT
-				{
-					/*
-					 * We handle identifiers that aren't parser keywords with
-					 * the following special-case codes, to avoid bloating the
-					 * size of the main parser.
-					 */
-					if (strcmp($1, "superuser") == 0)
-						$$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
-					else if (strcmp($1, "nosuperuser") == 0)
-						$$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
-					else if (strcmp($1, "createuser") == 0)
-					{
-						/* For backwards compatibility, synonym for SUPERUSER */
-						$$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
-					}
-					else if (strcmp($1, "nocreateuser") == 0)
-					{
-						/* For backwards compatibility, synonym for SUPERUSER */
-						$$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
-					}
-					else if (strcmp($1, "createrole") == 0)
-						$$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
-					else if (strcmp($1, "nocreaterole") == 0)
-						$$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
-					else if (strcmp($1, "replication") == 0)
-						$$ = makeDefElem("isreplication", (Node *)makeInteger(TRUE));
-					else if (strcmp($1, "noreplication") == 0)
-						$$ = makeDefElem("isreplication", (Node *)makeInteger(FALSE));
-					else if (strcmp($1, "createdb") == 0)
-						$$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
-					else if (strcmp($1, "nocreatedb") == 0)
-						$$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
-					else if (strcmp($1, "login") == 0)
-						$$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
-					else if (strcmp($1, "nologin") == 0)
-						$$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
-					else if (strcmp($1, "noinherit") == 0)
-					{
-						/*
-						 * Note that INHERIT is a keyword, so it's handled by main parser, but
-						 * NOINHERIT is handled here.
-						 */
-						$$ = makeDefElem("inherit", (Node *)makeInteger(FALSE));
-					}
-					else
-						ereport(ERROR,
-								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("unrecognized role option \"%s\"", $1),
-									 parser_errposition(@1)));
-				}
-		;
-
-CreateOptRoleElem:
-			AlterOptRoleElem			{ $$ = $1; }
-			/* The following are not supported by ALTER ROLE/USER/GROUP */
-			| SYSID Iconst
-				{
-					$$ = makeDefElem("sysid", (Node *)makeInteger($2));
-				}
-			| ADMIN name_list
-				{
-					$$ = makeDefElem("adminmembers", (Node *)$2);
-				}
-			| ROLE name_list
-				{
-					$$ = makeDefElem("rolemembers", (Node *)$2);
-				}
-			| IN_P ROLE name_list
-				{
-					$$ = makeDefElem("addroleto", (Node *)$3);
-				}
-			| IN_P GROUP_P name_list
-				{
-					$$ = makeDefElem("addroleto", (Node *)$3);
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Create a new Postgres DBMS user (role with implied login ability)
- *
- *****************************************************************************/
-
-CreateUserStmt:
-			CREATE USER RoleId opt_with OptRoleList
-				{
-					CreateRoleStmt *n = makeNode(CreateRoleStmt);
-					n->stmt_type = ROLESTMT_USER;
-					n->role = $3;
-					n->options = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Alter a postgresql DBMS role
- *
- *****************************************************************************/
-
-AlterRoleStmt:
-			ALTER ROLE RoleId opt_with AlterOptRoleList
-				 {
-					AlterRoleStmt *n = makeNode(AlterRoleStmt);
-					n->role = $3;
-					n->action = +1;	/* add, if there are members */
-					n->options = $5;
-					$$ = (Node *)n;
-				 }
-		;
-
-opt_in_database:
-			   /* EMPTY */					{ $$ = NULL; }
-			| IN_P DATABASE database_name	{ $$ = $3; }
-		;
-
-AlterRoleSetStmt:
-			ALTER ROLE RoleId opt_in_database SetResetClause
-				{
-					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
-					n->role = $3;
-					n->database = $4;
-					n->setstmt = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Alter a postgresql DBMS user
- *
- *****************************************************************************/
-
-AlterUserStmt:
-			ALTER USER RoleId opt_with AlterOptRoleList
-				 {
-					AlterRoleStmt *n = makeNode(AlterRoleStmt);
-					n->role = $3;
-					n->action = +1;	/* add, if there are members */
-					n->options = $5;
-					$$ = (Node *)n;
-				 }
-		;
-
-
-AlterUserSetStmt:
-			ALTER USER RoleId SetResetClause
-				{
-					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
-					n->role = $3;
-					n->database = NULL;
-					n->setstmt = $4;
-					$$ = (Node *)n;
-				}
-			;
-
-
-/*****************************************************************************
- *
- * Drop a postgresql DBMS role
- *
- * XXX Ideally this would have CASCADE/RESTRICT options, but since a role
- * might own objects in multiple databases, there is presently no way to
- * implement either cascading or restricting.  Caveat DBA.
- *****************************************************************************/
-
-DropRoleStmt:
-			DROP ROLE name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->missing_ok = FALSE;
-					n->roles = $3;
-					$$ = (Node *)n;
-				}
-			| DROP ROLE IF_P EXISTS name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->missing_ok = TRUE;
-					n->roles = $5;
-					$$ = (Node *)n;
-				}
-			;
-
-/*****************************************************************************
- *
- * Drop a postgresql DBMS user
- *
- * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
- * might own objects in multiple databases, there is presently no way to
- * implement either cascading or restricting.  Caveat DBA.
- *****************************************************************************/
-
-DropUserStmt:
-			DROP USER name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->missing_ok = FALSE;
-					n->roles = $3;
-					$$ = (Node *)n;
-				}
-			| DROP USER IF_P EXISTS name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->roles = $5;
-					n->missing_ok = TRUE;
-					$$ = (Node *)n;
-				}
-			;
-
-
-/*****************************************************************************
- *
- * Create a postgresql group (role without login ability)
- *
- *****************************************************************************/
-
-CreateGroupStmt:
-			CREATE GROUP_P RoleId opt_with OptRoleList
-				{
-					CreateRoleStmt *n = makeNode(CreateRoleStmt);
-					n->stmt_type = ROLESTMT_GROUP;
-					n->role = $3;
-					n->options = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Alter a postgresql group
- *
- *****************************************************************************/
-
-AlterGroupStmt:
-			ALTER GROUP_P RoleId add_drop USER name_list
-				{
-					AlterRoleStmt *n = makeNode(AlterRoleStmt);
-					n->role = $3;
-					n->action = $4;
-					n->options = list_make1(makeDefElem("rolemembers",
-														(Node *)$6));
-					$$ = (Node *)n;
-				}
-		;
-
-add_drop:	ADD_P									{ $$ = +1; }
-			| DROP									{ $$ = -1; }
-		;
-
-
-/*****************************************************************************
- *
- * Drop a postgresql group
- *
- * XXX see above notes about cascading DROP USER; groups have same problem.
- *****************************************************************************/
-
-DropGroupStmt:
-			DROP GROUP_P name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->missing_ok = FALSE;
-					n->roles = $3;
-					$$ = (Node *)n;
-				}
-			| DROP GROUP_P IF_P EXISTS name_list
-				{
-					DropRoleStmt *n = makeNode(DropRoleStmt);
-					n->missing_ok = TRUE;
-					n->roles = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Manipulate a schema
- *
- *****************************************************************************/
-
-CreateSchemaStmt:
-			CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
-				{
-					CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
-					/* One can omit the schema name or the authorization id. */
-					if ($3 != NULL)
-						n->schemaname = $3;
-					else
-						n->schemaname = $5;
-					n->authid = $5;
-					n->schemaElts = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE SCHEMA ColId OptSchemaEltList
-				{
-					CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
-					/* ...but not both */
-					n->schemaname = $3;
-					n->authid = NULL;
-					n->schemaElts = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-OptSchemaName:
-			ColId									{ $$ = $1; }
-			| /* EMPTY */							{ $$ = NULL; }
-		;
-
-OptSchemaEltList:
-			OptSchemaEltList schema_stmt			{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-/*
- *	schema_stmt are the ones that can show up inside a CREATE SCHEMA
- *	statement (in addition to by themselves).
- */
-schema_stmt:
-			CreateStmt
-			| IndexStmt
-			| CreateSeqStmt
-			| CreateTrigStmt
-			| GrantStmt
-			| ViewStmt
-		;
-
-
-/*****************************************************************************
- *
- * 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
-				{
-					VariableSetStmt *n = $2;
-					n->is_local = false;
-					$$ = (Node *) n;
-				}
-			| SET LOCAL set_rest
-				{
-					VariableSetStmt *n = $3;
-					n->is_local = true;
-					$$ = (Node *) n;
-				}
-			| SET SESSION set_rest
-				{
-					VariableSetStmt *n = $3;
-					n->is_local = false;
-					$$ = (Node *) n;
-				}
-		;
-
-set_rest:	/* Generic SET syntaxes: */
-			var_name TO var_list
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = $1;
-					n->args = $3;
-					$$ = n;
-				}
-			| var_name '=' var_list
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = $1;
-					n->args = $3;
-					$$ = n;
-				}
-			| var_name TO DEFAULT
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_DEFAULT;
-					n->name = $1;
-					$$ = n;
-				}
-			| var_name '=' DEFAULT
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_DEFAULT;
-					n->name = $1;
-					$$ = n;
-				}
-			| var_name FROM CURRENT_P
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_CURRENT;
-					n->name = $1;
-					$$ = n;
-				}
-			/* Special syntaxes mandated by SQL standard: */
-			| TIME ZONE zone_value
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "timezone";
-					if ($3 != NULL)
-						n->args = list_make1($3);
-					else
-						n->kind = VAR_SET_DEFAULT;
-					$$ = n;
-				}
-			| TRANSACTION transaction_mode_list
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_MULTI;
-					n->name = "TRANSACTION";
-					n->args = $2;
-					$$ = n;
-				}
-			| SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_MULTI;
-					n->name = "SESSION CHARACTERISTICS";
-					n->args = $5;
-					$$ = n;
-				}
-			| CATALOG_P Sconst
-				{
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("current database cannot be changed"),
-							 parser_errposition(@2)));
-					$$ = NULL; /*not reached*/
-				}
-			| SCHEMA Sconst
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "search_path";
-					n->args = list_make1(makeStringConst($2, @2));
-					$$ = n;
-				}
-			| NAMES opt_encoding
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "client_encoding";
-					if ($2 != NULL)
-						n->args = list_make1(makeStringConst($2, @2));
-					else
-						n->kind = VAR_SET_DEFAULT;
-					$$ = n;
-				}
-			| ROLE ColId_or_Sconst
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "role";
-					n->args = list_make1(makeStringConst($2, @2));
-					$$ = n;
-				}
-			| SESSION AUTHORIZATION ColId_or_Sconst
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "session_authorization";
-					n->args = list_make1(makeStringConst($3, @3));
-					$$ = n;
-				}
-			| SESSION AUTHORIZATION DEFAULT
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_DEFAULT;
-					n->name = "session_authorization";
-					$$ = n;
-				}
-			| XML_P OPTION document_or_content
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_SET_VALUE;
-					n->name = "xmloption";
-					n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3));
-					$$ = n;
-				}
-		;
-
-var_name:	ColId								{ $$ = $1; }
-			| var_name '.' ColId
-				{
-					$$ = palloc(strlen($1) + strlen($3) + 2);
-					sprintf($$, "%s.%s", $1, $3);
-				}
-		;
-
-var_list:	var_value								{ $$ = list_make1($1); }
-			| var_list ',' var_value				{ $$ = lappend($1, $3); }
-		;
-
-var_value:	opt_boolean_or_string
-				{ $$ = makeStringConst($1, @1); }
-			| NumericOnly
-				{ $$ = makeAConst($1, @1); }
-		;
-
-iso_level:	READ UNCOMMITTED						{ $$ = "read uncommitted"; }
-			| READ COMMITTED						{ $$ = "read committed"; }
-			| REPEATABLE READ						{ $$ = "repeatable read"; }
-			| SERIALIZABLE							{ $$ = "serializable"; }
-		;
-
-opt_boolean_or_string:
-			TRUE_P									{ $$ = "true"; }
-			| FALSE_P								{ $$ = "false"; }
-			| ON									{ $$ = "on"; }
-			/*
-			 * OFF is also accepted as a boolean value, but is handled
-			 * by the ColId rule below. The action for booleans and strings
-			 * is the same, so we don't need to distinguish them here.
-			 */
-			| ColId_or_Sconst						{ $$ = $1; }
-		;
-
-/* Timezone values can be:
- * - a string such as 'pst8pdt'
- * - an identifier such as "pst8pdt"
- * - an integer or floating point number
- * - a time interval per SQL99
- * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
- * so use IDENT (meaning we reject anything that is a key word).
- */
-zone_value:
-			Sconst
-				{
-					$$ = makeStringConst($1, @1);
-				}
-			| IDENT
-				{
-					$$ = makeStringConst($1, @1);
-				}
-			| ConstInterval Sconst opt_interval
-				{
-					TypeName *t = $1;
-					if ($3 != NIL)
-					{
-						A_Const *n = (A_Const *) linitial($3);
-						if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
-							ereport(ERROR,
-									(errcode(ERRCODE_SYNTAX_ERROR),
-									 errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
-									 parser_errposition(@3)));
-					}
-					t->typmods = $3;
-					$$ = makeStringConstCast($2, @2, t);
-				}
-			| ConstInterval '(' Iconst ')' Sconst opt_interval
-				{
-					TypeName *t = $1;
-					if ($6 != NIL)
-					{
-						A_Const *n = (A_Const *) linitial($6);
-						if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
-							ereport(ERROR,
-									(errcode(ERRCODE_SYNTAX_ERROR),
-									 errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
-									 parser_errposition(@6)));
-						if (list_length($6) != 1)
-							ereport(ERROR,
-									(errcode(ERRCODE_SYNTAX_ERROR),
-									 errmsg("interval precision specified twice"),
-									 parser_errposition(@1)));
-						t->typmods = lappend($6, makeIntConst($3, @3));
-					}
-					else
-						t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
-												makeIntConst($3, @3));
-					$$ = makeStringConstCast($5, @5, t);
-				}
-			| NumericOnly							{ $$ = makeAConst($1, @1); }
-			| DEFAULT								{ $$ = NULL; }
-			| LOCAL									{ $$ = NULL; }
-		;
-
-opt_encoding:
-			Sconst									{ $$ = $1; }
-			| DEFAULT								{ $$ = NULL; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-ColId_or_Sconst:
-			ColId									{ $$ = $1; }
-			| Sconst								{ $$ = $1; }
-		;
-
-VariableResetStmt:
-			RESET var_name
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_RESET;
-					n->name = $2;
-					$$ = (Node *) n;
-				}
-			| RESET TIME ZONE
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_RESET;
-					n->name = "timezone";
-					$$ = (Node *) n;
-				}
-			| RESET TRANSACTION ISOLATION LEVEL
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_RESET;
-					n->name = "transaction_isolation";
-					$$ = (Node *) n;
-				}
-			| RESET SESSION AUTHORIZATION
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_RESET;
-					n->name = "session_authorization";
-					$$ = (Node *) n;
-				}
-			| RESET ALL
-				{
-					VariableSetStmt *n = makeNode(VariableSetStmt);
-					n->kind = VAR_RESET_ALL;
-					$$ = (Node *) n;
-				}
-		;
-
-/* SetResetClause allows SET or RESET without LOCAL */
-SetResetClause:
-			SET set_rest					{ $$ = $2; }
-			| VariableResetStmt				{ $$ = (VariableSetStmt *) $1; }
-		;
-
-
-VariableShowStmt:
-			SHOW var_name
-				{
-					VariableShowStmt *n = makeNode(VariableShowStmt);
-					n->name = $2;
-					$$ = (Node *) n;
-				}
-			| SHOW TIME ZONE
-				{
-					VariableShowStmt *n = makeNode(VariableShowStmt);
-					n->name = "timezone";
-					$$ = (Node *) n;
-				}
-			| SHOW TRANSACTION ISOLATION LEVEL
-				{
-					VariableShowStmt *n = makeNode(VariableShowStmt);
-					n->name = "transaction_isolation";
-					$$ = (Node *) n;
-				}
-			| SHOW SESSION AUTHORIZATION
-				{
-					VariableShowStmt *n = makeNode(VariableShowStmt);
-					n->name = "session_authorization";
-					$$ = (Node *) n;
-				}
-			| SHOW ALL
-				{
-					VariableShowStmt *n = makeNode(VariableShowStmt);
-					n->name = "all";
-					$$ = (Node *) n;
-				}
-		;
-
-
-ConstraintsSetStmt:
-			SET CONSTRAINTS constraints_set_list constraints_set_mode
-				{
-					ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
-					n->constraints = $3;
-					n->deferred    = $4;
-					$$ = (Node *) n;
-				}
-		;
-
-constraints_set_list:
-			ALL										{ $$ = NIL; }
-			| qualified_name_list					{ $$ = $1; }
-		;
-
-constraints_set_mode:
-			DEFERRED								{ $$ = TRUE; }
-			| IMMEDIATE								{ $$ = FALSE; }
-		;
-
-
-/*
- * Checkpoint statement
- */
-CheckPointStmt:
-			CHECKPOINT
-				{
-					CheckPointStmt *n = makeNode(CheckPointStmt);
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * DISCARD { ALL | TEMP | PLANS }
- *
- *****************************************************************************/
-
-DiscardStmt:
-			DISCARD ALL
-				{
-					DiscardStmt *n = makeNode(DiscardStmt);
-					n->target = DISCARD_ALL;
-					$$ = (Node *) n;
-				}
-			| DISCARD TEMP
-				{
-					DiscardStmt *n = makeNode(DiscardStmt);
-					n->target = DISCARD_TEMP;
-					$$ = (Node *) n;
-				}
-			| DISCARD TEMPORARY
-				{
-					DiscardStmt *n = makeNode(DiscardStmt);
-					n->target = DISCARD_TEMP;
-					$$ = (Node *) n;
-				}
-			| DISCARD PLANS
-				{
-					DiscardStmt *n = makeNode(DiscardStmt);
-					n->target = DISCARD_PLANS;
-					$$ = (Node *) n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *	ALTER [ TABLE | INDEX | SEQUENCE | VIEW ] variations
- *
- * Note: we accept all subcommands for each of the four variants, and sort
- * out what's really legal at execution time.
- *****************************************************************************/
-
-AlterTableStmt:
-			ALTER TABLE relation_expr alter_table_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-					n->relation = $3;
-					n->cmds = $4;
-					n->relkind = OBJECT_TABLE;
-					$$ = (Node *)n;
-				}
-		|	ALTER INDEX qualified_name alter_table_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-					n->relation = $3;
-					n->cmds = $4;
-					n->relkind = OBJECT_INDEX;
-					$$ = (Node *)n;
-				}
-		|	ALTER SEQUENCE qualified_name alter_table_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-					n->relation = $3;
-					n->cmds = $4;
-					n->relkind = OBJECT_SEQUENCE;
-					$$ = (Node *)n;
-				}
-		|	ALTER VIEW qualified_name alter_table_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-					n->relation = $3;
-					n->cmds = $4;
-					n->relkind = OBJECT_VIEW;
-					$$ = (Node *)n;
-				}
-		;
-
-alter_table_cmds:
-			alter_table_cmd							{ $$ = list_make1($1); }
-			| alter_table_cmds ',' alter_table_cmd	{ $$ = lappend($1, $3); }
-		;
-
-alter_table_cmd:
-			/* ALTER TABLE <name> ADD <coldef> */
-			ADD_P columnDef
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddColumn;
-					n->def = $2;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ADD COLUMN <coldef> */
-			| ADD_P COLUMN columnDef
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddColumn;
-					n->def = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
-			| ALTER opt_column ColId alter_column_default
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ColumnDefault;
-					n->name = $3;
-					n->def = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
-			| ALTER opt_column ColId DROP NOT NULL_P
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropNotNull;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
-			| ALTER opt_column ColId SET NOT NULL_P
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetNotNull;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS <SignedIconst> */
-			| ALTER opt_column ColId SET STATISTICS SignedIconst
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetStatistics;
-					n->name = $3;
-					n->def = (Node *) makeInteger($6);
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
-			| ALTER opt_column ColId SET reloptions
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetOptions;
-					n->name = $3;
-					n->def = (Node *) $5;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
-			| ALTER opt_column ColId RESET reloptions
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ResetOptions;
-					n->name = $3;
-					n->def = (Node *) $5;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
-			| ALTER opt_column ColId SET STORAGE ColId
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetStorage;
-					n->name = $3;
-					n->def = (Node *) makeString($6);
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DROP [COLUMN] IF EXISTS <colname> [RESTRICT|CASCADE] */
-			| DROP opt_column IF_P EXISTS ColId opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropColumn;
-					n->name = $5;
-					n->behavior = $6;
-					n->missing_ok = TRUE;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
-			| DROP opt_column ColId opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropColumn;
-					n->name = $3;
-					n->behavior = $4;
-					n->missing_ok = FALSE;
-					$$ = (Node *)n;
-				}
-			/*
-			 * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
-			 *		[ USING <expression> ]
-			 */
-			| ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					ColumnDef *def = makeNode(ColumnDef);
-					n->subtype = AT_AlterColumnType;
-					n->name = $3;
-					n->def = (Node *) def;
-					/* We only use these three fields of the ColumnDef node */
-					def->typeName = $6;
-					def->collClause = (CollateClause *) $7;
-					def->raw_default = $8;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ADD CONSTRAINT ... */
-			| ADD_P TableConstraint
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddConstraint;
-					n->def = $2;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> VALIDATE CONSTRAINT ... */
-			| VALIDATE CONSTRAINT name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ValidateConstraint;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
-			| DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropConstraint;
-					n->name = $5;
-					n->behavior = $6;
-					n->missing_ok = TRUE;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
-			| DROP CONSTRAINT name opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropConstraint;
-					n->name = $3;
-					n->behavior = $4;
-					n->missing_ok = FALSE;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> SET WITH OIDS  */
-			| SET WITH OIDS
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddOids;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> SET WITHOUT OIDS  */
-			| SET WITHOUT OIDS
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropOids;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> CLUSTER ON <indexname> */
-			| CLUSTER ON name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ClusterOn;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> SET WITHOUT CLUSTER */
-			| SET WITHOUT CLUSTER
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropCluster;
-					n->name = NULL;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE TRIGGER <trig> */
-			| ENABLE_P TRIGGER name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableTrig;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
-			| ENABLE_P ALWAYS TRIGGER name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableAlwaysTrig;
-					n->name = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
-			| ENABLE_P REPLICA TRIGGER name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableReplicaTrig;
-					n->name = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE TRIGGER ALL */
-			| ENABLE_P TRIGGER ALL
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableTrigAll;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE TRIGGER USER */
-			| ENABLE_P TRIGGER USER
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableTrigUser;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DISABLE TRIGGER <trig> */
-			| DISABLE_P TRIGGER name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DisableTrig;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DISABLE TRIGGER ALL */
-			| DISABLE_P TRIGGER ALL
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DisableTrigAll;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DISABLE TRIGGER USER */
-			| DISABLE_P TRIGGER USER
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DisableTrigUser;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE RULE <rule> */
-			| ENABLE_P RULE name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableRule;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
-			| ENABLE_P ALWAYS RULE name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableAlwaysRule;
-					n->name = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
-			| ENABLE_P REPLICA RULE name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_EnableReplicaRule;
-					n->name = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> DISABLE RULE <rule> */
-			| DISABLE_P RULE name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DisableRule;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> INHERIT <parent> */
-			| INHERIT qualified_name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddInherit;
-					n->def = (Node *) $2;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> NO INHERIT <parent> */
-			| NO INHERIT qualified_name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropInherit;
-					n->def = (Node *) $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> OF <type_name> */
-			| OF any_name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					TypeName *def = makeTypeNameFromNameList($2);
-					def->location = @2;
-					n->subtype = AT_AddOf;
-					n->def = (Node *) def;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> NOT OF */
-			| NOT OF
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropOf;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> OWNER TO RoleId */
-			| OWNER TO RoleId
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ChangeOwner;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
-			| SET TABLESPACE name
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetTableSpace;
-					n->name = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> SET (...) */
-			| SET reloptions
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_SetRelOptions;
-					n->def = (Node *)$2;
-					$$ = (Node *)n;
-				}
-			/* ALTER TABLE <name> RESET (...) */
-			| RESET reloptions
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_ResetRelOptions;
-					n->def = (Node *)$2;
-					$$ = (Node *)n;
-				}
-			| alter_generic_options
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_GenericOptions;
-					n->def = (Node *)$1;
-					$$ = (Node *) n;
-				}
-		;
-
-alter_column_default:
-			SET DEFAULT a_expr			{ $$ = $3; }
-			| DROP DEFAULT				{ $$ = NULL; }
-		;
-
-opt_drop_behavior:
-			CASCADE						{ $$ = DROP_CASCADE; }
-			| RESTRICT					{ $$ = DROP_RESTRICT; }
-			| /* EMPTY */				{ $$ = DROP_RESTRICT; /* default */ }
-		;
-
 opt_collate_clause:
 			COLLATE any_name
 				{
@@ -2015,2753 +515,6 @@ opt_collate_clause:
 			| /* EMPTY */				{ $$ = NULL; }
 		;
 
-alter_using:
-			USING a_expr				{ $$ = $2; }
-			| /* EMPTY */				{ $$ = NULL; }
-		;
-
-reloptions:
-		  	'(' reloption_list ')'					{ $$ = $2; }
-		;
-
-opt_reloptions:		WITH reloptions					{ $$ = $2; }
-			 |		/* EMPTY */						{ $$ = NIL; }
-		;
-
-reloption_list:
-			reloption_elem							{ $$ = list_make1($1); }
-			| reloption_list ',' reloption_elem		{ $$ = lappend($1, $3); }
-		;
-
-/* This should match def_elem and also allow qualified names */
-reloption_elem:
-			ColLabel '=' def_arg
-				{
-					$$ = makeDefElem($1, (Node *) $3);
-				}
-			| ColLabel
-				{
-					$$ = makeDefElem($1, NULL);
-				}
-			| ColLabel '.' ColLabel '=' def_arg
-				{
-					$$ = makeDefElemExtended($1, $3, (Node *) $5,
-											 DEFELEM_UNSPEC);
-				}
-			| ColLabel '.' ColLabel
-				{
-					$$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC);
-				}
-		;
-
-
-/*****************************************************************************
- *
- *	ALTER TYPE
- *
- * really variants of the ALTER TABLE subcommands with different spellings
- *****************************************************************************/
-
-AlterCompositeTypeStmt:
-			ALTER TYPE_P any_name alter_type_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-
-					/* can't use qualified_name, sigh */
-					n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
-					n->cmds = $4;
-					n->relkind = OBJECT_TYPE;
-					$$ = (Node *)n;
-				}
-			;
-
-alter_type_cmds:
-			alter_type_cmd							{ $$ = list_make1($1); }
-			| alter_type_cmds ',' alter_type_cmd	{ $$ = lappend($1, $3); }
-		;
-
-alter_type_cmd:
-			/* ALTER TYPE <name> ADD ATTRIBUTE <coldef> [RESTRICT|CASCADE] */
-			ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_AddColumn;
-					n->def = $3;
-					n->behavior = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> [RESTRICT|CASCADE] */
-			| DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropColumn;
-					n->name = $5;
-					n->behavior = $6;
-					n->missing_ok = TRUE;
-					$$ = (Node *)n;
-				}
-			/* ALTER TYPE <name> DROP ATTRIBUTE <attname> [RESTRICT|CASCADE] */
-			| DROP ATTRIBUTE ColId opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					n->subtype = AT_DropColumn;
-					n->name = $3;
-					n->behavior = $4;
-					n->missing_ok = FALSE;
-					$$ = (Node *)n;
-				}
-			/* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> [RESTRICT|CASCADE] */
-			| ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
-				{
-					AlterTableCmd *n = makeNode(AlterTableCmd);
-					ColumnDef *def = makeNode(ColumnDef);
-					n->subtype = AT_AlterColumnType;
-					n->name = $3;
-					n->def = (Node *) def;
-					n->behavior = $8;
-					/* We only use these three fields of the ColumnDef node */
-					def->typeName = $6;
-					def->collClause = (CollateClause *) $7;
-					def->raw_default = NULL;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY :
- *				close <portalname>
- *
- *****************************************************************************/
-
-ClosePortalStmt:
-			CLOSE cursor_name
-				{
-					ClosePortalStmt *n = makeNode(ClosePortalStmt);
-					n->portalname = $2;
-					$$ = (Node *)n;
-				}
-			| CLOSE ALL
-				{
-					ClosePortalStmt *n = makeNode(ClosePortalStmt);
-					n->portalname = NULL;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY :
- *				COPY relname [(columnList)] FROM/TO file [WITH] [(options)]
- *				COPY ( SELECT ... ) TO file [WITH] [(options)]
- *
- *				In the preferred syntax the options are comma-separated
- *				and use generic identifiers instead of keywords.  The pre-9.0
- *				syntax had a hard-wired, space-separated set of options.
- *
- *				Really old syntax, from versions 7.2 and prior:
- *				COPY [ BINARY ] table [ WITH OIDS ] FROM/TO file
- *					[ [ USING ] DELIMITERS 'delimiter' ] ]
- *					[ WITH NULL AS 'null string' ]
- *				This option placement is not supported with COPY (SELECT...).
- *
- *****************************************************************************/
-
-CopyStmt:	COPY opt_binary qualified_name opt_column_list opt_oids
-			copy_from copy_file_name copy_delimiter opt_with copy_options
-				{
-					CopyStmt *n = makeNode(CopyStmt);
-					n->relation = $3;
-					n->query = NULL;
-					n->attlist = $4;
-					n->is_from = $6;
-					n->filename = $7;
-
-					n->options = NIL;
-					/* Concatenate user-supplied flags */
-					if ($2)
-						n->options = lappend(n->options, $2);
-					if ($5)
-						n->options = lappend(n->options, $5);
-					if ($8)
-						n->options = lappend(n->options, $8);
-					if ($10)
-						n->options = list_concat(n->options, $10);
-					$$ = (Node *)n;
-				}
-			| COPY select_with_parens TO copy_file_name opt_with copy_options
-				{
-					CopyStmt *n = makeNode(CopyStmt);
-					n->relation = NULL;
-					n->query = $2;
-					n->attlist = NIL;
-					n->is_from = false;
-					n->filename = $4;
-					n->options = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-copy_from:
-			FROM									{ $$ = TRUE; }
-			| TO									{ $$ = FALSE; }
-		;
-
-/*
- * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
- * used depends on the direction. (It really doesn't make sense to copy from
- * stdout. We silently correct the "typo".)		 - AY 9/94
- */
-copy_file_name:
-			Sconst									{ $$ = $1; }
-			| STDIN									{ $$ = NULL; }
-			| STDOUT								{ $$ = NULL; }
-		;
-
-copy_options: copy_opt_list							{ $$ = $1; }
-			| '(' copy_generic_opt_list ')'			{ $$ = $2; }
-		;
-
-/* old COPY option syntax */
-copy_opt_list:
-			copy_opt_list copy_opt_item				{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-copy_opt_item:
-			BINARY
-				{
-					$$ = makeDefElem("format", (Node *)makeString("binary"));
-				}
-			| OIDS
-				{
-					$$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
-				}
-			| DELIMITER opt_as Sconst
-				{
-					$$ = makeDefElem("delimiter", (Node *)makeString($3));
-				}
-			| NULL_P opt_as Sconst
-				{
-					$$ = makeDefElem("null", (Node *)makeString($3));
-				}
-			| CSV
-				{
-					$$ = makeDefElem("format", (Node *)makeString("csv"));
-				}
-			| HEADER_P
-				{
-					$$ = makeDefElem("header", (Node *)makeInteger(TRUE));
-				}
-			| QUOTE opt_as Sconst
-				{
-					$$ = makeDefElem("quote", (Node *)makeString($3));
-				}
-			| ESCAPE opt_as Sconst
-				{
-					$$ = makeDefElem("escape", (Node *)makeString($3));
-				}
-			| FORCE QUOTE columnList
-				{
-					$$ = makeDefElem("force_quote", (Node *)$3);
-				}
-			| FORCE QUOTE '*'
-				{
-					$$ = makeDefElem("force_quote", (Node *)makeNode(A_Star));
-				}
-			| FORCE NOT NULL_P columnList
-				{
-					$$ = makeDefElem("force_not_null", (Node *)$4);
-				}
-			| ENCODING Sconst
-				{
-					$$ = makeDefElem("encoding", (Node *)makeString($2));
-				}
-		;
-
-/* The following exist for backward compatibility with very old versions */
-
-opt_binary:
-			BINARY
-				{
-					$$ = makeDefElem("format", (Node *)makeString("binary"));
-				}
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-opt_oids:
-			WITH OIDS
-				{
-					$$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
-				}
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-copy_delimiter:
-			opt_using DELIMITERS Sconst
-				{
-					$$ = makeDefElem("delimiter", (Node *)makeString($3));
-				}
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-opt_using:
-			USING									{}
-			| /*EMPTY*/								{}
-		;
-
-/* new COPY option syntax */
-copy_generic_opt_list:
-			copy_generic_opt_elem
-				{
-					$$ = list_make1($1);
-				}
-			| copy_generic_opt_list ',' copy_generic_opt_elem
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-copy_generic_opt_elem:
-			ColLabel copy_generic_opt_arg
-				{
-					$$ = makeDefElem($1, $2);
-				}
-		;
-
-copy_generic_opt_arg:
-			opt_boolean_or_string			{ $$ = (Node *) makeString($1); }
-			| NumericOnly					{ $$ = (Node *) $1; }
-			| '*'							{ $$ = (Node *) makeNode(A_Star); }
-			| '(' copy_generic_opt_arg_list ')'		{ $$ = (Node *) $2; }
-			| /* EMPTY */					{ $$ = NULL; }
-		;
-
-copy_generic_opt_arg_list:
-			  copy_generic_opt_arg_list_item
-				{
-					$$ = list_make1($1);
-				}
-			| copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-/* beware of emitting non-string list elements here; see commands/define.c */
-copy_generic_opt_arg_list_item:
-			opt_boolean_or_string	{ $$ = (Node *) makeString($1); }
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY :
- *				CREATE TABLE relname
- *
- *****************************************************************************/
-
-CreateStmt:	CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
-			OptInherit OptWith OnCommitOption OptTableSpace
-				{
-					CreateStmt *n = makeNode(CreateStmt);
-					$4->relpersistence = $2;
-					n->relation = $4;
-					n->tableElts = $6;
-					n->inhRelations = $8;
-					n->constraints = NIL;
-					n->options = $9;
-					n->oncommit = $10;
-					n->tablespacename = $11;
-					n->if_not_exists = false;
-					$$ = (Node *)n;
-				}
-		| CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '('
-			OptTableElementList ')' OptInherit OptWith OnCommitOption
-			OptTableSpace
-				{
-					CreateStmt *n = makeNode(CreateStmt);
-					$7->relpersistence = $2;
-					n->relation = $7;
-					n->tableElts = $9;
-					n->inhRelations = $11;
-					n->constraints = NIL;
-					n->options = $12;
-					n->oncommit = $13;
-					n->tablespacename = $14;
-					n->if_not_exists = true;
-					$$ = (Node *)n;
-				}
-		| CREATE OptTemp TABLE qualified_name OF any_name
-			OptTypedTableElementList OptWith OnCommitOption OptTableSpace
-				{
-					CreateStmt *n = makeNode(CreateStmt);
-					$4->relpersistence = $2;
-					n->relation = $4;
-					n->tableElts = $7;
-					n->ofTypename = makeTypeNameFromNameList($6);
-					n->ofTypename->location = @6;
-					n->constraints = NIL;
-					n->options = $8;
-					n->oncommit = $9;
-					n->tablespacename = $10;
-					n->if_not_exists = false;
-					$$ = (Node *)n;
-				}
-		| CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name
-			OptTypedTableElementList OptWith OnCommitOption OptTableSpace
-				{
-					CreateStmt *n = makeNode(CreateStmt);
-					$7->relpersistence = $2;
-					n->relation = $7;
-					n->tableElts = $10;
-					n->ofTypename = makeTypeNameFromNameList($9);
-					n->ofTypename->location = @9;
-					n->constraints = NIL;
-					n->options = $11;
-					n->oncommit = $12;
-					n->tablespacename = $13;
-					n->if_not_exists = true;
-					$$ = (Node *)n;
-				}
-		;
-
-/*
- * Redundancy here is needed to avoid shift/reduce conflicts,
- * since TEMP is not a reserved word.  See also OptTempTableName.
- *
- * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
- * the LOCAL keyword is really meaningless.
- */
-OptTemp:	TEMPORARY					{ $$ = RELPERSISTENCE_TEMP; }
-			| TEMP						{ $$ = RELPERSISTENCE_TEMP; }
-			| LOCAL TEMPORARY			{ $$ = RELPERSISTENCE_TEMP; }
-			| LOCAL TEMP				{ $$ = RELPERSISTENCE_TEMP; }
-			| GLOBAL TEMPORARY			{ $$ = RELPERSISTENCE_TEMP; }
-			| GLOBAL TEMP				{ $$ = RELPERSISTENCE_TEMP; }
-			| UNLOGGED					{ $$ = RELPERSISTENCE_UNLOGGED; }
-			| /*EMPTY*/					{ $$ = RELPERSISTENCE_PERMANENT; }
-		;
-
-OptTableElementList:
-			TableElementList					{ $$ = $1; }
-			| /*EMPTY*/							{ $$ = NIL; }
-		;
-
-OptTypedTableElementList:
-			'(' TypedTableElementList ')'		{ $$ = $2; }
-			| /*EMPTY*/							{ $$ = NIL; }
-		;
-
-TableElementList:
-			TableElement
-				{
-					$$ = list_make1($1);
-				}
-			| TableElementList ',' TableElement
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-TypedTableElementList:
-			TypedTableElement
-				{
-					$$ = list_make1($1);
-				}
-			| TypedTableElementList ',' TypedTableElement
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-TableElement:
-			columnDef							{ $$ = $1; }
-			| TableLikeClause					{ $$ = $1; }
-			| TableConstraint					{ $$ = $1; }
-		;
-
-TypedTableElement:
-			columnOptions						{ $$ = $1; }
-			| TableConstraint					{ $$ = $1; }
-		;
-
-columnDef:	ColId Typename ColQualList
-				{
-					ColumnDef *n = makeNode(ColumnDef);
-					n->colname = $1;
-					n->typeName = $2;
-					n->inhcount = 0;
-					n->is_local = true;
-					n->is_not_null = false;
-					n->is_from_type = false;
-					n->storage = 0;
-					n->raw_default = NULL;
-					n->cooked_default = NULL;
-					n->collOid = InvalidOid;
-					SplitColQualList($3, &n->constraints, &n->collClause,
-									 yyscanner);
-					$$ = (Node *)n;
-				}
-		;
-
-columnOptions:	ColId WITH OPTIONS ColQualList
-				{
-					ColumnDef *n = makeNode(ColumnDef);
-					n->colname = $1;
-					n->typeName = NULL;
-					n->inhcount = 0;
-					n->is_local = true;
-					n->is_not_null = false;
-					n->is_from_type = false;
-					n->storage = 0;
-					n->raw_default = NULL;
-					n->cooked_default = NULL;
-					n->collOid = InvalidOid;
-					SplitColQualList($4, &n->constraints, &n->collClause,
-									 yyscanner);
-					$$ = (Node *)n;
-				}
-		;
-
-ColQualList:
-			ColQualList ColConstraint				{ $$ = lappend($1, $2); }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-ColConstraint:
-			CONSTRAINT name ColConstraintElem
-				{
-					Constraint *n = (Constraint *) $3;
-					Assert(IsA(n, Constraint));
-					n->conname = $2;
-					n->location = @1;
-					$$ = (Node *) n;
-				}
-			| ColConstraintElem						{ $$ = $1; }
-			| ConstraintAttr						{ $$ = $1; }
-			| COLLATE any_name
-				{
-					/*
-					 * Note: the CollateClause is momentarily included in
-					 * the list built by ColQualList, but we split it out
-					 * again in SplitColQualList.
-					 */
-					CollateClause *n = makeNode(CollateClause);
-					n->arg = NULL;
-					n->collname = $2;
-					n->location = @1;
-					$$ = (Node *) n;
-				}
-		;
-
-/* 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
- *
- * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
- * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
- * or be part of a_expr NOT LIKE or similar constructs).
- */
-ColConstraintElem:
-			NOT NULL_P
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_NOTNULL;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-			| NULL_P
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_NULL;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-			| UNIQUE opt_definition OptConsTableSpace
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_UNIQUE;
-					n->location = @1;
-					n->keys = NULL;
-					n->options = $2;
-					n->indexname = NULL;
-					n->indexspace = $3;
-					$$ = (Node *)n;
-				}
-			| PRIMARY KEY opt_definition OptConsTableSpace
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_PRIMARY;
-					n->location = @1;
-					n->keys = NULL;
-					n->options = $3;
-					n->indexname = NULL;
-					n->indexspace = $4;
-					$$ = (Node *)n;
-				}
-			| CHECK '(' a_expr ')'
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_CHECK;
-					n->location = @1;
-					n->raw_expr = $3;
-					n->cooked_expr = NULL;
-					$$ = (Node *)n;
-				}
-			| DEFAULT b_expr
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_DEFAULT;
-					n->location = @1;
-					n->raw_expr = $2;
-					n->cooked_expr = NULL;
-					$$ = (Node *)n;
-				}
-			| REFERENCES qualified_name opt_column_list key_match key_actions
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $2;
-					n->fk_attrs			= NIL;
-					n->pk_attrs			= $3;
-					n->fk_matchtype		= $4;
-					n->fk_upd_action	= (char) ($5 >> 8);
-					n->fk_del_action	= (char) ($5 & 0xFF);
-					n->skip_validation  = FALSE;
-					n->initially_valid  = true;
-					$$ = (Node *)n;
-				}
-		;
-
-/*
- * 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).  parse_utilcmd.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
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_ATTR_DEFERRABLE;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-			| NOT DEFERRABLE
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-			| INITIALLY DEFERRED
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_ATTR_DEFERRED;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-			| INITIALLY IMMEDIATE
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_ATTR_IMMEDIATE;
-					n->location = @1;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*
- * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
- * This seems to be a poor man's inheritance capability, with the resulting
- * tables completely decoupled except for the original commonality in definitions.
- *
- * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
- * which is a part of SQL:2003.
- */
-TableLikeClause:
-			LIKE qualified_name TableLikeOptionList
-				{
-					InhRelation *n = makeNode(InhRelation);
-					n->relation = $2;
-					n->options = $3;
-					$$ = (Node *)n;
-				}
-		;
-
-TableLikeOptionList:
-				TableLikeOptionList INCLUDING TableLikeOption	{ $$ = $1 | $3; }
-				| TableLikeOptionList EXCLUDING TableLikeOption	{ $$ = $1 & ~$3; }
-				| /* EMPTY */						{ $$ = 0; }
-		;
-
-TableLikeOption:
-				DEFAULTS			{ $$ = CREATE_TABLE_LIKE_DEFAULTS; }
-				| CONSTRAINTS		{ $$ = CREATE_TABLE_LIKE_CONSTRAINTS; }
-				| INDEXES			{ $$ = CREATE_TABLE_LIKE_INDEXES; }
-				| STORAGE			{ $$ = CREATE_TABLE_LIKE_STORAGE; }
-				| COMMENTS			{ $$ = CREATE_TABLE_LIKE_COMMENTS; }
-				| ALL				{ $$ = CREATE_TABLE_LIKE_ALL; }
-		;
-
-
-/* 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
-				{
-					Constraint *n = (Constraint *) $3;
-					Assert(IsA(n, Constraint));
-					n->conname = $2;
-					n->location = @1;
-					$$ = (Node *) n;
-				}
-			| ConstraintElem						{ $$ = $1; }
-		;
-
-ConstraintElem:
-			CHECK '(' a_expr ')' ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_CHECK;
-					n->location = @1;
-					n->raw_expr = $3;
-					n->cooked_expr = NULL;
-					if ($5 != 0)
-						ereport(ERROR,
-								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-								 errmsg("CHECK constraints cannot be deferred"),
-								 parser_errposition(@5)));
-					$$ = (Node *)n;
-				}
-			| UNIQUE '(' columnList ')' opt_definition OptConsTableSpace
-				ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_UNIQUE;
-					n->location = @1;
-					n->keys = $3;
-					n->options = $5;
-					n->indexname = NULL;
-					n->indexspace = $6;
-					n->deferrable = ($7 & 1) != 0;
-					n->initdeferred = ($7 & 2) != 0;
-					$$ = (Node *)n;
-				}
-			| UNIQUE ExistingIndex ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_UNIQUE;
-					n->location = @1;
-					n->keys = NIL;
-					n->options = NIL;
-					n->indexname = $2;
-					n->indexspace = NULL;
-					n->deferrable = ($3 & 1) != 0;
-					n->initdeferred = ($3 & 2) != 0;
-					$$ = (Node *)n;
-				}
-			| PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace
-				ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_PRIMARY;
-					n->location = @1;
-					n->keys = $4;
-					n->options = $6;
-					n->indexname = NULL;
-					n->indexspace = $7;
-					n->deferrable = ($8 & 1) != 0;
-					n->initdeferred = ($8 & 2) != 0;
-					$$ = (Node *)n;
-				}
-			| PRIMARY KEY ExistingIndex ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_PRIMARY;
-					n->location = @1;
-					n->keys = NIL;
-					n->options = NIL;
-					n->indexname = $3;
-					n->indexspace = NULL;
-					n->deferrable = ($4 & 1) != 0;
-					n->initdeferred = ($4 & 2) != 0;
-					$$ = (Node *)n;
-				}
-			| EXCLUDE access_method_clause '(' ExclusionConstraintList ')'
-				opt_definition OptConsTableSpace ExclusionWhereClause
-				ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_EXCLUSION;
-					n->location = @1;
-					n->access_method	= $2;
-					n->exclusions		= $4;
-					n->options			= $6;
-					n->indexname		= NULL;
-					n->indexspace		= $7;
-					n->where_clause		= $8;
-					n->deferrable		= ($9 & 1) != 0;
-					n->initdeferred		= ($9 & 2) != 0;
-					$$ = (Node *)n;
-				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions ConstraintAttributeSpec
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $7;
-					n->fk_attrs			= $4;
-					n->pk_attrs			= $8;
-					n->fk_matchtype		= $9;
-					n->fk_upd_action	= (char) ($10 >> 8);
-					n->fk_del_action	= (char) ($10 & 0xFF);
-					n->deferrable		= ($11 & 1) != 0;
-					n->initdeferred		= ($11 & 2) != 0;
-					n->skip_validation  = false;
-					n->initially_valid  = true;
-					$$ = (Node *)n;
-				}
-			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
-				opt_column_list key_match key_actions
-				NOT VALID
-				{
-					Constraint *n = makeNode(Constraint);
-					n->contype = CONSTR_FOREIGN;
-					n->location = @1;
-					n->pktable			= $7;
-					n->fk_attrs			= $4;
-					n->pk_attrs			= $8;
-					n->fk_matchtype		= $9;
-					n->fk_upd_action	= (char) ($10 >> 8);
-					n->fk_del_action	= (char) ($10 & 0xFF);
-					n->skip_validation  = true;
-					n->initially_valid  = false;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_column_list:
-			'(' columnList ')'						{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-columnList:
-			columnElem								{ $$ = list_make1($1); }
-			| columnList ',' columnElem				{ $$ = lappend($1, $3); }
-		;
-
-columnElem: ColId
-				{
-					$$ = (Node *) makeString($1);
-				}
-		;
-
-key_match:  MATCH FULL
-			{
-				$$ = FKCONSTR_MATCH_FULL;
-			}
-		| MATCH PARTIAL
-			{
-				ereport(ERROR,
-						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-						 errmsg("MATCH PARTIAL not yet implemented"),
-						 parser_errposition(@1)));
-				$$ = FKCONSTR_MATCH_PARTIAL;
-			}
-		| MATCH SIMPLE
-			{
-				$$ = FKCONSTR_MATCH_UNSPECIFIED;
-			}
-		| /*EMPTY*/
-			{
-				$$ = FKCONSTR_MATCH_UNSPECIFIED;
-			}
-		;
-
-ExclusionConstraintList:
-			ExclusionConstraintElem					{ $$ = list_make1($1); }
-			| ExclusionConstraintList ',' ExclusionConstraintElem
-													{ $$ = lappend($1, $3); }
-		;
-
-ExclusionConstraintElem: index_elem WITH any_operator
-			{
-				$$ = list_make2($1, $3);
-			}
-			/* allow OPERATOR() decoration for the benefit of ruleutils.c */
-			| index_elem WITH OPERATOR '(' any_operator ')'
-			{
-				$$ = list_make2($1, $5);
-			}
-		;
-
-ExclusionWhereClause:
-			WHERE '(' a_expr ')'					{ $$ = $3; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-/*
- * We combine the update and delete actions into one value temporarily
- * for simplicity of parsing, and then break them down again in the
- * calling production.  update is in the left 8 bits, delete in the right.
- * Note that NOACTION is the default.
- */
-key_actions:
-			key_update
-				{ $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
-			| key_delete
-				{ $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
-			| key_update key_delete
-				{ $$ = ($1 << 8) | ($2 & 0xFF); }
-			| key_delete key_update
-				{ $$ = ($2 << 8) | ($1 & 0xFF); }
-			| /*EMPTY*/
-				{ $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
-		;
-
-key_update: ON UPDATE key_action		{ $$ = $3; }
-		;
-
-key_delete: ON DELETE_P key_action		{ $$ = $3; }
-		;
-
-key_action:
-			NO ACTION					{ $$ = FKCONSTR_ACTION_NOACTION; }
-			| RESTRICT					{ $$ = FKCONSTR_ACTION_RESTRICT; }
-			| CASCADE					{ $$ = FKCONSTR_ACTION_CASCADE; }
-			| SET NULL_P				{ $$ = FKCONSTR_ACTION_SETNULL; }
-			| SET DEFAULT				{ $$ = FKCONSTR_ACTION_SETDEFAULT; }
-		;
-
-OptInherit: INHERITS '(' qualified_name_list ')'	{ $$ = $3; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-/* WITH (options) is preferred, WITH OIDS and WITHOUT OIDS are legacy forms */
-OptWith:
-			WITH reloptions				{ $$ = $2; }
-			| WITH OIDS					{ $$ = list_make1(defWithOids(true)); }
-			| WITHOUT OIDS				{ $$ = list_make1(defWithOids(false)); }
-			| /*EMPTY*/					{ $$ = NIL; }
-		;
-
-OnCommitOption:  ON COMMIT DROP				{ $$ = ONCOMMIT_DROP; }
-			| ON COMMIT DELETE_P ROWS		{ $$ = ONCOMMIT_DELETE_ROWS; }
-			| ON COMMIT PRESERVE ROWS		{ $$ = ONCOMMIT_PRESERVE_ROWS; }
-			| /*EMPTY*/						{ $$ = ONCOMMIT_NOOP; }
-		;
-
-OptTableSpace:   TABLESPACE name					{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-OptConsTableSpace:   USING INDEX TABLESPACE name	{ $$ = $4; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-ExistingIndex:   USING INDEX index_name				{ $$ = $3; }
-		;
-
-
-/*
- * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
- * SELECT ... INTO.
- */
-
-CreateAsStmt:
-		CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data
-				{
-					/*
-					 * When the SelectStmt is a set-operation tree, we must
-					 * stuff the INTO information into the leftmost component
-					 * Select, because that's where analyze.c will expect
-					 * to find it.	Similarly, the output column names must
-					 * be attached to that Select's target list.
-					 */
-					SelectStmt *n = findLeftmostSelect((SelectStmt *) $6);
-					if (n->intoClause != NULL)
-						ereport(ERROR,
-								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("CREATE TABLE AS cannot specify INTO"),
-								 parser_errposition(exprLocation((Node *) n->intoClause))));
-					$4->rel->relpersistence = $2;
-					n->intoClause = $4;
-					/* Implement WITH NO DATA by forcing top-level LIMIT 0 */
-					if (!$7)
-						((SelectStmt *) $6)->limitCount = makeIntConst(0, -1);
-					$$ = $6;
-				}
-		;
-
-create_as_target:
-			qualified_name OptCreateAs OptWith OnCommitOption OptTableSpace
-				{
-					$$ = makeNode(IntoClause);
-					$$->rel = $1;
-					$$->colNames = $2;
-					$$->options = $3;
-					$$->onCommit = $4;
-					$$->tableSpaceName = $5;
-				}
-		;
-
-OptCreateAs:
-			'(' CreateAsList ')'					{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-CreateAsList:
-			CreateAsElement							{ $$ = list_make1($1); }
-			| CreateAsList ',' CreateAsElement		{ $$ = lappend($1, $3); }
-		;
-
-CreateAsElement:
-			ColId
-				{
-					ColumnDef *n = makeNode(ColumnDef);
-					n->colname = $1;
-					n->typeName = NULL;
-					n->inhcount = 0;
-					n->is_local = true;
-					n->is_not_null = false;
-					n->is_from_type = false;
-					n->storage = 0;
-					n->raw_default = NULL;
-					n->cooked_default = NULL;
-					n->collClause = NULL;
-					n->collOid = InvalidOid;
-					n->constraints = NIL;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_with_data:
-			WITH DATA_P								{ $$ = TRUE; }
-			| WITH NO DATA_P						{ $$ = FALSE; }
-			| /*EMPTY*/								{ $$ = TRUE; }
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY :
- *				CREATE SEQUENCE seqname
- *				ALTER SEQUENCE seqname
- *
- *****************************************************************************/
-
-CreateSeqStmt:
-			CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
-				{
-					CreateSeqStmt *n = makeNode(CreateSeqStmt);
-					$4->relpersistence = $2;
-					n->sequence = $4;
-					n->options = $5;
-					n->ownerId = InvalidOid;
-					$$ = (Node *)n;
-				}
-		;
-
-AlterSeqStmt:
-			ALTER SEQUENCE qualified_name SeqOptList
-				{
-					AlterSeqStmt *n = makeNode(AlterSeqStmt);
-					n->sequence = $3;
-					n->options = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-OptSeqOptList: SeqOptList							{ $$ = $1; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-SeqOptList: SeqOptElem								{ $$ = list_make1($1); }
-			| SeqOptList SeqOptElem					{ $$ = lappend($1, $2); }
-		;
-
-SeqOptElem: CACHE NumericOnly
-				{
-					$$ = makeDefElem("cache", (Node *)$2);
-				}
-			| CYCLE
-				{
-					$$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
-				}
-			| NO CYCLE
-				{
-					$$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
-				}
-			| INCREMENT opt_by NumericOnly
-				{
-					$$ = makeDefElem("increment", (Node *)$3);
-				}
-			| MAXVALUE NumericOnly
-				{
-					$$ = makeDefElem("maxvalue", (Node *)$2);
-				}
-			| MINVALUE NumericOnly
-				{
-					$$ = makeDefElem("minvalue", (Node *)$2);
-				}
-			| NO MAXVALUE
-				{
-					$$ = makeDefElem("maxvalue", NULL);
-				}
-			| NO MINVALUE
-				{
-					$$ = makeDefElem("minvalue", NULL);
-				}
-			| OWNED BY any_name
-				{
-					$$ = makeDefElem("owned_by", (Node *)$3);
-				}
-			| START opt_with NumericOnly
-				{
-					$$ = makeDefElem("start", (Node *)$3);
-				}
-			| RESTART
-				{
-					$$ = makeDefElem("restart", NULL);
-				}
-			| RESTART opt_with NumericOnly
-				{
-					$$ = makeDefElem("restart", (Node *)$3);
-				}
-		;
-
-opt_by:		BY				{}
-			| /* empty */	{}
-	  ;
-
-NumericOnly:
-			FCONST								{ $$ = makeFloat($1); }
-			| '-' FCONST
-				{
-					$$ = makeFloat($2);
-					doNegateFloat($$);
-				}
-			| SignedIconst						{ $$ = makeInteger($1); }
-		;
-
-NumericOnly_list:	NumericOnly						{ $$ = list_make1($1); }
-				| NumericOnly_list ',' NumericOnly	{ $$ = lappend($1, $3); }
-		;
-
-/*****************************************************************************
- *
- *		QUERIES :
- *				CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE ...
- *				DROP [PROCEDURAL] LANGUAGE ...
- *
- *****************************************************************************/
-
-CreatePLangStmt:
-			CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
-			{
-				CreatePLangStmt *n = makeNode(CreatePLangStmt);
-				n->replace = $2;
-				n->plname = $6;
-				/* parameters are all to be supplied by system */
-				n->plhandler = NIL;
-				n->plinline = NIL;
-				n->plvalidator = NIL;
-				n->pltrusted = false;
-				$$ = (Node *)n;
-			}
-			| CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
-			  HANDLER handler_name opt_inline_handler opt_validator
-			{
-				CreatePLangStmt *n = makeNode(CreatePLangStmt);
-				n->replace = $2;
-				n->plname = $6;
-				n->plhandler = $8;
-				n->plinline = $9;
-				n->plvalidator = $10;
-				n->pltrusted = $3;
-				$$ = (Node *)n;
-			}
-		;
-
-opt_trusted:
-			TRUSTED									{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-/* 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						{ $$ = list_make1(makeString($1)); }
-			| name attrs				{ $$ = lcons(makeString($1), $2); }
-		;
-
-opt_inline_handler:
-			INLINE_P handler_name					{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-validator_clause:
-			VALIDATOR handler_name					{ $$ = $2; }
-			| NO VALIDATOR							{ $$ = NIL; }
-		;
-
-opt_validator:
-			validator_clause						{ $$ = $1; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-DropPLangStmt:
-			DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
-				{
-					DropPLangStmt *n = makeNode(DropPLangStmt);
-					n->plname = $4;
-					n->behavior = $5;
-					n->missing_ok = false;
-					$$ = (Node *)n;
-				}
-			| DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
-				{
-					DropPLangStmt *n = makeNode(DropPLangStmt);
-					n->plname = $6;
-					n->behavior = $7;
-					n->missing_ok = true;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_procedural:
-			PROCEDURAL								{}
-			| /*EMPTY*/								{}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
- *
- *****************************************************************************/
-
-CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
-				{
-					CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
-					n->tablespacename = $3;
-					n->owner = $4;
-					n->location = $6;
-					$$ = (Node *) n;
-				}
-		;
-
-OptTableSpaceOwner: OWNER name			{ $$ = $2; }
-			| /*EMPTY */				{ $$ = NULL; }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				DROP TABLESPACE <tablespace>
- *
- *		No need for drop behaviour as we cannot implement dependencies for
- *		objects in other databases; we can only support RESTRICT.
- *
- ****************************************************************************/
-
-DropTableSpaceStmt: DROP TABLESPACE name
-				{
-					DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
-					n->tablespacename = $3;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-				|  DROP TABLESPACE IF_P EXISTS name
-                {
-					DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
-					n->tablespacename = $5;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE EXTENSION extension
- *             [ WITH ] [ SCHEMA schema ] [ VERSION version ] [ FROM oldversion ]
- *
- *****************************************************************************/
-
-CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list
-				{
-					CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
-					n->extname = $3;
-					n->if_not_exists = false;
-					n->options = $5;
-					$$ = (Node *) n;
-				}
-				| CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
-				{
-					CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
-					n->extname = $6;
-					n->if_not_exists = true;
-					n->options = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-create_extension_opt_list:
-			create_extension_opt_list create_extension_opt_item
-				{ $$ = lappend($1, $2); }
-			| /* EMPTY */
-				{ $$ = NIL; }
-		;
-
-create_extension_opt_item:
-			SCHEMA name
-				{
-					$$ = makeDefElem("schema", (Node *)makeString($2));
-				}
-			| VERSION_P ColId_or_Sconst
-				{
-					$$ = makeDefElem("new_version", (Node *)makeString($2));
-				}
-			| FROM ColId_or_Sconst
-				{
-					$$ = makeDefElem("old_version", (Node *)makeString($2));
-				}
-		;
-
-/*****************************************************************************
- *
- * ALTER EXTENSION name UPDATE [ TO version ]
- *
- *****************************************************************************/
-
-AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
-				{
-					AlterExtensionStmt *n = makeNode(AlterExtensionStmt);
-					n->extname = $3;
-					n->options = $5;
-					$$ = (Node *) n;
-				}
-		;
-
-alter_extension_opt_list:
-			alter_extension_opt_list alter_extension_opt_item
-				{ $$ = lappend($1, $2); }
-			| /* EMPTY */
-				{ $$ = NIL; }
-		;
-
-alter_extension_opt_item:
-			TO ColId_or_Sconst
-				{
-					$$ = makeDefElem("new_version", (Node *)makeString($2));
-				}
-		;
-
-/*****************************************************************************
- *
- * ALTER EXTENSION name ADD/DROP object-identifier
- *
- *****************************************************************************/
-
-AlterExtensionContentsStmt:
-			ALTER EXTENSION name add_drop AGGREGATE func_name aggr_args
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_AGGREGATE;
-					n->objname = $6;
-					n->objargs = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_CAST;
-					n->objname = list_make1($7);
-					n->objargs = list_make1($9);
-					$$ = (Node *) n;
-				}
-			| ALTER EXTENSION name add_drop COLLATION any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_COLLATION;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop CONVERSION_P any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_CONVERSION;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop DOMAIN_P any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_DOMAIN;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_FUNCTION;
-					n->objname = $6->funcname;
-					n->objargs = $6->funcargs;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop opt_procedural LANGUAGE name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_LANGUAGE;
-					n->objname = list_make1(makeString($7));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop OPERATOR any_operator oper_argtypes
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_OPERATOR;
-					n->objname = $6;
-					n->objargs = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING access_method
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_OPCLASS;
-					n->objname = $7;
-					n->objargs = list_make1(makeString($9));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING access_method
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_OPFAMILY;
-					n->objname = $7;
-					n->objargs = list_make1(makeString($9));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop SCHEMA name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_SCHEMA;
-					n->objname = list_make1(makeString($6));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TABLE any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TABLE;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TEXT_P SEARCH PARSER any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TSPARSER;
-					n->objname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TEXT_P SEARCH DICTIONARY any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TSDICTIONARY;
-					n->objname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TEXT_P SEARCH TEMPLATE any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TSTEMPLATE;
-					n->objname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TEXT_P SEARCH CONFIGURATION any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TSCONFIGURATION;
-					n->objname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop SEQUENCE any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_SEQUENCE;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop VIEW any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_VIEW;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop FOREIGN TABLE any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_FOREIGN_TABLE;
-					n->objname = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop FOREIGN DATA_P WRAPPER name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_FDW;
-					n->objname = list_make1(makeString($8));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop SERVER name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_FOREIGN_SERVER;
-					n->objname = list_make1(makeString($6));
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION name add_drop TYPE_P any_name
-				{
-					AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
-					n->extname = $3;
-					n->action = $4;
-					n->objtype = OBJECT_TYPE;
-					n->objname = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE FOREIGN DATA WRAPPER name options
- *
- *****************************************************************************/
-
-CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
-				{
-					CreateFdwStmt *n = makeNode(CreateFdwStmt);
-					n->fdwname = $5;
-					n->func_options = $6;
-					n->options = $7;
-					$$ = (Node *) n;
-				}
-		;
-
-fdw_option:
-			HANDLER handler_name				{ $$ = makeDefElem("handler", (Node *)$2); }
-			| NO HANDLER						{ $$ = makeDefElem("handler", NULL); }
-			| VALIDATOR handler_name			{ $$ = makeDefElem("validator", (Node *)$2); }
-			| NO VALIDATOR						{ $$ = makeDefElem("validator", NULL); }
-		;
-
-fdw_options:
-			fdw_option							{ $$ = list_make1($1); }
-			| fdw_options fdw_option			{ $$ = lappend($1, $2); }
-		;
-
-opt_fdw_options:
-			fdw_options							{ $$ = $1; }
-			| /*EMPTY*/							{ $$ = NIL; }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				DROP FOREIGN DATA WRAPPER name
- *
- ****************************************************************************/
-
-DropFdwStmt: DROP FOREIGN DATA_P WRAPPER name opt_drop_behavior
-				{
-					DropFdwStmt *n = makeNode(DropFdwStmt);
-					n->fdwname = $5;
-					n->missing_ok = false;
-					n->behavior = $6;
-					$$ = (Node *) n;
-				}
-				|  DROP FOREIGN DATA_P WRAPPER IF_P EXISTS name opt_drop_behavior
-                {
-					DropFdwStmt *n = makeNode(DropFdwStmt);
-					n->fdwname = $7;
-					n->missing_ok = true;
-					n->behavior = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				ALTER FOREIGN DATA WRAPPER name options
- *
- ****************************************************************************/
-
-AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
-				{
-					AlterFdwStmt *n = makeNode(AlterFdwStmt);
-					n->fdwname = $5;
-					n->func_options = $6;
-					n->options = $7;
-					$$ = (Node *) n;
-				}
-			| ALTER FOREIGN DATA_P WRAPPER name fdw_options
-				{
-					AlterFdwStmt *n = makeNode(AlterFdwStmt);
-					n->fdwname = $5;
-					n->func_options = $6;
-					n->options = NIL;
-					$$ = (Node *) n;
-				}
-		;
-
-/* Options definition for CREATE FDW, SERVER and USER MAPPING */
-create_generic_options:
-			OPTIONS '(' generic_option_list ')'			{ $$ = $3; }
-			| /*EMPTY*/									{ $$ = NIL; }
-		;
-
-generic_option_list:
-			generic_option_elem
-				{
-					$$ = list_make1($1);
-				}
-			| generic_option_list ',' generic_option_elem
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-/* Options definition for ALTER FDW, SERVER and USER MAPPING */
-alter_generic_options:
-			OPTIONS	'(' alter_generic_option_list ')'		{ $$ = $3; }
-		;
-
-alter_generic_option_list:
-			alter_generic_option_elem
-				{
-					$$ = list_make1($1);
-				}
-			| alter_generic_option_list ',' alter_generic_option_elem
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-alter_generic_option_elem:
-			generic_option_elem
-				{
-					$$ = $1;
-				}
-			| SET generic_option_elem
-				{
-					$$ = $2;
-					$$->defaction = DEFELEM_SET;
-				}
-			| ADD_P generic_option_elem
-				{
-					$$ = $2;
-					$$->defaction = DEFELEM_ADD;
-				}
-			| DROP generic_option_name
-				{
-					$$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP);
-				}
-		;
-
-generic_option_elem:
-			generic_option_name generic_option_arg
-				{
-					$$ = makeDefElem($1, $2);
-				}
-		;
-
-generic_option_name:
-				ColLabel			{ $$ = $1; }
-		;
-
-/* We could use def_arg here, but the spec only requires string literals */
-generic_option_arg:
-				Sconst				{ $$ = (Node *) makeString($1); }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE SERVER name [TYPE] [VERSION] [OPTIONS]
- *
- *****************************************************************************/
-
-CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version
-						 FOREIGN DATA_P WRAPPER name create_generic_options
-				{
-					CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
-					n->servername = $3;
-					n->servertype = $4;
-					n->version = $5;
-					n->fdwname = $9;
-					n->options = $10;
-					$$ = (Node *) n;
-				}
-		;
-
-opt_type:
-			TYPE_P Sconst			{ $$ = $2; }
-			| /*EMPTY*/				{ $$ = NULL; }
-		;
-
-
-foreign_server_version:
-			VERSION_P Sconst		{ $$ = $2; }
-		|	VERSION_P NULL_P		{ $$ = NULL; }
-		;
-
-opt_foreign_server_version:
-			foreign_server_version 	{ $$ = $1; }
-			| /*EMPTY*/				{ $$ = NULL; }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				DROP SERVER name
- *
- ****************************************************************************/
-
-DropForeignServerStmt: DROP SERVER name opt_drop_behavior
-				{
-					DropForeignServerStmt *n = makeNode(DropForeignServerStmt);
-					n->servername = $3;
-					n->missing_ok = false;
-					n->behavior = $4;
-					$$ = (Node *) n;
-				}
-				|  DROP SERVER IF_P EXISTS name opt_drop_behavior
-                {
-					DropForeignServerStmt *n = makeNode(DropForeignServerStmt);
-					n->servername = $5;
-					n->missing_ok = true;
-					n->behavior = $6;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				ALTER SERVER name [VERSION] [OPTIONS]
- *
- ****************************************************************************/
-
-AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options
-				{
-					AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
-					n->servername = $3;
-					n->version = $4;
-					n->options = $5;
-					n->has_version = true;
-					$$ = (Node *) n;
-				}
-			| ALTER SERVER name foreign_server_version
-				{
-					AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
-					n->servername = $3;
-					n->version = $4;
-					n->has_version = true;
-					$$ = (Node *) n;
-				}
-			| ALTER SERVER name alter_generic_options
-				{
-					AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
-					n->servername = $3;
-					n->options = $4;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE FOREIGN TABLE relname (...) SERVER name (...)
- *
- *****************************************************************************/
-
-CreateForeignTableStmt:
-		CREATE FOREIGN TABLE qualified_name
-			OptForeignTableElementList
-			SERVER name create_generic_options
-				{
-					CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
-					$4->relpersistence = RELPERSISTENCE_PERMANENT;
-					n->base.relation = $4;
-					n->base.tableElts = $5;
-					n->base.inhRelations = NIL;
-					n->base.if_not_exists = false;
-					/* FDW-specific data */
-					n->servername = $7;
-					n->options = $8;
-					$$ = (Node *) n;
-				}
-		| CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
-			OptForeignTableElementList
-			SERVER name create_generic_options
-				{
-					CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
-					$7->relpersistence = RELPERSISTENCE_PERMANENT;
-					n->base.relation = $7;
-					n->base.tableElts = $8;
-					n->base.inhRelations = NIL;
-					n->base.if_not_exists = true;
-					/* FDW-specific data */
-					n->servername = $10;
-					n->options = $11;
-					$$ = (Node *) n;
-				}
-		;
-
-OptForeignTableElementList:
-			'(' ForeignTableElementList ')'			{ $$ = $2; }
-			| '(' ')'								{ $$ = NIL; }
-		;
-
-ForeignTableElementList:
-			ForeignTableElement
-				{
-					$$ = list_make1($1);
-				}
-			| ForeignTableElementList ',' ForeignTableElement
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-ForeignTableElement:
-			columnDef					{ $$ = $1; }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             ALTER FOREIGN TABLE relname [...]
- *
- *****************************************************************************/
-
-AlterForeignTableStmt:
-			ALTER FOREIGN TABLE relation_expr alter_table_cmds
-				{
-					AlterTableStmt *n = makeNode(AlterTableStmt);
-					n->relation = $4;
-					n->cmds = $5;
-					n->relkind = OBJECT_FOREIGN_TABLE;
-					$$ = (Node *)n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY:
- *             CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS]
- *
- *****************************************************************************/
-
-CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
-				{
-					CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
-					n->username = $5;
-					n->servername = $7;
-					n->options = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-/* User mapping authorization identifier */
-auth_ident:
-			CURRENT_USER 	{ $$ = "current_user"; }
-		|	USER			{ $$ = "current_user"; }
-		|	RoleId 			{ $$ = (strcmp($1, "public") == 0) ? NULL : $1; }
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				DROP USER MAPPING FOR auth_ident SERVER name
- *
- ****************************************************************************/
-
-DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name
-				{
-					DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
-					n->username = $5;
-					n->servername = $7;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-				|  DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
-                {
-					DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
-					n->username = $7;
-					n->servername = $9;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- * 		QUERY :
- *				ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
- *
- ****************************************************************************/
-
-AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
-				{
-					AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
-					n->username = $5;
-					n->servername = $7;
-					n->options = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-/*****************************************************************************
- *
- *		QUERIES :
- *				CREATE TRIGGER ...
- *				DROP TRIGGER ...
- *
- *****************************************************************************/
-
-CreateTrigStmt:
-			CREATE TRIGGER name TriggerActionTime TriggerEvents ON
-			qualified_name TriggerForSpec TriggerWhen
-			EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
-				{
-					CreateTrigStmt *n = makeNode(CreateTrigStmt);
-					n->trigname = $3;
-					n->relation = $7;
-					n->funcname = $12;
-					n->args = $14;
-					n->row = $8;
-					n->timing = $4;
-					n->events = intVal(linitial($5));
-					n->columns = (List *) lsecond($5);
-					n->whenClause = $9;
-					n->isconstraint  = FALSE;
-					n->deferrable	 = FALSE;
-					n->initdeferred  = FALSE;
-					n->constrrel = NULL;
-					$$ = (Node *)n;
-				}
-			| CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
-			qualified_name OptConstrFromTable ConstraintAttributeSpec
-			FOR EACH ROW TriggerWhen
-			EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
-				{
-					CreateTrigStmt *n = makeNode(CreateTrigStmt);
-					n->trigname = $4;
-					n->relation = $8;
-					n->funcname = $17;
-					n->args = $19;
-					n->row = TRUE;
-					n->timing = TRIGGER_TYPE_AFTER;
-					n->events = intVal(linitial($6));
-					n->columns = (List *) lsecond($6);
-					n->whenClause = $14;
-					n->isconstraint  = TRUE;
-					n->deferrable = ($10 & 1) != 0;
-					n->initdeferred = ($10 & 2) != 0;
-					n->constrrel = $9;
-					$$ = (Node *)n;
-				}
-		;
-
-TriggerActionTime:
-			BEFORE								{ $$ = TRIGGER_TYPE_BEFORE; }
-			| AFTER								{ $$ = TRIGGER_TYPE_AFTER; }
-			| INSTEAD OF						{ $$ = TRIGGER_TYPE_INSTEAD; }
-		;
-
-TriggerEvents:
-			TriggerOneEvent
-				{ $$ = $1; }
-			| TriggerEvents OR TriggerOneEvent
-				{
-					int		events1 = intVal(linitial($1));
-					int		events2 = intVal(linitial($3));
-					List   *columns1 = (List *) lsecond($1);
-					List   *columns2 = (List *) lsecond($3);
-
-					if (events1 & events2)
-						parser_yyerror("duplicate trigger events specified");
-					/*
-					 * concat'ing the columns lists loses information about
-					 * which columns went with which event, but so long as
-					 * only UPDATE carries columns and we disallow multiple
-					 * UPDATE items, it doesn't matter.  Command execution
-					 * should just ignore the columns for non-UPDATE events.
-					 */
-					$$ = list_make2(makeInteger(events1 | events2),
-									list_concat(columns1, columns2));
-				}
-		;
-
-TriggerOneEvent:
-			INSERT
-				{ $$ = list_make2(makeInteger(TRIGGER_TYPE_INSERT), NIL); }
-			| DELETE_P
-				{ $$ = list_make2(makeInteger(TRIGGER_TYPE_DELETE), NIL); }
-			| UPDATE
-				{ $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), NIL); }
-			| UPDATE OF columnList
-				{ $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), $3); }
-			| TRUNCATE
-				{ $$ = list_make2(makeInteger(TRIGGER_TYPE_TRUNCATE), NIL); }
-		;
-
-TriggerForSpec:
-			FOR TriggerForOptEach TriggerForType
-				{
-					$$ = $3;
-				}
-			| /* EMPTY */
-				{
-					/*
-					 * If ROW/STATEMENT not specified, default to
-					 * STATEMENT, per SQL
-					 */
-					$$ = FALSE;
-				}
-		;
-
-TriggerForOptEach:
-			EACH									{}
-			| /*EMPTY*/								{}
-		;
-
-TriggerForType:
-			ROW										{ $$ = TRUE; }
-			| STATEMENT								{ $$ = FALSE; }
-		;
-
-TriggerWhen:
-			WHEN '(' a_expr ')'						{ $$ = $3; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-TriggerFuncArgs:
-			TriggerFuncArg							{ $$ = list_make1($1); }
-			| TriggerFuncArgs ',' TriggerFuncArg	{ $$ = lappend($1, $3); }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-TriggerFuncArg:
-			Iconst
-				{
-					char buf[64];
-					snprintf(buf, sizeof(buf), "%d", $1);
-					$$ = makeString(pstrdup(buf));
-				}
-			| FCONST								{ $$ = makeString($1); }
-			| Sconst								{ $$ = makeString($1); }
-			| ColLabel								{ $$ = makeString($1); }
-		;
-
-OptConstrFromTable:
-			FROM qualified_name						{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-ConstraintAttributeSpec:
-			ConstraintDeferrabilitySpec
-				{ $$ = $1; }
-			| ConstraintDeferrabilitySpec ConstraintTimeSpec
-				{
-					if ($1 == 0 && $2 != 0)
-						ereport(ERROR,
-								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
-								 parser_errposition(@1)));
-					$$ = $1 | $2;
-				}
-			| ConstraintTimeSpec
-				{
-					if ($1 != 0)
-						$$ = 3;
-					else
-						$$ = 0;
-				}
-			| ConstraintTimeSpec ConstraintDeferrabilitySpec
-				{
-					if ($2 == 0 && $1 != 0)
-						ereport(ERROR,
-								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
-								 parser_errposition(@1)));
-					$$ = $1 | $2;
-				}
-			| /*EMPTY*/
-				{ $$ = 0; }
-		;
-
-ConstraintDeferrabilitySpec:
-			NOT DEFERRABLE							{ $$ = 0; }
-			| DEFERRABLE							{ $$ = 1; }
-		;
-
-ConstraintTimeSpec:
-			INITIALLY IMMEDIATE						{ $$ = 0; }
-			| INITIALLY DEFERRED					{ $$ = 2; }
-		;
-
-
-DropTrigStmt:
-			DROP TRIGGER name ON qualified_name opt_drop_behavior
-				{
-					DropPropertyStmt *n = makeNode(DropPropertyStmt);
-					n->relation = $5;
-					n->property = $3;
-					n->behavior = $6;
-					n->removeType = OBJECT_TRIGGER;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-			| DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
-				{
-					DropPropertyStmt *n = makeNode(DropPropertyStmt);
-					n->relation = $7;
-					n->property = $5;
-					n->behavior = $8;
-					n->removeType = OBJECT_TRIGGER;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERIES :
- *				CREATE ASSERTION ...
- *				DROP ASSERTION ...
- *
- *****************************************************************************/
-
-CreateAssertStmt:
-			CREATE ASSERTION name CHECK '(' a_expr ')'
-			ConstraintAttributeSpec
-				{
-					CreateTrigStmt *n = makeNode(CreateTrigStmt);
-					n->trigname = $3;
-					n->args = list_make1($6);
-					n->isconstraint  = TRUE;
-					n->deferrable = ($8 & 1) != 0;
-					n->initdeferred = ($8 & 2) != 0;
-
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("CREATE ASSERTION is not yet implemented")));
-
-					$$ = (Node *)n;
-				}
-		;
-
-DropAssertStmt:
-			DROP ASSERTION name opt_drop_behavior
-				{
-					DropPropertyStmt *n = makeNode(DropPropertyStmt);
-					n->relation = NULL;
-					n->property = $3;
-					n->behavior = $4;
-					n->removeType = OBJECT_TRIGGER; /* XXX */
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("DROP ASSERTION is not yet implemented")));
-					$$ = (Node *) n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY :
- *				define (aggregate,operator,type)
- *
- *****************************************************************************/
-
-DefineStmt:
-			CREATE AGGREGATE func_name aggr_args definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_AGGREGATE;
-					n->oldstyle = false;
-					n->defnames = $3;
-					n->args = $4;
-					n->definition = $5;
-					$$ = (Node *)n;
-				}
-			| CREATE AGGREGATE func_name old_aggr_definition
-				{
-					/* old-style (pre-8.2) syntax for CREATE AGGREGATE */
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_AGGREGATE;
-					n->oldstyle = true;
-					n->defnames = $3;
-					n->args = NIL;
-					n->definition = $4;
-					$$ = (Node *)n;
-				}
-			| CREATE OPERATOR any_operator definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_OPERATOR;
-					n->oldstyle = false;
-					n->defnames = $3;
-					n->args = NIL;
-					n->definition = $4;
-					$$ = (Node *)n;
-				}
-			| CREATE TYPE_P any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TYPE;
-					n->oldstyle = false;
-					n->defnames = $3;
-					n->args = NIL;
-					n->definition = $4;
-					$$ = (Node *)n;
-				}
-			| CREATE TYPE_P any_name
-				{
-					/* Shell type (identified by lack of definition) */
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TYPE;
-					n->oldstyle = false;
-					n->defnames = $3;
-					n->args = NIL;
-					n->definition = NIL;
-					$$ = (Node *)n;
-				}
-			| CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
-				{
-					CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
-
-					/* can't use qualified_name, sigh */
-					n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner);
-					n->coldeflist = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
-				{
-					CreateEnumStmt *n = makeNode(CreateEnumStmt);
-					n->typeName = $3;
-					n->vals = $7;
-					$$ = (Node *)n;
-				}
-			| CREATE TEXT_P SEARCH PARSER any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TSPARSER;
-					n->args = NIL;
-					n->defnames = $5;
-					n->definition = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE TEXT_P SEARCH DICTIONARY any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TSDICTIONARY;
-					n->args = NIL;
-					n->defnames = $5;
-					n->definition = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE TEXT_P SEARCH TEMPLATE any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TSTEMPLATE;
-					n->args = NIL;
-					n->defnames = $5;
-					n->definition = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE TEXT_P SEARCH CONFIGURATION any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_TSCONFIGURATION;
-					n->args = NIL;
-					n->defnames = $5;
-					n->definition = $6;
-					$$ = (Node *)n;
-				}
-			| CREATE COLLATION any_name definition
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_COLLATION;
-					n->args = NIL;
-					n->defnames = $3;
-					n->definition = $4;
-					$$ = (Node *)n;
-				}
-			| CREATE COLLATION any_name FROM any_name
-				{
-					DefineStmt *n = makeNode(DefineStmt);
-					n->kind = OBJECT_COLLATION;
-					n->args = NIL;
-					n->defnames = $3;
-					n->definition = list_make1(makeDefElem("from", (Node *) $5));
-					$$ = (Node *)n;
-				}
-		;
-
-definition: '(' def_list ')'						{ $$ = $2; }
-		;
-
-def_list:  	def_elem								{ $$ = list_make1($1); }
-			| def_list ',' def_elem					{ $$ = lappend($1, $3); }
-		;
-
-def_elem:	ColLabel '=' def_arg
-				{
-					$$ = makeDefElem($1, (Node *) $3);
-				}
-			| ColLabel
-				{
-					$$ = makeDefElem($1, NULL);
-				}
-		;
-
-/* Note: any simple identifier will be returned as a type name! */
-def_arg:	func_type						{ $$ = (Node *)$1; }
-			| reserved_keyword				{ $$ = (Node *)makeString(pstrdup($1)); }
-			| qual_all_Op					{ $$ = (Node *)$1; }
-			| NumericOnly					{ $$ = (Node *)$1; }
-			| Sconst						{ $$ = (Node *)makeString($1); }
-		;
-
-aggr_args:	'(' type_list ')'						{ $$ = $2; }
-			| '(' '*' ')'							{ $$ = NIL; }
-		;
-
-old_aggr_definition: '(' old_aggr_list ')'			{ $$ = $2; }
-		;
-
-old_aggr_list: old_aggr_elem						{ $$ = list_make1($1); }
-			| old_aggr_list ',' old_aggr_elem		{ $$ = lappend($1, $3); }
-		;
-
-/*
- * Must use IDENT here to avoid reduce/reduce conflicts; fortunately none of
- * the item names needed in old aggregate definitions are likely to become
- * SQL keywords.
- */
-old_aggr_elem:  IDENT '=' def_arg
-				{
-					$$ = makeDefElem($1, (Node *)$3);
-				}
-		;
-
-opt_enum_val_list:
-		enum_val_list							{ $$ = $1; }
-		| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-enum_val_list:	Sconst
-				{ $$ = list_make1(makeString($1)); }
-			| enum_val_list ',' Sconst
-				{ $$ = lappend($1, makeString($3)); }
-		;
-
-/*****************************************************************************
- *
- *	ALTER TYPE enumtype ADD ...
- *
- *****************************************************************************/
-
-AlterEnumStmt:
-         ALTER TYPE_P any_name ADD_P VALUE_P Sconst
-			 {
-				 AlterEnumStmt *n = makeNode(AlterEnumStmt);
-				 n->typeName = $3;
-				 n->newVal = $6;
-				 n->newValNeighbor = NULL;
-				 n->newValIsAfter = true;
-				 $$ = (Node *) n;
-			 }
-		 | ALTER TYPE_P any_name ADD_P VALUE_P Sconst BEFORE Sconst
-			 {
-				 AlterEnumStmt *n = makeNode(AlterEnumStmt);
-				 n->typeName = $3;
-				 n->newVal = $6;
-				 n->newValNeighbor = $8;
-				 n->newValIsAfter = false;
-				 $$ = (Node *) n;
-			 }
-		 | ALTER TYPE_P any_name ADD_P VALUE_P Sconst AFTER Sconst
-			 {
-				 AlterEnumStmt *n = makeNode(AlterEnumStmt);
-				 n->typeName = $3;
-				 n->newVal = $6;
-				 n->newValNeighbor = $8;
-				 n->newValIsAfter = true;
-				 $$ = (Node *) n;
-			 }
-		 ;
-
-
-/*****************************************************************************
- *
- *		QUERIES :
- *				CREATE OPERATOR CLASS ...
- *				CREATE OPERATOR FAMILY ...
- *				ALTER OPERATOR FAMILY ...
- *				DROP OPERATOR CLASS ...
- *				DROP OPERATOR FAMILY ...
- *
- *****************************************************************************/
-
-CreateOpClassStmt:
-			CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
-			USING access_method opt_opfamily AS opclass_item_list
-				{
-					CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
-					n->opclassname = $4;
-					n->isDefault = $5;
-					n->datatype = $8;
-					n->amname = $10;
-					n->opfamilyname = $11;
-					n->items = $13;
-					$$ = (Node *) n;
-				}
-		;
-
-opclass_item_list:
-			opclass_item							{ $$ = list_make1($1); }
-			| opclass_item_list ',' opclass_item	{ $$ = lappend($1, $3); }
-		;
-
-opclass_item:
-			OPERATOR Iconst any_operator opclass_purpose opt_recheck
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_OPERATOR;
-					n->name = $3;
-					n->args = NIL;
-					n->number = $2;
-					n->order_family = $4;
-					$$ = (Node *) n;
-				}
-			| OPERATOR Iconst any_operator oper_argtypes opclass_purpose
-			  opt_recheck
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_OPERATOR;
-					n->name = $3;
-					n->args = $4;
-					n->number = $2;
-					n->order_family = $5;
-					$$ = (Node *) n;
-				}
-			| FUNCTION Iconst func_name func_args
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_FUNCTION;
-					n->name = $3;
-					n->args = extractArgTypes($4);
-					n->number = $2;
-					$$ = (Node *) n;
-				}
-			| FUNCTION Iconst '(' type_list ')' func_name func_args
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_FUNCTION;
-					n->name = $6;
-					n->args = extractArgTypes($7);
-					n->number = $2;
-					n->class_args = $4;
-					$$ = (Node *) n;
-				}
-			| STORAGE Typename
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_STORAGETYPE;
-					n->storedtype = $2;
-					$$ = (Node *) n;
-				}
-		;
-
-opt_default:	DEFAULT						{ $$ = TRUE; }
-			| /*EMPTY*/						{ $$ = FALSE; }
-		;
-
-opt_opfamily:	FAMILY any_name				{ $$ = $2; }
-			| /*EMPTY*/						{ $$ = NIL; }
-		;
-
-opclass_purpose: FOR SEARCH					{ $$ = NIL; }
-			| FOR ORDER BY any_name			{ $$ = $4; }
-			| /*EMPTY*/						{ $$ = NIL; }
-		;
-
-opt_recheck:	RECHECK
-				{
-					/*
-					 * RECHECK no longer does anything in opclass definitions,
-					 * but we still accept it to ease porting of old database
-					 * dumps.
-					 */
-					ereport(NOTICE,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("RECHECK is no longer required"),
-							 errhint("Update your data type."),
-							 parser_errposition(@1)));
-					$$ = TRUE;
-				}
-			| /*EMPTY*/						{ $$ = FALSE; }
-		;
-
-
-CreateOpFamilyStmt:
-			CREATE OPERATOR FAMILY any_name USING access_method
-				{
-					CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
-					n->opfamilyname = $4;
-					n->amname = $6;
-					$$ = (Node *) n;
-				}
-		;
-
-AlterOpFamilyStmt:
-			ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list
-				{
-					AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
-					n->opfamilyname = $4;
-					n->amname = $6;
-					n->isDrop = false;
-					n->items = $8;
-					$$ = (Node *) n;
-				}
-			| ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list
-				{
-					AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
-					n->opfamilyname = $4;
-					n->amname = $6;
-					n->isDrop = true;
-					n->items = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-opclass_drop_list:
-			opclass_drop							{ $$ = list_make1($1); }
-			| opclass_drop_list ',' opclass_drop	{ $$ = lappend($1, $3); }
-		;
-
-opclass_drop:
-			OPERATOR Iconst '(' type_list ')'
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_OPERATOR;
-					n->number = $2;
-					n->args = $4;
-					$$ = (Node *) n;
-				}
-			| FUNCTION Iconst '(' type_list ')'
-				{
-					CreateOpClassItem *n = makeNode(CreateOpClassItem);
-					n->itemtype = OPCLASS_ITEM_FUNCTION;
-					n->number = $2;
-					n->args = $4;
-					$$ = (Node *) n;
-				}
-		;
-
-
-DropOpClassStmt:
-			DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
-				{
-					RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
-					n->opclassname = $4;
-					n->amname = $6;
-					n->behavior = $7;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-			| DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
-				{
-					RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
-					n->opclassname = $6;
-					n->amname = $8;
-					n->behavior = $9;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-DropOpFamilyStmt:
-			DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
-				{
-					RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
-					n->opfamilyname = $4;
-					n->amname = $6;
-					n->behavior = $7;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-			| DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
-				{
-					RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
-					n->opfamilyname = $6;
-					n->amname = $8;
-					n->behavior = $9;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:
- *
- *		DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
- *		REASSIGN OWNED BY username [, username ...] TO username
- *
- *****************************************************************************/
-DropOwnedStmt:
-			DROP OWNED BY name_list opt_drop_behavior
-			 	{
-					DropOwnedStmt *n = makeNode(DropOwnedStmt);
-					n->roles = $4;
-					n->behavior = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-ReassignOwnedStmt:
-			REASSIGN OWNED BY name_list TO name
-				{
-					ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
-					n->roles = $4;
-					n->newrole = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-/*****************************************************************************
- *
- *		QUERY:
- *
- *		DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
- *           [ RESTRICT | CASCADE ]
- *
- *****************************************************************************/
-
-DropStmt:	DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
-				{
-					DropStmt *n = makeNode(DropStmt);
-					n->removeType = $2;
-					n->missing_ok = TRUE;
-					n->objects = $5;
-					n->behavior = $6;
-					$$ = (Node *)n;
-				}
-			| DROP drop_type any_name_list opt_drop_behavior
-				{
-					DropStmt *n = makeNode(DropStmt);
-					n->removeType = $2;
-					n->missing_ok = FALSE;
-					n->objects = $3;
-					n->behavior = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-
-drop_type:	TABLE									{ $$ = OBJECT_TABLE; }
-			| SEQUENCE								{ $$ = OBJECT_SEQUENCE; }
-			| VIEW									{ $$ = OBJECT_VIEW; }
-			| INDEX									{ $$ = OBJECT_INDEX; }
-			| FOREIGN TABLE							{ $$ = OBJECT_FOREIGN_TABLE; }
-			| TYPE_P								{ $$ = OBJECT_TYPE; }
-			| DOMAIN_P								{ $$ = OBJECT_DOMAIN; }
-			| COLLATION								{ $$ = OBJECT_COLLATION; }
-			| CONVERSION_P							{ $$ = OBJECT_CONVERSION; }
-			| SCHEMA								{ $$ = OBJECT_SCHEMA; }
-			| EXTENSION								{ $$ = OBJECT_EXTENSION; }
-			| TEXT_P SEARCH PARSER					{ $$ = OBJECT_TSPARSER; }
-			| TEXT_P SEARCH DICTIONARY				{ $$ = OBJECT_TSDICTIONARY; }
-			| TEXT_P SEARCH TEMPLATE				{ $$ = OBJECT_TSTEMPLATE; }
-			| TEXT_P SEARCH CONFIGURATION			{ $$ = OBJECT_TSCONFIGURATION; }
-		;
-
-any_name_list:
-			any_name								{ $$ = list_make1($1); }
-			| any_name_list ',' any_name			{ $$ = lappend($1, $3); }
-		;
-
 any_name:	ColId						{ $$ = list_make1(makeString($1)); }
 			| ColId attrs				{ $$ = lcons(makeString($1), $2); }
 		;
@@ -4772,1006 +525,6 @@ attrs:		'.' attr_name
 					{ $$ = lappend($1, makeString($3)); }
 		;
 
-
-/*****************************************************************************
- *
- *		QUERY:
- *				truncate table relname1, relname2, ...
- *
- *****************************************************************************/
-
-TruncateStmt:
-			TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
-				{
-					TruncateStmt *n = makeNode(TruncateStmt);
-					n->relations = $3;
-					n->restart_seqs = $4;
-					n->behavior = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_restart_seqs:
-			CONTINUE_P IDENTITY_P		{ $$ = false; }
-			| RESTART IDENTITY_P		{ $$ = true; }
-			| /* EMPTY */				{ $$ = false; }
-		;
-
-/*****************************************************************************
- *
- *	The COMMENT ON statement can take different forms based upon the type of
- *	the object associated with the comment. The form of the statement is:
- *
- *	COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW |
- *				   COLLATION | CONVERSION | LANGUAGE | OPERATOR CLASS |
- *				   LARGE OBJECT | CAST | COLUMN | SCHEMA | TABLESPACE |
- *				   EXTENSION | ROLE | TEXT SEARCH PARSER |
- *				   TEXT SEARCH DICTIONARY | TEXT SEARCH TEMPLATE |
- *				   TEXT SEARCH CONFIGURATION | FOREIGN TABLE |
- *				   FOREIGN DATA WRAPPER | SERVER ] <objname> |
- *				 AGGREGATE <aggname> (arg1, ...) |
- *				 FUNCTION <funcname> (arg1, arg2, ...) |
- *				 OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
- *				 TRIGGER <triggername> ON <relname> |
- *				 CONSTRAINT <constraintname> ON <relname> |
- *				 RULE <rulename> ON <relname> ]
- *			   IS 'text'
- *
- *****************************************************************************/
-
-CommentStmt:
-			COMMENT ON comment_type any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = $3;
-					n->objname = $4;
-					n->objargs = NIL;
-					n->comment = $6;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON AGGREGATE func_name aggr_args IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_AGGREGATE;
-					n->objname = $4;
-					n->objargs = $5;
-					n->comment = $7;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON FUNCTION func_name func_args IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_FUNCTION;
-					n->objname = $4;
-					n->objargs = extractArgTypes($5);
-					n->comment = $7;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON OPERATOR any_operator oper_argtypes IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_OPERATOR;
-					n->objname = $4;
-					n->objargs = $5;
-					n->comment = $7;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON CONSTRAINT name ON any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_CONSTRAINT;
-					n->objname = lappend($6, makeString($4));
-					n->objargs = NIL;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON RULE name ON any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_RULE;
-					n->objname = lappend($6, makeString($4));
-					n->objargs = NIL;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON RULE name IS comment_text
-				{
-					/* Obsolete syntax supported for awhile for compatibility */
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_RULE;
-					n->objname = list_make1(makeString($4));
-					n->objargs = NIL;
-					n->comment = $6;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON TRIGGER name ON any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_TRIGGER;
-					n->objname = lappend($6, makeString($4));
-					n->objargs = NIL;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_OPCLASS;
-					n->objname = $5;
-					n->objargs = list_make1(makeString($7));
-					n->comment = $9;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_OPFAMILY;
-					n->objname = $5;
-					n->objargs = list_make1(makeString($7));
-					n->comment = $9;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_LARGEOBJECT;
-					n->objname = list_make1($5);
-					n->objargs = NIL;
-					n->comment = $7;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_CAST;
-					n->objname = list_make1($5);
-					n->objargs = list_make1($7);
-					n->comment = $10;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_LANGUAGE;
-					n->objname = $5;
-					n->objargs = NIL;
-					n->comment = $7;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON TEXT_P SEARCH PARSER any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_TSPARSER;
-					n->objname = $6;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON TEXT_P SEARCH DICTIONARY any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_TSDICTIONARY;
-					n->objname = $6;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON TEXT_P SEARCH TEMPLATE any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_TSTEMPLATE;
-					n->objname = $6;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-			| COMMENT ON TEXT_P SEARCH CONFIGURATION any_name IS comment_text
-				{
-					CommentStmt *n = makeNode(CommentStmt);
-					n->objtype = OBJECT_TSCONFIGURATION;
-					n->objname = $6;
-					n->comment = $8;
-					$$ = (Node *) n;
-				}
-		;
-
-comment_type:
-			COLUMN								{ $$ = OBJECT_COLUMN; }
-			| DATABASE							{ $$ = OBJECT_DATABASE; }
-			| SCHEMA							{ $$ = OBJECT_SCHEMA; }
-			| INDEX								{ $$ = OBJECT_INDEX; }
-			| SEQUENCE							{ $$ = OBJECT_SEQUENCE; }
-			| TABLE								{ $$ = OBJECT_TABLE; }
-			| DOMAIN_P							{ $$ = OBJECT_DOMAIN; }
-			| TYPE_P							{ $$ = OBJECT_TYPE; }
-			| VIEW								{ $$ = OBJECT_VIEW; }
-			| COLLATION							{ $$ = OBJECT_COLLATION; }
-			| CONVERSION_P						{ $$ = OBJECT_CONVERSION; }
-			| TABLESPACE						{ $$ = OBJECT_TABLESPACE; }
-			| EXTENSION 						{ $$ = OBJECT_EXTENSION; }
-			| ROLE								{ $$ = OBJECT_ROLE; }
-			| FOREIGN TABLE						{ $$ = OBJECT_FOREIGN_TABLE; }
-			| SERVER							{ $$ = OBJECT_FOREIGN_SERVER; }
-			| FOREIGN DATA_P WRAPPER			{ $$ = OBJECT_FDW; }
-		;
-
-comment_text:
-			Sconst								{ $$ = $1; }
-			| NULL_P							{ $$ = NULL; }
-		;
-
-
-/*****************************************************************************
- *
- *  SECURITY LABEL [FOR <provider>] ON <object> IS <label>
- *
- *  As with COMMENT ON, <object> can refer to various types of database
- *  objects (e.g. TABLE, COLUMN, etc.).
- *
- *****************************************************************************/
-
-SecLabelStmt:
-			SECURITY LABEL opt_provider ON security_label_type any_name
-			IS security_label
-				{
-					SecLabelStmt *n = makeNode(SecLabelStmt);
-					n->provider = $3;
-					n->objtype = $5;
-					n->objname = $6;
-					n->objargs = NIL;
-					n->label = $8;
-					$$ = (Node *) n;
-				}
-			| SECURITY LABEL opt_provider ON AGGREGATE func_name aggr_args
-			  IS security_label
-				{
-					SecLabelStmt *n = makeNode(SecLabelStmt);
-					n->provider = $3;
-					n->objtype = OBJECT_AGGREGATE;
-					n->objname = $6;
-					n->objargs = $7;
-					n->label = $9;
-					$$ = (Node *) n;
-				}
-			| SECURITY LABEL opt_provider ON FUNCTION func_name func_args
-			  IS security_label
-				{
-					SecLabelStmt *n = makeNode(SecLabelStmt);
-					n->provider = $3;
-					n->objtype = OBJECT_FUNCTION;
-					n->objname = $6;
-					n->objargs = extractArgTypes($7);
-					n->label = $9;
-					$$ = (Node *) n;
-				}
-			| SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly
-			  IS security_label
-				{
-					SecLabelStmt *n = makeNode(SecLabelStmt);
-					n->provider = $3;
-					n->objtype = OBJECT_LARGEOBJECT;
-					n->objname = list_make1($7);
-					n->objargs = NIL;
-					n->label = $9;
-					$$ = (Node *) n;
-				}
-			| SECURITY LABEL opt_provider ON opt_procedural LANGUAGE any_name
-			  IS security_label
-				{
-					SecLabelStmt *n = makeNode(SecLabelStmt);
-					n->provider = $3;
-					n->objtype = OBJECT_LANGUAGE;
-					n->objname = $7;
-					n->objargs = NIL;
-					n->label = $9;
-					$$ = (Node *) n;
-				}
-		;
-
-opt_provider:	FOR ColId_or_Sconst	{ $$ = $2; }
-				| /* empty */		{ $$ = NULL; }
-		;
-
-security_label_type:
-			COLUMN								{ $$ = OBJECT_COLUMN; }
-			| FOREIGN TABLE						{ $$ = OBJECT_FOREIGN_TABLE; }
-			| SCHEMA							{ $$ = OBJECT_SCHEMA; }
-			| SEQUENCE							{ $$ = OBJECT_SEQUENCE; }
-			| TABLE								{ $$ = OBJECT_TABLE; }
-			| DOMAIN_P							{ $$ = OBJECT_TYPE; }
-			| TYPE_P							{ $$ = OBJECT_TYPE; }
-			| VIEW								{ $$ = OBJECT_VIEW; }
-		;
-
-security_label:	Sconst				{ $$ = $1; }
-				| NULL_P			{ $$ = NULL; }
-		;
-
-/*****************************************************************************
- *
- *		QUERY:
- *			fetch/move
- *
- *****************************************************************************/
-
-FetchStmt:	FETCH fetch_args
-				{
-					FetchStmt *n = (FetchStmt *) $2;
-					n->ismove = FALSE;
-					$$ = (Node *)n;
-				}
-			| MOVE fetch_args
-				{
-					FetchStmt *n = (FetchStmt *) $2;
-					n->ismove = TRUE;
-					$$ = (Node *)n;
-				}
-		;
-
-fetch_args:	cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $1;
-					n->direction = FETCH_FORWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $2;
-					n->direction = FETCH_FORWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| NEXT opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_FORWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| PRIOR opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_BACKWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| FIRST_P opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_ABSOLUTE;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| LAST_P opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_ABSOLUTE;
-					n->howMany = -1;
-					$$ = (Node *)n;
-				}
-			| ABSOLUTE_P SignedIconst opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_ABSOLUTE;
-					n->howMany = $2;
-					$$ = (Node *)n;
-				}
-			| RELATIVE_P SignedIconst opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_RELATIVE;
-					n->howMany = $2;
-					$$ = (Node *)n;
-				}
-			| SignedIconst opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_FORWARD;
-					n->howMany = $1;
-					$$ = (Node *)n;
-				}
-			| ALL opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_FORWARD;
-					n->howMany = FETCH_ALL;
-					$$ = (Node *)n;
-				}
-			| FORWARD opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_FORWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| FORWARD SignedIconst opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_FORWARD;
-					n->howMany = $2;
-					$$ = (Node *)n;
-				}
-			| FORWARD ALL opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_FORWARD;
-					n->howMany = FETCH_ALL;
-					$$ = (Node *)n;
-				}
-			| BACKWARD opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $3;
-					n->direction = FETCH_BACKWARD;
-					n->howMany = 1;
-					$$ = (Node *)n;
-				}
-			| BACKWARD SignedIconst opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_BACKWARD;
-					n->howMany = $2;
-					$$ = (Node *)n;
-				}
-			| BACKWARD ALL opt_from_in cursor_name
-				{
-					FetchStmt *n = makeNode(FetchStmt);
-					n->portalname = $4;
-					n->direction = FETCH_BACKWARD;
-					n->howMany = FETCH_ALL;
-					$$ = (Node *)n;
-				}
-		;
-
-from_in:	FROM									{}
-			| IN_P									{}
-		;
-
-opt_from_in:	from_in								{}
-			| /* EMPTY */							{}
-		;
-
-
-/*****************************************************************************
- *
- * GRANT and REVOKE statements
- *
- *****************************************************************************/
-
-GrantStmt:	GRANT privileges ON privilege_target TO grantee_list
-			opt_grant_grant_option
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = true;
-					n->privileges = $2;
-					n->targtype = ($4)->targtype;
-					n->objtype = ($4)->objtype;
-					n->objects = ($4)->objs;
-					n->grantees = $6;
-					n->grant_option = $7;
-					$$ = (Node*)n;
-				}
-		;
-
-RevokeStmt:
-			REVOKE privileges ON privilege_target
-			FROM grantee_list opt_drop_behavior
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = false;
-					n->grant_option = false;
-					n->privileges = $2;
-					n->targtype = ($4)->targtype;
-					n->objtype = ($4)->objtype;
-					n->objects = ($4)->objs;
-					n->grantees = $6;
-					n->behavior = $7;
-					$$ = (Node *)n;
-				}
-			| REVOKE GRANT OPTION FOR privileges ON privilege_target
-			FROM grantee_list opt_drop_behavior
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = false;
-					n->grant_option = true;
-					n->privileges = $5;
-					n->targtype = ($7)->targtype;
-					n->objtype = ($7)->objtype;
-					n->objects = ($7)->objs;
-					n->grantees = $9;
-					n->behavior = $10;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*
- * Privilege names are represented as strings; the validity of the privilege
- * names gets checked at execution.  This is a bit annoying but we have little
- * choice because of the syntactic conflict with lists of role names in
- * GRANT/REVOKE.  What's more, we have to call out in the "privilege"
- * production any reserved keywords that need to be usable as privilege names.
- */
-
-/* either ALL [PRIVILEGES] or a list of individual privileges */
-privileges: privilege_list
-				{ $$ = $1; }
-			| ALL
-				{ $$ = NIL; }
-			| ALL PRIVILEGES
-				{ $$ = NIL; }
-			| ALL '(' columnList ')'
-				{
-					AccessPriv *n = makeNode(AccessPriv);
-					n->priv_name = NULL;
-					n->cols = $3;
-					$$ = list_make1(n);
-				}
-			| ALL PRIVILEGES '(' columnList ')'
-				{
-					AccessPriv *n = makeNode(AccessPriv);
-					n->priv_name = NULL;
-					n->cols = $4;
-					$$ = list_make1(n);
-				}
-		;
-
-privilege_list:	privilege							{ $$ = list_make1($1); }
-			| privilege_list ',' privilege			{ $$ = lappend($1, $3); }
-		;
-
-privilege:	SELECT opt_column_list
-			{
-				AccessPriv *n = makeNode(AccessPriv);
-				n->priv_name = pstrdup($1);
-				n->cols = $2;
-				$$ = n;
-			}
-		| REFERENCES opt_column_list
-			{
-				AccessPriv *n = makeNode(AccessPriv);
-				n->priv_name = pstrdup($1);
-				n->cols = $2;
-				$$ = n;
-			}
-		| CREATE opt_column_list
-			{
-				AccessPriv *n = makeNode(AccessPriv);
-				n->priv_name = pstrdup($1);
-				n->cols = $2;
-				$$ = n;
-			}
-		| ColId opt_column_list
-			{
-				AccessPriv *n = makeNode(AccessPriv);
-				n->priv_name = $1;
-				n->cols = $2;
-				$$ = n;
-			}
-		;
-
-
-/* Don't bother trying to fold the first two rules into one using
- * opt_table.  You're going to get conflicts.
- */
-privilege_target:
-			qualified_name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_RELATION;
-					n->objs = $1;
-					$$ = n;
-				}
-			| TABLE qualified_name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_RELATION;
-					n->objs = $2;
-					$$ = n;
-				}
-			| SEQUENCE qualified_name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_SEQUENCE;
-					n->objs = $2;
-					$$ = n;
-				}
-			| FOREIGN DATA_P WRAPPER name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_FDW;
-					n->objs = $4;
-					$$ = n;
-				}
-			| FOREIGN SERVER name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_FOREIGN_SERVER;
-					n->objs = $3;
-					$$ = n;
-				}
-			| FUNCTION function_with_argtypes_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_FUNCTION;
-					n->objs = $2;
-					$$ = n;
-				}
-			| DATABASE name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_DATABASE;
-					n->objs = $2;
-					$$ = n;
-				}
-			| LANGUAGE name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_LANGUAGE;
-					n->objs = $2;
-					$$ = n;
-				}
-			| LARGE_P OBJECT_P NumericOnly_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_LARGEOBJECT;
-					n->objs = $3;
-					$$ = n;
-				}
-			| SCHEMA name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_NAMESPACE;
-					n->objs = $2;
-					$$ = n;
-				}
-			| TABLESPACE name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_OBJECT;
-					n->objtype = ACL_OBJECT_TABLESPACE;
-					n->objs = $2;
-					$$ = n;
-				}
-			| ALL TABLES IN_P SCHEMA name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
-					n->objtype = ACL_OBJECT_RELATION;
-					n->objs = $5;
-					$$ = n;
-				}
-			| ALL SEQUENCES IN_P SCHEMA name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
-					n->objtype = ACL_OBJECT_SEQUENCE;
-					n->objs = $5;
-					$$ = n;
-				}
-			| ALL FUNCTIONS IN_P SCHEMA name_list
-				{
-					PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
-					n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
-					n->objtype = ACL_OBJECT_FUNCTION;
-					n->objs = $5;
-					$$ = n;
-				}
-		;
-
-
-grantee_list:
-			grantee									{ $$ = list_make1($1); }
-			| grantee_list ',' grantee				{ $$ = lappend($1, $3); }
-		;
-
-grantee:	RoleId
-				{
-					PrivGrantee *n = makeNode(PrivGrantee);
-					/* This hack lets us avoid reserving PUBLIC as a keyword*/
-					if (strcmp($1, "public") == 0)
-						n->rolname = NULL;
-					else
-						n->rolname = $1;
-					$$ = (Node *)n;
-				}
-			| GROUP_P RoleId
-				{
-					PrivGrantee *n = makeNode(PrivGrantee);
-					/* Treat GROUP PUBLIC as a synonym for PUBLIC */
-					if (strcmp($2, "public") == 0)
-						n->rolname = NULL;
-					else
-						n->rolname = $2;
-					$$ = (Node *)n;
-				}
-		;
-
-
-opt_grant_grant_option:
-			WITH GRANT OPTION { $$ = TRUE; }
-			| /*EMPTY*/ { $$ = FALSE; }
-		;
-
-function_with_argtypes_list:
-			function_with_argtypes					{ $$ = list_make1($1); }
-			| function_with_argtypes_list ',' function_with_argtypes
-													{ $$ = lappend($1, $3); }
-		;
-
-function_with_argtypes:
-			func_name func_args
-				{
-					FuncWithArgs *n = makeNode(FuncWithArgs);
-					n->funcname = $1;
-					n->funcargs = extractArgTypes($2);
-					$$ = n;
-				}
-		;
-
-/*****************************************************************************
- *
- * GRANT and REVOKE ROLE statements
- *
- *****************************************************************************/
-
-GrantRoleStmt:
-			GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
-				{
-					GrantRoleStmt *n = makeNode(GrantRoleStmt);
-					n->is_grant = true;
-					n->granted_roles = $2;
-					n->grantee_roles = $4;
-					n->admin_opt = $5;
-					n->grantor = $6;
-					$$ = (Node*)n;
-				}
-		;
-
-RevokeRoleStmt:
-			REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
-				{
-					GrantRoleStmt *n = makeNode(GrantRoleStmt);
-					n->is_grant = false;
-					n->admin_opt = false;
-					n->granted_roles = $2;
-					n->grantee_roles = $4;
-					n->behavior = $6;
-					$$ = (Node*)n;
-				}
-			| REVOKE ADMIN OPTION FOR privilege_list FROM name_list opt_granted_by opt_drop_behavior
-				{
-					GrantRoleStmt *n = makeNode(GrantRoleStmt);
-					n->is_grant = false;
-					n->admin_opt = true;
-					n->granted_roles = $5;
-					n->grantee_roles = $7;
-					n->behavior = $9;
-					$$ = (Node*)n;
-				}
-		;
-
-opt_grant_admin_option: WITH ADMIN OPTION				{ $$ = TRUE; }
-			| /*EMPTY*/									{ $$ = FALSE; }
-		;
-
-opt_granted_by: GRANTED BY RoleId						{ $$ = $3; }
-			| /*EMPTY*/									{ $$ = NULL; }
-		;
-
-/*****************************************************************************
- *
- * ALTER DEFAULT PRIVILEGES statement
- *
- *****************************************************************************/
-
-AlterDefaultPrivilegesStmt:
-			ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
-				{
-					AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt);
-					n->options = $4;
-					n->action = (GrantStmt *) $5;
-					$$ = (Node*)n;
-				}
-		;
-
-DefACLOptionList:
-			DefACLOptionList DefACLOption			{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-DefACLOption:
-			IN_P SCHEMA name_list
-				{
-					$$ = makeDefElem("schemas", (Node *)$3);
-				}
-			| FOR ROLE name_list
-				{
-					$$ = makeDefElem("roles", (Node *)$3);
-				}
-			| FOR USER name_list
-				{
-					$$ = makeDefElem("roles", (Node *)$3);
-				}
-		;
-
-/*
- * This should match GRANT/REVOKE, except that individual target objects
- * are not mentioned and we only allow a subset of object types.
- */
-DefACLAction:
-			GRANT privileges ON defacl_privilege_target TO grantee_list
-			opt_grant_grant_option
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = true;
-					n->privileges = $2;
-					n->targtype = ACL_TARGET_DEFAULTS;
-					n->objtype = $4;
-					n->objects = NIL;
-					n->grantees = $6;
-					n->grant_option = $7;
-					$$ = (Node*)n;
-				}
-			| REVOKE privileges ON defacl_privilege_target
-			FROM grantee_list opt_drop_behavior
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = false;
-					n->grant_option = false;
-					n->privileges = $2;
-					n->targtype = ACL_TARGET_DEFAULTS;
-					n->objtype = $4;
-					n->objects = NIL;
-					n->grantees = $6;
-					n->behavior = $7;
-					$$ = (Node *)n;
-				}
-			| REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target
-			FROM grantee_list opt_drop_behavior
-				{
-					GrantStmt *n = makeNode(GrantStmt);
-					n->is_grant = false;
-					n->grant_option = true;
-					n->privileges = $5;
-					n->targtype = ACL_TARGET_DEFAULTS;
-					n->objtype = $7;
-					n->objects = NIL;
-					n->grantees = $9;
-					n->behavior = $10;
-					$$ = (Node *)n;
-				}
-		;
-
-defacl_privilege_target:
-			TABLES			{ $$ = ACL_OBJECT_RELATION; }
-			| FUNCTIONS		{ $$ = ACL_OBJECT_FUNCTION; }
-			| SEQUENCES		{ $$ = ACL_OBJECT_SEQUENCE; }
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY: CREATE INDEX
- *
- * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
- * willing to make TABLESPACE a fully reserved word.
- *****************************************************************************/
-
-IndexStmt:	CREATE opt_unique INDEX opt_concurrently opt_index_name
-			ON qualified_name access_method_clause '(' index_params ')'
-			opt_reloptions OptTableSpace where_clause
-				{
-					IndexStmt *n = makeNode(IndexStmt);
-					n->unique = $2;
-					n->concurrent = $4;
-					n->idxname = $5;
-					n->relation = $7;
-					n->accessMethod = $8;
-					n->indexParams = $10;
-					n->options = $12;
-					n->tableSpace = $13;
-					n->whereClause = $14;
-					n->indexOid = InvalidOid;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_unique:
-			UNIQUE									{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-opt_concurrently:
-			CONCURRENTLY							{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-opt_index_name:
-			index_name								{ $$ = $1; }
-			| /*EMPTY*/								{ $$ = NULL; }
-		;
-
-access_method_clause:
-			USING access_method						{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = DEFAULT_INDEX_TYPE; }
-		;
-
-index_params:	index_elem							{ $$ = list_make1($1); }
-			| index_params ',' index_elem			{ $$ = lappend($1, $3); }
-		;
-
-/*
- * Index attributes can be either simple column references, or arbitrary
- * expressions in parens.  For backwards-compatibility reasons, we allow
- * an expression that's just a function call to be written without parens.
- */
-index_elem:	ColId opt_collate opt_class opt_asc_desc opt_nulls_order
-				{
-					$$ = makeNode(IndexElem);
-					$$->name = $1;
-					$$->expr = NULL;
-					$$->indexcolname = NULL;
-					$$->collation = $2;
-					$$->opclass = $3;
-					$$->ordering = $4;
-					$$->nulls_ordering = $5;
-				}
-			| func_expr opt_collate opt_class opt_asc_desc opt_nulls_order
-				{
-					$$ = makeNode(IndexElem);
-					$$->name = NULL;
-					$$->expr = $1;
-					$$->indexcolname = NULL;
-					$$->collation = $2;
-					$$->opclass = $3;
-					$$->ordering = $4;
-					$$->nulls_ordering = $5;
-				}
-			| '(' a_expr ')' opt_collate opt_class opt_asc_desc opt_nulls_order
-				{
-					$$ = makeNode(IndexElem);
-					$$->name = NULL;
-					$$->expr = $2;
-					$$->indexcolname = NULL;
-					$$->collation = $4;
-					$$->opclass = $5;
-					$$->ordering = $6;
-					$$->nulls_ordering = $7;
-				}
-		;
-
-opt_collate: COLLATE any_name						{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-opt_class:	any_name								{ $$ = $1; }
-			| USING any_name						{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
 opt_asc_desc: ASC							{ $$ = SORTBY_ASC; }
 			| DESC							{ $$ = SORTBY_DESC; }
 			| /*EMPTY*/						{ $$ = SORTBY_DEFAULT; }
@@ -5782,454 +535,12 @@ opt_nulls_order: NULLS_FIRST				{ $$ = SORTBY_NULLS_FIRST; }
 			| /*EMPTY*/						{ $$ = SORTBY_NULLS_DEFAULT; }
 		;
 
-
-/*****************************************************************************
- *
- *		QUERY:
- *				create [or replace] function <fname>
- *						[(<type-1> { , <type-n>})]
- *						returns <type-r>
- *						as <filename or code in language as appropriate>
- *						language <lang> [with parameters]
- *
- *****************************************************************************/
-
-CreateFunctionStmt:
-			CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
-			RETURNS func_return createfunc_opt_list opt_definition
-				{
-					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
-					n->replace = $2;
-					n->funcname = $4;
-					n->parameters = $5;
-					n->returnType = $7;
-					n->options = $8;
-					n->withClause = $9;
-					$$ = (Node *)n;
-				}
-			| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
-			  RETURNS TABLE '(' table_func_column_list ')' createfunc_opt_list opt_definition
-				{
-					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
-					n->replace = $2;
-					n->funcname = $4;
-					n->parameters = mergeTableFuncParameters($5, $9);
-					n->returnType = TableFuncTypeName($9);
-					n->returnType->location = @7;
-					n->options = $11;
-					n->withClause = $12;
-					$$ = (Node *)n;
-				}
-			| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
-			  createfunc_opt_list opt_definition
-				{
-					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
-					n->replace = $2;
-					n->funcname = $4;
-					n->parameters = $5;
-					n->returnType = NULL;
-					n->options = $6;
-					n->withClause = $7;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_or_replace:
-			OR REPLACE								{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-func_args:	'(' func_args_list ')'					{ $$ = $2; }
-			| '(' ')'								{ $$ = NIL; }
-		;
-
-func_args_list:
-			func_arg								{ $$ = list_make1($1); }
-			| func_args_list ',' func_arg			{ $$ = lappend($1, $3); }
-		;
-
-/*
- * func_args_with_defaults is separate because we only want to accept
- * defaults in CREATE FUNCTION, not in ALTER etc.
- */
-func_args_with_defaults:
-		'(' func_args_with_defaults_list ')'		{ $$ = $2; }
-		| '(' ')'									{ $$ = NIL; }
-		;
-
-func_args_with_defaults_list:
-		func_arg_with_default						{ $$ = list_make1($1); }
-		| func_args_with_defaults_list ',' func_arg_with_default
-													{ $$ = lappend($1, $3); }
-		;
-
-/*
- * The style with arg_class first is SQL99 standard, but Oracle puts
- * param_name first; accept both since it's likely people will try both
- * anyway.  Don't bother trying to save productions by letting arg_class
- * have an empty alternative ... you'll get shift/reduce conflicts.
- *
- * We can catch over-specified arguments here if we want to,
- * but for now better to silently swallow typmod, etc.
- * - thomas 2000-03-22
- */
-func_arg:
-			arg_class param_name func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = $2;
-					n->argType = $3;
-					n->mode = $1;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-			| param_name arg_class func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = $1;
-					n->argType = $3;
-					n->mode = $2;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-			| param_name func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = $1;
-					n->argType = $2;
-					n->mode = FUNC_PARAM_IN;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-			| arg_class func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = NULL;
-					n->argType = $2;
-					n->mode = $1;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-			| func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = NULL;
-					n->argType = $1;
-					n->mode = FUNC_PARAM_IN;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-		;
-
-/* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
-arg_class:	IN_P								{ $$ = FUNC_PARAM_IN; }
-			| OUT_P								{ $$ = FUNC_PARAM_OUT; }
-			| INOUT								{ $$ = FUNC_PARAM_INOUT; }
-			| IN_P OUT_P						{ $$ = FUNC_PARAM_INOUT; }
-			| VARIADIC							{ $$ = FUNC_PARAM_VARIADIC; }
-		;
-
 /*
  * Ideally param_name should be ColId, but that causes too many conflicts.
  */
 param_name:	type_function_name
 		;
 
-func_return:
-			func_type
-				{
-					/* We can catch over-specified results here if we want to,
-					 * but for now better to silently swallow typmod, etc.
-					 * - thomas 2000-03-22
-					 */
-					$$ = $1;
-				}
-		;
-
-/*
- * We would like to make the %TYPE productions here be ColId attrs etc,
- * but that causes reduce/reduce conflicts.  type_function_name
- * is next best choice.
- */
-func_type:	Typename								{ $$ = $1; }
-			| type_function_name attrs '%' TYPE_P
-				{
-					$$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
-					$$->pct_type = true;
-					$$->location = @1;
-				}
-			| SETOF type_function_name attrs '%' TYPE_P
-				{
-					$$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
-					$$->pct_type = true;
-					$$->setof = TRUE;
-					$$->location = @2;
-				}
-		;
-
-func_arg_with_default:
-		func_arg
-			    {
-				    $$ = $1;
-			    }
-		| func_arg DEFAULT a_expr
-			    {
-				    $$ = $1;
-				    $$->defexpr = $3;
-			    }
-		| func_arg '=' a_expr
-			    {
-				    $$ = $1;
-				    $$->defexpr = $3;
-			    }
-		;
-
-
-createfunc_opt_list:
-			/* Must be at least one to prevent conflict */
-			createfunc_opt_item                     { $$ = list_make1($1); }
-			| createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
-	;
-
-/*
- * Options common to both CREATE FUNCTION and ALTER FUNCTION
- */
-common_func_opt_item:
-			CALLED ON NULL_P INPUT_P
-				{
-					$$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
-				}
-			| RETURNS NULL_P ON NULL_P INPUT_P
-				{
-					$$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
-				}
-			| STRICT_P
-				{
-					$$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
-				}
-			| IMMUTABLE
-				{
-					$$ = makeDefElem("volatility", (Node *)makeString("immutable"));
-				}
-			| STABLE
-				{
-					$$ = makeDefElem("volatility", (Node *)makeString("stable"));
-				}
-			| VOLATILE
-				{
-					$$ = makeDefElem("volatility", (Node *)makeString("volatile"));
-				}
-			| EXTERNAL SECURITY DEFINER
-				{
-					$$ = makeDefElem("security", (Node *)makeInteger(TRUE));
-				}
-			| EXTERNAL SECURITY INVOKER
-				{
-					$$ = makeDefElem("security", (Node *)makeInteger(FALSE));
-				}
-			| SECURITY DEFINER
-				{
-					$$ = makeDefElem("security", (Node *)makeInteger(TRUE));
-				}
-			| SECURITY INVOKER
-				{
-					$$ = makeDefElem("security", (Node *)makeInteger(FALSE));
-				}
-			| COST NumericOnly
-				{
-					$$ = makeDefElem("cost", (Node *)$2);
-				}
-			| ROWS NumericOnly
-				{
-					$$ = makeDefElem("rows", (Node *)$2);
-				}
-			| SetResetClause
-				{
-					/* we abuse the normal content of a DefElem here */
-					$$ = makeDefElem("set", (Node *)$1);
-				}
-		;
-
-createfunc_opt_item:
-			AS func_as
-				{
-					$$ = makeDefElem("as", (Node *)$2);
-				}
-			| LANGUAGE ColId_or_Sconst
-				{
-					$$ = makeDefElem("language", (Node *)makeString($2));
-				}
-			| WINDOW
-				{
-					$$ = makeDefElem("window", (Node *)makeInteger(TRUE));
-				}
-			| common_func_opt_item
-				{
-					$$ = $1;
-				}
-		;
-
-func_as:	Sconst						{ $$ = list_make1(makeString($1)); }
-			| Sconst ',' Sconst
-				{
-					$$ = list_make2(makeString($1), makeString($3));
-				}
-		;
-
-opt_definition:
-			WITH definition							{ $$ = $2; }
-			| /*EMPTY*/								{ $$ = NIL; }
-		;
-
-table_func_column:	param_name func_type
-				{
-					FunctionParameter *n = makeNode(FunctionParameter);
-					n->name = $1;
-					n->argType = $2;
-					n->mode = FUNC_PARAM_TABLE;
-					n->defexpr = NULL;
-					$$ = n;
-				}
-		;
-
-table_func_column_list:
-			table_func_column
-				{
-					$$ = list_make1($1);
-				}
-			| table_func_column_list ',' table_func_column
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-/*****************************************************************************
- * ALTER FUNCTION
- *
- * RENAME and OWNER subcommands are already provided by the generic
- * ALTER infrastructure, here we just specify alterations that can
- * only be applied to functions.
- *
- *****************************************************************************/
-AlterFunctionStmt:
-			ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
-				{
-					AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
-					n->func = $3;
-					n->actions = $4;
-					$$ = (Node *) n;
-				}
-		;
-
-alterfunc_opt_list:
-			/* At least one option must be specified */
-			common_func_opt_item					{ $$ = list_make1($1); }
-			| alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
-		;
-
-/* Ignored, merely for SQL compliance */
-opt_restrict:
-			RESTRICT
-			| /* EMPTY */
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:
- *
- *		DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
- *		DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
- *		DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
- *
- *****************************************************************************/
-
-RemoveFuncStmt:
-			DROP FUNCTION func_name func_args opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_FUNCTION;
-					n->name = $3;
-					n->args = extractArgTypes($4);
-					n->behavior = $5;
-					n->missing_ok = false;
-					$$ = (Node *)n;
-				}
-			| DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_FUNCTION;
-					n->name = $5;
-					n->args = extractArgTypes($6);
-					n->behavior = $7;
-					n->missing_ok = true;
-					$$ = (Node *)n;
-				}
-		;
-
-RemoveAggrStmt:
-			DROP AGGREGATE func_name aggr_args opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_AGGREGATE;
-					n->name = $3;
-					n->args = $4;
-					n->behavior = $5;
-					n->missing_ok = false;
-					$$ = (Node *)n;
-				}
-			| DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_AGGREGATE;
-					n->name = $5;
-					n->args = $6;
-					n->behavior = $7;
-					n->missing_ok = true;
-					$$ = (Node *)n;
-				}
-		;
-
-RemoveOperStmt:
-			DROP OPERATOR any_operator oper_argtypes opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_OPERATOR;
-					n->name = $3;
-					n->args = $4;
-					n->behavior = $5;
-					n->missing_ok = false;
-					$$ = (Node *)n;
-				}
-			| DROP OPERATOR IF_P EXISTS any_operator oper_argtypes opt_drop_behavior
-				{
-					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
-					n->kind = OBJECT_OPERATOR;
-					n->name = $5;
-					n->args = $6;
-					n->behavior = $7;
-					n->missing_ok = true;
-					$$ = (Node *)n;
-				}
-		;
-
-oper_argtypes:
-			'(' Typename ')'
-				{
-				   ereport(ERROR,
-						   (errcode(ERRCODE_SYNTAX_ERROR),
-							errmsg("missing argument"),
-							errhint("Use NONE to denote the missing argument of a unary operator."),
-							parser_errposition(@3)));
-				}
-			| '(' Typename ',' Typename ')'
-					{ $$ = list_make2($2, $4); }
-			| '(' NONE ',' Typename ')'					/* left unary */
-					{ $$ = list_make2(NULL, $4); }
-			| '(' Typename ',' NONE ')'					/* right unary */
-					{ $$ = list_make2($2, NULL); }
-		;
-
 any_operator:
 			all_Op
 					{ $$ = list_make1(makeString($1)); }
@@ -6237,1723 +548,11 @@ any_operator:
 					{ $$ = lcons(makeString($1), $3); }
 		;
 
-/*****************************************************************************
- *
- *		DO <anonymous code block> [ LANGUAGE language ]
- *
- * We use a DefElem list for future extensibility, and to allow flexibility
- * in the clause order.
- *
- *****************************************************************************/
-
-DoStmt: DO dostmt_opt_list
-				{
-					DoStmt *n = makeNode(DoStmt);
-					n->args = $2;
-					$$ = (Node *)n;
-				}
-		;
-
-dostmt_opt_list:
-			dostmt_opt_item						{ $$ = list_make1($1); }
-			| dostmt_opt_list dostmt_opt_item	{ $$ = lappend($1, $2); }
-		;
-
-dostmt_opt_item:
-			Sconst
-				{
-					$$ = makeDefElem("as", (Node *)makeString($1));
-				}
-			| LANGUAGE ColId_or_Sconst
-				{
-					$$ = makeDefElem("language", (Node *)makeString($2));
-				}
-		;
-
-/*****************************************************************************
- *
- *		CREATE CAST / DROP CAST
- *
- *****************************************************************************/
-
-CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
-					WITH FUNCTION function_with_argtypes cast_context
-				{
-					CreateCastStmt *n = makeNode(CreateCastStmt);
-					n->sourcetype = $4;
-					n->targettype = $6;
-					n->func = $10;
-					n->context = (CoercionContext) $11;
-					n->inout = false;
-					$$ = (Node *)n;
-				}
-			| CREATE CAST '(' Typename AS Typename ')'
-					WITHOUT FUNCTION cast_context
-				{
-					CreateCastStmt *n = makeNode(CreateCastStmt);
-					n->sourcetype = $4;
-					n->targettype = $6;
-					n->func = NULL;
-					n->context = (CoercionContext) $10;
-					n->inout = false;
-					$$ = (Node *)n;
-				}
-			| CREATE CAST '(' Typename AS Typename ')'
-					WITH INOUT cast_context
-				{
-					CreateCastStmt *n = makeNode(CreateCastStmt);
-					n->sourcetype = $4;
-					n->targettype = $6;
-					n->func = NULL;
-					n->context = (CoercionContext) $10;
-					n->inout = true;
-					$$ = (Node *)n;
-				}
-		;
-
-cast_context:  AS IMPLICIT_P					{ $$ = COERCION_IMPLICIT; }
-		| AS ASSIGNMENT							{ $$ = COERCION_ASSIGNMENT; }
-		| /*EMPTY*/								{ $$ = COERCION_EXPLICIT; }
-		;
-
-
-DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
-				{
-					DropCastStmt *n = makeNode(DropCastStmt);
-					n->sourcetype = $5;
-					n->targettype = $7;
-					n->behavior = $9;
-					n->missing_ok = $3;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_if_exists: IF_P EXISTS						{ $$ = TRUE; }
-		| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:
- *
- *		REINDEX type <name> [FORCE]
- *
- * FORCE no longer does anything, but we accept it for backwards compatibility
- *****************************************************************************/
-
-ReindexStmt:
-			REINDEX reindex_type qualified_name opt_force
-				{
-					ReindexStmt *n = makeNode(ReindexStmt);
-					n->kind = $2;
-					n->relation = $3;
-					n->name = NULL;
-					$$ = (Node *)n;
-				}
-			| REINDEX SYSTEM_P name opt_force
-				{
-					ReindexStmt *n = makeNode(ReindexStmt);
-					n->kind = OBJECT_DATABASE;
-					n->name = $3;
-					n->relation = NULL;
-					n->do_system = true;
-					n->do_user = false;
-					$$ = (Node *)n;
-				}
-			| REINDEX DATABASE name opt_force
-				{
-					ReindexStmt *n = makeNode(ReindexStmt);
-					n->kind = OBJECT_DATABASE;
-					n->name = $3;
-					n->relation = NULL;
-					n->do_system = true;
-					n->do_user = true;
-					$$ = (Node *)n;
-				}
-		;
-
-reindex_type:
-			INDEX									{ $$ = OBJECT_INDEX; }
-			| TABLE									{ $$ = OBJECT_TABLE; }
-		;
-
-opt_force:	FORCE									{  $$ = TRUE; }
-			| /* EMPTY */							{  $$ = FALSE; }
-		;
-
-
-/*****************************************************************************
- *
- * ALTER THING name RENAME TO newname
- *
- *****************************************************************************/
-
-RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_AGGREGATE;
-					n->object = $3;
-					n->objarg = $4;
-					n->newname = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER COLLATION any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_COLLATION;
-					n->object = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER CONVERSION_P any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_CONVERSION;
-					n->object = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER DATABASE database_name RENAME TO database_name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_DATABASE;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER FUNCTION function_with_argtypes RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_FUNCTION;
-					n->object = $3->funcname;
-					n->objarg = $3->funcargs;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER GROUP_P RoleId RENAME TO RoleId
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_ROLE;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER opt_procedural LANGUAGE name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_LANGUAGE;
-					n->subname = $4;
-					n->newname = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_OPCLASS;
-					n->object = $4;
-					n->subname = $6;
-					n->newname = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_OPFAMILY;
-					n->object = $4;
-					n->subname = $6;
-					n->newname = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER SCHEMA name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_SCHEMA;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLE relation_expr RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TABLE;
-					n->relation = $3;
-					n->subname = NULL;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER SEQUENCE qualified_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_SEQUENCE;
-					n->relation = $3;
-					n->subname = NULL;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER VIEW qualified_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_VIEW;
-					n->relation = $3;
-					n->subname = NULL;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER INDEX qualified_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_INDEX;
-					n->relation = $3;
-					n->subname = NULL;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER FOREIGN TABLE relation_expr RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_FOREIGN_TABLE;
-					n->relation = $4;
-					n->subname = NULL;
-					n->newname = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLE relation_expr RENAME opt_column name TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_COLUMN;
-					n->relationType = OBJECT_TABLE;
-					n->relation = $3;
-					n->subname = $6;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_COLUMN;
-					n->relationType = OBJECT_FOREIGN_TABLE;
-					n->relation = $4;
-					n->subname = $7;
-					n->newname = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER TRIGGER name ON qualified_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TRIGGER;
-					n->relation = $5;
-					n->subname = $3;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER ROLE RoleId RENAME TO RoleId
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_ROLE;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER USER RoleId RENAME TO RoleId
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_ROLE;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLESPACE name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TABLESPACE;
-					n->subname = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLESPACE name SET reloptions
-				{
-					AlterTableSpaceOptionsStmt *n =
-						makeNode(AlterTableSpaceOptionsStmt);
-					n->tablespacename = $3;
-					n->options = $5;
-					n->isReset = FALSE;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLESPACE name RESET reloptions
-				{
-					AlterTableSpaceOptionsStmt *n =
-						makeNode(AlterTableSpaceOptionsStmt);
-					n->tablespacename = $3;
-					n->options = $5;
-					n->isReset = TRUE;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TSPARSER;
-					n->object = $5;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TSDICTIONARY;
-					n->object = $5;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TSTEMPLATE;
-					n->object = $5;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TSCONFIGURATION;
-					n->object = $5;
-					n->newname = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TYPE_P any_name RENAME TO name
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_TYPE;
-					n->object = $3;
-					n->newname = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
-				{
-					RenameStmt *n = makeNode(RenameStmt);
-					n->renameType = OBJECT_ATTRIBUTE;
-					n->relationType = OBJECT_TYPE;
-					n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
-					n->subname = $6;
-					n->newname = $8;
-					n->behavior = $9;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_column: COLUMN									{ $$ = COLUMN; }
-			| /*EMPTY*/								{ $$ = 0; }
-		;
-
-opt_set_data: SET DATA_P							{ $$ = 1; }
-			| /*EMPTY*/								{ $$ = 0; }
-		;
-
-/*****************************************************************************
- *
- * ALTER THING name SET SCHEMA name
- *
- *****************************************************************************/
-
-AlterObjectSchemaStmt:
-			ALTER AGGREGATE func_name aggr_args SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_AGGREGATE;
-					n->object = $3;
-					n->objarg = $4;
-					n->newschema = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER COLLATION any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_COLLATION;
-					n->object = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER CONVERSION_P any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_CONVERSION;
-					n->object = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER DOMAIN_P any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_DOMAIN;
-					n->object = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER EXTENSION any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_EXTENSION;
-					n->object = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER FUNCTION function_with_argtypes SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_FUNCTION;
-					n->object = $3->funcname;
-					n->objarg = $3->funcargs;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR any_operator oper_argtypes SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_OPERATOR;
-					n->object = $3;
-					n->objarg = $4;
-					n->newschema = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR CLASS any_name USING access_method SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_OPCLASS;
-					n->object = $4;
-					n->addname = $6;
-					n->newschema = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR FAMILY any_name USING access_method SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_OPFAMILY;
-					n->object = $4;
-					n->addname = $6;
-					n->newschema = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLE relation_expr SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TABLE;
-					n->relation = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TSPARSER;
-					n->object = $5;
-					n->newschema = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TSDICTIONARY;
-					n->object = $5;
-					n->newschema = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TSTEMPLATE;
-					n->object = $5;
-					n->newschema = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TSCONFIGURATION;
-					n->object = $5;
-					n->newschema = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER SEQUENCE qualified_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_SEQUENCE;
-					n->relation = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER VIEW qualified_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_VIEW;
-					n->relation = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER FOREIGN TABLE relation_expr SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_FOREIGN_TABLE;
-					n->relation = $4;
-					n->newschema = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER TYPE_P any_name SET SCHEMA name
-				{
-					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
-					n->objectType = OBJECT_TYPE;
-					n->object = $3;
-					n->newschema = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-/*****************************************************************************
- *
- * ALTER THING name OWNER TO newname
- *
- *****************************************************************************/
-
-AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_AGGREGATE;
-					n->object = $3;
-					n->objarg = $4;
-					n->newowner = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER COLLATION any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_COLLATION;
-					n->object = $3;
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER CONVERSION_P any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_CONVERSION;
-					n->object = $3;
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER DATABASE database_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_DATABASE;
-					n->object = list_make1(makeString($3));
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER DOMAIN_P any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_DOMAIN;
-					n->object = $3;
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER FUNCTION function_with_argtypes OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_FUNCTION;
-					n->object = $3->funcname;
-					n->objarg = $3->funcargs;
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER opt_procedural LANGUAGE name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_LANGUAGE;
-					n->object = list_make1(makeString($4));
-					n->newowner = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_LARGEOBJECT;
-					n->object = list_make1($4);
-					n->newowner = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR any_operator oper_argtypes OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_OPERATOR;
-					n->object = $3;
-					n->objarg = $4;
-					n->newowner = $7;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_OPCLASS;
-					n->object = $4;
-					n->addname = $6;
-					n->newowner = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_OPFAMILY;
-					n->object = $4;
-					n->addname = $6;
-					n->newowner = $9;
-					$$ = (Node *)n;
-				}
-			| ALTER SCHEMA name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_SCHEMA;
-					n->object = list_make1(makeString($3));
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TYPE_P any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_TYPE;
-					n->object = $3;
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TABLESPACE name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_TABLESPACE;
-					n->object = list_make1(makeString($3));
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_TSDICTIONARY;
-					n->object = $5;
-					n->newowner = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_TSCONFIGURATION;
-					n->object = $5;
-					n->newowner = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_FDW;
-					n->object = list_make1(makeString($5));
-					n->newowner = $8;
-					$$ = (Node *)n;
-				}
-			| ALTER SERVER name OWNER TO RoleId
-				{
-					AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
-					n->objectType = OBJECT_FOREIGN_SERVER;
-					n->object = list_make1(makeString($3));
-					n->newowner = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:	Define Rewrite Rule
- *
- *****************************************************************************/
-
-RuleStmt:	CREATE opt_or_replace RULE name AS
-			ON event TO qualified_name where_clause
-			DO opt_instead RuleActionList
-				{
-					RuleStmt *n = makeNode(RuleStmt);
-					n->replace = $2;
-					n->relation = $9;
-					n->rulename = $4;
-					n->whereClause = $10;
-					n->event = $7;
-					n->instead = $12;
-					n->actions = $13;
-					$$ = (Node *)n;
-				}
-		;
-
-RuleActionList:
-			NOTHING									{ $$ = NIL; }
-			| RuleActionStmt						{ $$ = list_make1($1); }
-			| '(' RuleActionMulti ')'				{ $$ = $2; }
-		;
-
-/* the thrashing around here is to discard "empty" statements... */
-RuleActionMulti:
-			RuleActionMulti ';' RuleActionStmtOrEmpty
-				{ if ($3 != NULL)
-					$$ = lappend($1, $3);
-				  else
-					$$ = $1;
-				}
-			| RuleActionStmtOrEmpty
-				{ if ($1 != NULL)
-					$$ = list_make1($1);
-				  else
-					$$ = NIL;
-				}
-		;
-
-RuleActionStmt:
-			SelectStmt
-			| InsertStmt
-			| UpdateStmt
-			| DeleteStmt
-			| NotifyStmt
-		;
-
-RuleActionStmtOrEmpty:
-			RuleActionStmt							{ $$ = $1; }
-			|	/*EMPTY*/							{ $$ = NULL; }
-		;
-
-event:		SELECT									{ $$ = CMD_SELECT; }
-			| UPDATE								{ $$ = CMD_UPDATE; }
-			| DELETE_P								{ $$ = CMD_DELETE; }
-			| INSERT								{ $$ = CMD_INSERT; }
-		 ;
-
-opt_instead:
-			INSTEAD									{ $$ = TRUE; }
-			| ALSO									{ $$ = FALSE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-
-DropRuleStmt:
-			DROP RULE name ON qualified_name opt_drop_behavior
-				{
-					DropPropertyStmt *n = makeNode(DropPropertyStmt);
-					n->relation = $5;
-					n->property = $3;
-					n->behavior = $6;
-					n->removeType = OBJECT_RULE;
-					n->missing_ok = false;
-					$$ = (Node *) n;
-				}
-			| DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
-				{
-					DropPropertyStmt *n = makeNode(DropPropertyStmt);
-					n->relation = $7;
-					n->property = $5;
-					n->behavior = $8;
-					n->removeType = OBJECT_RULE;
-					n->missing_ok = true;
-					$$ = (Node *) n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:
- *				NOTIFY <identifier> can appear both in rule bodies and
- *				as a query-level command
- *
- *****************************************************************************/
-
-NotifyStmt: NOTIFY ColId notify_payload
-				{
-					NotifyStmt *n = makeNode(NotifyStmt);
-					n->conditionname = $2;
-					n->payload = $3;
-					$$ = (Node *)n;
-				}
-		;
-
-notify_payload:
-			',' Sconst							{ $$ = $2; }
-			| /*EMPTY*/							{ $$ = NULL; }
-		;
-
-ListenStmt: LISTEN ColId
-				{
-					ListenStmt *n = makeNode(ListenStmt);
-					n->conditionname = $2;
-					$$ = (Node *)n;
-				}
-		;
-
-UnlistenStmt:
-			UNLISTEN ColId
-				{
-					UnlistenStmt *n = makeNode(UnlistenStmt);
-					n->conditionname = $2;
-					$$ = (Node *)n;
-				}
-			| UNLISTEN '*'
-				{
-					UnlistenStmt *n = makeNode(UnlistenStmt);
-					n->conditionname = NULL;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		Transactions:
- *
- *		BEGIN / COMMIT / ROLLBACK
- *		(also older versions END / ABORT)
- *
- *****************************************************************************/
-
-TransactionStmt:
-			ABORT_P opt_transaction
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_ROLLBACK;
-					n->options = NIL;
-					$$ = (Node *)n;
-				}
-			| BEGIN_P opt_transaction transaction_mode_list_or_empty
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_BEGIN;
-					n->options = $3;
-					$$ = (Node *)n;
-				}
-			| START TRANSACTION transaction_mode_list_or_empty
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_START;
-					n->options = $3;
-					$$ = (Node *)n;
-				}
-			| COMMIT opt_transaction
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_COMMIT;
-					n->options = NIL;
-					$$ = (Node *)n;
-				}
-			| END_P opt_transaction
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_COMMIT;
-					n->options = NIL;
-					$$ = (Node *)n;
-				}
-			| ROLLBACK opt_transaction
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_ROLLBACK;
-					n->options = NIL;
-					$$ = (Node *)n;
-				}
-			| SAVEPOINT ColId
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_SAVEPOINT;
-					n->options = list_make1(makeDefElem("savepoint_name",
-														(Node *)makeString($2)));
-					$$ = (Node *)n;
-				}
-			| RELEASE SAVEPOINT ColId
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_RELEASE;
-					n->options = list_make1(makeDefElem("savepoint_name",
-														(Node *)makeString($3)));
-					$$ = (Node *)n;
-				}
-			| RELEASE ColId
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_RELEASE;
-					n->options = list_make1(makeDefElem("savepoint_name",
-														(Node *)makeString($2)));
-					$$ = (Node *)n;
-				}
-			| ROLLBACK opt_transaction TO SAVEPOINT ColId
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_ROLLBACK_TO;
-					n->options = list_make1(makeDefElem("savepoint_name",
-														(Node *)makeString($5)));
-					$$ = (Node *)n;
-				}
-			| ROLLBACK opt_transaction TO ColId
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_ROLLBACK_TO;
-					n->options = list_make1(makeDefElem("savepoint_name",
-														(Node *)makeString($4)));
-					$$ = (Node *)n;
-				}
-			| PREPARE TRANSACTION Sconst
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_PREPARE;
-					n->gid = $3;
-					$$ = (Node *)n;
-				}
-			| COMMIT PREPARED Sconst
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_COMMIT_PREPARED;
-					n->gid = $3;
-					$$ = (Node *)n;
-				}
-			| ROLLBACK PREPARED Sconst
-				{
-					TransactionStmt *n = makeNode(TransactionStmt);
-					n->kind = TRANS_STMT_ROLLBACK_PREPARED;
-					n->gid = $3;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_transaction:	WORK							{}
-			| TRANSACTION							{}
-			| /*EMPTY*/								{}
-		;
-
-transaction_mode_item:
-			ISOLATION LEVEL iso_level
-					{ $$ = makeDefElem("transaction_isolation",
-									   makeStringConst($3, @3)); }
-			| READ ONLY
-					{ $$ = makeDefElem("transaction_read_only",
-									   makeIntConst(TRUE, @1)); }
-			| READ WRITE
-					{ $$ = makeDefElem("transaction_read_only",
-									   makeIntConst(FALSE, @1)); }
-			| DEFERRABLE
-					{ $$ = makeDefElem("transaction_deferrable",
-									   makeIntConst(TRUE, @1)); }
-			| NOT DEFERRABLE
-					{ $$ = makeDefElem("transaction_deferrable",
-									   makeIntConst(FALSE, @1)); }
-		;
-
-/* Syntax with commas is SQL-spec, without commas is Postgres historical */
-transaction_mode_list:
-			transaction_mode_item
-					{ $$ = list_make1($1); }
-			| transaction_mode_list ',' transaction_mode_item
-					{ $$ = lappend($1, $3); }
-			| transaction_mode_list transaction_mode_item
-					{ $$ = lappend($1, $2); }
-		;
-
-transaction_mode_list_or_empty:
-			transaction_mode_list
-			| /* EMPTY */
-					{ $$ = NIL; }
-		;
-
-
-/*****************************************************************************
- *
- *	QUERY:
- *		CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
- *			AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
- *
- *****************************************************************************/
-
-ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
-				AS SelectStmt opt_check_option
-				{
-					ViewStmt *n = makeNode(ViewStmt);
-					n->view = $4;
-					n->view->relpersistence = $2;
-					n->aliases = $5;
-					n->query = $7;
-					n->replace = false;
-					$$ = (Node *) n;
-				}
-		| CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list
-				AS SelectStmt opt_check_option
-				{
-					ViewStmt *n = makeNode(ViewStmt);
-					n->view = $6;
-					n->view->relpersistence = $4;
-					n->aliases = $7;
-					n->query = $9;
-					n->replace = true;
-					$$ = (Node *) n;
-				}
-		;
-
-opt_check_option:
-		WITH CHECK OPTION
-				{
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("WITH CHECK OPTION is not implemented")));
-				}
-		| WITH CASCADED CHECK OPTION
-				{
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("WITH CHECK OPTION is not implemented")));
-				}
-		| WITH LOCAL CHECK OPTION
-				{
-					ereport(ERROR,
-							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("WITH CHECK OPTION is not implemented")));
-				}
-		| /* EMPTY */							{ $$ = NIL; }
-		;
-
-/*****************************************************************************
- *
- *		QUERY:
- *				LOAD "filename"
- *
- *****************************************************************************/
-
-LoadStmt:	LOAD file_name
-				{
-					LoadStmt *n = makeNode(LoadStmt);
-					n->filename = $2;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		CREATE DATABASE
- *
- *****************************************************************************/
-
-CreatedbStmt:
-			CREATE DATABASE database_name opt_with createdb_opt_list
-				{
-					CreatedbStmt *n = makeNode(CreatedbStmt);
-					n->dbname = $3;
-					n->options = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-createdb_opt_list:
-			createdb_opt_list createdb_opt_item		{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-createdb_opt_item:
-			TABLESPACE opt_equal name
-				{
-					$$ = makeDefElem("tablespace", (Node *)makeString($3));
-				}
-			| TABLESPACE opt_equal DEFAULT
-				{
-					$$ = makeDefElem("tablespace", NULL);
-				}
-			| LOCATION opt_equal Sconst
-				{
-					$$ = makeDefElem("location", (Node *)makeString($3));
-				}
-			| LOCATION opt_equal DEFAULT
-				{
-					$$ = makeDefElem("location", NULL);
-				}
-			| TEMPLATE opt_equal name
-				{
-					$$ = makeDefElem("template", (Node *)makeString($3));
-				}
-			| TEMPLATE opt_equal DEFAULT
-				{
-					$$ = makeDefElem("template", NULL);
-				}
-			| ENCODING opt_equal Sconst
-				{
-					$$ = makeDefElem("encoding", (Node *)makeString($3));
-				}
-			| ENCODING opt_equal Iconst
-				{
-					$$ = makeDefElem("encoding", (Node *)makeInteger($3));
-				}
-			| ENCODING opt_equal DEFAULT
-				{
-					$$ = makeDefElem("encoding", NULL);
-				}
-			| LC_COLLATE_P opt_equal Sconst
-				{
-					$$ = makeDefElem("lc_collate", (Node *)makeString($3));
-				}
-			| LC_COLLATE_P opt_equal DEFAULT
-				{
-					$$ = makeDefElem("lc_collate", NULL);
-				}
-			| LC_CTYPE_P opt_equal Sconst
-				{
-					$$ = makeDefElem("lc_ctype", (Node *)makeString($3));
-				}
-			| LC_CTYPE_P opt_equal DEFAULT
-				{
-					$$ = makeDefElem("lc_ctype", NULL);
-				}
-			| CONNECTION LIMIT opt_equal SignedIconst
-				{
-					$$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
-				}
-			| OWNER opt_equal name
-				{
-					$$ = makeDefElem("owner", (Node *)makeString($3));
-				}
-			| OWNER opt_equal DEFAULT
-				{
-					$$ = makeDefElem("owner", NULL);
-				}
-		;
-
-/*
- *	Though the equals sign doesn't match other WITH options, pg_dump uses
- *	equals for backward compatibility, and it doesn't seem worth removing it.
- */
-opt_equal:	'='										{}
-			| /*EMPTY*/								{}
-		;
-
-
-/*****************************************************************************
- *
- *		ALTER DATABASE
- *
- *****************************************************************************/
-
-AlterDatabaseStmt:
-			ALTER DATABASE database_name opt_with alterdb_opt_list
-				 {
-					AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
-					n->dbname = $3;
-					n->options = $5;
-					$$ = (Node *)n;
-				 }
-			| ALTER DATABASE database_name SET TABLESPACE name
-				 {
-					AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
-					n->dbname = $3;
-					n->options = list_make1(makeDefElem("tablespace",
-													(Node *)makeString($6)));
-					$$ = (Node *)n;
-				 }
-		;
-
-AlterDatabaseSetStmt:
-			ALTER DATABASE database_name SetResetClause
-				{
-					AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
-					n->dbname = $3;
-					n->setstmt = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-
-alterdb_opt_list:
-			alterdb_opt_list alterdb_opt_item		{ $$ = lappend($1, $2); }
-			| /* EMPTY */							{ $$ = NIL; }
-		;
-
-alterdb_opt_item:
-			CONNECTION LIMIT opt_equal SignedIconst
-				{
-					$$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
-				}
-		;
-
-
-/*****************************************************************************
- *
- *		DROP DATABASE [ IF EXISTS ]
- *
- * This is implicitly CASCADE, no need for drop behavior
- *****************************************************************************/
-
-DropdbStmt: DROP DATABASE database_name
-				{
-					DropdbStmt *n = makeNode(DropdbStmt);
-					n->dbname = $3;
-					n->missing_ok = FALSE;
-					$$ = (Node *)n;
-				}
-			| DROP DATABASE IF_P EXISTS database_name
-				{
-					DropdbStmt *n = makeNode(DropdbStmt);
-					n->dbname = $5;
-					n->missing_ok = TRUE;
-					$$ = (Node *)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Manipulate a domain
- *
- *****************************************************************************/
-
-CreateDomainStmt:
-			CREATE DOMAIN_P any_name opt_as Typename ColQualList
-				{
-					CreateDomainStmt *n = makeNode(CreateDomainStmt);
-					n->domainname = $3;
-					n->typeName = $5;
-					SplitColQualList($6, &n->constraints, &n->collClause,
-									 yyscanner);
-					$$ = (Node *)n;
-				}
-		;
-
-AlterDomainStmt:
-			/* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
-			ALTER DOMAIN_P any_name alter_column_default
-				{
-					AlterDomainStmt *n = makeNode(AlterDomainStmt);
-					n->subtype = 'T';
-					n->typeName = $3;
-					n->def = $4;
-					$$ = (Node *)n;
-				}
-			/* ALTER DOMAIN <domain> DROP NOT NULL */
-			| ALTER DOMAIN_P any_name DROP NOT NULL_P
-				{
-					AlterDomainStmt *n = makeNode(AlterDomainStmt);
-					n->subtype = 'N';
-					n->typeName = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER DOMAIN <domain> SET NOT NULL */
-			| ALTER DOMAIN_P any_name SET NOT NULL_P
-				{
-					AlterDomainStmt *n = makeNode(AlterDomainStmt);
-					n->subtype = 'O';
-					n->typeName = $3;
-					$$ = (Node *)n;
-				}
-			/* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
-			| ALTER DOMAIN_P any_name ADD_P TableConstraint
-				{
-					AlterDomainStmt *n = makeNode(AlterDomainStmt);
-					n->subtype = 'C';
-					n->typeName = $3;
-					n->def = $5;
-					$$ = (Node *)n;
-				}
-			/* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
-			| ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
-				{
-					AlterDomainStmt *n = makeNode(AlterDomainStmt);
-					n->subtype = 'X';
-					n->typeName = $3;
-					n->name = $6;
-					n->behavior = $7;
-					$$ = (Node *)n;
-				}
-			;
-
-opt_as:		AS										{}
-			| /* EMPTY */							{}
-		;
-
-
-/*****************************************************************************
- *
- * Manipulate a text search dictionary or configuration
- *
- *****************************************************************************/
-
-AlterTSDictionaryStmt:
-			ALTER TEXT_P SEARCH DICTIONARY any_name definition
-				{
-					AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
-					n->dictname = $5;
-					n->options = $6;
-					$$ = (Node *)n;
-				}
-		;
-
-AlterTSConfigurationStmt:
-			ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = $9;
-					n->dicts = $11;
-					n->override = false;
-					n->replace = false;
-					$$ = (Node*)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list WITH any_name_list
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = $9;
-					n->dicts = $11;
-					n->override = true;
-					n->replace = false;
-					$$ = (Node*)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name WITH any_name
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = NIL;
-					n->dicts = list_make2($9,$11);
-					n->override = false;
-					n->replace = true;
-					$$ = (Node*)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name WITH any_name
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = $9;
-					n->dicts = list_make2($11,$13);
-					n->override = false;
-					n->replace = true;
-					$$ = (Node*)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = $9;
-					n->missing_ok = false;
-					$$ = (Node*)n;
-				}
-			| ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
-				{
-					AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
-					n->cfgname = $5;
-					n->tokentype = $11;
-					n->missing_ok = true;
-					$$ = (Node*)n;
-				}
-		;
-
-
-/*****************************************************************************
- *
- * Manipulate a conversion
- *
- *		CREATE [DEFAULT] CONVERSION <conversion_name>
- *		FOR <encoding_name> TO <encoding_name> FROM <func_name>
- *
- *****************************************************************************/
-
-CreateConversionStmt:
-			CREATE opt_default CONVERSION_P any_name FOR Sconst
-			TO Sconst FROM any_name
-			{
-			  CreateConversionStmt *n = makeNode(CreateConversionStmt);
-			  n->conversion_name = $4;
-			  n->for_encoding_name = $6;
-			  n->to_encoding_name = $8;
-			  n->func_name = $10;
-			  n->def = $2;
-			  $$ = (Node *)n;
-			}
-		;
-
-/*****************************************************************************
- *
- *		QUERY:
- *				CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ]
- *				CLUSTER [VERBOSE]
- *				CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
- *
- *****************************************************************************/
-
-ClusterStmt:
-			CLUSTER opt_verbose qualified_name cluster_index_specification
-				{
-			       ClusterStmt *n = makeNode(ClusterStmt);
-				   n->relation = $3;
-				   n->indexname = $4;
-				   n->verbose = $2;
-				   $$ = (Node*)n;
-				}
-			| CLUSTER opt_verbose
-			    {
-				   ClusterStmt *n = makeNode(ClusterStmt);
-				   n->relation = NULL;
-				   n->indexname = NULL;
-				   n->verbose = $2;
-				   $$ = (Node*)n;
-				}
-			/* kept for pre-8.3 compatibility */
-			| CLUSTER opt_verbose index_name ON qualified_name
-				{
-				   ClusterStmt *n = makeNode(ClusterStmt);
-				   n->relation = $5;
-				   n->indexname = $3;
-				   n->verbose = $2;
-				   $$ = (Node*)n;
-				}
-		;
-
-cluster_index_specification:
-			USING index_name		{ $$ = $2; }
-			| /*EMPTY*/				{ $$ = NULL; }
-		;
-
-
-/*****************************************************************************
- *
- *		QUERY:
- *				VACUUM
- *				ANALYZE
- *
- *****************************************************************************/
-
-VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_VACUUM;
-					if ($2)
-						n->options |= VACOPT_FULL;
-					if ($4)
-						n->options |= VACOPT_VERBOSE;
-					n->freeze_min_age = $3 ? 0 : -1;
-					n->freeze_table_age = $3 ? 0 : -1;
-					n->relation = NULL;
-					n->va_cols = NIL;
-					$$ = (Node *)n;
-				}
-			| VACUUM opt_full opt_freeze opt_verbose qualified_name
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_VACUUM;
-					if ($2)
-						n->options |= VACOPT_FULL;
-					if ($4)
-						n->options |= VACOPT_VERBOSE;
-					n->freeze_min_age = $3 ? 0 : -1;
-					n->freeze_table_age = $3 ? 0 : -1;
-					n->relation = $5;
-					n->va_cols = NIL;
-					$$ = (Node *)n;
-				}
-			| VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
-				{
-					VacuumStmt *n = (VacuumStmt *) $5;
-					n->options |= VACOPT_VACUUM;
-					if ($2)
-						n->options |= VACOPT_FULL;
-					if ($4)
-						n->options |= VACOPT_VERBOSE;
-					n->freeze_min_age = $3 ? 0 : -1;
-					n->freeze_table_age = $3 ? 0 : -1;
-					$$ = (Node *)n;
-				}
-			| VACUUM '(' vacuum_option_list ')'
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_VACUUM | $3;
-					if (n->options & VACOPT_FREEZE)
-						n->freeze_min_age = n->freeze_table_age = 0;
-					else
-						n->freeze_min_age = n->freeze_table_age = -1;
-					n->relation = NULL;
-					n->va_cols = NIL;
-					$$ = (Node *) n;
-				}
-			| VACUUM '(' vacuum_option_list ')' qualified_name opt_name_list
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_VACUUM | $3;
-					if (n->options & VACOPT_FREEZE)
-						n->freeze_min_age = n->freeze_table_age = 0;
-					else
-						n->freeze_min_age = n->freeze_table_age = -1;
-					n->relation = $5;
-					n->va_cols = $6;
-					if (n->va_cols != NIL)	/* implies analyze */
-						n->options |= VACOPT_ANALYZE;
-					$$ = (Node *) n;
-				}
-		;
-
-vacuum_option_list:
-			vacuum_option_elem								{ $$ = $1; }
-			| vacuum_option_list ',' vacuum_option_elem		{ $$ = $1 | $3; }
-		;
-
-vacuum_option_elem:
-			analyze_keyword		{ $$ = VACOPT_ANALYZE; }
-			| VERBOSE			{ $$ = VACOPT_VERBOSE; }
-			| FREEZE			{ $$ = VACOPT_FREEZE; }
-			| FULL				{ $$ = VACOPT_FULL; }
-		;
-
-AnalyzeStmt:
-			analyze_keyword opt_verbose
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_ANALYZE;
-					if ($2)
-						n->options |= VACOPT_VERBOSE;
-					n->freeze_min_age = -1;
-					n->freeze_table_age = -1;
-					n->relation = NULL;
-					n->va_cols = NIL;
-					$$ = (Node *)n;
-				}
-			| analyze_keyword opt_verbose qualified_name opt_name_list
-				{
-					VacuumStmt *n = makeNode(VacuumStmt);
-					n->options = VACOPT_ANALYZE;
-					if ($2)
-						n->options |= VACOPT_VERBOSE;
-					n->freeze_min_age = -1;
-					n->freeze_table_age = -1;
-					n->relation = $3;
-					n->va_cols = $4;
-					$$ = (Node *)n;
-				}
-		;
-
-analyze_keyword:
-			ANALYZE									{}
-			| ANALYSE /* British */					{}
-		;
-
-opt_verbose:
-			VERBOSE									{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-opt_full:	FULL									{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
-opt_freeze: FREEZE									{ $$ = TRUE; }
-			| /*EMPTY*/								{ $$ = FALSE; }
-		;
-
 opt_name_list:
 			'(' name_list ')'						{ $$ = $2; }
 			| /*EMPTY*/								{ $$ = NIL; }
 		;
 
-
-/*****************************************************************************
- *
- *		QUERY:
- *				EXPLAIN [ANALYZE] [VERBOSE] query
- *				EXPLAIN ( options ) query
- *
- *****************************************************************************/
-
-ExplainStmt:
-		EXPLAIN ExplainableStmt
-				{
-					ExplainStmt *n = makeNode(ExplainStmt);
-					n->query = $2;
-					n->options = NIL;
-					$$ = (Node *) n;
-				}
-		| EXPLAIN analyze_keyword opt_verbose ExplainableStmt
-				{
-					ExplainStmt *n = makeNode(ExplainStmt);
-					n->query = $4;
-					n->options = list_make1(makeDefElem("analyze", NULL));
-					if ($3)
-						n->options = lappend(n->options,
-											 makeDefElem("verbose", NULL));
-					$$ = (Node *) n;
-				}
-		| EXPLAIN VERBOSE ExplainableStmt
-				{
-					ExplainStmt *n = makeNode(ExplainStmt);
-					n->query = $3;
-					n->options = list_make1(makeDefElem("verbose", NULL));
-					$$ = (Node *) n;
-				}
-		| EXPLAIN '(' explain_option_list ')' ExplainableStmt
-				{
-					ExplainStmt *n = makeNode(ExplainStmt);
-					n->query = $5;
-					n->options = $3;
-					$$ = (Node *) n;
-				}
-		;
-
-ExplainableStmt:
-			SelectStmt
-			| InsertStmt
-			| UpdateStmt
-			| DeleteStmt
-			| DeclareCursorStmt
-			| CreateAsStmt
-			| ExecuteStmt					/* by default all are $$=$1 */
-		;
-
-explain_option_list:
-			explain_option_elem
-				{
-					$$ = list_make1($1);
-				}
-			| explain_option_list ',' explain_option_elem
-				{
-					$$ = lappend($1, $3);
-				}
-		;
-
-explain_option_elem:
-			explain_option_name explain_option_arg
-				{
-					$$ = makeDefElem($1, $2);
-				}
-		;
-
-explain_option_name:
-			ColId					{ $$ = $1; }
-			| analyze_keyword		{ $$ = "analyze"; }
-			| VERBOSE				{ $$ = "verbose"; }
-		;
-
-explain_option_arg:
-			opt_boolean_or_string	{ $$ = (Node *) makeString($1); }
-			| NumericOnly			{ $$ = (Node *) $1; }
-			| /* EMPTY */			{ $$ = NULL; }
-		;
-
-/*****************************************************************************
- *
- *		QUERY:
- *				PREPARE <plan_name> [(args, ...)] AS <query>
- *
- *****************************************************************************/
-
-PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
-				{
-					PrepareStmt *n = makeNode(PrepareStmt);
-					n->name = $2;
-					n->argtypes = $3;
-					n->query = $5;
-					$$ = (Node *) n;
-				}
-		;
-
-prep_type_clause: '(' type_list ')'			{ $$ = $2; }
-				| /* EMPTY */				{ $$ = NIL; }
-		;
-
 PreparableStmt:
 			SelectStmt
 			| InsertStmt
@@ -7963,75 +562,6 @@ PreparableStmt:
 
 /*****************************************************************************
  *
- * EXECUTE <plan_name> [(params, ...)]
- * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
- *
- *****************************************************************************/
-
-ExecuteStmt: EXECUTE name execute_param_clause
-				{
-					ExecuteStmt *n = makeNode(ExecuteStmt);
-					n->name = $2;
-					n->params = $3;
-					n->into = NULL;
-					$$ = (Node *) n;
-				}
-			| CREATE OptTemp TABLE create_as_target AS
-				EXECUTE name execute_param_clause
-				{
-					ExecuteStmt *n = makeNode(ExecuteStmt);
-					n->name = $7;
-					n->params = $8;
-					$4->rel->relpersistence = $2;
-					n->into = $4;
-					if ($4->colNames)
-						ereport(ERROR,
-								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-								 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
-					/* ... because it's not implemented, but it could be */
-					$$ = (Node *) n;
-				}
-		;
-
-execute_param_clause: '(' expr_list ')'				{ $$ = $2; }
-					| /* EMPTY */					{ $$ = NIL; }
-					;
-
-/*****************************************************************************
- *
- *		QUERY:
- *				DEALLOCATE [PREPARE] <plan_name>
- *
- *****************************************************************************/
-
-DeallocateStmt: DEALLOCATE name
-					{
-						DeallocateStmt *n = makeNode(DeallocateStmt);
-						n->name = $2;
-						$$ = (Node *) n;
-					}
-				| DEALLOCATE PREPARE name
-					{
-						DeallocateStmt *n = makeNode(DeallocateStmt);
-						n->name = $3;
-						$$ = (Node *) n;
-					}
-				| DEALLOCATE ALL
-					{
-						DeallocateStmt *n = makeNode(DeallocateStmt);
-						n->name = NULL;
-						$$ = (Node *) n;
-					}
-				| DEALLOCATE PREPARE ALL
-					{
-						DeallocateStmt *n = makeNode(DeallocateStmt);
-						n->name = NULL;
-						$$ = (Node *) n;
-					}
-		;
-
-/*****************************************************************************
- *
  *		QUERY:
  *				INSERT STATEMENTS
  *
@@ -8117,39 +647,6 @@ using_clause:
 			| /*EMPTY*/								{ $$ = NIL; }
 		;
 
-
-/*****************************************************************************
- *
- *		QUERY:
- *				LOCK TABLE
- *
- *****************************************************************************/
-
-LockStmt:	LOCK_P opt_table relation_expr_list opt_lock opt_nowait
-				{
-					LockStmt *n = makeNode(LockStmt);
-
-					n->relations = $3;
-					n->mode = $4;
-					n->nowait = $5;
-					$$ = (Node *)n;
-				}
-		;
-
-opt_lock:	IN_P lock_type MODE 			{ $$ = $2; }
-			| /*EMPTY*/						{ $$ = AccessExclusiveLock; }
-		;
-
-lock_type:	ACCESS SHARE					{ $$ = AccessShareLock; }
-			| ROW SHARE						{ $$ = RowShareLock; }
-			| ROW EXCLUSIVE					{ $$ = RowExclusiveLock; }
-			| SHARE UPDATE EXCLUSIVE		{ $$ = ShareUpdateExclusiveLock; }
-			| SHARE							{ $$ = ShareLock; }
-			| SHARE ROW EXCLUSIVE			{ $$ = ShareRowExclusiveLock; }
-			| EXCLUSIVE						{ $$ = ExclusiveLock; }
-			| ACCESS EXCLUSIVE				{ $$ = AccessExclusiveLock; }
-		;
-
 opt_nowait:	NOWAIT							{ $$ = TRUE; }
 			| /*EMPTY*/						{ $$ = FALSE; }
 		;
@@ -8242,38 +739,9 @@ set_target_list:
 		;
 
 
-/*****************************************************************************
- *
- *		QUERY:
- *				CURSOR STATEMENTS
- *
- *****************************************************************************/
-DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
-				{
-					DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
-					n->portalname = $2;
-					/* currently we always set FAST_PLAN option */
-					n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
-					n->query = $7;
-					$$ = (Node *)n;
-				}
-		;
-
 cursor_name:	name						{ $$ = $1; }
 		;
 
-cursor_options: /*EMPTY*/					{ $$ = 0; }
-			| cursor_options NO SCROLL		{ $$ = $1 | CURSOR_OPT_NO_SCROLL; }
-			| cursor_options SCROLL			{ $$ = $1 | CURSOR_OPT_SCROLL; }
-			| cursor_options BINARY			{ $$ = $1 | CURSOR_OPT_BINARY; }
-			| cursor_options INSENSITIVE	{ $$ = $1 | CURSOR_OPT_INSENSITIVE; }
-		;
-
-opt_hold: /* EMPTY */						{ $$ = 0; }
-			| WITH HOLD						{ $$ = CURSOR_OPT_HOLD; }
-			| WITHOUT HOLD					{ $$ = 0; }
-		;
-
 /*****************************************************************************
  *
  *		QUERY:
@@ -9077,13 +1545,6 @@ relation_expr:
 				}
 		;
 
-
-relation_expr_list:
-			relation_expr							{ $$ = list_make1($1); }
-			| relation_expr_list ',' relation_expr	{ $$ = lappend($1, $3); }
-		;
-
-
 /*
  * Given "UPDATE foo set set ...", we have to decide without looking any
  * further ahead whether the first "set" is an alias or the UPDATE's SET
@@ -9138,11 +1599,6 @@ where_or_current_clause:
 		;
 
 
-OptTableFuncElementList:
-			TableFuncElementList				{ $$ = $1; }
-			| /*EMPTY*/							{ $$ = NIL; }
-		;
-
 TableFuncElementList:
 			TableFuncElement
 				{
@@ -11629,18 +4085,8 @@ name_list:	name
 
 name:		ColId									{ $$ = $1; };
 
-database_name:
-			ColId									{ $$ = $1; };
-
-access_method:
-			ColId									{ $$ = $1; };
-
 attr_name:	ColLabel								{ $$ = $1; };
 
-index_name: ColId									{ $$ = $1; };
-
-file_name:	Sconst									{ $$ = $1; };
-
 /*
  * The production for a qualified func_name has to exactly match the
  * production for a qualified columnref, because we cannot tell which we
@@ -11762,7 +4208,6 @@ AexprConst: Iconst
 
 Iconst:		ICONST									{ $$ = $1; };
 Sconst:		SCONST									{ $$ = $1; };
-RoleId:		ColId									{ $$ = $1; };
 
 SignedIconst: Iconst								{ $$ = $1; }
 			| '+' Iconst							{ $$ = + $2; }
@@ -11817,239 +4262,55 @@ ColLabel:	IDENT									{ $$ = $1; }
  * it is listed here.  (Someday we may be able to generate these lists and
  * kwlist.h's table from a common master list.)
  */
-
 /* "Unreserved" keywords --- available for use as any kind of name.
  */
 unreserved_keyword:
-			  ABORT_P
-			| ABSOLUTE_P
-			| ACCESS
-			| ACTION
-			| ADD_P
-			| ADMIN
-			| AFTER
-			| AGGREGATE
-			| ALSO
-			| ALTER
-			| ALWAYS
-			| ASSERTION
-			| ASSIGNMENT
-			| AT
-			| ATTRIBUTE
-			| BACKWARD
-			| BEFORE
-			| BEGIN_P
+			  AT
 			| BY
-			| CACHE
-			| CALLED
-			| CASCADE
-			| CASCADED
-			| CATALOG_P
-			| CHAIN
-			| CHARACTERISTICS
-			| CHECKPOINT
-			| CLASS
-			| CLOSE
-			| CLUSTER
-			| COLLATION
-			| COMMENT
-			| COMMENTS
-			| COMMIT
-			| COMMITTED
-			| CONFIGURATION
-			| CONNECTION
-			| CONSTRAINTS
 			| CONTENT_P
-			| CONTINUE_P
-			| CONVERSION_P
-			| COPY
-			| COST
-			| CSV
 			| CURRENT_P
-			| CURSOR
-			| CYCLE
-			| DATA_P
-			| DATABASE
 			| DAY_P
-			| DEALLOCATE
-			| DECLARE
-			| DEFAULTS
-			| DEFERRED
-			| DEFINER
 			| DELETE_P
-			| DELIMITER
-			| DELIMITERS
-			| DICTIONARY
-			| DISABLE_P
-			| DISCARD
 			| DOCUMENT_P
-			| DOMAIN_P
 			| DOUBLE_P
-			| DROP
-			| EACH
-			| ENABLE_P
-			| ENCODING
-			| ENCRYPTED
-			| ENUM_P
 			| ESCAPE
-			| EXCLUDE
-			| EXCLUDING
-			| EXCLUSIVE
-			| EXECUTE
-			| EXPLAIN
-			| EXTENSION
-			| EXTERNAL
-			| FAMILY
 			| FIRST_P
 			| FOLLOWING
-			| FORCE
-			| FORWARD
-			| FUNCTION
-			| FUNCTIONS
 			| GLOBAL
-			| GRANTED
-			| HANDLER
-			| HEADER_P
-			| HOLD
 			| HOUR_P
-			| IDENTITY_P
-			| IF_P
-			| IMMEDIATE
-			| IMMUTABLE
-			| IMPLICIT_P
-			| INCLUDING
-			| INCREMENT
-			| INDEX
-			| INDEXES
-			| INHERIT
-			| INHERITS
-			| INLINE_P
-			| INPUT_P
-			| INSENSITIVE
 			| INSERT
-			| INSTEAD
-			| INVOKER
-			| ISOLATION
-			| KEY
-			| LABEL
-			| LANGUAGE
-			| LARGE_P
 			| LAST_P
-			| LC_COLLATE_P
-			| LC_CTYPE_P
-			| LEVEL
-			| LISTEN
-			| LOAD
 			| LOCAL
-			| LOCATION
-			| LOCK_P
-			| MAPPING
-			| MATCH
-			| MAXVALUE
 			| MINUTE_P
-			| MINVALUE
-			| MODE
 			| MONTH_P
-			| MOVE
 			| NAME_P
-			| NAMES
 			| NEXT
 			| NO
-			| NOTHING
-			| NOTIFY
 			| NOWAIT
 			| NULLS_P
-			| OBJECT_P
 			| OF
-			| OFF
-			| OIDS
 			| OPERATOR
-			| OPTION
-			| OPTIONS
-			| OWNED
-			| OWNER
-			| PARSER
-			| PARTIAL
 			| PARTITION
 			| PASSING
-			| PASSWORD
-			| PLANS
 			| PRECEDING
-			| PREPARE
-			| PREPARED
 			| PRESERVE
-			| PRIOR
-			| PRIVILEGES
-			| PROCEDURAL
-			| PROCEDURE
-			| QUOTE
 			| RANGE
 			| READ
-			| REASSIGN
-			| RECHECK
 			| RECURSIVE
 			| REF
-			| REINDEX
-			| RELATIVE_P
-			| RELEASE
-			| RENAME
-			| REPEATABLE
-			| REPLACE
-			| REPLICA
-			| RESET
-			| RESTART
-			| RESTRICT
-			| RETURNS
-			| REVOKE
-			| ROLE
-			| ROLLBACK
 			| ROWS
-			| RULE
-			| SAVEPOINT
-			| SCHEMA
-			| SCROLL
-			| SEARCH
 			| SECOND_P
-			| SECURITY
-			| SEQUENCE
-			| SEQUENCES
-			| SERIALIZABLE
-			| SERVER
-			| SESSION
 			| SET
 			| SHARE
-			| SHOW
-			| SIMPLE
-			| STABLE
 			| STANDALONE_P
-			| START
-			| STATEMENT
-			| STATISTICS
-			| STDIN
-			| STDOUT
-			| STORAGE
-			| STRICT_P
 			| STRIP_P
-			| SYSID
-			| SYSTEM_P
-			| TABLES
-			| TABLESPACE
 			| TEMP
-			| TEMPLATE
 			| TEMPORARY
 			| TEXT_P
-			| TRANSACTION
-			| TRIGGER
-			| TRUNCATE
-			| TRUSTED
 			| TYPE_P
 			| UNBOUNDED
-			| UNCOMMITTED
-			| UNENCRYPTED
 			| UNKNOWN
-			| UNLISTEN
 			| UNLOGGED
-			| UNTIL
 			| UPDATE
 			| VACUUM
 			| VALID
@@ -12393,30 +4654,6 @@ makeNullAConst(int location)
 	return (Node *)n;
 }
 
-static Node *
-makeAConst(Value *v, int location)
-{
-	Node *n;
-
-	switch (v->type)
-	{
-		case T_Float:
-			n = makeFloatConst(v->val.str, location);
-			break;
-
-		case T_Integer:
-			n = makeIntConst(v->val.ival, location);
-			break;
-
-		case T_String:
-		default:
-			n = makeStringConst(v->val.str, location);
-			break;
-	}
-
-	return n;
-}
-
 /* makeBoolAConst()
  * Create an A_Const string node and put it inside a boolean cast.
  */
@@ -12521,40 +4758,6 @@ check_indirection(List *indirection, core_yyscan_t yyscanner)
 	return indirection;
 }
 
-/* extractArgTypes()
- * Given a list of FunctionParameter nodes, extract a list of just the
- * argument types (TypeNames) for input parameters only.  This is what
- * is needed to look up an existing function, which is what is wanted by
- * the productions that use this call.
- */
-static List *
-extractArgTypes(List *parameters)
-{
-	List	   *result = NIL;
-	ListCell   *i;
-
-	foreach(i, parameters)
-	{
-		FunctionParameter *p = (FunctionParameter *) lfirst(i);
-
-		if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
-			result = lappend(result, p->argType);
-	}
-	return result;
-}
-
-/* findLeftmostSelect()
- * Find the leftmost component SelectStmt in a set-operation parsetree.
- */
-static SelectStmt *
-findLeftmostSelect(SelectStmt *node)
-{
-	while (node && node->op != SETOP_NONE)
-		node = node->larg;
-	Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
-	return node;
-}
-
 /* insertSelectOptions()
  * Insert ORDER BY, etc into an already-constructed SelectStmt.
  *
@@ -12736,135 +4939,6 @@ makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
 	return (Node *) x;
 }
 
-/*
- * Merge the input and output parameters of a table function.
- */
-static List *
-mergeTableFuncParameters(List *func_args, List *columns)
-{
-	ListCell   *lc;
-
-	/* Explicit OUT and INOUT parameters shouldn't be used in this syntax */
-	foreach(lc, func_args)
-	{
-		FunctionParameter *p = (FunctionParameter *) lfirst(lc);
-
-		if (p->mode != FUNC_PARAM_IN && p->mode != FUNC_PARAM_VARIADIC)
-			ereport(ERROR,
-					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("OUT and INOUT arguments aren't allowed in TABLE functions")));
-	}
-
-	return list_concat(func_args, columns);
-}
-
-/*
- * Determine return type of a TABLE function.  A single result column
- * returns setof that column's type; otherwise return setof record.
- */
-static TypeName *
-TableFuncTypeName(List *columns)
-{
-	TypeName *result;
-
-	if (list_length(columns) == 1)
-	{
-		FunctionParameter *p = (FunctionParameter *) linitial(columns);
-
-		result = (TypeName *) copyObject(p->argType);
-	}
-	else
-		result = SystemTypeName("record");
-
-	result->setof = true;
-
-	return result;
-}
-
-/*
- * Convert a list of (dotted) names to a RangeVar (like
- * makeRangeVarFromNameList, but with position support).  The
- * "AnyName" refers to the any_name production in the grammar.
- */
-static RangeVar *
-makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
-{
-	RangeVar *r = makeNode(RangeVar);
-
-	switch (list_length(names))
-	{
-		case 1:
-			r->catalogname = NULL;
-			r->schemaname = NULL;
-			r->relname = strVal(linitial(names));
-			break;
-		case 2:
-			r->catalogname = NULL;
-			r->schemaname = strVal(linitial(names));
-			r->relname = strVal(lsecond(names));
-			break;
-		case 3:
-			r->catalogname = strVal(linitial(names));;
-			r->schemaname = strVal(lsecond(names));
-			r->relname = strVal(lthird(names));
-			break;
-		default:
-			ereport(ERROR,
-					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("improper qualified name (too many dotted names): %s",
-							NameListToString(names)),
-					 parser_errposition(position)));
-			break;
-	}
-
-	r->relpersistence = RELPERSISTENCE_PERMANENT;
-	r->location = position;
-
-	return r;
-}
-
-/* Separate Constraint nodes from COLLATE clauses in a ColQualList */
-static void
-SplitColQualList(List *qualList,
-				 List **constraintList, CollateClause **collClause,
-				 core_yyscan_t yyscanner)
-{
-	ListCell   *cell;
-	ListCell   *prev;
-	ListCell   *next;
-
-	*collClause = NULL;
-	prev = NULL;
-	for (cell = list_head(qualList); cell; cell = next)
-	{
-		Node   *n = (Node *) lfirst(cell);
-
-		next = lnext(cell);
-		if (IsA(n, Constraint))
-		{
-			/* keep it in list */
-			prev = cell;
-			continue;
-		}
-		if (IsA(n, CollateClause))
-		{
-			CollateClause *c = (CollateClause *) n;
-
-			if (*collClause)
-				ereport(ERROR,
-						(errcode(ERRCODE_SYNTAX_ERROR),
-						 errmsg("multiple COLLATE clauses not allowed"),
-						 parser_errposition(c->location)));
-			*collClause = c;
-		}
-		else
-			elog(ERROR, "unexpected node type %d", (int) n->type);
-		/* remove non-Constraint nodes from qualList */
-		qualList = list_delete_cell(qualList, cell, prev);
-	}
-	*constraintList = qualList;
-}
-
 /* parser_init()
  * Initialize to parse one query string
  */
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 12c2faf..2e5e329 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -26,18 +26,7 @@
  */
 
 /* name, value, category */
-PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD)
-PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD)
-PG_KEYWORD("add", ADD_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("admin", ADMIN, UNRESERVED_KEYWORD)
-PG_KEYWORD("after", AFTER, UNRESERVED_KEYWORD)
-PG_KEYWORD("aggregate", AGGREGATE, UNRESERVED_KEYWORD)
 PG_KEYWORD("all", ALL, RESERVED_KEYWORD)
-PG_KEYWORD("also", ALSO, UNRESERVED_KEYWORD)
-PG_KEYWORD("alter", ALTER, UNRESERVED_KEYWORD)
-PG_KEYWORD("always", ALWAYS, UNRESERVED_KEYWORD)
 PG_KEYWORD("analyse", ANALYSE, RESERVED_KEYWORD)		/* British spelling */
 PG_KEYWORD("analyze", ANALYZE, RESERVED_KEYWORD)
 PG_KEYWORD("and", AND, RESERVED_KEYWORD)
@@ -45,15 +34,9 @@ PG_KEYWORD("any", ANY, RESERVED_KEYWORD)
 PG_KEYWORD("array", ARRAY, RESERVED_KEYWORD)
 PG_KEYWORD("as", AS, RESERVED_KEYWORD)
 PG_KEYWORD("asc", ASC, RESERVED_KEYWORD)
-PG_KEYWORD("assertion", ASSERTION, UNRESERVED_KEYWORD)
-PG_KEYWORD("assignment", ASSIGNMENT, UNRESERVED_KEYWORD)
 PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD)
 PG_KEYWORD("at", AT, UNRESERVED_KEYWORD)
-PG_KEYWORD("attribute", ATTRIBUTE, UNRESERVED_KEYWORD)
 PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD)
-PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD)
-PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("between", BETWEEN, COL_NAME_KEYWORD)
 PG_KEYWORD("bigint", BIGINT, COL_NAME_KEYWORD)
 PG_KEYWORD("binary", BINARY, TYPE_FUNC_NAME_KEYWORD)
@@ -61,43 +44,19 @@ PG_KEYWORD("bit", BIT, COL_NAME_KEYWORD)
 PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD)
 PG_KEYWORD("both", BOTH, RESERVED_KEYWORD)
 PG_KEYWORD("by", BY, UNRESERVED_KEYWORD)
-PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD)
-PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD)
-PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD)
-PG_KEYWORD("cascaded", CASCADED, UNRESERVED_KEYWORD)
 PG_KEYWORD("case", CASE, RESERVED_KEYWORD)
 PG_KEYWORD("cast", CAST, RESERVED_KEYWORD)
-PG_KEYWORD("catalog", CATALOG_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("chain", CHAIN, UNRESERVED_KEYWORD)
 PG_KEYWORD("char", CHAR_P, COL_NAME_KEYWORD)
 PG_KEYWORD("character", CHARACTER, COL_NAME_KEYWORD)
-PG_KEYWORD("characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD)
 PG_KEYWORD("check", CHECK, RESERVED_KEYWORD)
-PG_KEYWORD("checkpoint", CHECKPOINT, UNRESERVED_KEYWORD)
-PG_KEYWORD("class", CLASS, UNRESERVED_KEYWORD)
-PG_KEYWORD("close", CLOSE, UNRESERVED_KEYWORD)
-PG_KEYWORD("cluster", CLUSTER, UNRESERVED_KEYWORD)
 PG_KEYWORD("coalesce", COALESCE, COL_NAME_KEYWORD)
 PG_KEYWORD("collate", COLLATE, RESERVED_KEYWORD)
-PG_KEYWORD("collation", COLLATION, UNRESERVED_KEYWORD)
 PG_KEYWORD("column", COLUMN, RESERVED_KEYWORD)
-PG_KEYWORD("comment", COMMENT, UNRESERVED_KEYWORD)
-PG_KEYWORD("comments", COMMENTS, UNRESERVED_KEYWORD)
-PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD)
-PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("concurrently", CONCURRENTLY, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD)
-PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD)
 PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD)
-PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD)
 PG_KEYWORD("content", CONTENT_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("continue", CONTINUE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("conversion", CONVERSION_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("copy", COPY, UNRESERVED_KEYWORD)
-PG_KEYWORD("cost", COST, UNRESERVED_KEYWORD)
 PG_KEYWORD("create", CREATE, RESERVED_KEYWORD)
 PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD)
 PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD)
 PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD)
@@ -107,136 +66,65 @@ PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD)
 PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD)
 PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD)
 PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD)
-PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD)
-PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD)
 PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD)
 PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD)
 PG_KEYWORD("decimal", DECIMAL_P, COL_NAME_KEYWORD)
-PG_KEYWORD("declare", DECLARE, UNRESERVED_KEYWORD)
 PG_KEYWORD("default", DEFAULT, RESERVED_KEYWORD)
-PG_KEYWORD("defaults", DEFAULTS, UNRESERVED_KEYWORD)
 PG_KEYWORD("deferrable", DEFERRABLE, RESERVED_KEYWORD)
-PG_KEYWORD("deferred", DEFERRED, UNRESERVED_KEYWORD)
-PG_KEYWORD("definer", DEFINER, UNRESERVED_KEYWORD)
 PG_KEYWORD("delete", DELETE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("delimiter", DELIMITER, UNRESERVED_KEYWORD)
-PG_KEYWORD("delimiters", DELIMITERS, UNRESERVED_KEYWORD)
 PG_KEYWORD("desc", DESC, RESERVED_KEYWORD)
-PG_KEYWORD("dictionary", DICTIONARY, UNRESERVED_KEYWORD)
-PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD)
 PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD)
 PG_KEYWORD("do", DO, RESERVED_KEYWORD)
 PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
-PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
 PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
-PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
-PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("end", END_P, RESERVED_KEYWORD)
-PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD)
 PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD)
-PG_KEYWORD("exclude", EXCLUDE, UNRESERVED_KEYWORD)
-PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD)
-PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD)
-PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD)
 PG_KEYWORD("exists", EXISTS, COL_NAME_KEYWORD)
-PG_KEYWORD("explain", EXPLAIN, UNRESERVED_KEYWORD)
-PG_KEYWORD("extension", EXTENSION, UNRESERVED_KEYWORD)
-PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD)
 PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD)
 PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD)
-PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD)
 PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD)
 PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD)
 PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD)
 PG_KEYWORD("for", FOR, RESERVED_KEYWORD)
-PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD)
 PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD)
-PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD)
 PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("from", FROM, RESERVED_KEYWORD)
 PG_KEYWORD("full", FULL, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("function", FUNCTION, UNRESERVED_KEYWORD)
-PG_KEYWORD("functions", FUNCTIONS, UNRESERVED_KEYWORD)
 PG_KEYWORD("global", GLOBAL, UNRESERVED_KEYWORD)
 PG_KEYWORD("grant", GRANT, RESERVED_KEYWORD)
-PG_KEYWORD("granted", GRANTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("greatest", GREATEST, COL_NAME_KEYWORD)
 PG_KEYWORD("group", GROUP_P, RESERVED_KEYWORD)
-PG_KEYWORD("handler", HANDLER, UNRESERVED_KEYWORD)
 PG_KEYWORD("having", HAVING, RESERVED_KEYWORD)
-PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD)
 PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD)
-PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD)
-PG_KEYWORD("implicit", IMPLICIT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("in", IN_P, RESERVED_KEYWORD)
-PG_KEYWORD("including", INCLUDING, UNRESERVED_KEYWORD)
-PG_KEYWORD("increment", INCREMENT, UNRESERVED_KEYWORD)
-PG_KEYWORD("index", INDEX, UNRESERVED_KEYWORD)
-PG_KEYWORD("indexes", INDEXES, UNRESERVED_KEYWORD)
-PG_KEYWORD("inherit", INHERIT, UNRESERVED_KEYWORD)
-PG_KEYWORD("inherits", INHERITS, UNRESERVED_KEYWORD)
 PG_KEYWORD("initially", INITIALLY, RESERVED_KEYWORD)
-PG_KEYWORD("inline", INLINE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("inner", INNER_P, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("inout", INOUT, COL_NAME_KEYWORD)
-PG_KEYWORD("input", INPUT_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("insensitive", INSENSITIVE, UNRESERVED_KEYWORD)
 PG_KEYWORD("insert", INSERT, UNRESERVED_KEYWORD)
-PG_KEYWORD("instead", INSTEAD, UNRESERVED_KEYWORD)
 PG_KEYWORD("int", INT_P, COL_NAME_KEYWORD)
 PG_KEYWORD("integer", INTEGER, COL_NAME_KEYWORD)
 PG_KEYWORD("intersect", INTERSECT, RESERVED_KEYWORD)
 PG_KEYWORD("interval", INTERVAL, COL_NAME_KEYWORD)
 PG_KEYWORD("into", INTO, RESERVED_KEYWORD)
-PG_KEYWORD("invoker", INVOKER, UNRESERVED_KEYWORD)
 PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD)
 PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD)
-PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD)
-PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD)
-PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("lc_collate", LC_COLLATE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("lc_ctype", LC_CTYPE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD)
 PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD)
 PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("level", LEVEL, UNRESERVED_KEYWORD)
 PG_KEYWORD("like", LIKE, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD)
-PG_KEYWORD("listen", LISTEN, UNRESERVED_KEYWORD)
-PG_KEYWORD("load", LOAD, UNRESERVED_KEYWORD)
 PG_KEYWORD("local", LOCAL, UNRESERVED_KEYWORD)
 PG_KEYWORD("localtime", LOCALTIME, RESERVED_KEYWORD)
 PG_KEYWORD("localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD)
-PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD)
-PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD)
-PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD)
-PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD)
 PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD)
-PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD)
 PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD)
 PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD)
 PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD)
 PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD)
@@ -244,24 +132,17 @@ PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD)
 PG_KEYWORD("no", NO, UNRESERVED_KEYWORD)
 PG_KEYWORD("none", NONE, COL_NAME_KEYWORD)
 PG_KEYWORD("not", NOT, RESERVED_KEYWORD)
-PG_KEYWORD("nothing", NOTHING, UNRESERVED_KEYWORD)
-PG_KEYWORD("notify", NOTIFY, UNRESERVED_KEYWORD)
 PG_KEYWORD("notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("nowait", NOWAIT, UNRESERVED_KEYWORD)
 PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD)
 PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD)
 PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD)
-PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("of", OF, UNRESERVED_KEYWORD)
-PG_KEYWORD("off", OFF, UNRESERVED_KEYWORD)
 PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD)
-PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD)
 PG_KEYWORD("on", ON, RESERVED_KEYWORD)
 PG_KEYWORD("only", ONLY, RESERVED_KEYWORD)
 PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD)
-PG_KEYWORD("option", OPTION, UNRESERVED_KEYWORD)
-PG_KEYWORD("options", OPTIONS, UNRESERVED_KEYWORD)
 PG_KEYWORD("or", OR, RESERVED_KEYWORD)
 PG_KEYWORD("order", ORDER, RESERVED_KEYWORD)
 PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD)
@@ -269,94 +150,39 @@ PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("over", OVER, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD)
-PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD)
-PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD)
-PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD)
-PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD)
 PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD)
 PG_KEYWORD("passing", PASSING, UNRESERVED_KEYWORD)
-PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD)
 PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD)
-PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD)
 PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD)
 PG_KEYWORD("preceding", PRECEDING, UNRESERVED_KEYWORD)
 PG_KEYWORD("precision", PRECISION, COL_NAME_KEYWORD)
-PG_KEYWORD("prepare", PREPARE, UNRESERVED_KEYWORD)
-PG_KEYWORD("prepared", PREPARED, UNRESERVED_KEYWORD)
 PG_KEYWORD("preserve", PRESERVE, UNRESERVED_KEYWORD)
 PG_KEYWORD("primary", PRIMARY, RESERVED_KEYWORD)
-PG_KEYWORD("prior", PRIOR, UNRESERVED_KEYWORD)
-PG_KEYWORD("privileges", PRIVILEGES, UNRESERVED_KEYWORD)
-PG_KEYWORD("procedural", PROCEDURAL, UNRESERVED_KEYWORD)
-PG_KEYWORD("procedure", PROCEDURE, UNRESERVED_KEYWORD)
-PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD)
 PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD)
 PG_KEYWORD("read", READ, UNRESERVED_KEYWORD)
 PG_KEYWORD("real", REAL, COL_NAME_KEYWORD)
-PG_KEYWORD("reassign", REASSIGN, UNRESERVED_KEYWORD)
-PG_KEYWORD("recheck", RECHECK, UNRESERVED_KEYWORD)
 PG_KEYWORD("recursive", RECURSIVE, UNRESERVED_KEYWORD)
 PG_KEYWORD("ref", REF, UNRESERVED_KEYWORD)
 PG_KEYWORD("references", REFERENCES, RESERVED_KEYWORD)
-PG_KEYWORD("reindex", REINDEX, UNRESERVED_KEYWORD)
-PG_KEYWORD("relative", RELATIVE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("release", RELEASE, UNRESERVED_KEYWORD)
-PG_KEYWORD("rename", RENAME, UNRESERVED_KEYWORD)
-PG_KEYWORD("repeatable", REPEATABLE, UNRESERVED_KEYWORD)
-PG_KEYWORD("replace", REPLACE, UNRESERVED_KEYWORD)
-PG_KEYWORD("replica", REPLICA, UNRESERVED_KEYWORD)
-PG_KEYWORD("reset", RESET, UNRESERVED_KEYWORD)
-PG_KEYWORD("restart", RESTART, UNRESERVED_KEYWORD)
-PG_KEYWORD("restrict", RESTRICT, UNRESERVED_KEYWORD)
 PG_KEYWORD("returning", RETURNING, RESERVED_KEYWORD)
-PG_KEYWORD("returns", RETURNS, UNRESERVED_KEYWORD)
-PG_KEYWORD("revoke", REVOKE, UNRESERVED_KEYWORD)
 PG_KEYWORD("right", RIGHT, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("role", ROLE, UNRESERVED_KEYWORD)
-PG_KEYWORD("rollback", ROLLBACK, UNRESERVED_KEYWORD)
 PG_KEYWORD("row", ROW, COL_NAME_KEYWORD)
 PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD)
-PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD)
-PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD)
-PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD)
-PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD)
-PG_KEYWORD("search", SEARCH, UNRESERVED_KEYWORD)
 PG_KEYWORD("second", SECOND_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("security", SECURITY, UNRESERVED_KEYWORD)
 PG_KEYWORD("select", SELECT, RESERVED_KEYWORD)
-PG_KEYWORD("sequence", SEQUENCE, UNRESERVED_KEYWORD)
-PG_KEYWORD("sequences", SEQUENCES, UNRESERVED_KEYWORD)
-PG_KEYWORD("serializable", SERIALIZABLE, UNRESERVED_KEYWORD)
-PG_KEYWORD("server", SERVER, UNRESERVED_KEYWORD)
-PG_KEYWORD("session", SESSION, UNRESERVED_KEYWORD)
 PG_KEYWORD("session_user", SESSION_USER, RESERVED_KEYWORD)
 PG_KEYWORD("set", SET, UNRESERVED_KEYWORD)
 PG_KEYWORD("setof", SETOF, COL_NAME_KEYWORD)
 PG_KEYWORD("share", SHARE, UNRESERVED_KEYWORD)
-PG_KEYWORD("show", SHOW, UNRESERVED_KEYWORD)
 PG_KEYWORD("similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD)
-PG_KEYWORD("simple", SIMPLE, UNRESERVED_KEYWORD)
 PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD)
 PG_KEYWORD("some", SOME, RESERVED_KEYWORD)
-PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD)
 PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD)
-PG_KEYWORD("start", START, UNRESERVED_KEYWORD)
-PG_KEYWORD("statement", STATEMENT, UNRESERVED_KEYWORD)
-PG_KEYWORD("statistics", STATISTICS, UNRESERVED_KEYWORD)
-PG_KEYWORD("stdin", STDIN, UNRESERVED_KEYWORD)
-PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD)
-PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD)
-PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD)
 PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD)
-PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD)
-PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("table", TABLE, RESERVED_KEYWORD)
-PG_KEYWORD("tables", TABLES, UNRESERVED_KEYWORD)
-PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD)
 PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD)
-PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD)
 PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD)
 PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("then", THEN, RESERVED_KEYWORD)
@@ -364,23 +190,15 @@ PG_KEYWORD("time", TIME, COL_NAME_KEYWORD)
 PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD)
 PG_KEYWORD("to", TO, RESERVED_KEYWORD)
 PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD)
-PG_KEYWORD("transaction", TRANSACTION, UNRESERVED_KEYWORD)
 PG_KEYWORD("treat", TREAT, COL_NAME_KEYWORD)
-PG_KEYWORD("trigger", TRIGGER, UNRESERVED_KEYWORD)
 PG_KEYWORD("trim", TRIM, COL_NAME_KEYWORD)
 PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD)
-PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD)
-PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD)
-PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD)
-PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("union", UNION, RESERVED_KEYWORD)
 PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD)
 PG_KEYWORD("unknown", UNKNOWN, UNRESERVED_KEYWORD)
-PG_KEYWORD("unlisten", UNLISTEN, UNRESERVED_KEYWORD)
 PG_KEYWORD("unlogged", UNLOGGED, UNRESERVED_KEYWORD)
-PG_KEYWORD("until", UNTIL, UNRESERVED_KEYWORD)
 PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD)
 PG_KEYWORD("user", USER, RESERVED_KEYWORD)
 PG_KEYWORD("using", USING, RESERVED_KEYWORD)