kaby76 / Trash

Toolkit for grammars
MIT License
74 stars 5 forks source link

Error converting bison grammar #8

Closed SKalt closed 3 years ago

SKalt commented 3 years ago

Hi! I was testing out the script to convert grammars on a .y grammar, and I got an unexpected error:

System.Runtime.CompilerServices.SwitchExpressionException: Non-exhaustive switch expression failed to match its input.
Unmatched value was BisonParser.g4.
   at Docs.Class1.CreateDoc(ParsingResultSet parse_info) in C:\Users\kenne\Documents\GitHub\Domemtech.Trash\Docs\Class1.cs:line 63
   at Trash.CConvert.Execute(Config config) in C:\Users\kenne\Documents\GitHub\Domemtech.Trash\trconvert\CConvert.cs:line 44
   at Trash.Program.MainInternal(String[] args) in C:\Users\kenne\Documents\GitHub\Domemtech.Trash\trconvert\Program.cs:line 65
   at Trash.Program.Main(String[] args) in C:\Users\kenne\Documents\GitHub\Domemtech.Trash\trconvert\Program.cs:line 14

Looking at line 63 of Docs/Class1.cs, it seems like trconvert doesn't support conversion from Bison to Antlr4 without additional configuration. Is that correct?

Reproduction:

#!/usr/bin/env bash
# with docker and git accessible

# clone trash
git clone https://github.com/kaby76/Domemtech.Trash.git /tmp/trash
cd /tmp/trash

# build a docker image with trash's tools installed, since I don't have .NET installed locally
echo '
# Dockerfile, butilt in the repo root cloned to 5cfd838
FROM mcr.microsoft.com/dotnet/sdk
ENV PATH="$PATH:/root/.dotnet/tools"
WORKDIR /trash
COPY . /trash
RUN dotnet tool install -g trparse
RUN dotnet tool install -g trconvert
CMD bash
' | docker build -t trash -f - /tmp/trash;

git clone --depth 1 https://github.com/postgres/postgres.git /tmp/postgres

docker run \
  -v /tmp/postgres:/postgres \
  --workdir /postgres \
   trash sh -c '
     trparse /postgres/src/backend/parser/gram.y | trconvert
  '
kaby76 commented 3 years ago

Thanks for pointing out this problem. BTW, you don't need to clone the Trash repo, just

dotnet tool install -g trparse
dotnet tool install -g trconvert
dotnet tool install -g trsponge
dotnet tool install -g trxgrep
dotnet tool install -g trtext

then

trparse gram.y | trconvert | trsponge

That would then create gram.g4 (trsponge is like tee in unix). Sorry, but I don't have a Lex converter yet. Presumably, one could write a script to grep out the uppercase symbol names from the grammar, sort + unique the names, and just create a lexer rule that is a string literal with the same spelling. E.g.,

trparse gram.g4 | trxgrep ' //TOKEN_REF' | trtext | sort -u | sed 's/\(.*\)/\1 : "\1";/'

Afterwards, you'd have to go through the .l file and fix up the lexer rules for literals.

gram.g4:

// Combined Antlr4 grammar generated by Antlrvsix.
// Input grammar: C:\Users\kenne\Documents\GitHub\postgres\src\backend\parser\gram.y
// Date: 7/10/2021 5:16:05 PM

grammar gram;
parse_toplevel  : stmtmulti
  | MODE_TYPE_NAME typename
  | MODE_PLPGSQL_EXPR pLpgSQL_Expr
  | MODE_PLPGSQL_ASSIGN1 pLAssignStmt
  | MODE_PLPGSQL_ASSIGN2 pLAssignStmt
  | MODE_PLPGSQL_ASSIGN3 pLAssignStmt
  ;
stmtmulti  : stmtmulti ';' toplevel_stmt
  | toplevel_stmt
  ;
toplevel_stmt  : stmt
  | transactionStmtLegacy
  ;
stmt  : alterEventTrigStmt
  | alterCollationStmt
  | alterDatabaseStmt
  | alterDatabaseSetStmt
  | alterDefaultPrivilegesStmt
  | alterDomainStmt
  | alterEnumStmt
  | alterExtensionStmt
  | alterExtensionContentsStmt
  | alterFdwStmt
  | alterForeignServerStmt
  | alterFunctionStmt
  | alterGroupStmt
  | alterObjectDependsStmt
  | alterObjectSchemaStmt
  | alterOwnerStmt
  | alterOperatorStmt
  | alterTypeStmt
  | alterPolicyStmt
  | alterSeqStmt
  | alterSystemStmt
  | alterTableStmt
  | alterTblSpcStmt
  | alterCompositeTypeStmt
  | alterPublicationStmt
  | alterRoleSetStmt
  | alterRoleStmt
  | alterSubscriptionStmt
  | alterStatsStmt
  | alterTSConfigurationStmt
  | alterTSDictionaryStmt
  | alterUserMappingStmt
  | analyzeStmt
  | callStmt
  | checkPointStmt
  | closePortalStmt
  | clusterStmt
  | commentStmt
  | constraintsSetStmt
  | copyStmt
  | createAmStmt
  | createAsStmt
  | createAssertionStmt
  | createCastStmt
  | createConversionStmt
  | createDomainStmt
  | createExtensionStmt
  | createFdwStmt
  | createForeignServerStmt
  | createForeignTableStmt
  | createFunctionStmt
  | createGroupStmt
  | createMatViewStmt
  | createOpClassStmt
  | createOpFamilyStmt
  | createPublicationStmt
  | alterOpFamilyStmt
  | createPolicyStmt
  | createPLangStmt
  | createSchemaStmt
  | createSeqStmt
  | createStmt
  | createSubscriptionStmt
  | createStatsStmt
  | createTableSpaceStmt
  | createTransformStmt
  | createTrigStmt
  | createEventTrigStmt
  | createRoleStmt
  | createUserStmt
  | createUserMappingStmt
  | createdbStmt
  | deallocateStmt
  | declareCursorStmt
  | defineStmt
  | deleteStmt
  | discardStmt
  | doStmt
  | dropCastStmt
  | dropOpClassStmt
  | dropOpFamilyStmt
  | dropOwnedStmt
  | dropStmt
  | dropSubscriptionStmt
  | dropTableSpaceStmt
  | dropTransformStmt
  | dropRoleStmt
  | dropUserMappingStmt
  | dropdbStmt
  | executeStmt
  | explainStmt
  | fetchStmt
  | grantStmt
  | grantRoleStmt
  | importForeignSchemaStmt
  | indexStmt
  | insertStmt
  | listenStmt
  | refreshMatViewStmt
  | loadStmt
  | lockStmt
  | notifyStmt
  | prepareStmt
  | reassignOwnedStmt
  | reindexStmt
  | removeAggrStmt
  | removeFuncStmt
  | removeOperStmt
  | renameStmt
  | revokeStmt
  | revokeRoleStmt
  | ruleStmt
  | secLabelStmt
  | selectStmt
  | transactionStmt
  | truncateStmt
  | unlistenStmt
  | updateStmt
  | vacuumStmt
  | variableResetStmt
  | variableSetStmt
  | variableShowStmt
  | viewStmt
  |
  ;
callStmt  : CALL func_application
  ;
createRoleStmt  : CREATE ROLE roleId opt_with optRoleList
  ;
opt_with  : WITH
  | WITH_LA
  |
  ;
optRoleList  : optRoleList createOptRoleElem
  |
  ;
alterOptRoleList  : alterOptRoleList alterOptRoleElem
  |
  ;
alterOptRoleElem  : PASSWORD sconst
  | PASSWORD NULL_P
  | ENCRYPTED PASSWORD sconst
  | UNENCRYPTED PASSWORD sconst
  | INHERIT
  | CONNECTION LIMIT signedIconst
  | VALID UNTIL sconst
  | USER role_list
  | IDENT
  ;
createOptRoleElem  : alterOptRoleElem
  | SYSID iconst
  | ADMIN role_list
  | ROLE role_list
  | IN_P ROLE role_list
  | IN_P GROUP_P role_list
  ;
createUserStmt  : CREATE USER roleId opt_with optRoleList
  ;
alterRoleStmt  : ALTER ROLE roleSpec opt_with alterOptRoleList
  | ALTER USER roleSpec opt_with alterOptRoleList
  ;
opt_in_database  :
  | IN_P DATABASE name
  ;
alterRoleSetStmt  : ALTER ROLE roleSpec opt_in_database setResetClause
  | ALTER ROLE ALL opt_in_database setResetClause
  | ALTER USER roleSpec opt_in_database setResetClause
  | ALTER USER ALL opt_in_database setResetClause
  ;
dropRoleStmt  : DROP ROLE role_list
  | DROP ROLE IF_P EXISTS role_list
  | DROP USER role_list
  | DROP USER IF_P EXISTS role_list
  | DROP GROUP_P role_list
  | DROP GROUP_P IF_P EXISTS role_list
  ;
createGroupStmt  : CREATE GROUP_P roleId opt_with optRoleList
  ;
alterGroupStmt  : ALTER GROUP_P roleSpec add_drop USER role_list
  ;
add_drop  : ADD_P
  | DROP
  ;
createSchemaStmt  : CREATE SCHEMA optSchemaName AUTHORIZATION roleSpec optSchemaEltList
  | CREATE SCHEMA colId optSchemaEltList
  | CREATE SCHEMA IF_P NOT EXISTS optSchemaName AUTHORIZATION roleSpec optSchemaEltList
  | CREATE SCHEMA IF_P NOT EXISTS colId optSchemaEltList
  ;
optSchemaName  : colId
  |
  ;
optSchemaEltList  : optSchemaEltList schema_stmt
  |
  ;
schema_stmt  : createStmt
  | indexStmt
  | createSeqStmt
  | createTrigStmt
  | grantStmt
  | viewStmt
  ;
variableSetStmt  : SET set_rest
  | SET LOCAL set_rest
  | SET SESSION set_rest
  ;
set_rest  : TRANSACTION transaction_mode_list
  | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
  | set_rest_more
  ;
generic_set  : var_name TO var_list
  | var_name '=' var_list
  | var_name TO DEFAULT
  | var_name '=' DEFAULT
  ;
set_rest_more  : generic_set
  | var_name FROM CURRENT_P
  | TIME ZONE zone_value
  | CATALOG_P sconst
  | SCHEMA sconst
  | NAMES opt_encoding
  | ROLE nonReservedWord_or_Sconst
  | SESSION AUTHORIZATION nonReservedWord_or_Sconst
  | SESSION AUTHORIZATION DEFAULT
  | XML_P OPTION document_or_content
  | TRANSACTION SNAPSHOT sconst
  ;
var_name  : colId
  | var_name '.' colId
  ;
var_list  : var_value
  | var_list ',' var_value
  ;
var_value  : opt_boolean_or_string
  | numericOnly
  ;
iso_level  : READ UNCOMMITTED
  | READ COMMITTED
  | REPEATABLE READ
  | SERIALIZABLE
  ;
opt_boolean_or_string  : TRUE_P
  | FALSE_P
  | ON
  | nonReservedWord_or_Sconst
  ;
zone_value  : sconst
  | IDENT
  | constInterval sconst opt_interval
  | constInterval '(' iconst ')' sconst
  | numericOnly
  | DEFAULT
  | LOCAL
  ;
opt_encoding  : sconst
  | DEFAULT
  |
  ;
nonReservedWord_or_Sconst  : nonReservedWord
  | sconst
  ;
variableResetStmt  : RESET reset_rest
  ;
reset_rest  : generic_reset
  | TIME ZONE
  | TRANSACTION ISOLATION LEVEL
  | SESSION AUTHORIZATION
  ;
generic_reset  : var_name
  | ALL
  ;
setResetClause  : SET set_rest
  | variableResetStmt
  ;
functionSetResetClause  : SET set_rest_more
  | variableResetStmt
  ;
variableShowStmt  : SHOW var_name
  | SHOW TIME ZONE
  | SHOW TRANSACTION ISOLATION LEVEL
  | SHOW SESSION AUTHORIZATION
  | SHOW ALL
  ;
constraintsSetStmt  : SET CONSTRAINTS constraints_set_list constraints_set_mode
  ;
constraints_set_list  : ALL
  | qualified_name_list
  ;
constraints_set_mode  : DEFERRED
  | IMMEDIATE
  ;
checkPointStmt  : CHECKPOINT
  ;
discardStmt  : DISCARD ALL
  | DISCARD TEMP
  | DISCARD TEMPORARY
  | DISCARD PLANS
  | DISCARD SEQUENCES
  ;
alterTableStmt  : ALTER TABLE relation_expr alter_table_cmds
  | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
  | ALTER TABLE relation_expr partition_cmd
  | ALTER TABLE IF_P EXISTS relation_expr partition_cmd
  | ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
  | ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
  | ALTER INDEX qualified_name alter_table_cmds
  | ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
  | ALTER INDEX qualified_name index_partition_cmd
  | ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
  | ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
  | ALTER SEQUENCE qualified_name alter_table_cmds
  | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
  | ALTER VIEW qualified_name alter_table_cmds
  | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
  | ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
  | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
  | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
  | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
  | ALTER FOREIGN TABLE relation_expr alter_table_cmds
  | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
  ;
alter_table_cmds  : alter_table_cmd
  | alter_table_cmds ',' alter_table_cmd
  ;
partition_cmd  : ATTACH PARTITION qualified_name partitionBoundSpec
  | DETACH PARTITION qualified_name opt_concurrently
  | DETACH PARTITION qualified_name FINALIZE
  ;
index_partition_cmd  : ATTACH PARTITION qualified_name
  ;
alter_table_cmd  : ADD_P columnDef
  | ADD_P IF_P NOT EXISTS columnDef
  | ADD_P COLUMN columnDef
  | ADD_P COLUMN IF_P NOT EXISTS columnDef
  | ALTER opt_column colId alter_column_default
  | ALTER opt_column colId DROP NOT NULL_P
  | ALTER opt_column colId SET NOT NULL_P
  | ALTER opt_column colId DROP EXPRESSION
  | ALTER opt_column colId DROP EXPRESSION IF_P EXISTS
  | ALTER opt_column colId SET STATISTICS signedIconst
  | ALTER opt_column iconst SET STATISTICS signedIconst
  | ALTER opt_column colId SET reloptions
  | ALTER opt_column colId RESET reloptions
  | ALTER opt_column colId SET STORAGE colId
  | ALTER opt_column colId SET column_compression
  | ALTER opt_column colId ADD_P GENERATED generated_when AS IDENTITY_P optParenthesizedSeqOptList
  | ALTER opt_column colId alter_identity_column_option_list
  | ALTER opt_column colId DROP IDENTITY_P
  | ALTER opt_column colId DROP IDENTITY_P IF_P EXISTS
  | DROP opt_column IF_P EXISTS colId opt_drop_behavior
  | DROP opt_column colId opt_drop_behavior
  | ALTER opt_column colId opt_set_data TYPE_P typename opt_collate_clause alter_using
  | ALTER opt_column colId alter_generic_options
  | ADD_P tableConstraint
  | ALTER CONSTRAINT name constraintAttributeSpec
  | VALIDATE CONSTRAINT name
  | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
  | DROP CONSTRAINT name opt_drop_behavior
  | SET WITHOUT OIDS
  | CLUSTER ON name
  | SET WITHOUT CLUSTER
  | SET LOGGED
  | SET UNLOGGED
  | ENABLE_P TRIGGER name
  | ENABLE_P ALWAYS TRIGGER name
  | ENABLE_P REPLICA TRIGGER name
  | ENABLE_P TRIGGER ALL
  | ENABLE_P TRIGGER USER
  | DISABLE_P TRIGGER name
  | DISABLE_P TRIGGER ALL
  | DISABLE_P TRIGGER USER
  | ENABLE_P RULE name
  | ENABLE_P ALWAYS RULE name
  | ENABLE_P REPLICA RULE name
  | DISABLE_P RULE name
  | INHERIT qualified_name
  | NO INHERIT qualified_name
  | OF any_name
  | NOT OF
  | OWNER TO roleSpec
  | SET TABLESPACE name
  | SET reloptions
  | RESET reloptions
  | REPLICA IDENTITY_P replica_identity
  | ENABLE_P ROW LEVEL SECURITY
  | DISABLE_P ROW LEVEL SECURITY
  | FORCE ROW LEVEL SECURITY
  | NO FORCE ROW LEVEL SECURITY
  | alter_generic_options
  ;
alter_column_default  : SET DEFAULT a_expr
  | DROP DEFAULT
  ;
opt_drop_behavior  : CASCADE
  | RESTRICT
  |
  ;
opt_collate_clause  : COLLATE any_name
  |
  ;
alter_using  : USING a_expr
  |
  ;
replica_identity  : NOTHING
  | FULL
  | DEFAULT
  | USING INDEX name
  ;
reloptions  : '(' reloption_list ')'
  ;
opt_reloptions  : WITH reloptions
  |
  ;
reloption_list  : reloption_elem
  | reloption_list ',' reloption_elem
  ;
reloption_elem  : colLabel '=' def_arg
  | colLabel
  | colLabel '.' colLabel '=' def_arg
  | colLabel '.' colLabel
  ;
alter_identity_column_option_list  : alter_identity_column_option
  | alter_identity_column_option_list alter_identity_column_option
  ;
alter_identity_column_option  : RESTART
  | RESTART opt_with numericOnly
  | SET seqOptElem
  | SET GENERATED generated_when
  ;
partitionBoundSpec  : FOR VALUES WITH '(' hash_partbound ')'
  | FOR VALUES IN_P '(' expr_list ')'
  | FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
  | DEFAULT
  ;
hash_partbound_elem  : nonReservedWord iconst
  ;
hash_partbound  : hash_partbound_elem
  | hash_partbound ',' hash_partbound_elem
  ;
alterCompositeTypeStmt  : ALTER TYPE_P any_name alter_type_cmds
  ;
alter_type_cmds  : alter_type_cmd
  | alter_type_cmds ',' alter_type_cmd
  ;
alter_type_cmd  : ADD_P ATTRIBUTE tableFuncElement opt_drop_behavior
  | DROP ATTRIBUTE IF_P EXISTS colId opt_drop_behavior
  | DROP ATTRIBUTE colId opt_drop_behavior
  | ALTER ATTRIBUTE colId opt_set_data TYPE_P typename opt_collate_clause opt_drop_behavior
  ;
closePortalStmt  : CLOSE cursor_name
  | CLOSE ALL
  ;
copyStmt  : COPY opt_binary qualified_name opt_column_list copy_from opt_program copy_file_name copy_delimiter opt_with copy_options where_clause
  | COPY '(' preparableStmt ')' TO opt_program copy_file_name opt_with copy_options
  ;
copy_from  : FROM
  | TO
  ;
opt_program  : PROGRAM
  |
  ;
copy_file_name  : sconst
  | STDIN
  | STDOUT
  ;
copy_options  : copy_opt_list
  | '(' copy_generic_opt_list ')'
  ;
copy_opt_list  : copy_opt_list copy_opt_item
  |
  ;
copy_opt_item  : BINARY
  | FREEZE
  | DELIMITER opt_as sconst
  | NULL_P opt_as sconst
  | CSV
  | HEADER_P
  | QUOTE opt_as sconst
  | ESCAPE opt_as sconst
  | FORCE QUOTE columnList
  | FORCE QUOTE '*'
  | FORCE NOT NULL_P columnList
  | FORCE NULL_P columnList
  | ENCODING sconst
  ;
opt_binary  : BINARY
  |
  ;
copy_delimiter  : opt_using DELIMITERS sconst
  |
  ;
opt_using  : USING
  |
  ;
copy_generic_opt_list  : copy_generic_opt_elem
  | copy_generic_opt_list ',' copy_generic_opt_elem
  ;
copy_generic_opt_elem  : colLabel copy_generic_opt_arg
  ;
copy_generic_opt_arg  : opt_boolean_or_string
  | numericOnly
  | '*'
  | '(' copy_generic_opt_arg_list ')'
  |
  ;
copy_generic_opt_arg_list  : copy_generic_opt_arg_list_item
  | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
  ;
copy_generic_opt_arg_list_item  : opt_boolean_or_string
  ;
createStmt  : CREATE optTemp TABLE qualified_name '(' optTableElementList ')' optInherit optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  | CREATE optTemp TABLE IF_P NOT EXISTS qualified_name '(' optTableElementList ')' optInherit optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  | CREATE optTemp TABLE qualified_name OF any_name optTypedTableElementList optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  | CREATE optTemp TABLE IF_P NOT EXISTS qualified_name OF any_name optTypedTableElementList optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  | CREATE optTemp TABLE qualified_name PARTITION OF qualified_name optTypedTableElementList partitionBoundSpec optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  | CREATE optTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name optTypedTableElementList partitionBoundSpec optPartitionSpec table_access_method_clause optWith onCommitOption optTableSpace
  ;
optTemp  : TEMPORARY
  | TEMP
  | LOCAL TEMPORARY
  | LOCAL TEMP
  | GLOBAL TEMPORARY
  | GLOBAL TEMP
  | UNLOGGED
  |
  ;
optTableElementList  : tableElementList
  |
  ;
optTypedTableElementList  : '(' typedTableElementList ')'
  |
  ;
tableElementList  : tableElement
  | tableElementList ',' tableElement
  ;
typedTableElementList  : typedTableElement
  | typedTableElementList ',' typedTableElement
  ;
tableElement  : columnDef
  | tableLikeClause
  | tableConstraint
  ;
typedTableElement  : columnOptions
  | tableConstraint
  ;
columnDef  : colId typename opt_column_compression create_generic_options colQualList
  ;
columnOptions  : colId colQualList
  | colId WITH OPTIONS colQualList
  ;
column_compression  : COMPRESSION colId
  | COMPRESSION DEFAULT
  ;
opt_column_compression  : column_compression
  |
  ;
colQualList  : colQualList colConstraint
  |
  ;
colConstraint  : CONSTRAINT name colConstraintElem
  | colConstraintElem
  | constraintAttr
  | COLLATE any_name
  ;
colConstraintElem  : NOT NULL_P
  | NULL_P
  | UNIQUE opt_definition optConsTableSpace
  | PRIMARY KEY opt_definition optConsTableSpace
  | CHECK '(' a_expr ')' opt_no_inherit
  | DEFAULT b_expr
  | GENERATED generated_when AS IDENTITY_P optParenthesizedSeqOptList
  | GENERATED generated_when AS '(' a_expr ')' STORED
  | REFERENCES qualified_name opt_column_list key_match key_actions
  ;
generated_when  : ALWAYS
  | BY DEFAULT
  ;
constraintAttr  : DEFERRABLE
  | NOT DEFERRABLE
  | INITIALLY DEFERRED
  | INITIALLY IMMEDIATE
  ;
tableLikeClause  : LIKE qualified_name tableLikeOptionList
  ;
tableLikeOptionList  : tableLikeOptionList INCLUDING tableLikeOption
  | tableLikeOptionList EXCLUDING tableLikeOption
  |
  ;
tableLikeOption  : COMMENTS
  | COMPRESSION
  | CONSTRAINTS
  | DEFAULTS
  | IDENTITY_P
  | GENERATED
  | INDEXES
  | STATISTICS
  | STORAGE
  | ALL
  ;
tableConstraint  : CONSTRAINT name constraintElem
  | constraintElem
  ;
constraintElem  : CHECK '(' a_expr ')' constraintAttributeSpec
  | UNIQUE '(' columnList ')' opt_c_include opt_definition optConsTableSpace constraintAttributeSpec
  | UNIQUE existingIndex constraintAttributeSpec
  | PRIMARY KEY '(' columnList ')' opt_c_include opt_definition optConsTableSpace constraintAttributeSpec
  | PRIMARY KEY existingIndex constraintAttributeSpec
  | EXCLUDE access_method_clause '(' exclusionConstraintList ')' opt_c_include opt_definition optConsTableSpace optWhereClause constraintAttributeSpec
  | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions constraintAttributeSpec
  ;
opt_no_inherit  : NO INHERIT
  |
  ;
opt_column_list  : '(' columnList ')'
  |
  ;
columnList  : columnElem
  | columnList ',' columnElem
  ;
columnElem  : colId
  ;
opt_c_include  : INCLUDE '(' columnList ')'
  |
  ;
key_match  : MATCH FULL
  | MATCH PARTIAL
  | MATCH SIMPLE
  |
  ;
exclusionConstraintList  : exclusionConstraintElem
  | exclusionConstraintList ',' exclusionConstraintElem
  ;
exclusionConstraintElem  : index_elem WITH any_operator
  | index_elem WITH OPERATOR '(' any_operator ')'
  ;
optWhereClause  : WHERE '(' a_expr ')'
  |
  ;
key_actions  : key_update
  | key_delete
  | key_update key_delete
  | key_delete key_update
  |
  ;
key_update  : ON UPDATE key_action
  ;
key_delete  : ON DELETE_P key_action
  ;
key_action  : NO ACTION
  | RESTRICT
  | CASCADE
  | SET NULL_P
  | SET DEFAULT
  ;
optInherit  : INHERITS '(' qualified_name_list ')'
  |
  ;
optPartitionSpec  : partitionSpec
  |
  ;
partitionSpec  : PARTITION BY colId '(' part_params ')'
  ;
part_params  : part_elem
  | part_params ',' part_elem
  ;
part_elem  : colId opt_collate opt_class
  | func_expr_windowless opt_collate opt_class
  | '(' a_expr ')' opt_collate opt_class
  ;
table_access_method_clause  : USING name
  |
  ;
optWith  : WITH reloptions
  | WITHOUT OIDS
  |
  ;
onCommitOption  : ON COMMIT DROP
  | ON COMMIT DELETE_P ROWS
  | ON COMMIT PRESERVE ROWS
  |
  ;
optTableSpace  : TABLESPACE name
  |
  ;
optConsTableSpace  : USING INDEX TABLESPACE name
  |
  ;
existingIndex  : USING INDEX name
  ;
createStatsStmt  : CREATE STATISTICS any_name opt_name_list ON stats_params FROM from_list
  | CREATE STATISTICS IF_P NOT EXISTS any_name opt_name_list ON stats_params FROM from_list
  ;
stats_params  : stats_param
  | stats_params ',' stats_param
  ;
stats_param  : colId
  | func_expr_windowless
  | '(' a_expr ')'
  ;
alterStatsStmt  : ALTER STATISTICS any_name SET STATISTICS signedIconst
  | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS signedIconst
  ;
createAsStmt  : CREATE optTemp TABLE create_as_target AS selectStmt opt_with_data
  | CREATE optTemp TABLE IF_P NOT EXISTS create_as_target AS selectStmt opt_with_data
  ;
create_as_target  : qualified_name opt_column_list table_access_method_clause optWith onCommitOption optTableSpace
  ;
opt_with_data  : WITH DATA_P
  | WITH NO DATA_P
  |
  ;
createMatViewStmt  : CREATE optNoLog MATERIALIZED VIEW create_mv_target AS selectStmt opt_with_data
  | CREATE optNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS selectStmt opt_with_data
  ;
create_mv_target  : qualified_name opt_column_list table_access_method_clause opt_reloptions optTableSpace
  ;
optNoLog  : UNLOGGED
  |
  ;
refreshMatViewStmt  : REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
  ;
createSeqStmt  : CREATE optTemp SEQUENCE qualified_name optSeqOptList
  | CREATE optTemp SEQUENCE IF_P NOT EXISTS qualified_name optSeqOptList
  ;
alterSeqStmt  : ALTER SEQUENCE qualified_name seqOptList
  | ALTER SEQUENCE IF_P EXISTS qualified_name seqOptList
  ;
optSeqOptList  : seqOptList
  |
  ;
optParenthesizedSeqOptList  : '(' seqOptList ')'
  |
  ;
seqOptList  : seqOptElem
  | seqOptList seqOptElem
  ;
seqOptElem  : AS simpleTypename
  | CACHE numericOnly
  | CYCLE
  | NO CYCLE
  | INCREMENT opt_by numericOnly
  | MAXVALUE numericOnly
  | MINVALUE numericOnly
  | NO MAXVALUE
  | NO MINVALUE
  | OWNED BY any_name
  | SEQUENCE NAME_P any_name
  | START opt_with numericOnly
  | RESTART
  | RESTART opt_with numericOnly
  ;
opt_by  : BY
  |
  ;
numericOnly  : FCONST
  | '+' FCONST
  | '-' FCONST
  | signedIconst
  ;
numericOnly_list  : numericOnly
  | numericOnly_list ',' numericOnly
  ;
createPLangStmt  : CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
  | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name HANDLER handler_name opt_inline_handler opt_validator
  ;
opt_trusted  : TRUSTED
  |
  ;
handler_name  : name
  | name attrs
  ;
opt_inline_handler  : INLINE_P handler_name
  |
  ;
validator_clause  : VALIDATOR handler_name
  | NO VALIDATOR
  ;
opt_validator  : validator_clause
  |
  ;
opt_procedural  : PROCEDURAL
  |
  ;
createTableSpaceStmt  : CREATE TABLESPACE name optTableSpaceOwner LOCATION sconst opt_reloptions
  ;
optTableSpaceOwner  : OWNER roleSpec
  |
  ;
dropTableSpaceStmt  : DROP TABLESPACE name
  | DROP TABLESPACE IF_P EXISTS name
  ;
createExtensionStmt  : CREATE EXTENSION name opt_with create_extension_opt_list
  | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
  ;
create_extension_opt_list  : create_extension_opt_list create_extension_opt_item
  |
  ;
create_extension_opt_item  : SCHEMA name
  | VERSION_P nonReservedWord_or_Sconst
  | FROM nonReservedWord_or_Sconst
  | CASCADE
  ;
alterExtensionStmt  : ALTER EXTENSION name UPDATE alter_extension_opt_list
  ;
alter_extension_opt_list  : alter_extension_opt_list alter_extension_opt_item
  |
  ;
alter_extension_opt_item  : TO nonReservedWord_or_Sconst
  ;
alterExtensionContentsStmt  : ALTER EXTENSION name add_drop object_type_name name
  | ALTER EXTENSION name add_drop object_type_any_name any_name
  | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
  | ALTER EXTENSION name add_drop CAST '(' typename AS typename ')'
  | ALTER EXTENSION name add_drop DOMAIN_P typename
  | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
  | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
  | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
  | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
  | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
  | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
  | ALTER EXTENSION name add_drop TRANSFORM FOR typename LANGUAGE name
  | ALTER EXTENSION name add_drop TYPE_P typename
  ;
createFdwStmt  : CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
  ;
fdw_option  : HANDLER handler_name
  | NO HANDLER
  | VALIDATOR handler_name
  | NO VALIDATOR
  ;
fdw_options  : fdw_option
  | fdw_options fdw_option
  ;
opt_fdw_options  : fdw_options
  |
  ;
alterFdwStmt  : ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
  | ALTER FOREIGN DATA_P WRAPPER name fdw_options
  ;
create_generic_options  : OPTIONS '(' generic_option_list ')'
  |
  ;
generic_option_list  : generic_option_elem
  | generic_option_list ',' generic_option_elem
  ;
alter_generic_options  : OPTIONS '(' alter_generic_option_list ')'
  ;
alter_generic_option_list  : alter_generic_option_elem
  | alter_generic_option_list ',' alter_generic_option_elem
  ;
alter_generic_option_elem  : generic_option_elem
  | SET generic_option_elem
  | ADD_P generic_option_elem
  | DROP generic_option_name
  ;
generic_option_elem  : generic_option_name generic_option_arg
  ;
generic_option_name  : colLabel
  ;
generic_option_arg  : sconst
  ;
createForeignServerStmt  : CREATE SERVER name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
  | CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
  ;
opt_type  : TYPE_P sconst
  |
  ;
foreign_server_version  : VERSION_P sconst
  | VERSION_P NULL_P
  ;
opt_foreign_server_version  : foreign_server_version
  |
  ;
alterForeignServerStmt  : ALTER SERVER name foreign_server_version alter_generic_options
  | ALTER SERVER name foreign_server_version
  | ALTER SERVER name alter_generic_options
  ;
createForeignTableStmt  : CREATE FOREIGN TABLE qualified_name '(' optTableElementList ')' optInherit SERVER name create_generic_options
  | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name '(' optTableElementList ')' optInherit SERVER name create_generic_options
  | CREATE FOREIGN TABLE qualified_name PARTITION OF qualified_name optTypedTableElementList partitionBoundSpec SERVER name create_generic_options
  | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name optTypedTableElementList partitionBoundSpec SERVER name create_generic_options
  ;
importForeignSchemaStmt  : IMPORT_P FOREIGN SCHEMA name import_qualification FROM SERVER name INTO name create_generic_options
  ;
import_qualification_type  : LIMIT TO
  | EXCEPT
  ;
import_qualification  : import_qualification_type '(' relation_expr_list ')'
  |
  ;
createUserMappingStmt  : CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
  | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
  ;
auth_ident  : roleSpec
  | USER
  ;
dropUserMappingStmt  : DROP USER MAPPING FOR auth_ident SERVER name
  | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
  ;
alterUserMappingStmt  : ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
  ;
createPolicyStmt  : CREATE POLICY name ON qualified_name rowSecurityDefaultPermissive rowSecurityDefaultForCmd rowSecurityDefaultToRole rowSecurityOptionalExpr rowSecurityOptionalWithCheck
  ;
alterPolicyStmt  : ALTER POLICY name ON qualified_name rowSecurityOptionalToRole rowSecurityOptionalExpr rowSecurityOptionalWithCheck
  ;
rowSecurityOptionalExpr  : USING '(' a_expr ')'
  |
  ;
rowSecurityOptionalWithCheck  : WITH CHECK '(' a_expr ')'
  |
  ;
rowSecurityDefaultToRole  : TO role_list
  |
  ;
rowSecurityOptionalToRole  : TO role_list
  |
  ;
rowSecurityDefaultPermissive  : AS IDENT
  |
  ;
rowSecurityDefaultForCmd  : FOR row_security_cmd
  |
  ;
row_security_cmd  : ALL
  | SELECT
  | INSERT
  | UPDATE
  | DELETE_P
  ;
createAmStmt  : CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
  ;
am_type  : INDEX
  | TABLE
  ;
createTrigStmt  : CREATE opt_or_replace TRIGGER name triggerActionTime triggerEvents ON qualified_name triggerReferencing triggerForSpec triggerWhen EXECUTE fUNCTION_or_PROCEDURE func_name '(' triggerFuncArgs ')'
  | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER triggerEvents ON qualified_name optConstrFromTable constraintAttributeSpec FOR EACH ROW triggerWhen EXECUTE fUNCTION_or_PROCEDURE func_name '(' triggerFuncArgs ')'
  ;
triggerActionTime  : BEFORE
  | AFTER
  | INSTEAD OF
  ;
triggerEvents  : triggerOneEvent
  | triggerEvents OR triggerOneEvent
  ;
triggerOneEvent  : INSERT
  | DELETE_P
  | UPDATE
  | UPDATE OF columnList
  | TRUNCATE
  ;
triggerReferencing  : REFERENCING triggerTransitions
  |
  ;
triggerTransitions  : triggerTransition
  | triggerTransitions triggerTransition
  ;
triggerTransition  : transitionOldOrNew transitionRowOrTable opt_as transitionRelName
  ;
transitionOldOrNew  : NEW
  | OLD
  ;
transitionRowOrTable  : TABLE
  | ROW
  ;
transitionRelName  : colId
  ;
triggerForSpec  : FOR triggerForOptEach triggerForType
  |
  ;
triggerForOptEach  : EACH
  |
  ;
triggerForType  : ROW
  | STATEMENT
  ;
triggerWhen  : WHEN '(' a_expr ')'
  |
  ;
fUNCTION_or_PROCEDURE  : FUNCTION
  | PROCEDURE
  ;
triggerFuncArgs  : triggerFuncArg
  | triggerFuncArgs ',' triggerFuncArg
  |
  ;
triggerFuncArg  : iconst
  | FCONST
  | sconst
  | colLabel
  ;
optConstrFromTable  : FROM qualified_name
  |
  ;
constraintAttributeSpec  :
  | constraintAttributeSpec constraintAttributeElem
  ;
constraintAttributeElem  : NOT DEFERRABLE
  | DEFERRABLE
  | INITIALLY IMMEDIATE
  | INITIALLY DEFERRED
  | NOT VALID
  | NO INHERIT
  ;
createEventTrigStmt  : CREATE EVENT TRIGGER name ON colLabel EXECUTE fUNCTION_or_PROCEDURE func_name '(' ')'
  | CREATE EVENT TRIGGER name ON colLabel WHEN event_trigger_when_list EXECUTE fUNCTION_or_PROCEDURE func_name '(' ')'
  ;
event_trigger_when_list  : event_trigger_when_item
  | event_trigger_when_list AND event_trigger_when_item
  ;
event_trigger_when_item  : colId IN_P '(' event_trigger_value_list ')'
  ;
event_trigger_value_list  : SCONST
  | event_trigger_value_list ',' SCONST
  ;
alterEventTrigStmt  : ALTER EVENT TRIGGER name enable_trigger
  ;
enable_trigger  : ENABLE_P
  | ENABLE_P REPLICA
  | ENABLE_P ALWAYS
  | DISABLE_P
  ;
createAssertionStmt  : CREATE ASSERTION any_name CHECK '(' a_expr ')' constraintAttributeSpec
  ;
defineStmt  : CREATE opt_or_replace AGGREGATE func_name aggr_args definition
  | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
  | CREATE OPERATOR any_operator definition
  | CREATE TYPE_P any_name definition
  | CREATE TYPE_P any_name
  | CREATE TYPE_P any_name AS '(' optTableFuncElementList ')'
  | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
  | CREATE TYPE_P any_name AS RANGE definition
  | CREATE TEXT_P SEARCH PARSER any_name definition
  | CREATE TEXT_P SEARCH DICTIONARY any_name definition
  | CREATE TEXT_P SEARCH TEMPLATE any_name definition
  | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
  | CREATE COLLATION any_name definition
  | CREATE COLLATION IF_P NOT EXISTS any_name definition
  | CREATE COLLATION any_name FROM any_name
  | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
  ;
definition  : '(' def_list ')'
  ;
def_list  : def_elem
  | def_list ',' def_elem
  ;
def_elem  : colLabel '=' def_arg
  | colLabel
  ;
def_arg  : func_type
  | reserved_keyword
  | qual_all_Op
  | numericOnly
  | sconst
  | NONE
  ;
old_aggr_definition  : '(' old_aggr_list ')'
  ;
old_aggr_list  : old_aggr_elem
  | old_aggr_list ',' old_aggr_elem
  ;
old_aggr_elem  : IDENT '=' def_arg
  ;
opt_enum_val_list  : enum_val_list
  |
  ;
enum_val_list  : sconst
  | enum_val_list ',' sconst
  ;
alterEnumStmt  : ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists sconst
  | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists sconst BEFORE sconst
  | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists sconst AFTER sconst
  | ALTER TYPE_P any_name RENAME VALUE_P sconst TO sconst
  ;
opt_if_not_exists  : IF_P NOT EXISTS
  |
  ;
createOpClassStmt  : CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P typename USING name opt_opfamily AS opclass_item_list
  ;
opclass_item_list  : opclass_item
  | opclass_item_list ',' opclass_item
  ;
opclass_item  : OPERATOR iconst any_operator opclass_purpose opt_recheck
  | OPERATOR iconst operator_with_argtypes opclass_purpose opt_recheck
  | FUNCTION iconst function_with_argtypes
  | FUNCTION iconst '(' type_list ')' function_with_argtypes
  | STORAGE typename
  ;
opt_default  : DEFAULT
  |
  ;
opt_opfamily  : FAMILY any_name
  |
  ;
opclass_purpose  : FOR SEARCH
  | FOR ORDER BY any_name
  |
  ;
opt_recheck  : RECHECK
  |
  ;
createOpFamilyStmt  : CREATE OPERATOR FAMILY any_name USING name
  ;
alterOpFamilyStmt  : ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
  | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
  ;
opclass_drop_list  : opclass_drop
  | opclass_drop_list ',' opclass_drop
  ;
opclass_drop  : OPERATOR iconst '(' type_list ')'
  | FUNCTION iconst '(' type_list ')'
  ;
dropOpClassStmt  : DROP OPERATOR CLASS any_name USING name opt_drop_behavior
  | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
  ;
dropOpFamilyStmt  : DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
  | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
  ;
dropOwnedStmt  : DROP OWNED BY role_list opt_drop_behavior
  ;
reassignOwnedStmt  : REASSIGN OWNED BY role_list TO roleSpec
  ;
dropStmt  : DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
  | DROP object_type_any_name any_name_list opt_drop_behavior
  | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
  | DROP drop_type_name name_list opt_drop_behavior
  | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
  | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
  | DROP TYPE_P type_name_list opt_drop_behavior
  | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
  | DROP DOMAIN_P type_name_list opt_drop_behavior
  | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
  | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
  | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
  ;
object_type_any_name  : TABLE
  | SEQUENCE
  | VIEW
  | MATERIALIZED VIEW
  | INDEX
  | FOREIGN TABLE
  | COLLATION
  | CONVERSION_P
  | STATISTICS
  | TEXT_P SEARCH PARSER
  | TEXT_P SEARCH DICTIONARY
  | TEXT_P SEARCH TEMPLATE
  | TEXT_P SEARCH CONFIGURATION
  ;
object_type_name  : drop_type_name
  | DATABASE
  | ROLE
  | SUBSCRIPTION
  | TABLESPACE
  ;
drop_type_name  : ACCESS METHOD
  | EVENT TRIGGER
  | EXTENSION
  | FOREIGN DATA_P WRAPPER
  | opt_procedural LANGUAGE
  | PUBLICATION
  | SCHEMA
  | SERVER
  ;
object_type_name_on_any_name  : POLICY
  | RULE
  | TRIGGER
  ;
any_name_list  : any_name
  | any_name_list ',' any_name
  ;
any_name  : colId
  | colId attrs
  ;
attrs  : '.' attr_name
  | attrs '.' attr_name
  ;
type_name_list  : typename
  | type_name_list ',' typename
  ;
truncateStmt  : TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
  ;
opt_restart_seqs  : CONTINUE_P IDENTITY_P
  | RESTART IDENTITY_P
  |
  ;
commentStmt  : COMMENT ON object_type_any_name any_name IS comment_text
  | COMMENT ON COLUMN any_name IS comment_text
  | COMMENT ON object_type_name name IS comment_text
  | COMMENT ON TYPE_P typename IS comment_text
  | COMMENT ON DOMAIN_P typename IS comment_text
  | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
  | COMMENT ON FUNCTION function_with_argtypes IS comment_text
  | COMMENT ON OPERATOR operator_with_argtypes IS comment_text
  | COMMENT ON CONSTRAINT name ON any_name IS comment_text
  | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
  | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
  | COMMENT ON PROCEDURE function_with_argtypes IS comment_text
  | COMMENT ON ROUTINE function_with_argtypes IS comment_text
  | COMMENT ON TRANSFORM FOR typename LANGUAGE name IS comment_text
  | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
  | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
  | COMMENT ON LARGE_P OBJECT_P numericOnly IS comment_text
  | COMMENT ON CAST '(' typename AS typename ')' IS comment_text
  ;
comment_text  : sconst
  | NULL_P
  ;
secLabelStmt  : SECURITY LABEL opt_provider ON object_type_any_name any_name IS security_label
  | SECURITY LABEL opt_provider ON COLUMN any_name IS security_label
  | SECURITY LABEL opt_provider ON object_type_name name IS security_label
  | SECURITY LABEL opt_provider ON TYPE_P typename IS security_label
  | SECURITY LABEL opt_provider ON DOMAIN_P typename IS security_label
  | SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes IS security_label
  | SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes IS security_label
  | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P numericOnly IS security_label
  | SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes IS security_label
  | SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes IS security_label
  ;
opt_provider  : FOR nonReservedWord_or_Sconst
  |
  ;
security_label  : sconst
  | NULL_P
  ;
fetchStmt  : FETCH fetch_args
  | MOVE fetch_args
  ;
fetch_args  : cursor_name
  | from_in cursor_name
  | NEXT opt_from_in cursor_name
  | PRIOR opt_from_in cursor_name
  | FIRST_P opt_from_in cursor_name
  | LAST_P opt_from_in cursor_name
  | ABSOLUTE_P signedIconst opt_from_in cursor_name
  | RELATIVE_P signedIconst opt_from_in cursor_name
  | signedIconst opt_from_in cursor_name
  | ALL opt_from_in cursor_name
  | FORWARD opt_from_in cursor_name
  | FORWARD signedIconst opt_from_in cursor_name
  | FORWARD ALL opt_from_in cursor_name
  | BACKWARD opt_from_in cursor_name
  | BACKWARD signedIconst opt_from_in cursor_name
  | BACKWARD ALL opt_from_in cursor_name
  ;
from_in  : FROM
  | IN_P
  ;
opt_from_in  : from_in
  |
  ;
grantStmt  : GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option opt_granted_by
  ;
revokeStmt  : REVOKE privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
  | REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
  ;
privileges  : privilege_list
  | ALL
  | ALL PRIVILEGES
  | ALL '(' columnList ')'
  | ALL PRIVILEGES '(' columnList ')'
  ;
privilege_list  : privilege
  | privilege_list ',' privilege
  ;
privilege  : SELECT opt_column_list
  | REFERENCES opt_column_list
  | CREATE opt_column_list
  | colId opt_column_list
  ;
privilege_target  : qualified_name_list
  | TABLE qualified_name_list
  | SEQUENCE qualified_name_list
  | FOREIGN DATA_P WRAPPER name_list
  | FOREIGN SERVER name_list
  | FUNCTION function_with_argtypes_list
  | PROCEDURE function_with_argtypes_list
  | ROUTINE function_with_argtypes_list
  | DATABASE name_list
  | DOMAIN_P any_name_list
  | LANGUAGE name_list
  | LARGE_P OBJECT_P numericOnly_list
  | SCHEMA name_list
  | TABLESPACE name_list
  | TYPE_P any_name_list
  | ALL TABLES IN_P SCHEMA name_list
  | ALL SEQUENCES IN_P SCHEMA name_list
  | ALL FUNCTIONS IN_P SCHEMA name_list
  | ALL PROCEDURES IN_P SCHEMA name_list
  | ALL ROUTINES IN_P SCHEMA name_list
  ;
grantee_list  : grantee
  | grantee_list ',' grantee
  ;
grantee  : roleSpec
  | GROUP_P roleSpec
  ;
opt_grant_grant_option  : WITH GRANT OPTION
  |
  ;
grantRoleStmt  : GRANT privilege_list TO role_list opt_grant_admin_option opt_granted_by
  ;
revokeRoleStmt  : REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
  | REVOKE ADMIN OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
  ;
opt_grant_admin_option  : WITH ADMIN OPTION
  |
  ;
opt_granted_by  : GRANTED BY roleSpec
  |
  ;
alterDefaultPrivilegesStmt  : ALTER DEFAULT PRIVILEGES defACLOptionList defACLAction
  ;
defACLOptionList  : defACLOptionList defACLOption
  |
  ;
defACLOption  : IN_P SCHEMA name_list
  | FOR ROLE role_list
  | FOR USER role_list
  ;
defACLAction  : GRANT privileges ON defacl_privilege_target TO grantee_list opt_grant_grant_option
  | REVOKE privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
  | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
  ;
defacl_privilege_target  : TABLES
  | FUNCTIONS
  | ROUTINES
  | SEQUENCES
  | TYPES_P
  | SCHEMAS
  ;
indexStmt  : CREATE opt_unique INDEX opt_concurrently opt_index_name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_reloptions optTableSpace where_clause
  | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_reloptions optTableSpace where_clause
  ;
opt_unique  : UNIQUE
  |
  ;
opt_concurrently  : CONCURRENTLY
  |
  ;
opt_index_name  : name
  |
  ;
access_method_clause  : USING name
  |
  ;
index_params  : index_elem
  | index_params ',' index_elem
  ;
index_elem_options  : opt_collate opt_class opt_asc_desc opt_nulls_order
  | opt_collate any_name reloptions opt_asc_desc opt_nulls_order
  ;
index_elem  : colId index_elem_options
  | func_expr_windowless index_elem_options
  | '(' a_expr ')' index_elem_options
  ;
opt_include  : INCLUDE '(' index_including_params ')'
  |
  ;
index_including_params  : index_elem
  | index_including_params ',' index_elem
  ;
opt_collate  : COLLATE any_name
  |
  ;
opt_class  : any_name
  |
  ;
opt_asc_desc  : ASC
  | DESC
  |
  ;
opt_nulls_order  : NULLS_LA FIRST_P
  | NULLS_LA LAST_P
  |
  ;
createFunctionStmt  : CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS func_return opt_createfunc_opt_list opt_routine_body
  | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
  | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
  | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
  ;
opt_or_replace  : OR REPLACE
  |
  ;
func_args  : '(' func_args_list ')'
  | '(' ')'
  ;
func_args_list  : func_arg
  | func_args_list ',' func_arg
  ;
function_with_argtypes_list  : function_with_argtypes
  | function_with_argtypes_list ',' function_with_argtypes
  ;
function_with_argtypes  : func_name func_args
  | type_func_name_keyword
  | colId
  | colId indirection
  ;
func_args_with_defaults  : '(' func_args_with_defaults_list ')'
  | '(' ')'
  ;
func_args_with_defaults_list  : func_arg_with_default
  | func_args_with_defaults_list ',' func_arg_with_default
  ;
func_arg  : arg_class param_name func_type
  | param_name arg_class func_type
  | param_name func_type
  | arg_class func_type
  | func_type
  ;
arg_class  : IN_P
  | OUT_P
  | INOUT
  | IN_P OUT_P
  | VARIADIC
  ;
param_name  : type_function_name
  ;
func_return  : func_type
  ;
func_type  : typename
  | type_function_name attrs '%' TYPE_P
  | SETOF type_function_name attrs '%' TYPE_P
  ;
func_arg_with_default  : func_arg
  | func_arg DEFAULT a_expr
  | func_arg '=' a_expr
  ;
aggr_arg  : func_arg
  ;
aggr_args  : '(' '*' ')'
  | '(' aggr_args_list ')'
  | '(' ORDER BY aggr_args_list ')'
  | '(' aggr_args_list ORDER BY aggr_args_list ')'
  ;
aggr_args_list  : aggr_arg
  | aggr_args_list ',' aggr_arg
  ;
aggregate_with_argtypes  : func_name aggr_args
  ;
aggregate_with_argtypes_list  : aggregate_with_argtypes
  | aggregate_with_argtypes_list ',' aggregate_with_argtypes
  ;
opt_createfunc_opt_list  : createfunc_opt_list
  |
  ;
createfunc_opt_list  : createfunc_opt_item
  | createfunc_opt_list createfunc_opt_item
  ;
common_func_opt_item  : CALLED ON NULL_P INPUT_P
  | RETURNS NULL_P ON NULL_P INPUT_P
  | STRICT_P
  | IMMUTABLE
  | STABLE
  | VOLATILE
  | EXTERNAL SECURITY DEFINER
  | EXTERNAL SECURITY INVOKER
  | SECURITY DEFINER
  | SECURITY INVOKER
  | LEAKPROOF
  | NOT LEAKPROOF
  | COST numericOnly
  | ROWS numericOnly
  | SUPPORT any_name
  | functionSetResetClause
  | PARALLEL colId
  ;
createfunc_opt_item  : AS func_as
  | LANGUAGE nonReservedWord_or_Sconst
  | TRANSFORM transform_type_list
  | WINDOW
  | common_func_opt_item
  ;
func_as  : sconst
  | sconst ',' sconst
  ;
returnStmt  : RETURN a_expr
  ;
opt_routine_body  : returnStmt
  | BEGIN_P ATOMIC routine_body_stmt_list END_P
  |
  ;
routine_body_stmt_list  : routine_body_stmt_list routine_body_stmt ';'
  |
  ;
routine_body_stmt  : stmt
  | returnStmt
  ;
transform_type_list  : FOR TYPE_P typename
  | transform_type_list ',' FOR TYPE_P typename
  ;
opt_definition  : WITH definition
  |
  ;
table_func_column  : param_name func_type
  ;
table_func_column_list  : table_func_column
  | table_func_column_list ',' table_func_column
  ;
alterFunctionStmt  : ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
  | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
  | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
  ;
alterfunc_opt_list  : common_func_opt_item
  | alterfunc_opt_list common_func_opt_item
  ;
opt_restrict  : RESTRICT
  |
  ;
removeFuncStmt  : DROP FUNCTION function_with_argtypes_list opt_drop_behavior
  | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
  | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
  | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
  | DROP ROUTINE function_with_argtypes_list opt_drop_behavior
  | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
  ;
removeAggrStmt  : DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
  | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
  ;
removeOperStmt  : DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
  | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
  ;
oper_argtypes  : '(' typename ')'
  | '(' typename ',' typename ')'
  | '(' NONE ',' typename ')'
  | '(' typename ',' NONE ')'
  ;
any_operator  : all_Op
  | colId '.' any_operator
  ;
operator_with_argtypes_list  : operator_with_argtypes
  | operator_with_argtypes_list ',' operator_with_argtypes
  ;
operator_with_argtypes  : any_operator oper_argtypes
  ;
doStmt  : DO dostmt_opt_list
  ;
dostmt_opt_list  : dostmt_opt_item
  | dostmt_opt_list dostmt_opt_item
  ;
dostmt_opt_item  : sconst
  | LANGUAGE nonReservedWord_or_Sconst
  ;
createCastStmt  : CREATE CAST '(' typename AS typename ')' WITH FUNCTION function_with_argtypes cast_context
  | CREATE CAST '(' typename AS typename ')' WITHOUT FUNCTION cast_context
  | CREATE CAST '(' typename AS typename ')' WITH INOUT cast_context
  ;
cast_context  : AS IMPLICIT_P
  | AS ASSIGNMENT
  |
  ;
dropCastStmt  : DROP CAST opt_if_exists '(' typename AS typename ')' opt_drop_behavior
  ;
opt_if_exists  : IF_P EXISTS
  |
  ;
createTransformStmt  : CREATE opt_or_replace TRANSFORM FOR typename LANGUAGE name '(' transform_element_list ')'
  ;
transform_element_list  : FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
  | TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
  | FROM SQL_P WITH FUNCTION function_with_argtypes
  | TO SQL_P WITH FUNCTION function_with_argtypes
  ;
dropTransformStmt  : DROP TRANSFORM opt_if_exists FOR typename LANGUAGE name opt_drop_behavior
  ;
reindexStmt  : REINDEX reindex_target_type opt_concurrently qualified_name
  | REINDEX reindex_target_multitable opt_concurrently name
  | REINDEX '(' utility_option_list ')' reindex_target_type opt_concurrently qualified_name
  | REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name
  ;
reindex_target_type  : INDEX
  | TABLE
  ;
reindex_target_multitable  : SCHEMA
  | SYSTEM_P
  | DATABASE
  ;
alterTblSpcStmt  : ALTER TABLESPACE name SET reloptions
  | ALTER TABLESPACE name RESET reloptions
  ;
renameStmt  : ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
  | ALTER COLLATION any_name RENAME TO name
  | ALTER CONVERSION_P any_name RENAME TO name
  | ALTER DATABASE name RENAME TO name
  | ALTER DOMAIN_P any_name RENAME TO name
  | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
  | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
  | ALTER FUNCTION function_with_argtypes RENAME TO name
  | ALTER GROUP_P roleId RENAME TO roleId
  | ALTER opt_procedural LANGUAGE name RENAME TO name
  | ALTER OPERATOR CLASS any_name USING name RENAME TO name
  | ALTER OPERATOR FAMILY any_name USING name RENAME TO name
  | ALTER POLICY name ON qualified_name RENAME TO name
  | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
  | ALTER PROCEDURE function_with_argtypes RENAME TO name
  | ALTER PUBLICATION name RENAME TO name
  | ALTER ROUTINE function_with_argtypes RENAME TO name
  | ALTER SCHEMA name RENAME TO name
  | ALTER SERVER name RENAME TO name
  | ALTER SUBSCRIPTION name RENAME TO name
  | ALTER TABLE relation_expr RENAME TO name
  | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
  | ALTER SEQUENCE qualified_name RENAME TO name
  | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
  | ALTER VIEW qualified_name RENAME TO name
  | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
  | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
  | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
  | ALTER INDEX qualified_name RENAME TO name
  | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
  | ALTER FOREIGN TABLE relation_expr RENAME TO name
  | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
  | ALTER TABLE relation_expr RENAME opt_column name TO name
  | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
  | ALTER VIEW qualified_name RENAME opt_column name TO name
  | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
  | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
  | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
  | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
  | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
  | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
  | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
  | ALTER RULE name ON qualified_name RENAME TO name
  | ALTER TRIGGER name ON qualified_name RENAME TO name
  | ALTER EVENT TRIGGER name RENAME TO name
  | ALTER ROLE roleId RENAME TO roleId
  | ALTER USER roleId RENAME TO roleId
  | ALTER TABLESPACE name RENAME TO name
  | ALTER STATISTICS any_name RENAME TO name
  | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
  | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
  | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
  | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
  | ALTER TYPE_P any_name RENAME TO name
  | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
  ;
opt_column  : COLUMN
  |
  ;
opt_set_data  : SET DATA_P
  |
  ;
alterObjectDependsStmt  : ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
  | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
  | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
  | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
  | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
  | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
  ;
opt_no  : NO
  |
  ;
alterObjectSchemaStmt  : ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
  | ALTER COLLATION any_name SET SCHEMA name
  | ALTER CONVERSION_P any_name SET SCHEMA name
  | ALTER DOMAIN_P any_name SET SCHEMA name
  | ALTER EXTENSION name SET SCHEMA name
  | ALTER FUNCTION function_with_argtypes SET SCHEMA name
  | ALTER OPERATOR operator_with_argtypes SET SCHEMA name
  | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
  | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
  | ALTER PROCEDURE function_with_argtypes SET SCHEMA name
  | ALTER ROUTINE function_with_argtypes SET SCHEMA name
  | ALTER TABLE relation_expr SET SCHEMA name
  | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
  | ALTER STATISTICS any_name SET SCHEMA name
  | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
  | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
  | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
  | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
  | ALTER SEQUENCE qualified_name SET SCHEMA name
  | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
  | ALTER VIEW qualified_name SET SCHEMA name
  | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
  | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
  | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
  | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
  | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
  | ALTER TYPE_P any_name SET SCHEMA name
  ;
alterOperatorStmt  : ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
  ;
operator_def_list  : operator_def_elem
  | operator_def_list ',' operator_def_elem
  ;
operator_def_elem  : colLabel '=' NONE
  | colLabel '=' operator_def_arg
  ;
operator_def_arg  : func_type
  | reserved_keyword
  | qual_all_Op
  | numericOnly
  | sconst
  ;
alterTypeStmt  : ALTER TYPE_P any_name SET '(' operator_def_list ')'
  ;
alterOwnerStmt  : ALTER AGGREGATE aggregate_with_argtypes OWNER TO roleSpec
  | ALTER COLLATION any_name OWNER TO roleSpec
  | ALTER CONVERSION_P any_name OWNER TO roleSpec
  | ALTER DATABASE name OWNER TO roleSpec
  | ALTER DOMAIN_P any_name OWNER TO roleSpec
  | ALTER FUNCTION function_with_argtypes OWNER TO roleSpec
  | ALTER opt_procedural LANGUAGE name OWNER TO roleSpec
  | ALTER LARGE_P OBJECT_P numericOnly OWNER TO roleSpec
  | ALTER OPERATOR operator_with_argtypes OWNER TO roleSpec
  | ALTER OPERATOR CLASS any_name USING name OWNER TO roleSpec
  | ALTER OPERATOR FAMILY any_name USING name OWNER TO roleSpec
  | ALTER PROCEDURE function_with_argtypes OWNER TO roleSpec
  | ALTER ROUTINE function_with_argtypes OWNER TO roleSpec
  | ALTER SCHEMA name OWNER TO roleSpec
  | ALTER TYPE_P any_name OWNER TO roleSpec
  | ALTER TABLESPACE name OWNER TO roleSpec
  | ALTER STATISTICS any_name OWNER TO roleSpec
  | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO roleSpec
  | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO roleSpec
  | ALTER FOREIGN DATA_P WRAPPER name OWNER TO roleSpec
  | ALTER SERVER name OWNER TO roleSpec
  | ALTER EVENT TRIGGER name OWNER TO roleSpec
  | ALTER PUBLICATION name OWNER TO roleSpec
  | ALTER SUBSCRIPTION name OWNER TO roleSpec
  ;
createPublicationStmt  : CREATE PUBLICATION name opt_publication_for_tables opt_definition
  ;
opt_publication_for_tables  : publication_for_tables
  |
  ;
publication_for_tables  : FOR TABLE relation_expr_list
  | FOR ALL TABLES
  ;
alterPublicationStmt  : ALTER PUBLICATION name SET definition
  | ALTER PUBLICATION name ADD_P TABLE relation_expr_list
  | ALTER PUBLICATION name SET TABLE relation_expr_list
  | ALTER PUBLICATION name DROP TABLE relation_expr_list
  ;
createSubscriptionStmt  : CREATE SUBSCRIPTION name CONNECTION sconst PUBLICATION name_list opt_definition
  ;
alterSubscriptionStmt  : ALTER SUBSCRIPTION name SET definition
  | ALTER SUBSCRIPTION name CONNECTION sconst
  | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
  | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
  | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
  | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
  | ALTER SUBSCRIPTION name ENABLE_P
  | ALTER SUBSCRIPTION name DISABLE_P
  ;
dropSubscriptionStmt  : DROP SUBSCRIPTION name opt_drop_behavior
  | DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
  ;
ruleStmt  : CREATE opt_or_replace RULE name AS ON event TO qualified_name where_clause DO opt_instead ruleActionList
  ;
ruleActionList  : NOTHING
  | ruleActionStmt
  | '(' ruleActionMulti ')'
  ;
ruleActionMulti  : ruleActionMulti ';' ruleActionStmtOrEmpty
  | ruleActionStmtOrEmpty
  ;
ruleActionStmt  : selectStmt
  | insertStmt
  | updateStmt
  | deleteStmt
  | notifyStmt
  ;
ruleActionStmtOrEmpty  : ruleActionStmt
  |
  ;
event  : SELECT
  | UPDATE
  | DELETE_P
  | INSERT
  ;
opt_instead  : INSTEAD
  | ALSO
  |
  ;
notifyStmt  : NOTIFY colId notify_payload
  ;
notify_payload  : ',' sconst
  |
  ;
listenStmt  : LISTEN colId
  ;
unlistenStmt  : UNLISTEN colId
  | UNLISTEN '*'
  ;
transactionStmt  : ABORT_P opt_transaction opt_transaction_chain
  | START TRANSACTION transaction_mode_list_or_empty
  | COMMIT opt_transaction opt_transaction_chain
  | ROLLBACK opt_transaction opt_transaction_chain
  | SAVEPOINT colId
  | RELEASE SAVEPOINT colId
  | RELEASE colId
  | ROLLBACK opt_transaction TO SAVEPOINT colId
  | ROLLBACK opt_transaction TO colId
  | PREPARE TRANSACTION sconst
  | COMMIT PREPARED sconst
  | ROLLBACK PREPARED sconst
  ;
transactionStmtLegacy  : BEGIN_P opt_transaction transaction_mode_list_or_empty
  | END_P opt_transaction opt_transaction_chain
  ;
opt_transaction  : WORK
  | TRANSACTION
  |
  ;
transaction_mode_item  : ISOLATION LEVEL iso_level
  | READ ONLY
  | READ WRITE
  | DEFERRABLE
  | NOT DEFERRABLE
  ;
transaction_mode_list  : transaction_mode_item
  | transaction_mode_list ',' transaction_mode_item
  | transaction_mode_list transaction_mode_item
  ;
transaction_mode_list_or_empty  : transaction_mode_list
  |
  ;
opt_transaction_chain  : AND CHAIN
  | AND NO CHAIN
  |
  ;
viewStmt  : CREATE optTemp VIEW qualified_name opt_column_list opt_reloptions AS selectStmt opt_check_option
  | CREATE OR REPLACE optTemp VIEW qualified_name opt_column_list opt_reloptions AS selectStmt opt_check_option
  | CREATE optTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS selectStmt opt_check_option
  | CREATE OR REPLACE optTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS selectStmt opt_check_option
  ;
opt_check_option  : WITH CHECK OPTION
  | WITH CASCADED CHECK OPTION
  | WITH LOCAL CHECK OPTION
  |
  ;
loadStmt  : LOAD file_name
  ;
createdbStmt  : CREATE DATABASE name opt_with createdb_opt_list
  ;
createdb_opt_list  : createdb_opt_items
  |
  ;
createdb_opt_items  : createdb_opt_item
  | createdb_opt_items createdb_opt_item
  ;
createdb_opt_item  : createdb_opt_name opt_equal signedIconst
  | createdb_opt_name opt_equal opt_boolean_or_string
  | createdb_opt_name opt_equal DEFAULT
  ;
createdb_opt_name  : IDENT
  | CONNECTION LIMIT
  | ENCODING
  | LOCATION
  | OWNER
  | TABLESPACE
  | TEMPLATE
  ;
opt_equal  : '='
  |
  ;
alterDatabaseStmt  : ALTER DATABASE name WITH createdb_opt_list
  | ALTER DATABASE name createdb_opt_list
  | ALTER DATABASE name SET TABLESPACE name
  ;
alterDatabaseSetStmt  : ALTER DATABASE name setResetClause
  ;
dropdbStmt  : DROP DATABASE name
  | DROP DATABASE IF_P EXISTS name
  | DROP DATABASE name opt_with '(' drop_option_list ')'
  | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
  ;
drop_option_list  : drop_option
  | drop_option_list ',' drop_option
  ;
drop_option  : FORCE
  ;
alterCollationStmt  : ALTER COLLATION any_name REFRESH VERSION_P
  ;
alterSystemStmt  : ALTER SYSTEM_P SET generic_set
  | ALTER SYSTEM_P RESET generic_reset
  ;
createDomainStmt  : CREATE DOMAIN_P any_name opt_as typename colQualList
  ;
alterDomainStmt  : ALTER DOMAIN_P any_name alter_column_default
  | ALTER DOMAIN_P any_name DROP NOT NULL_P
  | ALTER DOMAIN_P any_name SET NOT NULL_P
  | ALTER DOMAIN_P any_name ADD_P tableConstraint
  | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
  | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
  | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
  ;
opt_as  : AS
  |
  ;
alterTSDictionaryStmt  : ALTER TEXT_P SEARCH DICTIONARY any_name definition
  ;
alterTSConfigurationStmt  : ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
  | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
  | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
  | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
  | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
  | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
  ;
any_with  : WITH
  | WITH_LA
  ;
createConversionStmt  : CREATE opt_default CONVERSION_P any_name FOR sconst TO sconst FROM any_name
  ;
clusterStmt  : CLUSTER opt_verbose qualified_name cluster_index_specification
  | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
  | CLUSTER opt_verbose
  | CLUSTER opt_verbose name ON qualified_name
  ;
cluster_index_specification  : USING name
  |
  ;
vacuumStmt  : VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
  | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
  ;
analyzeStmt  : analyze_keyword opt_verbose opt_vacuum_relation_list
  | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list
  ;
utility_option_list  : utility_option_elem
  | utility_option_list ',' utility_option_elem
  ;
analyze_keyword  : ANALYZE
  | ANALYSE
  ;
utility_option_elem  : utility_option_name utility_option_arg
  ;
utility_option_name  : nonReservedWord
  | analyze_keyword
  ;
utility_option_arg  : opt_boolean_or_string
  | numericOnly
  |
  ;
opt_analyze  : analyze_keyword
  |
  ;
opt_verbose  : VERBOSE
  |
  ;
opt_full  : FULL
  |
  ;
opt_freeze  : FREEZE
  |
  ;
opt_name_list  : '(' name_list ')'
  |
  ;
vacuum_relation  : qualified_name opt_name_list
  ;
vacuum_relation_list  : vacuum_relation
  | vacuum_relation_list ',' vacuum_relation
  ;
opt_vacuum_relation_list  : vacuum_relation_list
  |
  ;
explainStmt  : EXPLAIN explainableStmt
  | EXPLAIN analyze_keyword opt_verbose explainableStmt
  | EXPLAIN VERBOSE explainableStmt
  | EXPLAIN '(' utility_option_list ')' explainableStmt
  ;
explainableStmt  : selectStmt
  | insertStmt
  | updateStmt
  | deleteStmt
  | declareCursorStmt
  | createAsStmt
  | createMatViewStmt
  | refreshMatViewStmt
  | executeStmt
  ;
prepareStmt  : PREPARE name prep_type_clause AS preparableStmt
  ;
prep_type_clause  : '(' type_list ')'
  |
  ;
preparableStmt  : selectStmt
  | insertStmt
  | updateStmt
  | deleteStmt
  ;
executeStmt  : EXECUTE name execute_param_clause
  | CREATE optTemp TABLE create_as_target AS EXECUTE name execute_param_clause opt_with_data
  | CREATE optTemp TABLE IF_P NOT EXISTS create_as_target AS EXECUTE name execute_param_clause opt_with_data
  ;
execute_param_clause  : '(' expr_list ')'
  |
  ;
deallocateStmt  : DEALLOCATE name
  | DEALLOCATE PREPARE name
  | DEALLOCATE ALL
  | DEALLOCATE PREPARE ALL
  ;
insertStmt  : opt_with_clause INSERT INTO insert_target insert_rest opt_on_conflict returning_clause
  ;
insert_target  : qualified_name
  | qualified_name AS colId
  ;
insert_rest  : selectStmt
  | OVERRIDING override_kind VALUE_P selectStmt
  | '(' insert_column_list ')' selectStmt
  | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P selectStmt
  | DEFAULT VALUES
  ;
override_kind  : USER
  | SYSTEM_P
  ;
insert_column_list  : insert_column_item
  | insert_column_list ',' insert_column_item
  ;
insert_column_item  : colId opt_indirection
  ;
opt_on_conflict  : ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
  | ON CONFLICT opt_conf_expr DO NOTHING
  |
  ;
opt_conf_expr  : '(' index_params ')' where_clause
  | ON CONSTRAINT name
  |
  ;
returning_clause  : RETURNING target_list
  |
  ;
deleteStmt  : opt_with_clause DELETE_P FROM relation_expr_opt_alias using_clause where_or_current_clause returning_clause
  ;
using_clause  : USING from_list
  |
  ;
lockStmt  : LOCK_P opt_table relation_expr_list opt_lock opt_nowait
  ;
opt_lock  : IN_P lock_type MODE
  |
  ;
lock_type  : ACCESS SHARE
  | ROW SHARE
  | ROW EXCLUSIVE
  | SHARE UPDATE EXCLUSIVE
  | SHARE
  | SHARE ROW EXCLUSIVE
  | EXCLUSIVE
  | ACCESS EXCLUSIVE
  ;
opt_nowait  : NOWAIT
  |
  ;
opt_nowait_or_skip  : NOWAIT
  | SKIP LOCKED
  |
  ;
updateStmt  : opt_with_clause UPDATE relation_expr_opt_alias SET set_clause_list from_clause where_or_current_clause returning_clause
  ;
set_clause_list  : set_clause
  | set_clause_list ',' set_clause
  ;
set_clause  : set_target '=' a_expr
  | '(' set_target_list ')' '=' a_expr
  ;
set_target  : colId opt_indirection
  ;
set_target_list  : set_target
  | set_target_list ',' set_target
  ;
declareCursorStmt  : DECLARE cursor_name cursor_options CURSOR opt_hold FOR selectStmt
  ;
cursor_name  : name
  ;
cursor_options  :
  | cursor_options NO SCROLL
  | cursor_options SCROLL
  | cursor_options BINARY
  | cursor_options ASENSITIVE
  | cursor_options INSENSITIVE
  ;
opt_hold  :
  | WITH HOLD
  | WITHOUT HOLD
  ;
selectStmt  : select_no_parens UMINUS
  | select_with_parens UMINUS
  ;
select_with_parens  : '(' select_no_parens ')'
  | '(' select_with_parens ')'
  ;
select_no_parens  : simple_select
  | select_clause sort_clause
  | select_clause opt_sort_clause for_locking_clause opt_select_limit
  | select_clause opt_sort_clause select_limit opt_for_locking_clause
  | with_clause select_clause
  | with_clause select_clause sort_clause
  | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
  | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
  ;
select_clause  : simple_select
  | select_with_parens
  ;
simple_select  : SELECT opt_all_clause opt_target_list into_clause from_clause where_clause group_clause having_clause window_clause
  | SELECT distinct_clause target_list into_clause from_clause where_clause group_clause having_clause window_clause
  | values_clause
  | TABLE relation_expr
  | select_clause UNION set_quantifier select_clause
  | select_clause INTERSECT set_quantifier select_clause
  | select_clause EXCEPT set_quantifier select_clause
  ;
with_clause  : WITH cte_list
  | WITH_LA cte_list
  | WITH RECURSIVE cte_list
  ;
cte_list  : common_table_expr
  | cte_list ',' common_table_expr
  ;
common_table_expr  : name opt_name_list AS opt_materialized '(' preparableStmt ')' opt_search_clause opt_cycle_clause
  ;
opt_materialized  : MATERIALIZED
  | NOT MATERIALIZED
  |
  ;
opt_search_clause  : SEARCH DEPTH FIRST_P BY columnList SET colId
  | SEARCH BREADTH FIRST_P BY columnList SET colId
  |
  ;
opt_cycle_clause  : CYCLE columnList SET colId TO aexprConst DEFAULT aexprConst USING colId
  | CYCLE columnList SET colId USING colId
  |
  ;
opt_with_clause  : with_clause
  |
  ;
into_clause  : INTO optTempTableName
  |
  ;
optTempTableName  : TEMPORARY opt_table qualified_name
  | TEMP opt_table qualified_name
  | LOCAL TEMPORARY opt_table qualified_name
  | LOCAL TEMP opt_table qualified_name
  | GLOBAL TEMPORARY opt_table qualified_name
  | GLOBAL TEMP opt_table qualified_name
  | UNLOGGED opt_table qualified_name
  | TABLE qualified_name
  | qualified_name
  ;
opt_table  : TABLE
  |
  ;
set_quantifier  : ALL
  | DISTINCT
  |
  ;
distinct_clause  : DISTINCT
  | DISTINCT ON '(' expr_list ')'
  ;
opt_all_clause  : ALL
  |
  ;
opt_distinct_clause  : distinct_clause
  | opt_all_clause
  ;
opt_sort_clause  : sort_clause
  |
  ;
sort_clause  : ORDER BY sortby_list
  ;
sortby_list  : sortby
  | sortby_list ',' sortby
  ;
sortby  : a_expr USING qual_all_Op opt_nulls_order
  | a_expr opt_asc_desc opt_nulls_order
  ;
select_limit  : limit_clause offset_clause
  | offset_clause limit_clause
  | limit_clause
  | offset_clause
  ;
opt_select_limit  : select_limit
  |
  ;
limit_clause  : LIMIT select_limit_value
  | LIMIT select_limit_value ',' select_offset_value
  | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
  | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
  | FETCH first_or_next row_or_rows ONLY
  | FETCH first_or_next row_or_rows WITH TIES
  ;
offset_clause  : OFFSET select_offset_value
  | OFFSET select_fetch_first_value row_or_rows
  ;
select_limit_value  : a_expr
  | ALL
  ;
select_offset_value  : a_expr
  ;
select_fetch_first_value  : c_expr
  | '+' i_or_F_const
  | '-' i_or_F_const
  ;
i_or_F_const  : iconst
  | FCONST
  ;
row_or_rows  : ROW
  | ROWS
  ;
first_or_next  : FIRST_P
  | NEXT
  ;
group_clause  : GROUP_P BY set_quantifier group_by_list
  |
  ;
group_by_list  : group_by_item
  | group_by_list ',' group_by_item
  ;
group_by_item  : a_expr
  | empty_grouping_set
  | cube_clause
  | rollup_clause
  | grouping_sets_clause
  ;
empty_grouping_set  : '(' ')'
  ;
rollup_clause  : ROLLUP '(' expr_list ')'
  ;
cube_clause  : CUBE '(' expr_list ')'
  ;
grouping_sets_clause  : GROUPING SETS '(' group_by_list ')'
  ;
having_clause  : HAVING a_expr
  |
  ;
for_locking_clause  : for_locking_items
  | FOR READ ONLY
  ;
opt_for_locking_clause  : for_locking_clause
  |
  ;
for_locking_items  : for_locking_item
  | for_locking_items for_locking_item
  ;
for_locking_item  : for_locking_strength locked_rels_list opt_nowait_or_skip
  ;
for_locking_strength  : FOR UPDATE
  | FOR NO KEY UPDATE
  | FOR SHARE
  | FOR KEY SHARE
  ;
locked_rels_list  : OF qualified_name_list
  |
  ;
values_clause  : VALUES '(' expr_list ')'
  | values_clause ',' '(' expr_list ')'
  ;
from_clause  : FROM from_list
  |
  ;
from_list  : table_ref
  | from_list ',' table_ref
  ;
table_ref  : relation_expr opt_alias_clause
  | relation_expr opt_alias_clause tablesample_clause
  | func_table func_alias_clause
  | LATERAL_P func_table func_alias_clause
  | xmltable opt_alias_clause
  | LATERAL_P xmltable opt_alias_clause
  | select_with_parens opt_alias_clause
  | LATERAL_P select_with_parens opt_alias_clause
  | joined_table
  | '(' joined_table ')' alias_clause
  ;
joined_table  : '(' joined_table ')'
  | table_ref CROSS JOIN table_ref
  | table_ref join_type JOIN table_ref join_qual
  | table_ref JOIN table_ref join_qual
  | table_ref NATURAL join_type JOIN table_ref
  | table_ref NATURAL JOIN table_ref
  ;
alias_clause  : AS colId '(' name_list ')'
  | AS colId
  | colId '(' name_list ')'
  | colId
  ;
opt_alias_clause  : alias_clause
  |
  ;
opt_alias_clause_for_join_using  : AS colId
  |
  ;
func_alias_clause  : alias_clause
  | AS '(' tableFuncElementList ')'
  | AS colId '(' tableFuncElementList ')'
  | colId '(' tableFuncElementList ')'
  |
  ;
join_type  : FULL opt_outer
  | LEFT opt_outer
  | RIGHT opt_outer
  | INNER_P
  ;
opt_outer  : OUTER_P
  |
  ;
join_qual  : USING '(' name_list ')' opt_alias_clause_for_join_using
  | ON a_expr
  ;
relation_expr  : qualified_name
  | qualified_name '*'
  | ONLY qualified_name
  | ONLY '(' qualified_name ')'
  ;
relation_expr_list  : relation_expr
  | relation_expr_list ',' relation_expr
  ;
relation_expr_opt_alias  : relation_expr UMINUS
  | relation_expr colId
  | relation_expr AS colId
  ;
tablesample_clause  : TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
  ;
opt_repeatable_clause  : REPEATABLE '(' a_expr ')'
  |
  ;
func_table  : func_expr_windowless opt_ordinality
  | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
  ;
rowsfrom_item  : func_expr_windowless opt_col_def_list
  ;
rowsfrom_list  : rowsfrom_item
  | rowsfrom_list ',' rowsfrom_item
  ;
opt_col_def_list  : AS '(' tableFuncElementList ')'
  |
  ;
opt_ordinality  : WITH_LA ORDINALITY
  |
  ;
where_clause  : WHERE a_expr
  |
  ;
where_or_current_clause  : WHERE a_expr
  | WHERE CURRENT_P OF cursor_name
  |
  ;
optTableFuncElementList  : tableFuncElementList
  |
  ;
tableFuncElementList  : tableFuncElement
  | tableFuncElementList ',' tableFuncElement
  ;
tableFuncElement  : colId typename opt_collate_clause
  ;
xmltable  : XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
  | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
  ;
xmltable_column_list  : xmltable_column_el
  | xmltable_column_list ',' xmltable_column_el
  ;
xmltable_column_el  : colId typename
  | colId typename xmltable_column_option_list
  | colId FOR ORDINALITY
  ;
xmltable_column_option_list  : xmltable_column_option_el
  | xmltable_column_option_list xmltable_column_option_el
  ;
xmltable_column_option_el  : IDENT b_expr
  | DEFAULT b_expr
  | NOT NULL_P
  | NULL_P
  ;
xml_namespace_list  : xml_namespace_el
  | xml_namespace_list ',' xml_namespace_el
  ;
xml_namespace_el  : b_expr AS colLabel
  | DEFAULT b_expr
  ;
typename  : simpleTypename opt_array_bounds
  | SETOF simpleTypename opt_array_bounds
  | simpleTypename ARRAY '[' iconst ']'
  | SETOF simpleTypename ARRAY '[' iconst ']'
  | simpleTypename ARRAY
  | SETOF simpleTypename ARRAY
  ;
opt_array_bounds  : opt_array_bounds '[' ']'
  | opt_array_bounds '[' iconst ']'
  |
  ;
simpleTypename  : genericType
  | numeric
  | bit
  | character
  | constDatetime
  | constInterval opt_interval
  | constInterval '(' iconst ')'
  ;
constTypename  : numeric
  | constBit
  | constCharacter
  | constDatetime
  ;
genericType  : type_function_name opt_type_modifiers
  | type_function_name attrs opt_type_modifiers
  ;
opt_type_modifiers  : '(' expr_list ')'
  |
  ;
numeric  : INT_P
  | INTEGER
  | SMALLINT
  | BIGINT
  | REAL
  | FLOAT_P opt_float
  | DOUBLE_P PRECISION
  | DECIMAL_P opt_type_modifiers
  | DEC opt_type_modifiers
  | NUMERIC opt_type_modifiers
  | BOOLEAN_P
  ;
opt_float  : '(' iconst ')'
  |
  ;
bit  : bitWithLength
  | bitWithoutLength
  ;
constBit  : bitWithLength
  | bitWithoutLength
  ;
bitWithLength  : BIT opt_varying '(' expr_list ')'
  ;
bitWithoutLength  : BIT opt_varying
  ;
character  : characterWithLength
  | characterWithoutLength
  ;
constCharacter  : characterWithLength
  | characterWithoutLength
  ;
characterWithLength  : character '(' iconst ')'
  ;
characterWithoutLength  : character
  ;
character  : CHARACTER opt_varying
  | CHAR_P opt_varying
  | VARCHAR
  | NATIONAL CHARACTER opt_varying
  | NATIONAL CHAR_P opt_varying
  | NCHAR opt_varying
  ;
opt_varying  : VARYING
  |
  ;
constDatetime  : TIMESTAMP '(' iconst ')' opt_timezone
  | TIMESTAMP opt_timezone
  | TIME '(' iconst ')' opt_timezone
  | TIME opt_timezone
  ;
constInterval  : INTERVAL
  ;
opt_timezone  : WITH_LA TIME ZONE
  | WITHOUT TIME ZONE
  |
  ;
opt_interval  : YEAR_P
  | MONTH_P
  | DAY_P
  | HOUR_P
  | MINUTE_P
  | interval_second
  | YEAR_P TO MONTH_P
  | DAY_P TO HOUR_P
  | DAY_P TO MINUTE_P
  | DAY_P TO interval_second
  | HOUR_P TO MINUTE_P
  | HOUR_P TO interval_second
  | MINUTE_P TO interval_second
  |
  ;
interval_second  : SECOND_P
  | SECOND_P '(' iconst ')'
  ;
a_expr  : c_expr
  | a_expr TYPECAST typename
  | a_expr COLLATE any_name
  | a_expr AT TIME ZONE a_expr AT
  | '+' a_expr UMINUS
  | '-' a_expr UMINUS
  | a_expr '+' a_expr
  | a_expr '-' a_expr
  | a_expr '*' a_expr
  | a_expr '/' a_expr
  | a_expr '%' a_expr
  | a_expr '^' a_expr
  | a_expr '<' a_expr
  | a_expr '>' a_expr
  | a_expr '=' a_expr
  | a_expr LESS_EQUALS a_expr
  | a_expr GREATER_EQUALS a_expr
  | a_expr NOT_EQUALS a_expr
  | a_expr qual_Op a_expr Op
  | qual_Op a_expr Op
  | a_expr AND a_expr
  | a_expr OR a_expr
  | NOT a_expr
  | NOT_LA a_expr NOT
  | a_expr LIKE a_expr
  | a_expr LIKE a_expr ESCAPE a_expr LIKE
  | a_expr NOT_LA LIKE a_expr NOT_LA
  | a_expr NOT_LA LIKE a_expr ESCAPE a_expr NOT_LA
  | a_expr ILIKE a_expr
  | a_expr ILIKE a_expr ESCAPE a_expr ILIKE
  | a_expr NOT_LA ILIKE a_expr NOT_LA
  | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr NOT_LA
  | a_expr SIMILAR TO a_expr SIMILAR
  | a_expr SIMILAR TO a_expr ESCAPE a_expr SIMILAR
  | a_expr NOT_LA SIMILAR TO a_expr NOT_LA
  | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr NOT_LA
  | a_expr IS NULL_P IS
  | a_expr ISNULL
  | a_expr IS NOT NULL_P IS
  | a_expr NOTNULL
  | row OVERLAPS row
  | a_expr IS TRUE_P IS
  | a_expr IS NOT TRUE_P IS
  | a_expr IS FALSE_P IS
  | a_expr IS NOT FALSE_P IS
  | a_expr IS UNKNOWN IS
  | a_expr IS NOT UNKNOWN IS
  | a_expr IS DISTINCT FROM a_expr IS
  | a_expr IS NOT DISTINCT FROM a_expr IS
  | a_expr BETWEEN opt_asymmetric b_expr AND a_expr BETWEEN
  | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr NOT_LA
  | a_expr BETWEEN SYMMETRIC b_expr AND a_expr BETWEEN
  | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr NOT_LA
  | a_expr IN_P in_expr
  | a_expr NOT_LA IN_P in_expr NOT_LA
  | a_expr subquery_Op sub_type select_with_parens Op
  | a_expr subquery_Op sub_type '(' a_expr ')' Op
  | UNIQUE select_with_parens
  | a_expr IS DOCUMENT_P IS
  | a_expr IS NOT DOCUMENT_P IS
  | a_expr IS NORMALIZED IS
  | a_expr IS unicode_normal_form NORMALIZED IS
  | a_expr IS NOT NORMALIZED IS
  | a_expr IS NOT unicode_normal_form NORMALIZED IS
  | DEFAULT
  ;
b_expr  : c_expr
  | b_expr TYPECAST typename
  | '+' b_expr UMINUS
  | '-' b_expr UMINUS
  | b_expr '+' b_expr
  | b_expr '-' b_expr
  | b_expr '*' b_expr
  | b_expr '/' b_expr
  | b_expr '%' b_expr
  | b_expr '^' b_expr
  | b_expr '<' b_expr
  | b_expr '>' b_expr
  | b_expr '=' b_expr
  | b_expr LESS_EQUALS b_expr
  | b_expr GREATER_EQUALS b_expr
  | b_expr NOT_EQUALS b_expr
  | b_expr qual_Op b_expr Op
  | qual_Op b_expr Op
  | b_expr IS DISTINCT FROM b_expr IS
  | b_expr IS NOT DISTINCT FROM b_expr IS
  | b_expr IS DOCUMENT_P IS
  | b_expr IS NOT DOCUMENT_P IS
  ;
c_expr  : columnref
  | aexprConst
  | PARAM opt_indirection
  | '(' a_expr ')' opt_indirection
  | case_expr
  | func_expr
  | select_with_parens UMINUS
  | select_with_parens indirection
  | EXISTS select_with_parens
  | ARRAY select_with_parens
  | ARRAY array_expr
  | explicit_row
  | implicit_row
  | GROUPING '(' expr_list ')'
  ;
func_application  : func_name '(' ')'
  | func_name '(' func_arg_list opt_sort_clause ')'
  | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
  | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
  | func_name '(' ALL func_arg_list opt_sort_clause ')'
  | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
  | func_name '(' '*' ')'
  ;
func_expr  : func_application within_group_clause filter_clause over_clause
  | func_expr_common_subexpr
  ;
func_expr_windowless  : func_application
  | func_expr_common_subexpr
  ;
func_expr_common_subexpr  : COLLATION FOR '(' a_expr ')'
  | CURRENT_DATE
  | CURRENT_TIME
  | CURRENT_TIME '(' iconst ')'
  | CURRENT_TIMESTAMP
  | CURRENT_TIMESTAMP '(' iconst ')'
  | LOCALTIME
  | LOCALTIME '(' iconst ')'
  | LOCALTIMESTAMP
  | LOCALTIMESTAMP '(' iconst ')'
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER
  | USER
  | CURRENT_CATALOG
  | CURRENT_SCHEMA
  | CAST '(' a_expr AS typename ')'
  | EXTRACT '(' extract_list ')'
  | NORMALIZE '(' a_expr ')'
  | NORMALIZE '(' a_expr ',' unicode_normal_form ')'
  | OVERLAY '(' overlay_list ')'
  | OVERLAY '(' func_arg_list_opt ')'
  | POSITION '(' position_list ')'
  | SUBSTRING '(' substr_list ')'
  | SUBSTRING '(' func_arg_list_opt ')'
  | TREAT '(' a_expr AS typename ')'
  | TRIM '(' BOTH trim_list ')'
  | TRIM '(' LEADING trim_list ')'
  | TRIM '(' TRAILING trim_list ')'
  | TRIM '(' trim_list ')'
  | NULLIF '(' a_expr ',' a_expr ')'
  | COALESCE '(' expr_list ')'
  | GREATEST '(' expr_list ')'
  | LEAST '(' expr_list ')'
  | XMLCONCAT '(' expr_list ')'
  | XMLELEMENT '(' NAME_P colLabel ')'
  | XMLELEMENT '(' NAME_P colLabel ',' xml_attributes ')'
  | XMLELEMENT '(' NAME_P colLabel ',' expr_list ')'
  | XMLELEMENT '(' NAME_P colLabel ',' xml_attributes ',' expr_list ')'
  | XMLEXISTS '(' c_expr xmlexists_argument ')'
  | XMLFOREST '(' xml_attribute_list ')'
  | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
  | XMLPI '(' NAME_P colLabel ')'
  | XMLPI '(' NAME_P colLabel ',' a_expr ')'
  | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
  | XMLSERIALIZE '(' document_or_content a_expr AS simpleTypename ')'
  ;
xml_root_version  : VERSION_P a_expr
  | VERSION_P NO VALUE_P
  ;
opt_xml_root_standalone  : ',' STANDALONE_P YES_P
  | ',' STANDALONE_P NO
  | ',' STANDALONE_P NO VALUE_P
  |
  ;
xml_attributes  : XMLATTRIBUTES '(' xml_attribute_list ')'
  ;
xml_attribute_list  : xml_attribute_el
  | xml_attribute_list ',' xml_attribute_el
  ;
xml_attribute_el  : a_expr AS colLabel
  | a_expr
  ;
document_or_content  : DOCUMENT_P
  | CONTENT_P
  ;
xml_whitespace_option  : PRESERVE WHITESPACE_P
  | STRIP_P WHITESPACE_P
  |
  ;
xmlexists_argument  : PASSING c_expr
  | PASSING c_expr xml_passing_mech
  | PASSING xml_passing_mech c_expr
  | PASSING xml_passing_mech c_expr xml_passing_mech
  ;
xml_passing_mech  : BY REF
  | BY VALUE_P
  ;
within_group_clause  : WITHIN GROUP_P '(' sort_clause ')'
  |
  ;
filter_clause  : FILTER '(' WHERE a_expr ')'
  |
  ;
window_clause  : WINDOW window_definition_list
  |
  ;
window_definition_list  : window_definition
  | window_definition_list ',' window_definition
  ;
window_definition  : colId AS window_specification
  ;
over_clause  : OVER window_specification
  | OVER colId
  |
  ;
window_specification  : '(' opt_existing_window_name opt_partition_clause opt_sort_clause opt_frame_clause ')'
  ;
opt_existing_window_name  : colId
  | Op
  ;
opt_partition_clause  : PARTITION BY expr_list
  |
  ;
opt_frame_clause  : RANGE frame_extent opt_window_exclusion_clause
  | ROWS frame_extent opt_window_exclusion_clause
  | GROUPS frame_extent opt_window_exclusion_clause
  |
  ;
frame_extent  : frame_bound
  | BETWEEN frame_bound AND frame_bound
  ;
frame_bound  : UNBOUNDED PRECEDING
  | UNBOUNDED FOLLOWING
  | CURRENT_P ROW
  | a_expr PRECEDING
  | a_expr FOLLOWING
  ;
opt_window_exclusion_clause  : EXCLUDE CURRENT_P ROW
  | EXCLUDE GROUP_P
  | EXCLUDE TIES
  | EXCLUDE NO OTHERS
  |
  ;
row  : ROW '(' expr_list ')'
  | ROW '(' ')'
  | '(' expr_list ',' a_expr ')'
  ;
explicit_row  : ROW '(' expr_list ')'
  | ROW '(' ')'
  ;
implicit_row  : '(' expr_list ',' a_expr ')'
  ;
sub_type  : ANY
  | SOME
  | ALL
  ;
all_Op  : Op
  | mathOp
  ;
mathOp  : '+'
  | '-'
  | '*'
  | '/'
  | '%'
  | '^'
  | '<'
  | '>'
  | '='
  | LESS_EQUALS
  | GREATER_EQUALS
  | NOT_EQUALS
  ;
qual_Op  : Op
  | OPERATOR '(' any_operator ')'
  ;
qual_all_Op  : all_Op
  | OPERATOR '(' any_operator ')'
  ;
subquery_Op  : all_Op
  | OPERATOR '(' any_operator ')'
  | LIKE
  | NOT_LA LIKE
  | ILIKE
  | NOT_LA ILIKE
  ;
expr_list  : a_expr
  | expr_list ',' a_expr
  ;
func_arg_list  : func_arg_expr
  | func_arg_list ',' func_arg_expr
  ;
func_arg_expr  : a_expr
  | param_name COLON_EQUALS a_expr
  | param_name EQUALS_GREATER a_expr
  ;
func_arg_list_opt  : func_arg_list
  |
  ;
type_list  : typename
  | type_list ',' typename
  ;
array_expr  : '[' expr_list ']'
  | '[' array_expr_list ']'
  | '[' ']'
  ;
array_expr_list  : array_expr
  | array_expr_list ',' array_expr
  ;
extract_list  : extract_arg FROM a_expr
  ;
extract_arg  : IDENT
  | YEAR_P
  | MONTH_P
  | DAY_P
  | HOUR_P
  | MINUTE_P
  | SECOND_P
  | sconst
  ;
unicode_normal_form  : NFC
  | NFD
  | NFKC
  | NFKD
  ;
overlay_list  : a_expr PLACING a_expr FROM a_expr FOR a_expr
  | a_expr PLACING a_expr FROM a_expr
  ;
position_list  : b_expr IN_P b_expr
  ;
substr_list  : a_expr FROM a_expr FOR a_expr
  | a_expr FOR a_expr FROM a_expr
  | a_expr FROM a_expr
  | a_expr FOR a_expr
  | a_expr SIMILAR a_expr ESCAPE a_expr
  ;
trim_list  : a_expr FROM expr_list
  | FROM expr_list
  | expr_list
  ;
in_expr  : select_with_parens
  | '(' expr_list ')'
  ;
case_expr  : CASE case_arg when_clause_list case_default END_P
  ;
when_clause_list  : when_clause
  | when_clause_list when_clause
  ;
when_clause  : WHEN a_expr THEN a_expr
  ;
case_default  : ELSE a_expr
  |
  ;
case_arg  : a_expr
  |
  ;
columnref  : colId
  | colId indirection
  ;
indirection_el  : '.' attr_name
  | '.' '*'
  | '[' a_expr ']'
  | '[' opt_slice_bound ':' opt_slice_bound ']'
  ;
opt_slice_bound  : a_expr
  |
  ;
indirection  : indirection_el
  | indirection indirection_el
  ;
opt_indirection  :
  | opt_indirection indirection_el
  ;
opt_asymmetric  : ASYMMETRIC
  |
  ;
opt_target_list  : target_list
  |
  ;
target_list  : target_el
  | target_list ',' target_el
  ;
target_el  : a_expr AS colLabel
  | a_expr bareColLabel
  | a_expr
  | '*'
  ;
qualified_name_list  : qualified_name
  | qualified_name_list ',' qualified_name
  ;
qualified_name  : colId
  | colId indirection
  ;
name_list  : name
  | name_list ',' name
  ;
name  : colId
  ;
attr_name  : colLabel
  ;
file_name  : sconst
  ;
func_name  : type_function_name
  | colId indirection
  ;
aexprConst  : iconst
  | FCONST
  | sconst
  | BCONST
  | XCONST
  | func_name sconst
  | func_name '(' func_arg_list opt_sort_clause ')' sconst
  | constTypename sconst
  | constInterval sconst opt_interval
  | constInterval '(' iconst ')' sconst
  | TRUE_P
  | FALSE_P
  | NULL_P
  ;
iconst  : ICONST
  ;
sconst  : SCONST
  ;
signedIconst  : iconst
  | '+' iconst
  | '-' iconst
  ;
roleId  : roleSpec
  ;
roleSpec  : nonReservedWord
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER
  ;
role_list  : roleSpec
  | role_list ',' roleSpec
  ;
pLpgSQL_Expr  : opt_distinct_clause opt_target_list from_clause where_clause group_clause having_clause window_clause opt_sort_clause opt_select_limit opt_for_locking_clause
  ;
pLAssignStmt  : plassign_target opt_indirection plassign_equals pLpgSQL_Expr
  ;
plassign_target  : colId
  | PARAM
  ;
plassign_equals  : COLON_EQUALS
  | '='
  ;
colId  : IDENT
  | unreserved_keyword
  | col_name_keyword
  ;
type_function_name  : IDENT
  | unreserved_keyword
  | type_func_name_keyword
  ;
nonReservedWord  : IDENT
  | unreserved_keyword
  | col_name_keyword
  | type_func_name_keyword
  ;
colLabel  : IDENT
  | unreserved_keyword
  | col_name_keyword
  | type_func_name_keyword
  | reserved_keyword
  ;
bareColLabel  : IDENT
  | bare_label_keyword
  ;
unreserved_keyword  : ABORT_P
  | ABSOLUTE_P
  | ACCESS
  | ACTION
  | ADD_P
  | ADMIN
  | AFTER
  | AGGREGATE
  | ALSO
  | ALTER
  | ALWAYS
  | ASENSITIVE
  | ASSERTION
  | ASSIGNMENT
  | AT
  | ATOMIC
  | ATTACH
  | ATTRIBUTE
  | BACKWARD
  | BEFORE
  | BEGIN_P
  | BREADTH
  | BY
  | CACHE
  | CALL
  | CALLED
  | CASCADE
  | CASCADED
  | CATALOG_P
  | CHAIN
  | CHARACTERISTICS
  | CHECKPOINT
  | CLASS
  | CLOSE
  | CLUSTER
  | COLUMNS
  | COMMENT
  | COMMENTS
  | COMMIT
  | COMMITTED
  | COMPRESSION
  | CONFIGURATION
  | CONFLICT
  | CONNECTION
  | CONSTRAINTS
  | CONTENT_P
  | CONTINUE_P
  | CONVERSION_P
  | COPY
  | COST
  | CSV
  | CUBE
  | CURRENT_P
  | CURSOR
  | CYCLE
  | DATA_P
  | DATABASE
  | DAY_P
  | DEALLOCATE
  | DECLARE
  | DEFAULTS
  | DEFERRED
  | DEFINER
  | DELETE_P
  | DELIMITER
  | DELIMITERS
  | DEPENDS
  | DEPTH
  | DETACH
  | DICTIONARY
  | DISABLE_P
  | DISCARD
  | DOCUMENT_P
  | DOMAIN_P
  | DOUBLE_P
  | DROP
  | EACH
  | ENABLE_P
  | ENCODING
  | ENCRYPTED
  | ENUM_P
  | ESCAPE
  | EVENT
  | EXCLUDE
  | EXCLUDING
  | EXCLUSIVE
  | EXECUTE
  | EXPLAIN
  | EXPRESSION
  | EXTENSION
  | EXTERNAL
  | FAMILY
  | FILTER
  | FINALIZE
  | FIRST_P
  | FOLLOWING
  | FORCE
  | FORWARD
  | FUNCTION
  | FUNCTIONS
  | GENERATED
  | GLOBAL
  | GRANTED
  | GROUPS
  | HANDLER
  | HEADER_P
  | HOLD
  | HOUR_P
  | IDENTITY_P
  | IF_P
  | IMMEDIATE
  | IMMUTABLE
  | IMPLICIT_P
  | IMPORT_P
  | INCLUDE
  | INCLUDING
  | INCREMENT
  | INDEX
  | INDEXES
  | INHERIT
  | INHERITS
  | INLINE_P
  | INPUT_P
  | INSENSITIVE
  | INSERT
  | INSTEAD
  | INVOKER
  | ISOLATION
  | KEY
  | LABEL
  | LANGUAGE
  | LARGE_P
  | LAST_P
  | LEAKPROOF
  | LEVEL
  | LISTEN
  | LOAD
  | LOCAL
  | LOCATION
  | LOCK_P
  | LOCKED
  | LOGGED
  | MAPPING
  | MATCH
  | MATERIALIZED
  | MAXVALUE
  | METHOD
  | MINUTE_P
  | MINVALUE
  | MODE
  | MONTH_P
  | MOVE
  | NAME_P
  | NAMES
  | NEW
  | NEXT
  | NFC
  | NFD
  | NFKC
  | NFKD
  | NO
  | NORMALIZED
  | NOTHING
  | NOTIFY
  | NOWAIT
  | NULLS_P
  | OBJECT_P
  | OF
  | OFF
  | OIDS
  | OLD
  | OPERATOR
  | OPTION
  | OPTIONS
  | ORDINALITY
  | OTHERS
  | OVER
  | OVERRIDING
  | OWNED
  | OWNER
  | PARALLEL
  | PARSER
  | PARTIAL
  | PARTITION
  | PASSING
  | PASSWORD
  | PLANS
  | POLICY
  | PRECEDING
  | PREPARE
  | PREPARED
  | PRESERVE
  | PRIOR
  | PRIVILEGES
  | PROCEDURAL
  | PROCEDURE
  | PROCEDURES
  | PROGRAM
  | PUBLICATION
  | QUOTE
  | RANGE
  | READ
  | REASSIGN
  | RECHECK
  | RECURSIVE
  | REF
  | REFERENCING
  | REFRESH
  | REINDEX
  | RELATIVE_P
  | RELEASE
  | RENAME
  | REPEATABLE
  | REPLACE
  | REPLICA
  | RESET
  | RESTART
  | RESTRICT
  | RETURN
  | RETURNS
  | REVOKE
  | ROLE
  | ROLLBACK
  | ROLLUP
  | ROUTINE
  | ROUTINES
  | ROWS
  | RULE
  | SAVEPOINT
  | SCHEMA
  | SCHEMAS
  | SCROLL
  | SEARCH
  | SECOND_P
  | SECURITY
  | SEQUENCE
  | SEQUENCES
  | SERIALIZABLE
  | SERVER
  | SESSION
  | SET
  | SETS
  | SHARE
  | SHOW
  | SIMPLE
  | SKIP
  | SNAPSHOT
  | SQL_P
  | STABLE
  | STANDALONE_P
  | START
  | STATEMENT
  | STATISTICS
  | STDIN
  | STDOUT
  | STORAGE
  | STORED
  | STRICT_P
  | STRIP_P
  | SUBSCRIPTION
  | SUPPORT
  | SYSID
  | SYSTEM_P
  | TABLES
  | TABLESPACE
  | TEMP
  | TEMPLATE
  | TEMPORARY
  | TEXT_P
  | TIES
  | TRANSACTION
  | TRANSFORM
  | TRIGGER
  | TRUNCATE
  | TRUSTED
  | TYPE_P
  | TYPES_P
  | UESCAPE
  | UNBOUNDED
  | UNCOMMITTED
  | UNENCRYPTED
  | UNKNOWN
  | UNLISTEN
  | UNLOGGED
  | UNTIL
  | UPDATE
  | VACUUM
  | VALID
  | VALIDATE
  | VALIDATOR
  | VALUE_P
  | VARYING
  | VERSION_P
  | VIEW
  | VIEWS
  | VOLATILE
  | WHITESPACE_P
  | WITHIN
  | WITHOUT
  | WORK
  | WRAPPER
  | WRITE
  | XML_P
  | YEAR_P
  | YES_P
  | ZONE
  ;
col_name_keyword  : BETWEEN
  | BIGINT
  | BIT
  | BOOLEAN_P
  | CHAR_P
  | CHARACTER
  | COALESCE
  | DEC
  | DECIMAL_P
  | EXISTS
  | EXTRACT
  | FLOAT_P
  | GREATEST
  | GROUPING
  | INOUT
  | INT_P
  | INTEGER
  | INTERVAL
  | LEAST
  | NATIONAL
  | NCHAR
  | NONE
  | NORMALIZE
  | NULLIF
  | NUMERIC
  | OUT_P
  | OVERLAY
  | POSITION
  | PRECISION
  | REAL
  | ROW
  | SETOF
  | SMALLINT
  | SUBSTRING
  | TIME
  | TIMESTAMP
  | TREAT
  | TRIM
  | VALUES
  | VARCHAR
  | XMLATTRIBUTES
  | XMLCONCAT
  | XMLELEMENT
  | XMLEXISTS
  | XMLFOREST
  | XMLNAMESPACES
  | XMLPARSE
  | XMLPI
  | XMLROOT
  | XMLSERIALIZE
  | XMLTABLE
  ;
type_func_name_keyword  : AUTHORIZATION
  | BINARY
  | COLLATION
  | CONCURRENTLY
  | CROSS
  | CURRENT_SCHEMA
  | FREEZE
  | FULL
  | ILIKE
  | INNER_P
  | IS
  | ISNULL
  | JOIN
  | LEFT
  | LIKE
  | NATURAL
  | NOTNULL
  | OUTER_P
  | OVERLAPS
  | RIGHT
  | SIMILAR
  | TABLESAMPLE
  | VERBOSE
  ;
reserved_keyword  : ALL
  | ANALYSE
  | ANALYZE
  | AND
  | ANY
  | ARRAY
  | AS
  | ASC
  | ASYMMETRIC
  | BOTH
  | CASE
  | CAST
  | CHECK
  | COLLATE
  | COLUMN
  | CONSTRAINT
  | CREATE
  | CURRENT_CATALOG
  | CURRENT_DATE
  | CURRENT_ROLE
  | CURRENT_TIME
  | CURRENT_TIMESTAMP
  | CURRENT_USER
  | DEFAULT
  | DEFERRABLE
  | DESC
  | DISTINCT
  | DO
  | ELSE
  | END_P
  | EXCEPT
  | FALSE_P
  | FETCH
  | FOR
  | FOREIGN
  | FROM
  | GRANT
  | GROUP_P
  | HAVING
  | IN_P
  | INITIALLY
  | INTERSECT
  | INTO
  | LATERAL_P
  | LEADING
  | LIMIT
  | LOCALTIME
  | LOCALTIMESTAMP
  | NOT
  | NULL_P
  | OFFSET
  | ON
  | ONLY
  | OR
  | ORDER
  | PLACING
  | PRIMARY
  | REFERENCES
  | RETURNING
  | SELECT
  | SESSION_USER
  | SOME
  | SYMMETRIC
  | TABLE
  | THEN
  | TO
  | TRAILING
  | TRUE_P
  | UNION
  | UNIQUE
  | USER
  | USING
  | VARIADIC
  | WHEN
  | WHERE
  | WINDOW
  | WITH
  ;
bare_label_keyword  : ABORT_P
  | ABSOLUTE_P
  | ACCESS
  | ACTION
  | ADD_P
  | ADMIN
  | AFTER
  | AGGREGATE
  | ALL
  | ALSO
  | ALTER
  | ALWAYS
  | ANALYSE
  | ANALYZE
  | AND
  | ANY
  | ASC
  | ASENSITIVE
  | ASSERTION
  | ASSIGNMENT
  | ASYMMETRIC
  | AT
  | ATOMIC
  | ATTACH
  | ATTRIBUTE
  | AUTHORIZATION
  | BACKWARD
  | BEFORE
  | BEGIN_P
  | BETWEEN
  | BIGINT
  | BINARY
  | BIT
  | BOOLEAN_P
  | BOTH
  | BREADTH
  | BY
  | CACHE
  | CALL
  | CALLED
  | CASCADE
  | CASCADED
  | CASE
  | CAST
  | CATALOG_P
  | CHAIN
  | CHARACTERISTICS
  | CHECK
  | CHECKPOINT
  | CLASS
  | CLOSE
  | CLUSTER
  | COALESCE
  | COLLATE
  | COLLATION
  | COLUMN
  | COLUMNS
  | COMMENT
  | COMMENTS
  | COMMIT
  | COMMITTED
  | COMPRESSION
  | CONCURRENTLY
  | CONFIGURATION
  | CONFLICT
  | CONNECTION
  | CONSTRAINT
  | CONSTRAINTS
  | CONTENT_P
  | CONTINUE_P
  | CONVERSION_P
  | COPY
  | COST
  | CROSS
  | CSV
  | CUBE
  | CURRENT_P
  | CURRENT_CATALOG
  | CURRENT_DATE
  | CURRENT_ROLE
  | CURRENT_SCHEMA
  | CURRENT_TIME
  | CURRENT_TIMESTAMP
  | CURRENT_USER
  | CURSOR
  | CYCLE
  | DATA_P
  | DATABASE
  | DEALLOCATE
  | DEC
  | DECIMAL_P
  | DECLARE
  | DEFAULT
  | DEFAULTS
  | DEFERRABLE
  | DEFERRED
  | DEFINER
  | DELETE_P
  | DELIMITER
  | DELIMITERS
  | DEPENDS
  | DEPTH
  | DESC
  | DETACH
  | DICTIONARY
  | DISABLE_P
  | DISCARD
  | DISTINCT
  | DO
  | DOCUMENT_P
  | DOMAIN_P
  | DOUBLE_P
  | DROP
  | EACH
  | ELSE
  | ENABLE_P
  | ENCODING
  | ENCRYPTED
  | END_P
  | ENUM_P
  | ESCAPE
  | EVENT
  | EXCLUDE
  | EXCLUDING
  | EXCLUSIVE
  | EXECUTE
  | EXISTS
  | EXPLAIN
  | EXPRESSION
  | EXTENSION
  | EXTERNAL
  | EXTRACT
  | FALSE_P
  | FAMILY
  | FINALIZE
  | FIRST_P
  | FLOAT_P
  | FOLLOWING
  | FORCE
  | FOREIGN
  | FORWARD
  | FREEZE
  | FULL
  | FUNCTION
  | FUNCTIONS
  | GENERATED
  | GLOBAL
  | GRANTED
  | GREATEST
  | GROUPING
  | GROUPS
  | HANDLER
  | HEADER_P
  | HOLD
  | IDENTITY_P
  | IF_P
  | ILIKE
  | IMMEDIATE
  | IMMUTABLE
  | IMPLICIT_P
  | IMPORT_P
  | IN_P
  | INCLUDE
  | INCLUDING
  | INCREMENT
  | INDEX
  | INDEXES
  | INHERIT
  | INHERITS
  | INITIALLY
  | INLINE_P
  | INNER_P
  | INOUT
  | INPUT_P
  | INSENSITIVE
  | INSERT
  | INSTEAD
  | INT_P
  | INTEGER
  | INTERVAL
  | INVOKER
  | IS
  | ISOLATION
  | JOIN
  | KEY
  | LABEL
  | LANGUAGE
  | LARGE_P
  | LAST_P
  | LATERAL_P
  | LEADING
  | LEAKPROOF
  | LEAST
  | LEFT
  | LEVEL
  | LIKE
  | LISTEN
  | LOAD
  | LOCAL
  | LOCALTIME
  | LOCALTIMESTAMP
  | LOCATION
  | LOCK_P
  | LOCKED
  | LOGGED
  | MAPPING
  | MATCH
  | MATERIALIZED
  | MAXVALUE
  | METHOD
  | MINVALUE
  | MODE
  | MOVE
  | NAME_P
  | NAMES
  | NATIONAL
  | NATURAL
  | NCHAR
  | NEW
  | NEXT
  | NFC
  | NFD
  | NFKC
  | NFKD
  | NO
  | NONE
  | NORMALIZE
  | NORMALIZED
  | NOT
  | NOTHING
  | NOTIFY
  | NOWAIT
  | NULL_P
  | NULLIF
  | NULLS_P
  | NUMERIC
  | OBJECT_P
  | OF
  | OFF
  | OIDS
  | OLD
  | ONLY
  | OPERATOR
  | OPTION
  | OPTIONS
  | OR
  | ORDINALITY
  | OTHERS
  | OUT_P
  | OUTER_P
  | OVERLAY
  | OVERRIDING
  | OWNED
  | OWNER
  | PARALLEL
  | PARSER
  | PARTIAL
  | PARTITION
  | PASSING
  | PASSWORD
  | PLACING
  | PLANS
  | POLICY
  | POSITION
  | PRECEDING
  | PREPARE
  | PREPARED
  | PRESERVE
  | PRIMARY
  | PRIOR
  | PRIVILEGES
  | PROCEDURAL
  | PROCEDURE
  | PROCEDURES
  | PROGRAM
  | PUBLICATION
  | QUOTE
  | RANGE
  | READ
  | REAL
  | REASSIGN
  | RECHECK
  | RECURSIVE
  | REF
  | REFERENCES
  | REFERENCING
  | REFRESH
  | REINDEX
  | RELATIVE_P
  | RELEASE
  | RENAME
  | REPEATABLE
  | REPLACE
  | REPLICA
  | RESET
  | RESTART
  | RESTRICT
  | RETURN
  | RETURNS
  | REVOKE
  | RIGHT
  | ROLE
  | ROLLBACK
  | ROLLUP
  | ROUTINE
  | ROUTINES
  | ROW
  | ROWS
  | RULE
  | SAVEPOINT
  | SCHEMA
  | SCHEMAS
  | SCROLL
  | SEARCH
  | SECURITY
  | SELECT
  | SEQUENCE
  | SEQUENCES
  | SERIALIZABLE
  | SERVER
  | SESSION
  | SESSION_USER
  | SET
  | SETOF
  | SETS
  | SHARE
  | SHOW
  | SIMILAR
  | SIMPLE
  | SKIP
  | SMALLINT
  | SNAPSHOT
  | SOME
  | SQL_P
  | STABLE
  | STANDALONE_P
  | START
  | STATEMENT
  | STATISTICS
  | STDIN
  | STDOUT
  | STORAGE
  | STORED
  | STRICT_P
  | STRIP_P
  | SUBSCRIPTION
  | SUBSTRING
  | SUPPORT
  | SYMMETRIC
  | SYSID
  | SYSTEM_P
  | TABLE
  | TABLES
  | TABLESAMPLE
  | TABLESPACE
  | TEMP
  | TEMPLATE
  | TEMPORARY
  | TEXT_P
  | THEN
  | TIES
  | TIME
  | TIMESTAMP
  | TRAILING
  | TRANSACTION
  | TRANSFORM
  | TREAT
  | TRIGGER
  | TRIM
  | TRUE_P
  | TRUNCATE
  | TRUSTED
  | TYPE_P
  | TYPES_P
  | UESCAPE
  | UNBOUNDED
  | UNCOMMITTED
  | UNENCRYPTED
  | UNIQUE
  | UNKNOWN
  | UNLISTEN
  | UNLOGGED
  | UNTIL
  | UPDATE
  | USER
  | USING
  | VACUUM
  | VALID
  | VALIDATE
  | VALIDATOR
  | VALUE_P
  | VALUES
  | VARCHAR
  | VARIADIC
  | VERBOSE
  | VERSION_P
  | VIEW
  | VIEWS
  | VOLATILE
  | WHEN
  | WHITESPACE_P
  | WORK
  | WRAPPER
  | WRITE
  | XML_P
  | XMLATTRIBUTES
  | XMLCONCAT
  | XMLELEMENT
  | XMLEXISTS
  | XMLFOREST
  | XMLNAMESPACES
  | XMLPARSE
  | XMLPI
  | XMLROOT
  | XMLSERIALIZE
  | XMLTABLE
  | YES_P
  | ZONE
  ;

Result of trxgrep/trtext/sort/sed:

ABORT_P : "ABORT_P";
ABSOLUTE_P : "ABSOLUTE_P";
ACCESS : "ACCESS";
ACTION : "ACTION";
ADD_P : "ADD_P";
ADMIN : "ADMIN";
AFTER : "AFTER";
AGGREGATE : "AGGREGATE";
ALL : "ALL";
ALSO : "ALSO";
ALTER : "ALTER";
ALWAYS : "ALWAYS";
ANALYSE : "ANALYSE";
ANALYZE : "ANALYZE";
AND : "AND";
ANY : "ANY";
ARRAY : "ARRAY";
AS : "AS";
ASC : "ASC";
ASENSITIVE : "ASENSITIVE";
ASSERTION : "ASSERTION";
ASSIGNMENT : "ASSIGNMENT";
ASYMMETRIC : "ASYMMETRIC";
AT : "AT";
ATOMIC : "ATOMIC";
ATTACH : "ATTACH";
ATTRIBUTE : "ATTRIBUTE";
AUTHORIZATION : "AUTHORIZATION";
BACKWARD : "BACKWARD";
BCONST : "BCONST";
BEFORE : "BEFORE";
BEGIN_P : "BEGIN_P";
BETWEEN : "BETWEEN";
BIGINT : "BIGINT";
BINARY : "BINARY";
BIT : "BIT";
BOOLEAN_P : "BOOLEAN_P";
BOTH : "BOTH";
BREADTH : "BREADTH";
BY : "BY";
CACHE : "CACHE";
CALL : "CALL";
CALLED : "CALLED";
CASCADE : "CASCADE";
CASCADED : "CASCADED";
CASE : "CASE";
CAST : "CAST";
CATALOG_P : "CATALOG_P";
CHAIN : "CHAIN";
CHARACTER : "CHARACTER";
CHARACTERISTICS : "CHARACTERISTICS";
CHAR_P : "CHAR_P";
CHECK : "CHECK";
CHECKPOINT : "CHECKPOINT";
CLASS : "CLASS";
CLOSE : "CLOSE";
CLUSTER : "CLUSTER";
COALESCE : "COALESCE";
COLLATE : "COLLATE";
COLLATION : "COLLATION";
COLON_EQUALS : "COLON_EQUALS";
COLUMN : "COLUMN";
COLUMNS : "COLUMNS";
COMMENT : "COMMENT";
COMMENTS : "COMMENTS";
COMMIT : "COMMIT";
COMMITTED : "COMMITTED";
COMPRESSION : "COMPRESSION";
CONCURRENTLY : "CONCURRENTLY";
CONFIGURATION : "CONFIGURATION";
CONFLICT : "CONFLICT";
CONNECTION : "CONNECTION";
CONSTRAINT : "CONSTRAINT";
CONSTRAINTS : "CONSTRAINTS";
CONTENT_P : "CONTENT_P";
CONTINUE_P : "CONTINUE_P";
CONVERSION_P : "CONVERSION_P";
COPY : "COPY";
COST : "COST";
CREATE : "CREATE";
CROSS : "CROSS";
CSV : "CSV";
CUBE : "CUBE";
CURRENT_CATALOG : "CURRENT_CATALOG";
CURRENT_DATE : "CURRENT_DATE";
CURRENT_P : "CURRENT_P";
CURRENT_ROLE : "CURRENT_ROLE";
CURRENT_SCHEMA : "CURRENT_SCHEMA";
CURRENT_TIME : "CURRENT_TIME";
CURRENT_TIMESTAMP : "CURRENT_TIMESTAMP";
CURRENT_USER : "CURRENT_USER";
CURSOR : "CURSOR";
CYCLE : "CYCLE";
DATABASE : "DATABASE";
DATA_P : "DATA_P";
DAY_P : "DAY_P";
DEALLOCATE : "DEALLOCATE";
DEC : "DEC";
DECIMAL_P : "DECIMAL_P";
DECLARE : "DECLARE";
DEFAULT : "DEFAULT";
DEFAULTS : "DEFAULTS";
DEFERRABLE : "DEFERRABLE";
DEFERRED : "DEFERRED";
DEFINER : "DEFINER";
DELETE_P : "DELETE_P";
DELIMITER : "DELIMITER";
DELIMITERS : "DELIMITERS";
DEPENDS : "DEPENDS";
DEPTH : "DEPTH";
DESC : "DESC";
DETACH : "DETACH";
DICTIONARY : "DICTIONARY";
DISABLE_P : "DISABLE_P";
DISCARD : "DISCARD";
DISTINCT : "DISTINCT";
DO : "DO";
DOCUMENT_P : "DOCUMENT_P";
DOMAIN_P : "DOMAIN_P";
DOUBLE_P : "DOUBLE_P";
DROP : "DROP";
EACH : "EACH";
ELSE : "ELSE";
ENABLE_P : "ENABLE_P";
ENCODING : "ENCODING";
ENCRYPTED : "ENCRYPTED";
END_P : "END_P";
ENUM_P : "ENUM_P";
EQUALS_GREATER : "EQUALS_GREATER";
ESCAPE : "ESCAPE";
EVENT : "EVENT";
EXCEPT : "EXCEPT";
EXCLUDE : "EXCLUDE";
EXCLUDING : "EXCLUDING";
EXCLUSIVE : "EXCLUSIVE";
EXECUTE : "EXECUTE";
EXISTS : "EXISTS";
EXPLAIN : "EXPLAIN";
EXPRESSION : "EXPRESSION";
EXTENSION : "EXTENSION";
EXTERNAL : "EXTERNAL";
EXTRACT : "EXTRACT";
FALSE_P : "FALSE_P";
FAMILY : "FAMILY";
FCONST : "FCONST";
FETCH : "FETCH";
FILTER : "FILTER";
FINALIZE : "FINALIZE";
FIRST_P : "FIRST_P";
FLOAT_P : "FLOAT_P";
FOLLOWING : "FOLLOWING";
FOR : "FOR";
FORCE : "FORCE";
FOREIGN : "FOREIGN";
FORWARD : "FORWARD";
FREEZE : "FREEZE";
FROM : "FROM";
FULL : "FULL";
FUNCTION : "FUNCTION";
FUNCTIONS : "FUNCTIONS";
GENERATED : "GENERATED";
GLOBAL : "GLOBAL";
GRANT : "GRANT";
GRANTED : "GRANTED";
GREATER_EQUALS : "GREATER_EQUALS";
GREATEST : "GREATEST";
GROUPING : "GROUPING";
GROUPS : "GROUPS";
GROUP_P : "GROUP_P";
HANDLER : "HANDLER";
HAVING : "HAVING";
HEADER_P : "HEADER_P";
HOLD : "HOLD";
HOUR_P : "HOUR_P";
ICONST : "ICONST";
IDENT : "IDENT";
IDENTITY_P : "IDENTITY_P";
IF_P : "IF_P";
ILIKE : "ILIKE";
IMMEDIATE : "IMMEDIATE";
IMMUTABLE : "IMMUTABLE";
IMPLICIT_P : "IMPLICIT_P";
IMPORT_P : "IMPORT_P";
INCLUDE : "INCLUDE";
INCLUDING : "INCLUDING";
INCREMENT : "INCREMENT";
INDEX : "INDEX";
INDEXES : "INDEXES";
INHERIT : "INHERIT";
INHERITS : "INHERITS";
INITIALLY : "INITIALLY";
INLINE_P : "INLINE_P";
INNER_P : "INNER_P";
INOUT : "INOUT";
INPUT_P : "INPUT_P";
INSENSITIVE : "INSENSITIVE";
INSERT : "INSERT";
INSTEAD : "INSTEAD";
INTEGER : "INTEGER";
INTERSECT : "INTERSECT";
INTERVAL : "INTERVAL";
INTO : "INTO";
INT_P : "INT_P";
INVOKER : "INVOKER";
IN_P : "IN_P";
IS : "IS";
ISNULL : "ISNULL";
ISOLATION : "ISOLATION";
JOIN : "JOIN";
KEY : "KEY";
LABEL : "LABEL";
LANGUAGE : "LANGUAGE";
LARGE_P : "LARGE_P";
LAST_P : "LAST_P";
LATERAL_P : "LATERAL_P";
LEADING : "LEADING";
LEAKPROOF : "LEAKPROOF";
LEAST : "LEAST";
LEFT : "LEFT";
LESS_EQUALS : "LESS_EQUALS";
LEVEL : "LEVEL";
LIKE : "LIKE";
LIMIT : "LIMIT";
LISTEN : "LISTEN";
LOAD : "LOAD";
LOCAL : "LOCAL";
LOCALTIME : "LOCALTIME";
LOCALTIMESTAMP : "LOCALTIMESTAMP";
LOCATION : "LOCATION";
LOCKED : "LOCKED";
LOCK_P : "LOCK_P";
LOGGED : "LOGGED";
MAPPING : "MAPPING";
MATCH : "MATCH";
MATERIALIZED : "MATERIALIZED";
MAXVALUE : "MAXVALUE";
METHOD : "METHOD";
MINUTE_P : "MINUTE_P";
MINVALUE : "MINVALUE";
MODE : "MODE";
MODE_PLPGSQL_ASSIGN1 : "MODE_PLPGSQL_ASSIGN1";
MODE_PLPGSQL_ASSIGN2 : "MODE_PLPGSQL_ASSIGN2";
MODE_PLPGSQL_ASSIGN3 : "MODE_PLPGSQL_ASSIGN3";
MODE_PLPGSQL_EXPR : "MODE_PLPGSQL_EXPR";
MODE_TYPE_NAME : "MODE_TYPE_NAME";
MONTH_P : "MONTH_P";
MOVE : "MOVE";
NAMES : "NAMES";
NAME_P : "NAME_P";
NATIONAL : "NATIONAL";
NATURAL : "NATURAL";
NCHAR : "NCHAR";
NEW : "NEW";
NEXT : "NEXT";
NFC : "NFC";
NFD : "NFD";
NFKC : "NFKC";
NFKD : "NFKD";
NO : "NO";
NONE : "NONE";
NORMALIZE : "NORMALIZE";
NORMALIZED : "NORMALIZED";
NOT : "NOT";
NOTHING : "NOTHING";
NOTIFY : "NOTIFY";
NOTNULL : "NOTNULL";
NOT_EQUALS : "NOT_EQUALS";
NOT_LA : "NOT_LA";
NOWAIT : "NOWAIT";
NULLIF : "NULLIF";
NULLS_LA : "NULLS_LA";
NULLS_P : "NULLS_P";
NULL_P : "NULL_P";
NUMERIC : "NUMERIC";
OBJECT_P : "OBJECT_P";
OF : "OF";
OFF : "OFF";
OFFSET : "OFFSET";
OIDS : "OIDS";
OLD : "OLD";
ON : "ON";
ONLY : "ONLY";
OPERATOR : "OPERATOR";
OPTION : "OPTION";
OPTIONS : "OPTIONS";
OR : "OR";
ORDER : "ORDER";
ORDINALITY : "ORDINALITY";
OTHERS : "OTHERS";
OUTER_P : "OUTER_P";
OUT_P : "OUT_P";
OVER : "OVER";
OVERLAPS : "OVERLAPS";
OVERLAY : "OVERLAY";
OVERRIDING : "OVERRIDING";
OWNED : "OWNED";
OWNER : "OWNER";
Op : "Op";
PARALLEL : "PARALLEL";
PARAM : "PARAM";
PARSER : "PARSER";
PARTIAL : "PARTIAL";
PARTITION : "PARTITION";
PASSING : "PASSING";
PASSWORD : "PASSWORD";
PLACING : "PLACING";
PLANS : "PLANS";
POLICY : "POLICY";
POSITION : "POSITION";
PRECEDING : "PRECEDING";
PRECISION : "PRECISION";
PREPARE : "PREPARE";
PREPARED : "PREPARED";
PRESERVE : "PRESERVE";
PRIMARY : "PRIMARY";
PRIOR : "PRIOR";
PRIVILEGES : "PRIVILEGES";
PROCEDURAL : "PROCEDURAL";
PROCEDURE : "PROCEDURE";
PROCEDURES : "PROCEDURES";
PROGRAM : "PROGRAM";
PUBLICATION : "PUBLICATION";
QUOTE : "QUOTE";
RANGE : "RANGE";
READ : "READ";
REAL : "REAL";
REASSIGN : "REASSIGN";
RECHECK : "RECHECK";
RECURSIVE : "RECURSIVE";
REF : "REF";
REFERENCES : "REFERENCES";
REFERENCING : "REFERENCING";
REFRESH : "REFRESH";
REINDEX : "REINDEX";
RELATIVE_P : "RELATIVE_P";
RELEASE : "RELEASE";
RENAME : "RENAME";
REPEATABLE : "REPEATABLE";
REPLACE : "REPLACE";
REPLICA : "REPLICA";
RESET : "RESET";
RESTART : "RESTART";
RESTRICT : "RESTRICT";
RETURN : "RETURN";
RETURNING : "RETURNING";
RETURNS : "RETURNS";
REVOKE : "REVOKE";
RIGHT : "RIGHT";
ROLE : "ROLE";
ROLLBACK : "ROLLBACK";
ROLLUP : "ROLLUP";
ROUTINE : "ROUTINE";
ROUTINES : "ROUTINES";
ROW : "ROW";
ROWS : "ROWS";
RULE : "RULE";
SAVEPOINT : "SAVEPOINT";
SCHEMA : "SCHEMA";
SCHEMAS : "SCHEMAS";
SCONST : "SCONST";
SCROLL : "SCROLL";
SEARCH : "SEARCH";
SECOND_P : "SECOND_P";
SECURITY : "SECURITY";
SELECT : "SELECT";
SEQUENCE : "SEQUENCE";
SEQUENCES : "SEQUENCES";
SERIALIZABLE : "SERIALIZABLE";
SERVER : "SERVER";
SESSION : "SESSION";
SESSION_USER : "SESSION_USER";
SET : "SET";
SETOF : "SETOF";
SETS : "SETS";
SHARE : "SHARE";
SHOW : "SHOW";
SIMILAR : "SIMILAR";
SIMPLE : "SIMPLE";
SKIP : "SKIP";
SMALLINT : "SMALLINT";
SNAPSHOT : "SNAPSHOT";
SOME : "SOME";
SQL_P : "SQL_P";
STABLE : "STABLE";
STANDALONE_P : "STANDALONE_P";
START : "START";
STATEMENT : "STATEMENT";
STATISTICS : "STATISTICS";
STDIN : "STDIN";
STDOUT : "STDOUT";
STORAGE : "STORAGE";
STORED : "STORED";
STRICT_P : "STRICT_P";
STRIP_P : "STRIP_P";
SUBSCRIPTION : "SUBSCRIPTION";
SUBSTRING : "SUBSTRING";
SUPPORT : "SUPPORT";
SYMMETRIC : "SYMMETRIC";
SYSID : "SYSID";
SYSTEM_P : "SYSTEM_P";
TABLE : "TABLE";
TABLES : "TABLES";
TABLESAMPLE : "TABLESAMPLE";
TABLESPACE : "TABLESPACE";
TEMP : "TEMP";
TEMPLATE : "TEMPLATE";
TEMPORARY : "TEMPORARY";
TEXT_P : "TEXT_P";
THEN : "THEN";
TIES : "TIES";
TIME : "TIME";
TIMESTAMP : "TIMESTAMP";
TO : "TO";
TRAILING : "TRAILING";
TRANSACTION : "TRANSACTION";
TRANSFORM : "TRANSFORM";
TREAT : "TREAT";
TRIGGER : "TRIGGER";
TRIM : "TRIM";
TRUE_P : "TRUE_P";
TRUNCATE : "TRUNCATE";
TRUSTED : "TRUSTED";
TYPECAST : "TYPECAST";
TYPES_P : "TYPES_P";
TYPE_P : "TYPE_P";
UESCAPE : "UESCAPE";
UMINUS : "UMINUS";
UNBOUNDED : "UNBOUNDED";
UNCOMMITTED : "UNCOMMITTED";
UNENCRYPTED : "UNENCRYPTED";
UNION : "UNION";
UNIQUE : "UNIQUE";
UNKNOWN : "UNKNOWN";
UNLISTEN : "UNLISTEN";
UNLOGGED : "UNLOGGED";
UNTIL : "UNTIL";
UPDATE : "UPDATE";
USER : "USER";
USING : "USING";
VACUUM : "VACUUM";
VALID : "VALID";
VALIDATE : "VALIDATE";
VALIDATOR : "VALIDATOR";
VALUES : "VALUES";
VALUE_P : "VALUE_P";
VARCHAR : "VARCHAR";
VARIADIC : "VARIADIC";
VARYING : "VARYING";
VERBOSE : "VERBOSE";
VERSION_P : "VERSION_P";
VIEW : "VIEW";
VIEWS : "VIEWS";
VOLATILE : "VOLATILE";
WHEN : "WHEN";
WHERE : "WHERE";
WHITESPACE_P : "WHITESPACE_P";
WINDOW : "WINDOW";
WITH : "WITH";
WITHIN : "WITHIN";
WITHOUT : "WITHOUT";
WITH_LA : "WITH_LA";
WORK : "WORK";
WRAPPER : "WRAPPER";
WRITE : "WRITE";
XCONST : "XCONST";
XMLATTRIBUTES : "XMLATTRIBUTES";
XMLCONCAT : "XMLCONCAT";
XMLELEMENT : "XMLELEMENT";
XMLEXISTS : "XMLEXISTS";
XMLFOREST : "XMLFOREST";
XMLNAMESPACES : "XMLNAMESPACES";
XMLPARSE : "XMLPARSE";
XMLPI : "XMLPI";
XMLROOT : "XMLROOT";
XMLSERIALIZE : "XMLSERIALIZE";
XMLTABLE : "XMLTABLE";
XML_P : "XML_P";
YEAR_P : "YEAR_P";
YES_P : "YES_P";
ZONE : "ZONE";
SKalt commented 3 years ago

Thanks! I'm still getting the error with trconvert and trparse 0.8.5:

trparse gram.y /tmp/out # works
trconvert < /tmp/out # fails with the aforementioned error
trparse --version;
trconvert --version;
kaby76 commented 3 years ago

Sorry, I hadn't made a release with the fix. Try v0.8.6 instead. (It might take a while for Nuget to reindex the latest version.) --Ken

SKalt commented 3 years ago

I ended up using dotnet tool install -g --add-source $path_to_trash $package_name, and as of 8.6+, conversions are working great!