Files
lava-oushudb-dt-sql-parser/src/grammar/postgresql/PostgreSqlParser.g4
Kijin-Seija ffb575e317 4.0.2-8
2024-08-26 16:59:41 +08:00

5612 lines
124 KiB
ANTLR

/*
* [The "MIT license"]
* Copyright (C) 2014 Sam Harwell, Tunnel Vision Laboratories, LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* 2. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
* 3. Except as contained in this notice, the name of Tunnel Vision
* Laboratories, LLC. shall not be used in advertising or otherwise to
* promote the sale, use or other dealings in this Software without prior
* written authorization from Tunnel Vision Laboratories, LLC.
*/
/**
* This file is an adaptation of antlr's sql/postgresql/PostgreSQLParser.g4 grammar.
* Reference: https://github.com/antlr/grammars-v4/blob/master/sql/postgresql/PostgreSQLParser.g4
*/
/**
* Reference Doc: https://www.postgresql.org/docs/16.1/sql-commands.html
*/
// $antlr-format alignTrailingComments true, columnLimit 150, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments false, useTab false
// $antlr-format allowShortRulesOnASingleLine false, allowShortBlocksOnASingleLine true, alignSemicolons hanging, alignColons hanging
// $antlr-format spaceBeforeAssignmentOperators false, keepEmptyLinesAtTheStartOfBlocks true
parser grammar PostgreSqlParser;
options {
tokenVocab= PostgreSqlLexer;
caseInsensitive= true;
superClass=SQLParserBase;
}
@header {
import { SQLParserBase } from '../SQLParserBase';
}
program
: singleStmt* EOF
;
plsqlroot
: pl_function
;
singleStmt
: stmt SEMI?
;
stmt
: altereventtrigstmt
| altercollationstmt
| alterdatabasestmt
| alterdatabasesetstmt
| alterdefaultprivilegesstmt
| alterdomainstmt
| alterenumstmt
| alterextensionstmt
| alterextensioncontentsstmt
| alterfdwstmt
| alterforeignserverstmt
| alterfunctionstmt
| altergroupstmt
| alterobjectdependsstmt
| alterobjectschemastmt
| alterownerstmt
| alteroperatorstmt
| altertypestmt
| alterpolicystmt
| alterprocedurestmt
| alterseqstmt
| altersystemstmt
| altertablestmt
| altertblspcstmt
| altercompositetypestmt
| alterpublicationstmt
| alterrolesetstmt
| alterroutinestmt
| 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
| dropstmt
| executestmt
| explainstmt
| fetchstmt
| grantstmt
| grantrolestmt
| mergestmt
| 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
| plsqlconsolecommand
;
plsqlconsolecommand
: MetaCommand EndMetaCommand?
;
callstmt
: KW_CALL func_application
;
createrolestmt
: KW_CREATE KW_ROLE roleid opt_with? optrolelist
;
opt_with
: KW_WITH
; //| WITH_LA
optrolelist
: createoptroleelem*
;
alteroptrolelist
: alteroptroleelem*
;
alteroptroleelem
: KW_PASSWORD (sconst | KW_NULL)
| (KW_ENCRYPTED | KW_UNENCRYPTED) KW_PASSWORD sconst
| (KW_INHERIT | KW_NOINHERIT)
| (KW_CREATEUSER | KW_NOCREATEUSER)
| (KW_CREATEROLE | KW_NOCREATEROLE)
| (KW_CREATEDB | KW_NOCREATEDB)
| (KW_SUPERUSER | KW_NOSUPERUSER)
| (KW_LOGIN | KW_NOLOGIN)
| (KW_REPLICATION | KW_NOREPLICATION)
| (KW_BYPASSRLS | KW_NOBYPASSRLS)
| KW_CONNECTION KW_LIMIT signediconst
| KW_VALID KW_UNTIL sconst
| KW_IN KW_ROLE name_list
| KW_IN KW_GROUP name_list
| KW_ROLE role_list
| KW_ADMIN name_list
| KW_USER role_list
| identifier
;
createoptroleelem
: alteroptroleelem
| KW_SYSID iconst
| KW_ADMIN role_list
| KW_ROLE role_list
| KW_IN (KW_ROLE | KW_GROUP) role_list
;
createuserstmt
: KW_CREATE KW_USER roleid opt_with? optrolelist
;
alterrolestmt
: KW_ALTER (KW_ROLE | KW_USER) rolespec opt_with? alteroptrolelist
;
opt_in_database
:
| KW_IN KW_DATABASE database_name
;
alterrolesetstmt
: KW_ALTER (KW_ROLE | KW_USER) (KW_ALL | rolespec) opt_in_database setresetclause
;
alterroutinestmt
: KW_ALTER KW_ROUTINE routine_name func_args? alter_routine_cluase
;
alter_routine_cluase
: routine_action_list KW_RESTRICT?
| KW_RENAME KW_TO routine_name_create
| KW_OWNER KW_TO rolespec
| KW_SET KW_SCHEMA schema_name_create
| KW_NO? KW_DEPENDS KW_ON KW_EXTENSION name
;
routine_action_list
: routine_action (routine_action)*
;
routine_action
: KW_IMMUTABLE
| KW_STABLE
| KW_VOLATILE
| KW_NOT? KW_LEAKPROOF
| (KW_EXTERNAL? KW_SECURITY KW_INVOKER | KW_EXTERNAL? KW_SECURITY KW_DEFINER)
| KW_PARALLEL (KW_UNSAFE | KW_RESTRICTED | KW_SAFE)
| KW_COST attr_name
| KW_ROWS name
| KW_SET name (KW_TO | EQUAL) (name | KW_DEFAULT)
| KW_SET name KW_FROM KW_CURRENT
| KW_RESET name
| KW_RESET KW_ALL
;
creategroupstmt
: KW_CREATE KW_GROUP groupname opt_with? optrolelist
;
altergroupstmt
: KW_ALTER KW_GROUP rolespec add_drop KW_USER role_list
;
add_drop
: KW_ADD
| KW_DROP
;
createschemastmt
: KW_CREATE KW_SCHEMA opt_if_not_exists? (
schema_name_create? KW_AUTHORIZATION rolespec
| schema_name_create
) optschemaeltlist
;
schema_name_create
: colid attrs? # schemaNameCreate
;
optschemaeltlist
: schema_stmt*
;
schema_stmt
: createstmt
| indexstmt
| createseqstmt
| createtrigstmt
| grantstmt
| viewstmt
;
variablesetstmt
: KW_SET (KW_LOCAL | KW_SESSION)? set_rest
;
set_rest
: KW_TRANSACTION transaction_mode_list
| KW_SESSION KW_CHARACTERISTICS KW_AS KW_TRANSACTION transaction_mode_list
| set_rest_more
;
generic_set
: (KW_ALL | var_name) (KW_TO | EQUAL)? (KW_DEFAULT | var_list)?
;
set_rest_more
: KW_TIME KW_ZONE zone_value
| KW_CATALOG sconst
| KW_SCHEMA schema_name
| KW_NAMES opt_encoding?
| KW_ROLE nonreservedword_or_sconst
| KW_SESSION KW_AUTHORIZATION nonreservedword_or_sconst
| KW_XML KW_OPTION document_or_content
| KW_TRANSACTION KW_SNAPSHOT sconst
| var_name KW_FROM KW_CURRENT
| generic_set
;
var_name
: colid (DOT colid)*
;
var_list
: var_value (COMMA var_value)*
;
var_value
: opt_boolean_or_string
| numericonly
;
iso_level
: KW_READ (KW_UNCOMMITTED | KW_COMMITTED)
| KW_REPEATABLE KW_READ
| KW_SERIALIZABLE
;
opt_boolean_or_string_column
: KW_TRUE
| KW_FALSE
| KW_ON
| nonreservedword_or_sconst_column
;
opt_boolean_or_string
: KW_TRUE
| KW_FALSE
| KW_ON
| nonreservedword_or_sconst
;
zone_value
: sconst
| identifier
| constinterval sconst opt_interval?
| constinterval OPEN_PAREN iconst CLOSE_PAREN sconst
| numericonly
| KW_DEFAULT
| KW_LOCAL
;
opt_encoding
: sconst
| KW_DEFAULT
;
nonreservedword_or_sconst_column
: nonreservedword_column
| sconst
;
nonreservedword_or_sconst
: nonreservedword
| sconst
;
variableresetstmt
: KW_RESET reset_rest
;
reset_rest
: KW_TIME KW_ZONE
| KW_TRANSACTION KW_ISOLATION KW_LEVEL
| KW_SESSION KW_AUTHORIZATION
| generic_reset
;
generic_reset
: KW_ALL
| var_name
;
setresetclause
: KW_SET set_rest
| variableresetstmt
;
functionsetresetclause
: KW_SET set_rest_more
| variableresetstmt
;
variableshowstmt
: KW_SHOW (
var_name
| KW_TIME KW_ZONE
| KW_TRANSACTION KW_ISOLATION KW_LEVEL
| KW_SESSION KW_AUTHORIZATION
| KW_ALL
)
;
constraintssetstmt
: KW_SET KW_CONSTRAINTS constraints_set_list constraints_set_mode
;
constraints_set_list
: KW_ALL
| qualified_name_list
;
constraints_set_mode
: KW_DEFERRED
| KW_IMMEDIATE
;
checkpointstmt
: KW_CHECKPOINT
;
discardstmt
: KW_DISCARD (KW_ALL | KW_TEMP | KW_TEMPORARY | KW_PLANS | KW_SEQUENCES)
;
altertablestmt
: KW_ALTER KW_TABLE opt_if_exists? relation_expr (alter_table_cmds | partition_cmd)
| KW_ALTER KW_TABLE KW_ALL KW_IN KW_TABLESPACE tablespace_name (KW_OWNED KW_BY role_list)? KW_SET KW_TABLESPACE tablespace_name_create opt_nowait?
| KW_ALTER KW_TABLE opt_if_exists? table_name KW_ATTACH KW_PARTITION qualified_name (
KW_FOR KW_VALUES partition_bound_spec
| KW_DEFAULT
)
| KW_ALTER KW_TABLE opt_if_exists? table_name KW_DETACH KW_PARTITION qualified_name (
KW_CONCURRENTLY
| KW_FINALIZE
)?
| KW_ALTER KW_INDEX opt_if_exists? qualified_name (alter_table_cmds | index_partition_cmd)
| KW_ALTER KW_INDEX KW_ALL KW_IN KW_TABLESPACE tablespace_name (KW_OWNED KW_BY role_list)? KW_SET KW_TABLESPACE tablespace_name opt_nowait?
| KW_ALTER KW_SEQUENCE opt_if_exists? qualified_name alter_table_cmds
| KW_ALTER KW_VIEW opt_if_exists? view_name alter_table_cmds
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name alter_table_cmds
| KW_ALTER KW_MATERIALIZED KW_VIEW KW_ALL KW_IN KW_TABLESPACE tablespace_name (
KW_OWNED KW_BY role_list
)? KW_SET KW_TABLESPACE tablespace_name_create opt_nowait?
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr alter_table_cmds
;
alter_table_cmds
: alter_table_cmd (COMMA alter_table_cmd)*
;
partition_bound_spec
: KW_IN opt_type_modifiers
| KW_FROM partition_bound_cluase KW_TO partition_bound_cluase
| KW_WITH partition_with_cluase
;
partition_bound_cluase
: OPEN_PAREN partition_bound_choose (COMMA partition_bound_choose)* CLOSE_PAREN
;
partition_bound_choose
: opt_type_modifiers
| KW_MINVALUE
| KW_MAXVALUE
;
partition_with_cluase
: OPEN_PAREN KW_MODULUS numericonly COMMA KW_REMAINDER numericonly CLOSE_PAREN
;
partition_cmd
: KW_ATTACH KW_PARTITION qualified_name partitionboundspec
| KW_DETACH KW_PARTITION qualified_name
;
index_partition_cmd
: KW_ATTACH KW_PARTITION qualified_name
;
alter_table_cmd
: KW_ADD (KW_CONSTRAINT name)? constraintelem
| KW_ALTER KW_CONSTRAINT name constraintattributespec
| KW_VALIDATE KW_CONSTRAINT name
| KW_DROP KW_CONSTRAINT opt_if_exists? name opt_drop_behavior?
| KW_SET KW_WITHOUT KW_OIDS
| KW_CLUSTER KW_ON name
| KW_SET KW_WITHOUT KW_CLUSTER
| KW_SET (KW_LOGGED | KW_UNLOGGED)
| KW_ENABLE (KW_REPLICA | KW_ALWAYS)? KW_TRIGGER
| KW_DISABLE KW_TRIGGER (KW_ALL | KW_USER | name)
| KW_ENABLE (KW_ALWAYS | KW_REPLICA) KW_RULE name
| KW_DISABLE KW_RULE name
| KW_NO? KW_INHERIT qualified_name
| KW_OF any_name
| KW_NOT KW_OF
| KW_OWNER KW_TO rolespec
| KW_SET KW_TABLESPACE tablespace_name_create
| KW_SET reloptions
| KW_RESET reloptions
| KW_REPLICA KW_IDENTITY replica_identity
| KW_ENABLE KW_ROW KW_LEVEL KW_SECURITY
| KW_DISABLE KW_ROW KW_LEVEL KW_SECURITY
| KW_FORCE KW_ROW KW_LEVEL KW_SECURITY
| KW_NO KW_FORCE KW_ROW KW_LEVEL KW_SECURITY
| KW_DROP KW_COLUMN? opt_if_exists? column_name opt_drop_behavior?
| KW_ADD KW_COLUMN? opt_if_not_exists? column_def
| KW_ALTER KW_COLUMN? column_name alter_column_default
| KW_ALTER KW_COLUMN? column_name (KW_DROP | KW_SET) KW_NOT KW_NULL
| KW_ALTER KW_COLUMN? column_name KW_DROP KW_EXPRESSION opt_if_exists?
| KW_ALTER KW_COLUMN? column_name KW_SET KW_STATISTICS signediconst
| KW_ALTER KW_COLUMN? column_name (KW_SET | KW_RESET) reloptions
| KW_ALTER KW_COLUMN? column_name KW_SET KW_STORAGE colid
| KW_ALTER KW_COLUMN? column_name KW_ADD KW_GENERATED generated_when KW_AS KW_IDENTITY optparenthesizedseqoptlist?
| KW_ALTER KW_COLUMN? column_name alter_identity_column_option_list
| KW_ALTER KW_COLUMN? column_name KW_DROP KW_IDENTITY opt_if_exists?
| KW_ALTER KW_COLUMN? column_name opt_set_data? KW_TYPE typename opt_collate_clause? alter_using?
| KW_ALTER KW_COLUMN? column_name alter_generic_options
| alter_generic_options
;
alter_column_default
: KW_SET KW_DEFAULT a_expr
| KW_DROP KW_DEFAULT
;
opt_drop_behavior
: KW_CASCADE
| KW_RESTRICT
;
opt_collate_clause
: KW_COLLATE any_name
;
alter_using
: KW_USING a_expr
;
replica_identity
: KW_NOTHING
| KW_FULL
| KW_DEFAULT
| KW_USING KW_INDEX name
;
reloptions
: OPEN_PAREN reloption_list CLOSE_PAREN
;
opt_reloptions
: KW_WITH reloptions
;
reloption_list
: reloption_elem (COMMA reloption_elem)*
;
reloption_elem
: collabel (EQUAL def_arg | DOT collabel (EQUAL def_arg)?)?
;
alter_identity_column_option_list
: alter_identity_column_option+
;
alter_identity_column_option
: KW_RESTART (opt_with? numericonly)?
| KW_SET (seqoptelem | KW_GENERATED generated_when)
;
partitionboundspec
: KW_FOR KW_VALUES KW_WITH OPEN_PAREN hash_partbound CLOSE_PAREN
| KW_FOR KW_VALUES KW_IN OPEN_PAREN expr_list CLOSE_PAREN
| KW_FOR KW_VALUES KW_FROM OPEN_PAREN expr_list CLOSE_PAREN KW_TO OPEN_PAREN expr_list CLOSE_PAREN
| KW_DEFAULT
;
hash_partbound_elem
: nonreservedword iconst
;
hash_partbound
: hash_partbound_elem (COMMA hash_partbound_elem)*
;
altercompositetypestmt
: KW_ALTER KW_TYPE any_name alter_type_cmds
;
alter_type_cmds
: alter_type_cmd (COMMA alter_type_cmd)*
;
alter_type_cmd
: KW_ADD KW_ATTRIBUTE tablefuncelement opt_drop_behavior?
| KW_DROP KW_ATTRIBUTE opt_if_exists? colid opt_drop_behavior?
| KW_ALTER KW_ATTRIBUTE colid opt_set_data? KW_TYPE typename opt_collate_clause? opt_drop_behavior?
;
closeportalstmt
: KW_CLOSE (cursor_name | KW_ALL)
;
copystmt
: KW_COPY opt_binary? table_name opt_column_list? copy_from opt_program? copy_file_name copy_delimiter? opt_with? copy_options where_clause?
| KW_COPY OPEN_PAREN preparablestmt CLOSE_PAREN KW_TO opt_program? copy_file_name opt_with? copy_options
;
copy_from
: KW_FROM
| KW_TO
;
opt_program
: KW_PROGRAM
;
copy_file_name
: sconst
| KW_STDIN
| KW_STDOUT
;
copy_options
: copy_opt_list
| OPEN_PAREN copy_generic_opt_list CLOSE_PAREN
;
copy_opt_list
: copy_opt_item*
;
copy_opt_item
: KW_BINARY
| KW_FREEZE
| KW_DELIMITER opt_as? sconst
| KW_NULL opt_as? sconst
| KW_CSV
| KW_HEADER
| KW_QUOTE opt_as? sconst
| KW_ESCAPE opt_as? sconst
| KW_FORCE KW_QUOTE column_list
| KW_FORCE KW_QUOTE STAR
| KW_FORCE KW_NOT KW_NULL column_list
| KW_FORCE KW_NULL column_list
| KW_ENCODING sconst
;
opt_binary
: KW_BINARY
;
copy_delimiter
: opt_using? KW_DELIMITERS sconst
;
opt_using
: KW_USING
;
copy_generic_opt_list
: copy_generic_opt_elem (COMMA copy_generic_opt_elem)*
;
copy_generic_opt_elem
: collabel copy_generic_opt_arg?
;
copy_generic_opt_arg
: opt_boolean_or_string
| numericonly
| STAR
| OPEN_PAREN copy_generic_opt_arg_list CLOSE_PAREN
;
copy_generic_opt_arg_list
: copy_generic_opt_arg_list_item (COMMA copy_generic_opt_arg_list_item)*
;
copy_generic_opt_arg_list_item
: opt_boolean_or_string_column
;
createstmt
: create_table_clause opt_if_not_exists? table_name_create (
OPEN_PAREN table_column_list? CLOSE_PAREN create_table_options*
| KW_OF any_name opttypedtableelementlist? optpartitionspec? table_access_method_clause? optwith? oncommitoption? opttablespace?
| KW_PARTITION KW_OF qualified_name opttypedtableelementlist? partitionboundspec optpartitionspec? table_access_method_clause? optwith?
oncommitoption? opttablespace?
) # columnCreateTable
;
create_table_options
: optinherit
| optpartitionspec
| table_access_method_clause
| optwith
| oncommitoption
| opttablespace
| optdistributed
;
create_table_clause
: KW_CREATE opttemp? KW_WRITABLE? KW_EXTERNAL? KW_TABLE
;
optdistributed
: KW_DISTRIBUTED KW_BY OPEN_PAREN column_list CLOSE_PAREN
;
opttemp
: KW_TEMPORARY
| KW_TEMP
| KW_LOCAL (KW_TEMPORARY | KW_TEMP)
| KW_GLOBAL (KW_TEMPORARY | KW_TEMP)
| KW_UNLOGGED
;
table_column_list
: tableelementlist
;
opttableelementlist
: tableelementlist
;
opttypedtableelementlist
: OPEN_PAREN typedtableelementlist CLOSE_PAREN
;
tableelementlist
: tableelement (COMMA tableelement)*
;
typedtableelementlist
: typedtableelement (COMMA typedtableelement)*
;
tableelement
: column_def
| tablelikeclause
| tableconstraint
;
typedtableelement
: columnOptions
| tableconstraint
;
column_def
: column_name_create typename create_generic_options? storageCluase? compressionCluase? (
KW_COLLATE any_name
)? (KW_WITH KW_OPTIONS)? colquallist
;
compressionCluase
: KW_COMPRESSION colid
;
storageCluase
: KW_STORAGE (KW_PLAIN | KW_EXTERNAL | KW_EXTENDED | KW_MAIN | KW_DEFAULT | colid)
;
columnOptions
: column_name_create (KW_WITH KW_OPTIONS)? colquallist
;
colquallist
: colconstraint*
;
colconstraint
: (KW_CONSTRAINT name)? colconstraintelem deferrable_trigger? initially_trigger?
| colconstraintelem deferrable_trigger? initially_trigger?
;
colconstraintelem
: KW_NOT KW_NULL
| KW_NULL
| KW_UNIQUE opt_definition? optconstablespace?
| KW_UNIQUE nulls_distinct? index_paramenters_create
| KW_PRIMARY KW_KEY opt_definition? optconstablespace?
| KW_CHECK OPEN_PAREN a_expr CLOSE_PAREN opt_no_inherit?
| KW_DEFAULT b_expr
| KW_GENERATED generated_when KW_AS (
KW_IDENTITY optparenthesizedseqoptlist?
| OPEN_PAREN a_expr CLOSE_PAREN KW_STORED
)
| KW_REFERENCES qualified_name opt_column_list? key_match? key_actions?
| opt_collate
;
nulls_distinct
: KW_NULLS KW_NOT? KW_DISTINCT
;
generated_when
: KW_ALWAYS
| KW_BY KW_DEFAULT
;
deferrable_trigger
: KW_DEFERRABLE
| KW_NOT KW_DEFERRABLE
;
initially_trigger
: KW_INITIALLY (KW_DEFERRED | KW_IMMEDIATE)
;
tablelikeclause
: KW_LIKE qualified_name tablelikeoptionlist
;
tablelikeoptionlist
: ((KW_INCLUDING | KW_EXCLUDING) tablelikeoption)*
;
tablelikeoption
: KW_COMMENTS
| KW_CONSTRAINTS
| KW_DEFAULTS
| KW_IDENTITY
| KW_GENERATED
| KW_INDEXES
| KW_STATISTICS
| KW_STORAGE
| KW_ALL
;
tableconstraint
: KW_CONSTRAINT name constraintelem
| constraintelem
;
constraintelem
: KW_CHECK OPEN_PAREN a_expr CLOSE_PAREN constraintattributespec
| KW_UNIQUE (
OPEN_PAREN column_list CLOSE_PAREN opt_c_include? opt_definition? optconstablespace? constraintattributespec
| existingindex constraintattributespec
)
| KW_PRIMARY KW_KEY (
OPEN_PAREN column_list CLOSE_PAREN opt_c_include? opt_definition? optconstablespace? constraintattributespec
| existingindex constraintattributespec
)
| KW_EXCLUDE access_method_clause? OPEN_PAREN exclusionconstraintlist CLOSE_PAREN opt_c_include? opt_definition? optconstablespace?
exclusionwhereclause? constraintattributespec
| KW_FOREIGN KW_KEY OPEN_PAREN column_list CLOSE_PAREN KW_REFERENCES qualified_name opt_column_list? key_match? key_actions?
constraintattributespec
;
opt_no_inherit
: KW_NO KW_INHERIT
;
opt_column_list
: OPEN_PAREN column_list CLOSE_PAREN
;
opt_column_list_create
: OPEN_PAREN column_list_create CLOSE_PAREN
;
column_list
: column_name (COMMA column_name)*
;
column_list_create
: column_name_create (COMMA column_name_create)*
;
opt_c_include
: KW_INCLUDE OPEN_PAREN column_list CLOSE_PAREN
;
key_match
: KW_MATCH (KW_FULL | KW_PARTIAL | KW_SIMPLE)
;
exclusionconstraintlist
: exclusionconstraintelem (COMMA exclusionconstraintelem)*
;
exclusionconstraintelem
: index_elem KW_WITH (any_operator | KW_OPERATOR OPEN_PAREN any_operator CLOSE_PAREN)
;
exclusionwhereclause
: KW_WHERE OPEN_PAREN a_expr CLOSE_PAREN
;
key_actions
: key_update
| key_delete
| key_update key_delete
| key_delete key_update
;
key_update
: KW_ON KW_UPDATE key_action
;
key_delete
: KW_ON KW_DELETE key_action
;
key_action
: KW_NO KW_ACTION
| KW_RESTRICT
| KW_CASCADE
| KW_SET (KW_NULL | KW_DEFAULT) column_list?
;
optinherit
: KW_INHERITS OPEN_PAREN qualified_name_list CLOSE_PAREN
;
optpartitionspec
: partitionspec
;
partitionspec
: KW_PARTITION KW_BY colid OPEN_PAREN part_params CLOSE_PAREN
;
part_params
: part_elem (COMMA part_elem)*
;
part_elem
: column_name opt_collate? opt_class?
| func_expr_windowless opt_collate? opt_class?
| OPEN_PAREN a_expr CLOSE_PAREN opt_collate? opt_class?
;
table_access_method_clause
: KW_USING name
;
optwith
: KW_WITH reloptions
| KW_WITHOUT KW_OIDS
| KW_WITH KW_OIDS
;
oncommitoption
: KW_ON KW_COMMIT (KW_DROP | KW_DELETE KW_ROWS | KW_PRESERVE KW_ROWS)
;
opttablespace
: KW_TABLESPACE tablespace_name
;
index_paramenters_create
: opt_include? with_clause? optconstablespace?
;
optconstablespace
: KW_USING KW_INDEX KW_TABLESPACE tablespace_name
;
existingindex
: KW_USING KW_INDEX name
;
createstatsstmt
: KW_CREATE KW_STATISTICS (opt_if_not_exists? any_name)? opt_name_list? KW_ON (
column_expr_list
| expr_list
) KW_FROM from_list
;
alterstatsstmt
: KW_ALTER KW_STATISTICS opt_if_exists? any_name KW_SET KW_STATISTICS signediconst
;
createasstmt
: create_table_clause opt_if_not_exists? create_as_target KW_AS selectstmt opt_with_data? # queryCreateTable
;
create_as_target
: table_name_create opt_column_list_create? table_access_method_clause? optwith? oncommitoption? opttablespace?
;
opt_with_data
: KW_WITH (KW_DATA | KW_NO KW_DATA)
;
creatematviewstmt
: KW_CREATE optnolog? KW_MATERIALIZED KW_VIEW opt_if_not_exists? create_mv_target KW_AS selectstmt opt_with_data? # createMaterializedView
;
create_mv_target
: view_name_create opt_column_list_create? table_access_method_clause? opt_reloptions? opttablespace?
;
optnolog
: KW_UNLOGGED
;
refreshmatviewstmt
: KW_REFRESH KW_MATERIALIZED KW_VIEW opt_concurrently? view_name opt_with_data?
;
createseqstmt
: KW_CREATE opttemp? KW_SEQUENCE opt_if_not_exists? qualified_name optseqoptlist?
;
alterseqstmt
: KW_ALTER KW_SEQUENCE opt_if_exists? qualified_name seqoptlist
;
optseqoptlist
: seqoptlist
;
optparenthesizedseqoptlist
: OPEN_PAREN seqoptlist CLOSE_PAREN
;
seqoptlist
: seqoptelem+
;
seqoptelem
: KW_AS simpletypename
| KW_CACHE numericonly
| KW_CYCLE
| KW_INCREMENT opt_by? numericonly
| KW_MAXVALUE numericonly
| KW_MINVALUE numericonly
| KW_NO (KW_MAXVALUE | KW_MINVALUE | KW_CYCLE)
| KW_OWNED KW_BY column_name
| KW_SEQUENCE KW_NAME any_name
| KW_START opt_with? numericonly
| KW_RESTART opt_with? numericonly?
;
opt_by
: KW_BY
;
numericonly
: fconst
| PLUS fconst
| MINUS fconst
| signediconst
;
numericonly_list
: numericonly (COMMA numericonly)*
;
createplangstmt
: KW_CREATE opt_or_replace? opt_trusted? opt_procedural? KW_LANGUAGE name (
KW_HANDLER handler_name opt_inline_handler? opt_validator?
)?
;
opt_trusted
: KW_TRUSTED
;
handler_name
: name attrs?
;
opt_inline_handler
: KW_INLINE handler_name
;
validator_clause
: KW_VALIDATOR handler_name
| KW_NO KW_VALIDATOR
;
opt_validator
: validator_clause
;
opt_procedural
: KW_PROCEDURAL
;
createtablespacestmt
: KW_CREATE KW_TABLESPACE tablespace_name opttablespaceowner? KW_LOCATION sconst opt_reloptions?
;
opttablespaceowner
: KW_OWNER rolespec
;
createextensionstmt
: KW_CREATE KW_EXTENSION opt_if_not_exists? name opt_with? create_extension_opt_list
;
create_extension_opt_list
: create_extension_opt_item*
;
create_extension_opt_item
: KW_SCHEMA schema_name
| KW_VERSION nonreservedword_or_sconst
| KW_FROM nonreservedword_or_sconst
| KW_CASCADE
;
alterextensionstmt
: KW_ALTER KW_EXTENSION name KW_UPDATE alter_extension_opt_list
;
alter_extension_opt_list
: alter_extension_opt_item*
;
alter_extension_opt_item
: KW_TO nonreservedword_or_sconst
;
alterextensioncontentsstmt
: KW_ALTER KW_EXTENSION name add_drop object_type_name
| KW_ALTER KW_EXTENSION name add_drop object_type_any_name
| KW_ALTER KW_EXTENSION name add_drop KW_AGGREGATE aggregate_with_argtypes
| KW_ALTER KW_EXTENSION name add_drop KW_CAST OPEN_PAREN typename KW_AS typename CLOSE_PAREN
| KW_ALTER KW_EXTENSION name add_drop KW_DOMAIN typename
| KW_ALTER KW_EXTENSION name add_drop KW_FUNCTION function_with_argtypes
| KW_ALTER KW_EXTENSION name add_drop KW_OPERATOR operator_with_argtypes
| KW_ALTER KW_EXTENSION name add_drop KW_OPERATOR KW_CLASS any_name KW_USING name
| KW_ALTER KW_EXTENSION name add_drop KW_OPERATOR KW_FAMILY any_name KW_USING name
| KW_ALTER KW_EXTENSION name add_drop KW_PROCEDURE procedure_with_argtypes
| KW_ALTER KW_EXTENSION name add_drop KW_ROUTINE routine_with_argtypes
| KW_ALTER KW_EXTENSION name add_drop KW_TRANSFORM KW_FOR typename KW_LANGUAGE name
| KW_ALTER KW_EXTENSION name add_drop KW_TYPE typename
;
createfdwstmt
: KW_CREATE KW_FOREIGN KW_DATA KW_WRAPPER name opt_fdw_options? create_generic_options?
;
fdw_option
: KW_HANDLER handler_name
| KW_NO KW_HANDLER
| KW_VALIDATOR handler_name
| KW_NO KW_VALIDATOR
;
fdw_options
: fdw_option+
;
opt_fdw_options
: fdw_options
;
alterfdwstmt
: KW_ALTER KW_FOREIGN KW_DATA KW_WRAPPER name opt_fdw_options? alter_generic_options
| KW_ALTER KW_FOREIGN KW_DATA KW_WRAPPER name fdw_options
;
create_generic_options
: KW_OPTIONS OPEN_PAREN generic_option_list CLOSE_PAREN
;
generic_option_list
: generic_option_elem (COMMA generic_option_elem)*
;
alter_generic_options
: KW_OPTIONS OPEN_PAREN alter_generic_option_list CLOSE_PAREN
;
alter_generic_option_list
: alter_generic_option_elem (COMMA alter_generic_option_elem)*
;
alter_generic_option_elem
: generic_option_elem
| KW_SET generic_option_elem
| KW_ADD generic_option_elem
| KW_DROP generic_option_elem
;
generic_option_elem
: generic_option_name generic_option_arg
;
generic_option_name
: collabel
;
generic_option_arg
: sconst
;
createforeignserverstmt
: KW_CREATE KW_SERVER opt_if_not_exists? name opt_type? opt_foreign_server_version? KW_FOREIGN KW_DATA KW_WRAPPER name create_generic_options?
;
opt_type
: KW_TYPE sconst
;
foreign_server_version
: KW_VERSION (sconst | KW_NULL)
;
opt_foreign_server_version
: foreign_server_version
;
alterforeignserverstmt
: KW_ALTER KW_SERVER name (
alter_generic_options
| foreign_server_version alter_generic_options?
)
;
createforeigntablestmt
: KW_CREATE KW_FOREIGN KW_TABLE opt_if_not_exists? table_name_create OPEN_PAREN opttableelementlist? CLOSE_PAREN optinherit? KW_SERVER name
create_generic_options? # createForeignTable
| KW_CREATE KW_FOREIGN KW_TABLE opt_if_not_exists? table_name_create KW_PARTITION KW_OF table_name opttypedtableelementlist? partitionboundspec
KW_SERVER name create_generic_options? # createPartitionForeignTable
;
importforeignschemastmt
: KW_IMPORT KW_FOREIGN KW_SCHEMA schema_name import_qualification? KW_FROM KW_SERVER name KW_INTO name create_generic_options?
;
import_qualification_type
: KW_LIMIT KW_TO
| KW_EXCEPT
;
import_qualification
: import_qualification_type OPEN_PAREN relation_expr_list CLOSE_PAREN
;
createusermappingstmt
: KW_CREATE KW_USER KW_MAPPING opt_if_not_exists? KW_FOR auth_ident KW_SERVER name create_generic_options?
;
auth_ident
: rolespec
| KW_USER
;
alterusermappingstmt
: KW_ALTER KW_USER KW_MAPPING KW_FOR auth_ident KW_SERVER name alter_generic_options
;
createpolicystmt
: KW_CREATE KW_POLICY name KW_ON qualified_name rowsecuritydefaultpermissive? rowsecuritydefaultforcmd? rowsecuritydefaulttorole?
rowsecurityoptionalexpr? rowsecurityoptionalwithcheck?
;
alterpolicystmt
: KW_ALTER KW_POLICY name KW_ON qualified_name rowsecurityoptionaltorole? rowsecurityoptionalexpr? rowsecurityoptionalwithcheck?
;
alterprocedurestmt
: KW_ALTER KW_PROCEDURE procedure_name func_args? procedure_cluase
;
procedure_cluase
: procedure_action (procedure_action)* KW_RESTRICT?
| KW_RENAME KW_TO procedure_name_create
| KW_OWNER KW_TO rolespec
| KW_SET KW_SCHEMA schema_name_create
| KW_NO? KW_DEPENDS KW_ON KW_EXTENSION name
;
procedure_action
: (KW_EXTERNAL? KW_SECURITY KW_INVOKER | KW_EXTERNAL? KW_SECURITY KW_DEFINER)
| KW_SET name (KW_TO | STAR) (name | KW_DEFAULT)
| KW_SET name KW_FROM KW_CURRENT
| KW_RESET name
| KW_RESET KW_ALL
;
rowsecurityoptionalexpr
: KW_USING OPEN_PAREN a_expr CLOSE_PAREN
;
rowsecurityoptionalwithcheck
: KW_WITH KW_CHECK OPEN_PAREN a_expr CLOSE_PAREN
;
rowsecuritydefaulttorole
: KW_TO role_list
;
rowsecurityoptionaltorole
: KW_TO role_list
;
rowsecuritydefaultpermissive
: KW_AS (KW_PERMISSIVE | KW_RESTRICTIVE | identifier)
;
rowsecuritydefaultforcmd
: KW_FOR row_security_cmd
;
row_security_cmd
: KW_ALL
| KW_SELECT
| KW_INSERT
| KW_UPDATE
| KW_DELETE
;
createamstmt
: KW_CREATE KW_ACCESS KW_METHOD name KW_TYPE am_type KW_HANDLER handler_name
;
am_type
: KW_INDEX
| KW_TABLE
;
createtrigstmt
: KW_CREATE opt_or_replace? KW_TRIGGER name triggeractiontime triggerevents KW_ON table_name triggerreferencing? triggerforspec? triggerwhen?
KW_EXECUTE function_or_procedure OPEN_PAREN triggerfuncargs CLOSE_PAREN
| KW_CREATE opt_or_replace? KW_CONSTRAINT? KW_TRIGGER name triggeractiontime triggerevents KW_ON table_name optconstrfromtable?
constraintattributespec foreachrow? triggerwhen? KW_EXECUTE function_or_procedure OPEN_PAREN triggerfuncargs CLOSE_PAREN
;
triggeractiontime
: KW_BEFORE
| KW_AFTER
| KW_INSTEAD KW_OF
;
foreachrow
: KW_FOR KW_EACH? roworstatment
;
roworstatment
: KW_ROW
| KW_STATEMENT
;
triggerevents
: triggeroneevent (KW_OR triggeroneevent)*
;
triggeroneevent
: KW_INSERT
| KW_DELETE
| KW_UPDATE
| KW_UPDATE KW_OF column_list
| KW_TRUNCATE
;
triggerreferencing
: KW_REFERENCING triggertransitions
;
triggertransitions
: triggertransition+
;
triggertransition
: transitionoldornew transitionrowortable opt_as? transitionrelname
;
transitionoldornew
: KW_NEW
| KW_OLD
;
transitionrowortable
: KW_TABLE
| KW_ROW
;
transitionrelname
: colid
;
triggerforspec
: KW_FOR triggerforopteach? triggerfortype
;
triggerforopteach
: KW_EACH
;
triggerfortype
: KW_ROW
| KW_STATEMENT
;
triggerwhen
: KW_WHEN OPEN_PAREN a_expr CLOSE_PAREN
;
function_or_procedure
: KW_FUNCTION function_name
| KW_PROCEDURE procedure_name
;
triggerfuncargs
: (triggerfuncarg |) (COMMA triggerfuncarg)*
;
triggerfuncarg
: iconst
| fconst
| sconst
| collabel
;
optconstrfromtable
: KW_FROM qualified_name
;
constraintattributespec
: constraintattributeElem*
;
constraintattributeElem
: KW_NOT KW_DEFERRABLE
| KW_DEFERRABLE
| KW_INITIALLY KW_IMMEDIATE
| KW_INITIALLY KW_DEFERRED
| KW_NOT KW_VALID
| KW_NO KW_INHERIT
;
createeventtrigstmt
: KW_CREATE KW_EVENT KW_TRIGGER name KW_ON collabel KW_EXECUTE function_or_procedure OPEN_PAREN CLOSE_PAREN
| KW_CREATE KW_EVENT KW_TRIGGER name KW_ON collabel KW_WHEN event_trigger_when_list KW_EXECUTE function_or_procedure OPEN_PAREN CLOSE_PAREN
;
event_trigger_when_list
: event_trigger_when_item (KW_AND event_trigger_when_item)*
;
event_trigger_when_item
: colid KW_IN OPEN_PAREN event_trigger_value_list CLOSE_PAREN
;
event_trigger_value_list
: sconst (COMMA sconst)*
;
altereventtrigstmt
: KW_ALTER KW_EVENT KW_TRIGGER name enable_trigger
;
enable_trigger
: KW_ENABLE (KW_REPLICA | KW_ALWAYS)?
| KW_DISABLE
;
createassertionstmt
: KW_CREATE KW_ASSERTION any_name KW_CHECK OPEN_PAREN a_expr CLOSE_PAREN constraintattributespec
;
definestmt
: KW_CREATE opt_or_replace? KW_AGGREGATE function_name aggr_args definition
| KW_CREATE opt_or_replace? KW_AGGREGATE function_name old_aggr_definition
| KW_CREATE KW_OPERATOR any_operator definition
| KW_CREATE KW_TYPE any_name definition
| KW_CREATE KW_TYPE any_name
| KW_CREATE KW_TYPE any_name KW_AS OPEN_PAREN opttablefuncelementlist? CLOSE_PAREN
| KW_CREATE KW_TYPE any_name KW_AS KW_ENUM OPEN_PAREN opt_enum_val_list? CLOSE_PAREN
| KW_CREATE KW_TYPE any_name KW_AS KW_RANGE definition
| KW_CREATE KW_TEXT KW_SEARCH KW_PARSER any_name definition
| KW_CREATE KW_TEXT KW_SEARCH KW_DICTIONARY any_name definition
| KW_CREATE KW_TEXT KW_SEARCH KW_TEMPLATE any_name definition
| KW_CREATE KW_TEXT KW_SEARCH KW_CONFIGURATION any_name definition
| KW_CREATE KW_COLLATION opt_if_not_exists? any_name definition
| KW_CREATE KW_COLLATION opt_if_not_exists? any_name KW_FROM any_name
;
definition
: OPEN_PAREN def_list CLOSE_PAREN
;
def_list
: def_elem (COMMA def_elem)*
;
def_elem
: collabel (EQUAL def_arg)?
;
def_arg
: func_type
| reserved_keyword
| qual_all_op
| numericonly
| sconst
| KW_NONE
;
old_aggr_definition
: OPEN_PAREN old_aggr_list CLOSE_PAREN
;
old_aggr_list
: old_aggr_elem (COMMA old_aggr_elem)*
;
old_aggr_elem
: identifier EQUAL def_arg
;
opt_enum_val_list
: enum_val_list
;
enum_val_list
: sconst (COMMA sconst)*
;
alterenumstmt
: KW_ALTER KW_TYPE any_name KW_ADD KW_VALUE opt_if_not_exists? sconst (
(KW_BEFORE | KW_AFTER) sconst
)?
| KW_ALTER KW_TYPE any_name KW_RENAME KW_VALUE sconst KW_TO sconst
;
opt_if_not_exists
: KW_IF KW_NOT KW_EXISTS
;
createopclassstmt
: KW_CREATE KW_OPERATOR KW_CLASS any_name opt_default? KW_FOR KW_TYPE typename KW_USING name opt_opfamily? KW_AS opclass_item_list
;
opclass_item_list
: opclass_item (COMMA opclass_item)*
;
opclass_item
: KW_OPERATOR iconst any_operator opclass_purpose? opt_recheck?
| KW_OPERATOR iconst operator_with_argtypes opclass_purpose? opt_recheck?
| KW_FUNCTION iconst function_with_argtypes
| KW_FUNCTION iconst OPEN_PAREN type_list CLOSE_PAREN function_with_argtypes
| KW_STORAGE typename
;
opt_default
: KW_DEFAULT
;
opt_opfamily
: KW_FAMILY any_name
;
opclass_purpose
: KW_FOR KW_SEARCH
| KW_FOR KW_ORDER KW_BY any_name
;
opt_recheck
: KW_RECHECK
;
createopfamilystmt
: KW_CREATE KW_OPERATOR KW_FAMILY any_name KW_USING name
;
alteropfamilystmt
: KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_ADD opclass_item_list
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_DROP opclass_drop_list
;
opclass_drop_list
: opclass_drop (COMMA opclass_drop)*
;
opclass_drop
: KW_OPERATOR iconst OPEN_PAREN type_list CLOSE_PAREN
| KW_FUNCTION iconst OPEN_PAREN type_list CLOSE_PAREN
;
reassignownedstmt
: KW_REASSIGN KW_OWNED KW_BY role_list KW_TO rolespec
;
dropstmt
: KW_DROP KW_TABLE opt_if_exists? table_name_list opt_drop_behavior?
| KW_DROP KW_SEQUENCE opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_VIEW opt_if_exists? view_nameList opt_drop_behavior?
| KW_DROP KW_MATERIALIZED KW_VIEW opt_if_exists? view_nameList opt_drop_behavior?
| KW_DROP KW_INDEX opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_FOREIGN KW_TABLE opt_if_exists? table_name_list opt_drop_behavior?
| KW_DROP KW_COLLATION opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_CONVERSION opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_STATISTICS opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_TEXT KW_SEARCH KW_PARSER opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_TEXT KW_SEARCH KW_DICTIONARY opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_TEXT KW_SEARCH KW_TEMPLATE opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_TEXT KW_SEARCH KW_CONFIGURATION opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_ACCESS KW_METHOD opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_EVENT KW_TRIGGER opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_EXTENSION opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_FOREIGN KW_DATA KW_WRAPPER opt_if_exists? name_list opt_drop_behavior?
| KW_DROP opt_procedural? KW_LANGUAGE opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_PUBLICATION opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_SERVER opt_if_exists? name_list opt_drop_behavior?
| KW_DROP KW_SCHEMA opt_if_exists? schema_name_list opt_drop_behavior?
| KW_DROP KW_POLICY opt_if_exists? name KW_ON any_name opt_drop_behavior?
| KW_DROP KW_RULE opt_if_exists? name KW_ON any_name opt_drop_behavior?
| KW_DROP KW_TRIGGER opt_if_exists? name KW_ON any_name opt_drop_behavior?
| KW_DROP KW_TYPE opt_if_exists? type_name_list opt_drop_behavior?
| KW_DROP KW_DOMAIN opt_if_exists? type_name_list opt_drop_behavior?
| KW_DROP KW_INDEX KW_CONCURRENTLY opt_if_exists? any_name_list opt_drop_behavior?
| KW_DROP KW_CAST opt_if_exists? OPEN_PAREN typename KW_AS typename CLOSE_PAREN opt_drop_behavior?
| KW_DROP KW_OPERATOR KW_CLASS opt_if_exists? any_name KW_USING name opt_drop_behavior?
| KW_DROP KW_OPERATOR KW_FAMILY opt_if_exists? any_name KW_USING name opt_drop_behavior?
| KW_DROP KW_OWNED KW_BY role_list opt_drop_behavior?
| KW_DROP KW_VIEW opt_if_exists? view_nameList opt_drop_behavior?
| KW_DROP KW_SUBSCRIPTION opt_if_exists? name opt_drop_behavior?
| KW_DROP KW_TABLESPACE opt_if_exists? tablespace_name
| KW_DROP KW_TRANSFORM opt_if_exists? KW_FOR typename KW_LANGUAGE name opt_drop_behavior?
| KW_DROP (KW_ROLE | KW_USER | KW_GROUP) opt_if_exists? role_list
| KW_DROP KW_USER KW_MAPPING opt_if_exists? KW_FOR auth_ident KW_SERVER name
| KW_DROP KW_DATABASE opt_if_exists? database_name (
opt_with? OPEN_PAREN drop_option_list CLOSE_PAREN
)?
;
view_nameList
: view_name (COMMA view_name)*
;
object_type_any_name
: KW_FOREIGN? KW_TABLE table_name
| KW_MATERIALIZED? KW_VIEW view_name
| KW_INDEX any_name
| KW_COLLATION any_name
| KW_CONVERSION any_name
| KW_STATISTICS any_name
| KW_SEQUENCE any_name
| KW_TEXT KW_SEARCH (KW_PARSER | KW_DICTIONARY | KW_TEMPLATE | KW_CONFIGURATION) any_name
;
object_type_name
: (KW_ACCESS KW_METHOD name)
| (KW_EVENT KW_TRIGGER name)
| (KW_EXTENSION name)
| (KW_FOREIGN KW_DATA KW_WRAPPER name)
| (opt_procedural? KW_LANGUAGE name)
| (KW_PUBLICATION name)
| (KW_SCHEMA schema_name)
| (KW_SERVER name)
| (KW_DATABASE database_name)
| (KW_ROLE name)
| (KW_SUBSCRIPTION name)
| (KW_TABLESPACE tablespace_name)
;
object_type_name_on_any_name
: KW_POLICY
| KW_RULE
| KW_TRIGGER
;
any_name_list
: any_name (COMMA any_name)*
;
relation_column_name
: relation_name DOT column_name
;
relation_name
: colid attrs?
;
any_name
: colid attrs?
;
attrs
: (DOT attr_name)+
;
type_name_list
: typename (COMMA typename)*
;
truncatestmt
: KW_TRUNCATE KW_TABLE? truncate_table (COMMA truncate_table)* (
(KW_CONTINUE | KW_RESTART) KW_IDENTITY
)? opt_drop_behavior?
;
truncate_table
: KW_ONLY? table_name STAR?
;
commentstmt
: KW_COMMENT KW_ON object_type_any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_COLUMN relation_column_name KW_IS comment_text
| KW_COMMENT KW_ON object_type_name KW_IS comment_text
| KW_COMMENT KW_ON KW_TYPE typename KW_IS comment_text
| KW_COMMENT KW_ON KW_DOMAIN typename KW_IS comment_text
| KW_COMMENT KW_ON KW_AGGREGATE aggregate_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_FUNCTION function_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_OPERATOR operator_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_CONSTRAINT name KW_ON table_name KW_IS comment_text
| KW_COMMENT KW_ON KW_CONSTRAINT name KW_ON KW_DOMAIN? any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_POLICY name KW_ON any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_RULE name KW_ON any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_TRIGGER name KW_ON any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_PROCEDURE procedure_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_ROUTINE routine_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_TRANSFORM KW_FOR typename KW_LANGUAGE name KW_IS comment_text
| KW_COMMENT KW_ON KW_OPERATOR KW_CLASS any_name KW_USING name KW_IS comment_text
| KW_COMMENT KW_ON KW_OPERATOR KW_FAMILY any_name KW_USING name KW_IS comment_text
| KW_COMMENT KW_ON KW_LARGE KW_OBJECT numericonly KW_IS comment_text
| KW_COMMENT KW_ON KW_CAST OPEN_PAREN typename KW_AS typename CLOSE_PAREN KW_IS comment_text
;
comment_text
: sconst
| KW_NULL
;
seclabelstmt
: KW_SECURITY KW_LABEL opt_provider? KW_ON KW_COLUMN column_name KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_TYPE typename KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_DOMAIN typename KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_AGGREGATE aggregate_with_argtypes KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_FUNCTION function_with_argtypes KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_LARGE KW_OBJECT numericonly KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_PROCEDURE procedure_with_argtypes KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_ROUTINE routine_with_argtypes KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_any_name KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_name KW_IS security_label
;
opt_provider
: KW_FOR nonreservedword_or_sconst
;
security_label
: sconst
| KW_NULL
;
fetchstmt
: KW_FETCH fetch_args
| KW_MOVE fetch_args
;
fetch_args
: cursor_name
| from_in cursor_name
| KW_NEXT opt_from_in? cursor_name
| KW_PRIOR opt_from_in? cursor_name
| KW_FIRST opt_from_in? cursor_name
| KW_LAST opt_from_in? cursor_name
| KW_ABSOLUTE signediconst opt_from_in? cursor_name
| KW_RELATIVE signediconst opt_from_in? cursor_name
| signediconst opt_from_in? cursor_name
| KW_ALL opt_from_in? cursor_name
| KW_FORWARD opt_from_in? cursor_name
| KW_FORWARD signediconst opt_from_in? cursor_name
| KW_FORWARD KW_ALL opt_from_in? cursor_name
| KW_BACKWARD opt_from_in? cursor_name
| KW_BACKWARD signediconst opt_from_in? cursor_name
| KW_BACKWARD KW_ALL opt_from_in? cursor_name
;
from_in
: KW_FROM
| KW_IN
;
opt_from_in
: from_in
;
grantstmt
: KW_GRANT privileges KW_ON privilege_target KW_TO grantee_list opt_grant_grant_option?
;
revokestmt
: KW_REVOKE privileges KW_ON privilege_target KW_FROM grantee_list opt_drop_behavior?
| KW_REVOKE KW_GRANT KW_OPTION KW_FOR privileges KW_ON privilege_target KW_FROM grantee_list opt_drop_behavior?
;
privileges
: privilege_list
| KW_ALL
| KW_ALL KW_PRIVILEGES
| KW_ALL OPEN_PAREN column_list CLOSE_PAREN
| KW_ALL KW_PRIVILEGES OPEN_PAREN column_list CLOSE_PAREN
| beforeprivilegeselectlist
;
beforeprivilegeselectlist
: beforeprivilegeselect (COMMA beforeprivilegeselect)*
;
beforeprivilegeselect
: KW_SELECT
| KW_INSERT
| KW_UPDATE
| KW_DELETE
| KW_TRUNCATE
| KW_PEFERENCES
| KW_TRIGGER
| KW_USAGE
| KW_CREATE
| KW_CONNECT
| KW_TEMPORARY
| KW_TEMP
| KW_EXECUTE
;
privilege_list
: privilege (COMMA privilege)*
;
privilege
: KW_SELECT opt_column_list?
| KW_REFERENCES opt_column_list?
| KW_CREATE opt_column_list?
| colid opt_column_list?
;
privilege_target
: qualified_name_list
| KW_TABLE table_name_list
| KW_SEQUENCE qualified_name_list
| KW_FOREIGN KW_DATA KW_WRAPPER name_list
| KW_FOREIGN KW_SERVER name_list
| KW_FUNCTION function_with_argtypes_list
| KW_PROCEDURE procedure_with_argtypes_list
| KW_ROUTINE routine_with_argtypes_list
| KW_DATABASE database_nameList
| KW_DOMAIN any_name_list
| KW_LANGUAGE name_list
| KW_LARGE KW_OBJECT numericonly_list
| KW_SCHEMA schema_name_list
| KW_TABLESPACE tablespace_name_list
| KW_TYPE any_name_list
| KW_ALL KW_TABLES KW_IN KW_SCHEMA schema_name_list
| KW_ALL KW_SEQUENCES KW_IN KW_SCHEMA schema_name_list
| KW_ALL KW_FUNCTIONS KW_IN KW_SCHEMA schema_name_list
| KW_ALL KW_PROCEDURES KW_IN KW_SCHEMA schema_name_list
| KW_ALL KW_ROUTINES KW_IN KW_SCHEMA schema_name_list
;
grantee_list
: grantee (COMMA grantee)*
;
grantee
: rolespec
| KW_GROUP rolespec
;
opt_grant_grant_option
: KW_WITH KW_GRANT KW_OPTION
;
grantrolestmt
: KW_GRANT privilege_list KW_TO role_list opt_grant_admin_option? opt_granted_by?
;
revokerolestmt
: KW_REVOKE privilege_list KW_FROM role_list opt_granted_by? opt_drop_behavior?
| KW_REVOKE KW_ADMIN KW_OPTION KW_FOR privilege_list KW_FROM role_list opt_granted_by? opt_drop_behavior?
;
opt_grant_admin_option
: KW_WITH KW_ADMIN KW_OPTION
;
opt_granted_by
: KW_GRANTED KW_BY rolespec
;
alterdefaultprivilegesstmt
: KW_ALTER KW_DEFAULT KW_PRIVILEGES defacloptionlist defaclaction
;
defacloptionlist
: defacloption*
;
defacloption
: KW_IN KW_SCHEMA schema_name_list
| KW_FOR KW_ROLE role_list
| KW_FOR KW_USER role_list
;
defaclaction
: KW_GRANT privileges KW_ON defacl_privilege_target KW_TO grantee_list opt_grant_grant_option?
| KW_REVOKE privileges KW_ON defacl_privilege_target KW_FROM grantee_list opt_drop_behavior?
| KW_REVOKE KW_GRANT KW_OPTION KW_FOR privileges KW_ON defacl_privilege_target KW_FROM grantee_list opt_drop_behavior?
;
defacl_privilege_target
: KW_TABLES
| KW_FUNCTIONS
| KW_ROUTINES
| KW_SEQUENCES
| KW_TYPES
| KW_SCHEMAS
;
//create index
indexstmt
: KW_CREATE opt_unique? KW_INDEX opt_concurrently? opt_if_not_exists? opt_index_name? KW_ON relation_expr access_method_clause? OPEN_PAREN
index_params CLOSE_PAREN opt_include? nulls_distinct? opt_reloptions? opttablespace? where_clause?
;
opt_unique
: KW_UNIQUE
;
opt_concurrently
: KW_CONCURRENTLY
;
opt_index_name
: name
;
access_method_clause
: KW_USING name
;
index_params
: index_elem (COMMA 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
: column_name index_elem_options
| func_expr_windowless index_elem_options
| OPEN_PAREN a_expr CLOSE_PAREN index_elem_options
;
opt_include
: KW_INCLUDE OPEN_PAREN index_including_params CLOSE_PAREN
;
index_including_params
: index_elem (COMMA index_elem)*
;
opt_collate
: KW_COLLATE any_name
;
opt_class
: any_name
;
opt_asc_desc
: KW_ASC
| KW_DESC
;
opt_nulls_order
: KW_NULLS KW_FIRST
| KW_NULLS KW_LAST
;
createfunctionstmt
: KW_CREATE opt_or_replace? (
KW_FUNCTION function_name_create
| KW_PROCEDURE procedure_name_create
) func_args_with_defaults (
KW_RETURNS (func_return | KW_TABLE OPEN_PAREN table_func_column_list CLOSE_PAREN)
)? createfunc_opt_list (KW_WITH attrilist)?
;
attrilist
: OPEN_PAREN colid (COMMA colid)* CLOSE_PAREN
;
opt_or_replace
: KW_OR KW_REPLACE
;
func_args
: OPEN_PAREN func_args_list? CLOSE_PAREN
;
func_args_list
: func_arg (COMMA func_arg)*
;
routine_with_argtypes_list
: routine_with_argtypes (COMMA routine_with_argtypes)*
;
routine_with_argtypes
: routine_name func_args
| type_func_name_keyword
| colid indirection?
;
procedure_with_argtypes_list
: procedure_with_argtypes (COMMA procedure_with_argtypes)*
;
procedure_with_argtypes
: procedure_name func_args
| type_func_name_keyword
| colid indirection?
;
function_with_argtypes_list
: function_with_argtypes (COMMA function_with_argtypes)*
;
function_with_argtypes
: function_name func_args
| type_func_name_keyword
| colid indirection?
;
func_args_with_defaults
: OPEN_PAREN func_args_with_defaults_list? CLOSE_PAREN
;
func_args_with_defaults_list
: func_arg_with_default (COMMA func_arg_with_default)*
;
func_arg
: arg_class param_name? func_type
| param_name arg_class? func_type
| func_type
;
arg_class
: KW_IN KW_OUT?
| KW_OUT
| KW_INOUT
| KW_VARIADIC
;
param_name
: type_function_name
;
func_return
: func_type
;
func_type
: typename
| type_function_name attrs PERCENT KW_TYPE
| KW_SETOF type_function_name attrs PERCENT KW_TYPE
;
func_arg_with_default
: func_arg ((KW_DEFAULT | EQUAL) a_expr)?
;
aggr_arg
: func_arg
;
aggr_args
: OPEN_PAREN (
STAR
| aggr_args_list
| KW_ORDER KW_BY aggr_args_list
| aggr_args_list KW_ORDER KW_BY aggr_args_list
) CLOSE_PAREN
;
aggr_args_list
: aggr_arg (COMMA aggr_arg)*
;
aggregate_with_argtypes
: function_name aggr_args
;
aggregate_with_argtypes_list
: aggregate_with_argtypes (COMMA aggregate_with_argtypes)*
;
createfunc_opt_list
: createfunc_opt_item+
;
common_func_opt_item
: KW_CALLED KW_ON KW_NULL KW_INPUT
| KW_RETURNS KW_NULL KW_ON KW_NULL KW_INPUT
| KW_STRICT
| KW_IMMUTABLE
| KW_STABLE
| KW_VOLATILE
| KW_EXTERNAL KW_SECURITY KW_DEFINER
| KW_EXTERNAL KW_SECURITY KW_INVOKER
| KW_SECURITY KW_DEFINER
| KW_SECURITY KW_INVOKER
| KW_LEAKPROOF
| KW_NOT KW_LEAKPROOF
| KW_COST numericonly
| KW_ROWS numericonly
| KW_SUPPORT any_name
| functionsetresetclause
| KW_PARALLEL colid
;
createfunc_opt_item
: KW_AS sconst COMMA sconst
| KW_LANGUAGE nonreservedword_or_sconst
| KW_TRANSFORM transform_type_list
| KW_WINDOW
| KW_SET colid (KW_TO colid | EQUAL colid | KW_FROM KW_CURRENT)
| KW_AS colid
| stmt
| common_func_opt_item
| colid
;
//https://www.postgresql.org/docs/9.1/sql-createfunction.html
// | KW_AS 'definition'
// | KW_AS 'obj_file', 'link_symbol'
transform_type_list
: KW_FOR KW_TYPE typename (COMMA KW_FOR KW_TYPE typename)*
;
opt_definition
: KW_WITH definition
;
table_func_column
: column_name func_type
;
table_func_column_list
: table_func_column (COMMA table_func_column)*
;
alterfunctionstmt
: KW_ALTER alterFunctionTypeClause alterfunc_opt_list opt_restrict?
;
alterFunctionTypeClause
: KW_FUNCTION function_with_argtypes
| KW_PROCEDURE procedure_with_argtypes
| KW_ROUTINE routine_with_argtypes
;
alterfunc_opt_list
: common_func_opt_item+
;
opt_restrict
: KW_RESTRICT
;
removefuncstmt
: KW_DROP KW_FUNCTION opt_if_exists? function_with_argtypes_list opt_drop_behavior?
| KW_DROP KW_PROCEDURE opt_if_exists? procedure_with_argtypes_list opt_drop_behavior?
| KW_DROP KW_ROUTINE opt_if_exists? routine_with_argtypes_list opt_drop_behavior?
;
removeaggrstmt
: KW_DROP KW_AGGREGATE opt_if_exists? aggregate_with_argtypes_list opt_drop_behavior?
;
removeoperstmt
: KW_DROP KW_OPERATOR opt_if_exists? operator_with_argtypes_list opt_drop_behavior?
;
oper_argtypes
: OPEN_PAREN typename CLOSE_PAREN
| OPEN_PAREN typename COMMA typename CLOSE_PAREN
| OPEN_PAREN KW_NONE COMMA typename CLOSE_PAREN
| OPEN_PAREN typename COMMA KW_NONE CLOSE_PAREN
;
any_operator
: (colid DOT)* all_op
;
operator_with_argtypes_list
: operator_with_argtypes (COMMA operator_with_argtypes)*
;
operator_with_argtypes
: any_operator oper_argtypes
;
dostmt
: KW_DO dostmt_opt_list
;
dostmt_opt_list
: dostmt_opt_item+
;
dostmt_opt_item
: sconst
| KW_LANGUAGE nonreservedword_or_sconst
;
createcaststmt
: KW_CREATE KW_CAST OPEN_PAREN typename KW_AS typename CLOSE_PAREN KW_WITH KW_FUNCTION function_with_argtypes cast_context?
| KW_CREATE KW_CAST OPEN_PAREN typename KW_AS typename CLOSE_PAREN KW_WITHOUT KW_FUNCTION cast_context?
| KW_CREATE KW_CAST OPEN_PAREN typename KW_AS typename CLOSE_PAREN KW_WITH KW_INOUT cast_context?
;
cast_context
: KW_AS KW_IMPLICIT
| KW_AS KW_ASSIGNMENT
;
opt_if_exists
: KW_IF KW_EXISTS
;
createtransformstmt
: KW_CREATE opt_or_replace? KW_TRANSFORM KW_FOR typename KW_LANGUAGE name OPEN_PAREN transform_element_list CLOSE_PAREN
;
transform_element_list
: KW_FROM KW_SQL KW_WITH KW_FUNCTION function_with_argtypes COMMA KW_TO KW_SQL KW_WITH KW_FUNCTION function_with_argtypes
| KW_TO KW_SQL KW_WITH KW_FUNCTION function_with_argtypes COMMA KW_FROM KW_SQL KW_WITH KW_FUNCTION function_with_argtypes
| KW_FROM KW_SQL KW_WITH KW_FUNCTION function_with_argtypes
| KW_TO KW_SQL KW_WITH KW_FUNCTION function_with_argtypes
;
reindexstmt
: KW_REINDEX reindex_target_type
| KW_REINDEX reindex_target_multitable
| KW_REINDEX OPEN_PAREN reindex_option_list CLOSE_PAREN reindex_target_type
| KW_REINDEX OPEN_PAREN reindex_option_list CLOSE_PAREN reindex_target_multitable
;
reindex_target_type
: (KW_INDEX opt_concurrently? qualified_name)
| (KW_TABLE opt_concurrently? table_name)
;
reindex_target_multitable
: (KW_SCHEMA opt_concurrently? schema_name)
| (KW_SYSTEM opt_concurrently? name)
| (KW_DATABASE opt_concurrently? database_name)
;
reindex_option_list
: reindex_option_elem (COMMA reindex_option_elem)*
;
reindex_option_elem
: KW_VERBOSE
;
altertblspcstmt
: KW_ALTER KW_TABLESPACE tablespace_name KW_SET reloptions
| KW_ALTER KW_TABLESPACE tablespace_name KW_RESET reloptions
;
renamestmt
: KW_ALTER KW_AGGREGATE aggregate_with_argtypes KW_RENAME KW_TO name
| KW_ALTER KW_COLLATION any_name KW_RENAME KW_TO name
| KW_ALTER KW_CONVERSION any_name KW_RENAME KW_TO name
| KW_ALTER KW_DATABASE database_name KW_RENAME KW_TO database_name_create
| KW_ALTER KW_DOMAIN any_name KW_RENAME KW_TO name
| KW_ALTER KW_DOMAIN any_name KW_RENAME KW_CONSTRAINT name KW_TO name
| KW_ALTER KW_FOREIGN KW_DATA KW_WRAPPER name KW_RENAME KW_TO name
| KW_ALTER KW_FUNCTION function_with_argtypes KW_RENAME KW_TO function_name_create
| KW_ALTER KW_GROUP roleid KW_RENAME KW_TO roleid
| KW_ALTER opt_procedural? KW_LANGUAGE name KW_RENAME KW_TO name
| KW_ALTER KW_OPERATOR KW_CLASS any_name KW_USING name KW_RENAME KW_TO name
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_RENAME KW_TO name
| KW_ALTER KW_POLICY opt_if_exists? name KW_ON qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_RENAME KW_TO procedure_name_create
| KW_ALTER KW_PUBLICATION name KW_RENAME KW_TO name
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_RENAME KW_TO name
| KW_ALTER KW_SCHEMA schema_name KW_RENAME KW_TO schema_name_create
| KW_ALTER KW_SERVER name KW_RENAME KW_TO name
| KW_ALTER KW_SUBSCRIPTION name KW_RENAME KW_TO name
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_TO table_name_create
| KW_ALTER KW_SEQUENCE opt_if_exists? qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_VIEW opt_if_exists? view_name KW_RENAME KW_TO view_name_create
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME KW_TO view_name_create
| KW_ALTER KW_INDEX opt_if_exists? qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_TO table_name_create
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_COLUMN? column_name KW_TO column_name_create
| KW_ALTER KW_VIEW opt_if_exists? view_name KW_RENAME KW_COLUMN? column_name KW_TO column_name_create
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME KW_COLUMN? column_name KW_TO column_name_create
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_CONSTRAINT name KW_TO name
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_COLUMN? column_name KW_TO column_name_create
| KW_ALTER KW_RULE name KW_ON qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_TRIGGER name KW_ON qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_EVENT KW_TRIGGER name KW_RENAME KW_TO name
| KW_ALTER KW_ROLE roleid KW_RENAME KW_TO roleid
| KW_ALTER KW_USER roleid KW_RENAME KW_TO roleid
| KW_ALTER KW_TABLESPACE tablespace_name KW_RENAME KW_TO tablespace_name_create
| KW_ALTER KW_STATISTICS any_name KW_RENAME KW_TO name
| KW_ALTER KW_TEXT KW_SEARCH KW_PARSER any_name KW_RENAME KW_TO name
| KW_ALTER KW_TEXT KW_SEARCH KW_DICTIONARY any_name KW_RENAME KW_TO name
| KW_ALTER KW_TEXT KW_SEARCH KW_TEMPLATE any_name KW_RENAME KW_TO name
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_RENAME KW_TO name
| KW_ALTER KW_TYPE any_name KW_RENAME KW_TO name
| KW_ALTER KW_TYPE any_name KW_RENAME KW_ATTRIBUTE name KW_TO name opt_drop_behavior?
;
opt_set_data
: KW_SET KW_DATA
;
alterobjectdependsstmt
: KW_ALTER KW_FUNCTION function_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
| KW_ALTER KW_PROCEDURE procedure_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
| KW_ALTER KW_ROUTINE routine_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
| KW_ALTER KW_TRIGGER name KW_ON qualified_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
| KW_ALTER KW_MATERIALIZED KW_VIEW view_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
| KW_ALTER KW_INDEX qualified_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
;
opt_no
: KW_NO
;
alterobjectschemastmt
: KW_ALTER KW_AGGREGATE aggregate_with_argtypes KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_COLLATION any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_CONVERSION any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_DOMAIN any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_EXTENSION name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_FUNCTION function_with_argtypes KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_OPERATOR operator_with_argtypes KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_OPERATOR KW_CLASS any_name KW_USING name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_STATISTICS any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TEXT KW_SEARCH KW_PARSER any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TEXT KW_SEARCH KW_DICTIONARY any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TEXT KW_SEARCH KW_TEMPLATE any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_SEQUENCE opt_if_exists? qualified_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_VIEW opt_if_exists? view_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_SET KW_SCHEMA schema_name
| KW_ALTER KW_TYPE any_name KW_SET KW_SCHEMA schema_name
;
alteroperatorstmt
: KW_ALTER KW_OPERATOR operator_with_argtypes KW_SET OPEN_PAREN operator_def_list CLOSE_PAREN
;
operator_def_list
: operator_def_elem (COMMA operator_def_elem)*
;
operator_def_elem
: collabel EQUAL KW_NONE
| collabel EQUAL operator_def_arg
;
operator_def_arg
: func_type
| reserved_keyword
| qual_all_op
| numericonly
| sconst
;
altertypestmt
: KW_ALTER KW_TYPE any_name KW_SET OPEN_PAREN operator_def_list CLOSE_PAREN
;
alterownerstmt
: KW_ALTER KW_AGGREGATE aggregate_with_argtypes KW_OWNER KW_TO rolespec
| KW_ALTER KW_COLLATION any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_CONVERSION any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_DATABASE database_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_DOMAIN any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_FUNCTION function_with_argtypes KW_OWNER KW_TO rolespec
| KW_ALTER opt_procedural? KW_LANGUAGE name KW_OWNER KW_TO rolespec
| KW_ALTER KW_LARGE KW_OBJECT numericonly KW_OWNER KW_TO rolespec
| KW_ALTER KW_OPERATOR operator_with_argtypes KW_OWNER KW_TO rolespec
| KW_ALTER KW_OPERATOR KW_CLASS any_name KW_USING name KW_OWNER KW_TO rolespec
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_OWNER KW_TO rolespec
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_OWNER KW_TO rolespec
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_OWNER KW_TO rolespec
| KW_ALTER KW_SCHEMA schema_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_TYPE any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_TABLESPACE tablespace_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_STATISTICS any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_TEXT KW_SEARCH KW_DICTIONARY any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_OWNER KW_TO rolespec
| KW_ALTER KW_FOREIGN KW_DATA KW_WRAPPER name KW_OWNER KW_TO rolespec
| KW_ALTER KW_SERVER name KW_OWNER KW_TO rolespec
| KW_ALTER KW_EVENT KW_TRIGGER name KW_OWNER KW_TO rolespec
| KW_ALTER KW_PUBLICATION name KW_OWNER KW_TO rolespec
| KW_ALTER KW_SUBSCRIPTION name KW_OWNER KW_TO rolespec
;
createpublicationstmt
: KW_CREATE KW_PUBLICATION name opt_publication_for_tables? opt_definition?
;
opt_publication_for_tables
: publication_for_tables
;
publication_for_tables
: KW_FOR KW_TABLE relation_expr_list
| KW_FOR KW_ALL KW_TABLES
;
alterpublicationstmt
: KW_ALTER KW_PUBLICATION name KW_SET definition
| KW_ALTER KW_PUBLICATION name KW_ADD publication_relation_expr_list
| KW_ALTER KW_PUBLICATION name KW_SET publication_relation_expr_list
| KW_ALTER KW_PUBLICATION name KW_DROP publication_relation_expr_list
| KW_ALTER KW_PUBLICATION name KW_OWNER KW_TO rolespec
| KW_ALTER KW_PUBLICATION name KW_RENAME KW_TO name
;
createsubscriptionstmt
: KW_CREATE KW_SUBSCRIPTION name KW_CONNECTION sconst KW_PUBLICATION publication_name_list opt_definition?
;
publication_name_list
: publication_name_item (COMMA publication_name_item)*
;
publication_name_item
: collabel
;
altersubscriptionstmt
: KW_ALTER KW_SUBSCRIPTION name KW_SET definition
| KW_ALTER KW_SUBSCRIPTION name KW_CONNECTION sconst
| KW_ALTER KW_SUBSCRIPTION name KW_REFRESH KW_PUBLICATION opt_definition?
| KW_ALTER KW_SUBSCRIPTION name KW_SET KW_PUBLICATION publication_name_list opt_definition?
| KW_ALTER KW_SUBSCRIPTION name KW_ADD KW_PUBLICATION publication_name_list opt_definition?
| KW_ALTER KW_SUBSCRIPTION name KW_DROP KW_PUBLICATION publication_name_list opt_definition?
| KW_ALTER KW_SUBSCRIPTION name KW_ENABLE
| KW_ALTER KW_SUBSCRIPTION name KW_DISABLE
| KW_ALTER KW_SUBSCRIPTION name KW_SET definition
| KW_ALTER KW_SUBSCRIPTION name KW_SKIP OPEN_PAREN old_aggr_elem CLOSE_PAREN
| KW_ALTER KW_SUBSCRIPTION name KW_OWNER KW_TO rolespec
;
rulestmt
: KW_CREATE opt_or_replace? KW_RULE name KW_AS KW_ON event KW_TO qualified_name where_clause? KW_DO opt_instead? ruleactionlist
;
ruleactionlist
: KW_NOTHING
| ruleactionstmt
| OPEN_PAREN ruleactionmulti CLOSE_PAREN
;
ruleactionmulti
: ruleactionstmtOrEmpty? (SEMI ruleactionstmtOrEmpty?)*
;
ruleactionstmt
: selectstmt
| insertstmt
| updatestmt
| deletestmt
| notifystmt
;
ruleactionstmtOrEmpty
: ruleactionstmt
;
event
: KW_SELECT
| KW_UPDATE
| KW_DELETE
| KW_INSERT
;
opt_instead
: KW_INSTEAD
| KW_ALSO
;
notifystmt
: KW_NOTIFY colid notify_payload?
;
notify_payload
: COMMA sconst
;
listenstmt
: KW_LISTEN colid
;
unlistenstmt
: KW_UNLISTEN colid
| KW_UNLISTEN STAR
;
transactionstmt
: KW_ABORT opt_transaction? opt_transaction_chain?
| KW_BEGIN opt_transaction? transaction_mode_list_or_empty?
| KW_START KW_TRANSACTION transaction_mode_list_or_empty?
| KW_END opt_transaction? opt_transaction_chain?
| KW_SAVEPOINT colid
| KW_RELEASE KW_SAVEPOINT? colid
| KW_PREPARE KW_TRANSACTION sconst
| KW_COMMIT KW_PREPARED sconst
| KW_COMMIT opt_transaction? opt_transaction_chain?
| KW_ROLLBACK KW_PREPARED sconst
| KW_ROLLBACK opt_transaction? KW_TO KW_SAVEPOINT? colid
| KW_ROLLBACK opt_transaction? opt_transaction_chain?
;
opt_transaction
: KW_WORK
| KW_TRANSACTION
;
transaction_mode_item
: KW_ISOLATION KW_LEVEL iso_level
| KW_READ KW_ONLY
| KW_READ KW_WRITE
| KW_DEFERRABLE
| KW_NOT KW_DEFERRABLE
;
transaction_mode_list
: transaction_mode_item (COMMA? transaction_mode_item)*
;
transaction_mode_list_or_empty
: transaction_mode_list
;
opt_transaction_chain
: KW_AND KW_NO? KW_CHAIN
;
viewstmt
: KW_CREATE (KW_OR KW_REPLACE)? opttemp? (
KW_VIEW view_name_create opt_column_list_create? opt_reloptions?
| KW_RECURSIVE KW_VIEW view_name_create OPEN_PAREN column_list CLOSE_PAREN opt_reloptions?
) KW_AS selectstmt opt_check_option? # createView
;
opt_check_option
: KW_WITH (KW_CASCADED | KW_LOCAL)? KW_CHECK KW_OPTION
;
loadstmt
: KW_LOAD file_name
;
createdbstmt
: KW_CREATE KW_DATABASE database_name_create opt_with? createdb_opt_list? # createDatabase
;
createdb_opt_list
: createdb_opt_items
;
createdb_opt_items
: createdb_opt_item+
;
createdb_opt_item
: createdb_opt_name opt_equal? (signediconst | opt_boolean_or_string | KW_DEFAULT)
;
createdb_opt_name
: KW_CONNECTION KW_LIMIT
| KW_ENCODING
| KW_LOCATION
| KW_OWNER
| KW_TABLESPACE
| KW_TEMPLATE
| identifier
;
opt_equal
: EQUAL
;
alterdatabasestmt
: KW_ALTER KW_DATABASE database_name (
(KW_SET KW_TABLESPACE tablespace_name_create)?
| (KW_WITH? createdb_opt_list)?
)
;
alterdatabasesetstmt
: KW_ALTER KW_DATABASE database_name setresetclause?
;
drop_option_list
: drop_option (COMMA drop_option)*
;
drop_option
: KW_FORCE
;
altercollationstmt
: KW_ALTER KW_COLLATION any_name KW_REFRESH KW_VERSION
;
altersystemstmt
: KW_ALTER KW_SYSTEM (KW_SET | KW_RESET) generic_set
;
createdomainstmt
: KW_CREATE KW_DOMAIN any_name opt_as? typename colquallist
;
alterdomainstmt
: KW_ALTER KW_DOMAIN any_name (
alter_column_default
| KW_DROP KW_NOT KW_NULL
| KW_SET KW_NOT KW_NULL
| KW_ADD tableconstraint
| KW_DROP KW_CONSTRAINT opt_if_exists? name opt_drop_behavior?
| KW_VALIDATE KW_CONSTRAINT name
)
;
opt_as
: KW_AS
;
altertsdictionarystmt
: KW_ALTER KW_TEXT KW_SEARCH KW_DICTIONARY any_name definition
;
altertsconfigurationstmt
: KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_ADD KW_MAPPING KW_FOR name_list any_with any_name_list
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_ALTER KW_MAPPING KW_FOR name_list any_with any_name_list
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_ALTER KW_MAPPING KW_REPLACE any_name any_with any_name
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_ALTER KW_MAPPING KW_FOR name_list KW_REPLACE any_name any_with any_name
| KW_ALTER KW_TEXT KW_SEARCH KW_CONFIGURATION any_name KW_DROP KW_MAPPING opt_if_exists? KW_FOR name_list
;
any_with
: KW_WITH
; // | WITH_LA
createconversionstmt
: KW_CREATE opt_default? KW_CONVERSION any_name KW_FOR sconst KW_TO sconst KW_FROM any_name
;
clusterstmt
: KW_CLUSTER opt_verbose? table_name cluster_index_specification?
| KW_CLUSTER opt_verbose?
| KW_CLUSTER opt_verbose_list table_name cluster_index_specification?
;
opt_verbose_list
: OPEN_PAREN opt_verbose (COMMA opt_verbose)* CLOSE_PAREN
;
cluster_index_specification
: KW_USING name
;
vacuumstmt
: KW_VACUUM opt_full? opt_freeze? opt_verbose? opt_analyze? opt_vacuum_relation_list?
| KW_VACUUM (OPEN_PAREN vac_analyze_option_list CLOSE_PAREN)? opt_vacuum_relation_list?
;
analyzestmt
: analyze_keyword opt_verbose? opt_vacuum_relation_list?
| analyze_keyword OPEN_PAREN analyze_options_list CLOSE_PAREN opt_vacuum_relation_list?
;
vac_analyze_option_list
: vac_analyze_option_elem (COMMA vac_analyze_option_elem)*
;
analyze_keyword
: KW_ANALYZE
| KW_ANALYSE
;
vac_analyze_option_elem
: vac_analyze_option_name vac_analyze_option_arg?
;
vac_analyze_option_name
: nonreservedword
| analyze_keyword
;
vac_analyze_option_arg
: opt_boolean_or_string
| numericonly
;
opt_analyze
: analyze_keyword
;
analyze_options_list
: analyze_option_elem (COMMA analyze_option_elem)*
;
analyze_option_elem
: opt_verbose
| opt_skiplock
| opt_buffer_usage_limit
; // support on v12+
opt_verbose
: KW_VERBOSE (KW_FALSE | KW_TRUE)?
;
opt_skiplock
: KW_SKIP_LOCKED (KW_FALSE | KW_TRUE)?
;
opt_buffer_usage_limit
: KW_BUFFER_USAGE_LIMIT (numericonly | sconst)
;
opt_full
: KW_FULL
;
opt_freeze
: KW_FREEZE
;
opt_name_list
: OPEN_PAREN column_list CLOSE_PAREN
;
vacuum_relation
: table_name opt_name_list?
;
vacuum_relation_list
: vacuum_relation (COMMA vacuum_relation)*
;
opt_vacuum_relation_list
: vacuum_relation_list
;
explainstmt
: KW_EXPLAIN explainablestmt
| KW_EXPLAIN analyze_keyword opt_verbose? explainablestmt
| KW_EXPLAIN KW_VERBOSE explainablestmt
| KW_EXPLAIN OPEN_PAREN explain_option_list CLOSE_PAREN explainablestmt
;
explainablestmt
: selectstmt
| insertstmt
| updatestmt
| deletestmt
| declarecursorstmt
| createasstmt
| creatematviewstmt
| refreshmatviewstmt
| executestmt
;
explain_option_list
: explain_option_elem (COMMA explain_option_elem)*
;
explain_option_elem
: explain_option_name explain_option_arg?
;
explain_option_name
: nonreservedword
| analyze_keyword
;
explain_option_arg
: opt_boolean_or_string
| numericonly
;
preparestmt
: KW_PREPARE name prep_type_clause? KW_AS preparablestmt
;
prep_type_clause
: OPEN_PAREN type_list CLOSE_PAREN
;
preparablestmt
: selectstmt
| insertstmt
| updatestmt
| deletestmt
;
executestmt
: KW_EXECUTE name execute_param_clause?
| create_table_clause opt_if_not_exists? create_as_target KW_AS KW_EXECUTE name execute_param_clause? opt_with_data?
;
execute_param_clause
: OPEN_PAREN expr_list CLOSE_PAREN
;
deallocatestmt
: KW_DEALLOCATE KW_PREPARE? (name | KW_ALL)
;
insertstmt
: opt_with_clause? KW_INSERT KW_INTO insert_target insert_rest opt_on_conflict? returning_clause? # insertStatement
;
insert_target
: table_name (KW_AS colid)?
;
insert_rest
: (OPEN_PAREN insert_column_list CLOSE_PAREN)? (KW_OVERRIDING override_kind KW_VALUE)? (
default_values_or_values
| selectstmt
)
;
override_kind
: KW_USER
| KW_SYSTEM
;
insert_column_list
: insert_column_item (COMMA insert_column_item)*
;
insert_column_item
: column_name opt_indirection
;
opt_on_conflict
: KW_ON KW_CONFLICT opt_conf_expr? KW_DO (
KW_UPDATE KW_SET set_clause_list where_clause?
| KW_NOTHING
)
;
opt_conf_expr
: OPEN_PAREN index_params CLOSE_PAREN where_clause?
| KW_ON KW_CONSTRAINT name
;
returning_clause
: KW_RETURNING target_list
;
deletestmt
: opt_with_clause? KW_DELETE KW_FROM relation_expr_opt_alias using_clause? where_or_current_clause? returning_clause?
;
using_clause
: KW_USING from_list
;
lockstmt
: KW_LOCK opt_table? relation_expr_list opt_lock? opt_nowait?
;
opt_lock
: KW_IN lock_type KW_MODE
;
lock_type
: KW_ACCESS (KW_SHARE | KW_EXCLUSIVE)
| KW_ROW (KW_SHARE | KW_EXCLUSIVE)
| KW_SHARE (KW_UPDATE KW_EXCLUSIVE | KW_ROW KW_EXCLUSIVE)?
| KW_EXCLUSIVE
;
opt_nowait
: KW_NOWAIT
;
opt_nowait_or_skip
: KW_NOWAIT
| KW_SKIP KW_LOCKED
;
updatestmt
: opt_with_clause? KW_UPDATE relation_expr_opt_alias KW_SET set_clause_list from_clause? where_or_current_clause? returning_clause?
;
set_clause_list
: set_clause (COMMA set_clause)*
;
set_clause
: set_target EQUAL a_expr
| OPEN_PAREN set_target_list CLOSE_PAREN EQUAL (
KW_ROW? a_expr
| OPEN_PAREN select_clause CLOSE_PAREN
)
;
set_target
: column_name opt_indirection
;
set_target_list
: set_target (COMMA set_target)*
;
declarecursorstmt
: KW_DECLARE cursor_name cursor_options KW_CURSOR opt_hold KW_FOR selectstmt
;
cursor_name
: name
;
cursor_options
: (KW_NO KW_SCROLL | KW_SCROLL | KW_BINARY | KW_INSENSITIVE)*
;
opt_hold
:
| KW_WITH KW_HOLD
| KW_WITHOUT KW_HOLD
;
/*
TODO: why select_with_parens alternative is needed at all? i guess it because original byson
grammar can choose selectstmt(2)->select_with_parens on only OPEN_PARENT/SELECT kewords at the
begining of statement; (select * from tab); parse can go through selectstmt(
)->select_no_parens(1)->select_clause(2)->select_with_parens(1)->select_no_parens(1)->select_clause(1)->simple_select
instead of
selectstmt(1)->select_no_parens(1)->select_clause(2)->select_with_parens(1)->select_no_parens(1)->select_clause(1)->simple_select
all standard tests passed on both variants
*/
selectstmt
: select_no_parens # selectStatement
| select_with_parens # selectStatement
;
select_with_parens
: OPEN_PAREN select_no_parens CLOSE_PAREN
| OPEN_PAREN select_with_parens CLOSE_PAREN
;
select_no_parens
: select_clause opt_sort_clause? (
for_locking_clause opt_select_limit?
| select_limit opt_for_locking_clause?
)?
| with_clause select_clause opt_sort_clause? (
for_locking_clause opt_select_limit?
| select_limit opt_for_locking_clause?
)?
;
select_clause
: simple_select
| select_with_parens
;
simple_select
: (
KW_SELECT (opt_all_clause? into_clause? opt_target_list? | distinct_clause? target_list?) into_clause? from_clause? where_clause? group_clause
? having_clause? window_clause?
| values_clause
| KW_TABLE relation_expr
| select_with_parens set_operator_with_all_or_distinct (simple_select | select_with_parens)
) (set_operator_with_all_or_distinct ( simple_select | select_with_parens))*
;
set_operator
: KW_UNION # union
| KW_INTERSECT # intersect
| KW_EXCEPT # except
;
set_operator_with_all_or_distinct
: set_operator all_or_distinct?
;
with_clause
: KW_WITH KW_RECURSIVE? cte_list
;
cte_list
: common_table_expr (COMMA common_table_expr)*
;
common_table_expr
: name opt_name_list? KW_AS opt_materialized? OPEN_PAREN preparablestmt CLOSE_PAREN search_cluase? cycle_cluase?
;
search_cluase
: KW_SEARCH (KW_BREADTH | KW_DEPTH) KW_FIRST KW_BY column_list KW_SET column_name
;
cycle_cluase
: KW_CYCLE column_list KW_SET column_name (KW_TO name KW_DEFAULT name)? KW_USING column_name
;
opt_materialized
: KW_MATERIALIZED
| KW_NOT KW_MATERIALIZED
;
opt_with_clause
: with_clause
;
into_clause
: KW_INTO (opt_strict opttempTableName | into_target)
;
opt_strict
:
| KW_STRICT
;
opttempTableName
: (KW_LOCAL | KW_GLOBAL)? (KW_TEMPORARY | KW_TEMP) opt_table? table_name_create
| KW_UNLOGGED opt_table? table_name_create
| KW_TABLE table_name_create
| table_name_create
;
opt_table
: KW_TABLE
;
all_or_distinct
: KW_ALL
| KW_DISTINCT
;
distinct_clause
: KW_DISTINCT (KW_ON OPEN_PAREN expr_list CLOSE_PAREN)?
;
opt_all_clause
: KW_ALL
;
opt_sort_clause
: sort_clause
;
sort_clause
: KW_ORDER KW_BY sortby_list
;
sortby_list
: sortby (COMMA sortby)*
;
sortby
: column_expr_noparen (KW_USING qual_all_op | opt_asc_desc)? opt_nulls_order?
;
select_limit
: // https://www.postgresql.org/docs/16/sql-select.html#SQL-LIMIT
limit_clause offset_clause?
| offset_clause fetch_clause?
| fetch_clause offset_clause?
;
opt_select_limit
: select_limit
;
limit_clause
: KW_LIMIT select_limit_value (COMMA select_offset_value)?
;
fetch_clause
: KW_FETCH first_or_next (
select_fetch_first_value row_or_rows (KW_ONLY | KW_WITH KW_TIES)
| row_or_rows (KW_ONLY | KW_WITH KW_TIES)
)
;
offset_clause
: KW_OFFSET (select_fetch_first_value row_or_rows | select_offset_value)
;
select_limit_value
: a_expr
| KW_ALL
;
select_offset_value
: a_expr
;
select_fetch_first_value
: PLUS i_or_f_const
| MINUS i_or_f_const
| c_expr
;
i_or_f_const
: iconst
| fconst
;
row_or_rows
: KW_ROW
| KW_ROWS
;
first_or_next
: KW_FIRST
| KW_NEXT
;
group_clause
: KW_GROUP KW_BY (all_or_distinct)? group_by_list
;
group_by_list
: group_by_item (COMMA group_by_item)*
;
group_by_item
: column_expr_noparen
| empty_grouping_set
| cube_clause
| rollup_clause
| grouping_sets_clause
| OPEN_PAREN column_expr_list_noparen CLOSE_PAREN
;
empty_grouping_set
: OPEN_PAREN CLOSE_PAREN
;
rollup_clause
: KW_ROLLUP OPEN_PAREN column_expr_list_noparen CLOSE_PAREN
;
cube_clause
: KW_CUBE OPEN_PAREN column_expr_list_noparen CLOSE_PAREN
;
grouping_sets_clause
: KW_GROUPING KW_SETS OPEN_PAREN group_by_list CLOSE_PAREN
;
having_clause
: KW_HAVING a_expr
;
for_locking_clause
: for_locking_items
| KW_FOR KW_READ KW_ONLY
;
opt_for_locking_clause
: for_locking_clause
;
for_locking_items
: for_locking_item+
;
for_locking_item
: for_locking_strength locked_rels_list? opt_nowait_or_skip?
;
for_locking_strength
: KW_FOR ((KW_NO KW_KEY)? KW_UPDATE | KW_KEY? KW_SHARE)
;
locked_rels_list
: KW_OF qualified_name_list
;
values_clause
: KW_VALUES OPEN_PAREN expr_list CLOSE_PAREN (COMMA OPEN_PAREN expr_list CLOSE_PAREN)*
;
from_clause
: KW_FROM from_list
;
from_list
: table_ref (COMMA table_ref)*
;
table_ref
: (
(relation_expr | view_relation_expr) opt_alias_clause? tablesample_clause?
| func_table func_alias_clause?
| xmltable opt_alias_clause?
| select_with_parens opt_alias_clause?
| KW_LATERAL (
xmltable opt_alias_clause?
| func_table func_alias_clause?
| select_with_parens opt_alias_clause?
)
| OPEN_PAREN table_ref (
KW_CROSS KW_JOIN table_ref
| KW_NATURAL join_type? KW_JOIN table_ref
| join_type? KW_JOIN table_ref join_qual
)? CLOSE_PAREN opt_alias_clause?
) (
KW_CROSS KW_JOIN table_ref
| KW_NATURAL join_type? KW_JOIN table_ref
| join_type? KW_JOIN table_ref join_qual
)*
;
alias_clause
: KW_AS? colid (OPEN_PAREN name_list CLOSE_PAREN)?
;
opt_alias_clause
: alias_clause
;
func_alias_clause
: alias_clause
| (KW_AS colid? | colid) OPEN_PAREN tablefuncelementlist CLOSE_PAREN
;
join_type
: (KW_FULL | KW_LEFT | KW_RIGHT | KW_INNER) KW_OUTER?
;
join_qual
: KW_USING OPEN_PAREN column_list CLOSE_PAREN
| KW_ON a_expr
;
relation_expr
: KW_ONLY? table_name STAR?
| KW_ONLY ( table_name | OPEN_PAREN table_name CLOSE_PAREN)
| KW_IN KW_SCHEMA (schema_name | KW_CURRENT_SCHEMA)
;
view_relation_expr
: KW_ONLY? view_name STAR? column_list? where_clause?
;
publication_relation_expr
: KW_TABLE KW_ONLY? table_name STAR? (OPEN_PAREN column_list CLOSE_PAREN)? where_clause?
| KW_TABLE KW_ONLY ( table_name | OPEN_PAREN table_name CLOSE_PAREN)
| KW_TABLES KW_IN KW_SCHEMA (schema_name | KW_CURRENT_SCHEMA)
;
relation_expr_list
: relation_expr (COMMA relation_expr)*
;
publication_relation_expr_list
: publication_relation_expr (COMMA publication_relation_expr)*
;
relation_expr_opt_alias
: relation_expr (KW_AS? colid)?
;
tablesample_clause
: KW_TABLESAMPLE function_name OPEN_PAREN expr_list CLOSE_PAREN opt_repeatable_clause?
;
opt_repeatable_clause
: KW_REPEATABLE OPEN_PAREN a_expr CLOSE_PAREN
;
func_table
: func_expr_windowless opt_ordinality?
| KW_ROWS KW_FROM OPEN_PAREN rowsfrom_list CLOSE_PAREN opt_ordinality?
;
rowsfrom_item
: func_expr_windowless opt_col_def_list?
;
rowsfrom_list
: rowsfrom_item (COMMA rowsfrom_item)*
;
opt_col_def_list
: KW_AS OPEN_PAREN tablefuncelementlist CLOSE_PAREN
;
opt_ordinality
: KW_WITH KW_ORDINALITY
;
where_clause
: KW_WHERE column_expr_noparen
;
where_or_current_clause
: KW_WHERE (KW_CURRENT KW_OF cursor_name | a_expr)
;
opttablefuncelementlist
: tablefuncelementlist
;
tablefuncelementlist
: tablefuncelement (COMMA tablefuncelement)*
;
tablefuncelement
: colid typename opt_collate_clause?
;
xmltable
: KW_XMLTABLE OPEN_PAREN (
c_expr xmlexists_argument KW_COLUMNS xmltable_column_list
| KW_XMLNAMESPACES OPEN_PAREN xml_namespace_list CLOSE_PAREN COMMA c_expr xmlexists_argument KW_COLUMNS xmltable_column_list
) CLOSE_PAREN
;
xmltable_column_list
: xmltable_column_el (COMMA xmltable_column_el)*
;
xmltable_column_el
: colid (typename xmltable_column_option_list? | KW_FOR KW_ORDINALITY)
;
xmltable_column_option_list
: xmltable_column_option_el+
;
xmltable_column_option_el
: KW_DEFAULT a_expr
| identifier a_expr
| KW_NOT KW_NULL
| KW_NULL
;
xml_namespace_list
: xml_namespace_el (COMMA xml_namespace_el)*
;
xml_namespace_el
: b_expr KW_AS collabel
| KW_DEFAULT b_expr
;
typename
: KW_SETOF? simpletypename (opt_array_bounds | KW_ARRAY (OPEN_BRACKET iconst CLOSE_BRACKET)?)
| qualified_name PERCENT (KW_ROWTYPE | KW_TYPE)
;
opt_array_bounds
: (OPEN_BRACKET iconst? CLOSE_BRACKET)*
;
simpletypename
: generictype
| numeric
| bit
| character
| constdatetime
| constinterval ( opt_interval? | OPEN_PAREN iconst CLOSE_PAREN)
;
consttypename
: numeric
| constbit
| constcharacter
| constdatetime
;
generictype
: type_function_name attrs? opt_type_modifiers?
;
opt_type_modifiers
: OPEN_PAREN expr_list CLOSE_PAREN
;
numeric
: KW_INT
| KW_INTEGER
| KW_SMALLINT
| KW_BIGINT
| KW_REAL
| KW_FLOAT opt_float?
| KW_DOUBLE KW_PRECISION
| KW_DECIMAL opt_type_modifiers?
| KW_DEC opt_type_modifiers?
| KW_NUMERIC opt_type_modifiers?
| KW_BOOLEAN
;
opt_float
: OPEN_PAREN iconst CLOSE_PAREN
;
bit
: bitwithlength
| bitwithoutlength
;
constbit
: bitwithlength
| bitwithoutlength
;
bitwithlength
: KW_BIT opt_varying? OPEN_PAREN expr_list CLOSE_PAREN
;
bitwithoutlength
: KW_BIT opt_varying?
;
character
: character_c (OPEN_PAREN iconst CLOSE_PAREN)?
;
constcharacter
: character_c (OPEN_PAREN iconst CLOSE_PAREN)?
;
character_c
: (KW_CHARACTER | KW_CHAR | KW_NCHAR) opt_varying?
| KW_VARCHAR
| KW_NATIONAL (KW_CHARACTER | KW_CHAR) opt_varying?
;
opt_varying
: KW_VARYING
;
constdatetime
: (KW_TIMESTAMP | KW_TIME) (OPEN_PAREN iconst CLOSE_PAREN)? opt_timezone?
;
constinterval
: KW_INTERVAL
;
//TODO with_la was used
opt_timezone
: KW_WITH KW_TIME KW_ZONE
| KW_WITHOUT KW_TIME KW_ZONE
;
opt_interval
: KW_YEAR
| KW_MONTH
| KW_DAY
| KW_HOUR
| KW_MINUTE
| interval_second
| KW_YEAR KW_TO KW_MONTH
| KW_DAY KW_TO (KW_HOUR | KW_MINUTE | interval_second)
| KW_HOUR KW_TO (KW_MINUTE | interval_second)
| KW_MINUTE KW_TO interval_second
;
interval_second
: KW_SECOND (OPEN_PAREN iconst CLOSE_PAREN)?
;
opt_escape
: KW_ESCAPE a_expr
;
//precendence accroding to Table 4.2. Operator Precedence (highest to lowest)
//https://www.postgresql.org/docs/12/sql-syntax-lexical.html#SQL-PRECEDENCE
/*
original version of a_expr, for info a_expr: c_expr //:: left PostgreSQL-style typecast | a_expr
TYPECAST typename -- 1 | a_expr KW_COLLATE any_name -- 2 | a_expr AT TIME ZONE a_expr-- 3 //right
unary plus, unary minus | (PLUS| MINUS) a_expr -- 4 //left exponentiation | a_expr CARET a_expr --
5 //left multiplication, division, modulo | a_expr (STAR | SLASH | PERCENT) a_expr -- 6 //left
addition, subtraction | a_expr (PLUS | MINUS) a_expr -- 7 //left all other native and user-defined
operators | a_expr qual_op a_expr -- 8 | qual_op a_expr -- 9 //range containment, set membership,
string matching BETWEEN IN LIKE ILIKE SIMILAR | a_expr NOT? (LIKE|ILIKE|SIMILAR TO|(BETWEEN
SYMMETRIC?)) a_expr opt_escape? -- 10 //< > = <= >= <> comparison operators | a_expr (LT | GT |
EQUAL | LESS_EQUALS | GREATER_EQUALS | NOT_EQUALS) a_expr -- 11 //IS ISNULL NOTNULL IS TRUE, IS
FALSE, IS NULL, IS KW_DISTINCT FROM, etc | a_expr IS NOT? ( NULL_P |TRUE_P |FALSE_P |UNKNOWN |KW_DISTINCT
KW_FROM a_expr |OF OPEN_PAREN type_list CLOSE_PAREN |DOCUMENT_P |unicode_normal_form? NORMALIZED ) --
12 | a_expr (ISNULL|NOTNULL) -- 13 | row OVERLAPS row -- 14 //NOT right logical negation | NOT
a_expr -- 15 //AND left logical conjunction | a_expr AND a_expr -- 16 //OR left logical disjunction
| a_expr OR a_expr -- 17 | a_expr (LESS_LESS|GREATER_GREATER) a_expr -- 18 | a_expr qual_op -- 19 |
a_expr NOT? IN_P in_expr -- 20 | a_expr subquery_Op sub_type (select_with_parens|OPEN_PAREN a_expr
CLOSE_PAREN) -- 21 | UNIQUE select_with_parens -- 22 | KW_DEFAULT -- 23 ;
*/
a_expr
: a_expr_qual
;
/*23*/
/*moved to c_expr*/
/*22*/
/*moved to c_expr*/
/*19*/
a_expr_qual
: a_expr_lessless qual_op?
;
/*18*/
a_expr_lessless
: a_expr_or ((LESS_LESS | GREATER_GREATER) a_expr_or)*
;
/*17*/
a_expr_or
: a_expr_and (KW_OR a_expr_and)*
;
/*16*/
a_expr_and
: a_expr_in (KW_AND a_expr_in)*
;
/*20*/
a_expr_in
: a_expr_unary_not (KW_NOT? KW_IN in_expr)?
;
/*15*/
a_expr_unary_not
: KW_NOT? a_expr_isnull
;
/*14*/
/*moved to c_expr*/
/*13*/
a_expr_isnull
: a_expr_is_not (KW_ISNULL | KW_NOTNULL)?
;
/*12*/
a_expr_is_not
: a_expr_compare (
KW_IS KW_NOT? (
KW_NULL
| KW_TRUE
| KW_FALSE
| KW_UNKNOWN
| KW_DISTINCT KW_FROM a_expr
| KW_OF OPEN_PAREN type_list CLOSE_PAREN
| KW_DOCUMENT
| unicode_normal_form? KW_NORMALIZED
)
)?
;
/*11*/
a_expr_compare
: a_expr_like (
(LT | GT | EQUAL | LESS_EQUALS | GREATER_EQUALS | NOT_EQUALS) a_expr_like
| subquery_Op sub_type (select_with_parens | OPEN_PAREN a_expr CLOSE_PAREN) /*21*/
)?
;
/*10*/
a_expr_like
: a_expr_qual_op (
KW_NOT? (KW_LIKE | KW_ILIKE | KW_SIMILAR KW_TO | KW_BETWEEN KW_SYMMETRIC?) a_expr_qual_op opt_escape?
)?
;
/* 8*/
a_expr_qual_op
: a_expr_unary_qualop (qual_op a_expr_unary_qualop)*
;
/* 9*/
a_expr_unary_qualop
: qual_op? a_expr_add
;
/* 7*/
a_expr_add
: a_expr_mul ((MINUS | PLUS) a_expr_mul)*
;
/* 6*/
a_expr_mul
: a_expr_caret ((STAR | SLASH | PERCENT) a_expr_caret)*
;
/* 5*/
a_expr_caret
: a_expr_unary_sign (CARET a_expr)?
;
/* 4*/
a_expr_unary_sign
: (MINUS | PLUS)? a_expr_at_time_zone /* */
;
/* 3*/
a_expr_at_time_zone
: a_expr_collate (KW_AT KW_TIME KW_ZONE a_expr)?
;
/* 2*/
a_expr_collate
: a_expr_typecast (KW_COLLATE any_name)?
;
/* 1*/
a_expr_typecast
: c_expr (TYPECAST typename)*
;
b_expr
: c_expr
| b_expr TYPECAST typename
//right unary plus, unary minus
| (PLUS | MINUS) b_expr
//^ left exponentiation
| b_expr CARET b_expr
//* / % left multiplication, division, modulo
| b_expr (STAR | SLASH | PERCENT) b_expr
//+ - left addition, subtraction
| b_expr (PLUS | MINUS) b_expr
//(any other operator) left all other native and user-defined operators
| b_expr qual_op b_expr
//< > = <= >= <> comparison operators
| b_expr ( LT | GT | EQUAL | LESS_EQUALS | GREATER_EQUALS | NOT_EQUALS) b_expr
| qual_op b_expr
| b_expr qual_op
//S ISNULL NOTNULL IS TRUE, IS FALSE, IS NULL, IS KW_DISTINCT FROM, etc
| b_expr KW_IS KW_NOT? (
KW_DISTINCT KW_FROM b_expr
| KW_OF OPEN_PAREN type_list CLOSE_PAREN
| KW_DOCUMENT
)
;
c_expr
: KW_EXISTS select_with_parens # c_expr_exists
| KW_ARRAY (select_with_parens | array_expr) # c_expr_expr
| PARAM opt_indirection # c_expr_expr
| KW_GROUPING OPEN_PAREN expr_list CLOSE_PAREN # c_expr_expr
| /*22*/ KW_UNIQUE select_with_parens # c_expr_expr
| aexprconst # c_expr_expr
| plsqlvariablename # c_expr_expr
| OPEN_PAREN a_expr_in_parens= a_expr CLOSE_PAREN opt_indirection # c_expr_expr
| case_expr # c_expr_case
| func_expr # c_expr_expr
| select_with_parens indirection? # c_expr_expr
| explicit_row # c_expr_expr
| implicit_row # c_expr_expr
| row KW_OVERLAPS row /* 14*/ # c_expr_expr
| columnref # c_expr_expr
;
plsqlvariablename
: PLSQLVARIABLENAME
;
func_application
: function_name (
OPEN_PAREN (
func_arg_list (COMMA KW_VARIADIC func_arg_expr)? opt_sort_clause?
| KW_VARIADIC func_arg_expr opt_sort_clause?
| (KW_ALL | KW_DISTINCT) func_arg_list opt_sort_clause?
| STAR
|
) CLOSE_PAREN
)?
;
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
: KW_COLLATION KW_FOR OPEN_PAREN a_expr CLOSE_PAREN
| KW_CURRENT_DATE
| KW_CURRENT_TIME (OPEN_PAREN iconst CLOSE_PAREN)?
| KW_CURRENT_TIMESTAMP (OPEN_PAREN iconst CLOSE_PAREN)?
| KW_LOCALTIME (OPEN_PAREN iconst CLOSE_PAREN)?
| KW_LOCALTIMESTAMP (OPEN_PAREN iconst CLOSE_PAREN)?
| KW_CURRENT_ROLE
| KW_CURRENT_USER
| KW_SESSION_USER
| KW_USER
| KW_CURRENT_CATALOG
| KW_CURRENT_SCHEMA
| KW_CAST OPEN_PAREN a_expr KW_AS typename CLOSE_PAREN
| KW_EXTRACT OPEN_PAREN extract_list? CLOSE_PAREN
| KW_NORMALIZE OPEN_PAREN a_expr (COMMA unicode_normal_form)? CLOSE_PAREN
| KW_OVERLAY OPEN_PAREN overlay_list CLOSE_PAREN
| KW_POSITION OPEN_PAREN position_list? CLOSE_PAREN
| KW_SUBSTRING OPEN_PAREN substr_list? CLOSE_PAREN
| KW_TREAT OPEN_PAREN a_expr KW_AS typename CLOSE_PAREN
| KW_TRIM OPEN_PAREN (KW_BOTH | KW_LEADING | KW_TRAILING)? trim_list CLOSE_PAREN
| KW_NULLIF OPEN_PAREN a_expr COMMA a_expr CLOSE_PAREN
| KW_COALESCE OPEN_PAREN expr_list CLOSE_PAREN
| KW_GREATEST OPEN_PAREN expr_list CLOSE_PAREN
| KW_LEAST OPEN_PAREN expr_list CLOSE_PAREN
| KW_XMLCONCAT OPEN_PAREN expr_list CLOSE_PAREN
| KW_XMLELEMENT OPEN_PAREN KW_NAME collabel (COMMA (xml_attributes | expr_list))? CLOSE_PAREN
| KW_XMLEXISTS OPEN_PAREN c_expr xmlexists_argument CLOSE_PAREN
| KW_XMLFOREST OPEN_PAREN xml_attribute_list CLOSE_PAREN
| KW_XMLPARSE OPEN_PAREN document_or_content a_expr xml_whitespace_option? CLOSE_PAREN
| KW_XMLPI OPEN_PAREN KW_NAME collabel (COMMA a_expr)? CLOSE_PAREN
| KW_XMLROOT OPEN_PAREN KW_XML a_expr COMMA xml_root_version opt_xml_root_standalone? CLOSE_PAREN
| KW_XMLSERIALIZE OPEN_PAREN document_or_content a_expr KW_AS simpletypename CLOSE_PAREN
;
xml_root_version
: KW_VERSION a_expr
| KW_VERSION KW_NO KW_VALUE
;
opt_xml_root_standalone
: COMMA KW_STANDALONE KW_YES
| COMMA KW_STANDALONE KW_NO
| COMMA KW_STANDALONE KW_NO KW_VALUE
;
xml_attributes
: KW_XMLATTRIBUTES OPEN_PAREN xml_attribute_list CLOSE_PAREN
;
xml_attribute_list
: xml_attribute_el (COMMA xml_attribute_el)*
;
xml_attribute_el
: a_expr (KW_AS collabel)?
;
document_or_content
: KW_DOCUMENT
| KW_CONTENT
;
xml_whitespace_option
: KW_PRESERVE KW_WHITESPACE
| KW_STRIP KW_WHITESPACE
;
xmlexists_argument
: KW_PASSING c_expr
| KW_PASSING c_expr xml_passing_mech
| KW_PASSING xml_passing_mech c_expr
| KW_PASSING xml_passing_mech c_expr xml_passing_mech
;
xml_passing_mech
: KW_BY (KW_REF | KW_VALUE)
;
within_group_clause
: KW_WITHIN KW_GROUP OPEN_PAREN sort_clause CLOSE_PAREN
;
filter_clause
: KW_FILTER OPEN_PAREN KW_WHERE a_expr CLOSE_PAREN
;
window_clause
: KW_WINDOW window_definition_list
;
window_definition_list
: window_definition (COMMA window_definition)*
;
window_definition
: colid KW_AS window_specification
;
over_clause
: KW_OVER (window_specification | colid)
;
window_specification
: OPEN_PAREN opt_existing_window_name? opt_partition_clause? opt_sort_clause? opt_frame_clause? CLOSE_PAREN
;
opt_existing_window_name
: colid
;
opt_partition_clause
: KW_PARTITION KW_BY expr_list
;
opt_frame_clause
: KW_RANGE frame_extent opt_window_exclusion_clause?
| KW_ROWS frame_extent opt_window_exclusion_clause?
| KW_GROUPS frame_extent opt_window_exclusion_clause?
;
frame_extent
: frame_bound
| KW_BETWEEN frame_bound KW_AND frame_bound
;
frame_bound
: KW_UNBOUNDED (KW_PRECEDING | KW_FOLLOWING)
| KW_CURRENT KW_ROW
| a_expr (KW_PRECEDING | KW_FOLLOWING)
;
opt_window_exclusion_clause
: KW_EXCLUDE (KW_CURRENT KW_ROW | KW_GROUP | KW_TIES | KW_NO KW_OTHERS)
;
row
: KW_ROW OPEN_PAREN expr_list? CLOSE_PAREN
| OPEN_PAREN expr_list COMMA a_expr CLOSE_PAREN
;
explicit_row
: KW_ROW OPEN_PAREN expr_list? CLOSE_PAREN
;
implicit_row
: OPEN_PAREN a_expr COMMA expr_list CLOSE_PAREN
;
sub_type
: KW_ANY
| KW_SOME
| KW_ALL
;
all_op
: Operator
| mathop
;
mathop
: PLUS
| MINUS
| STAR
| SLASH
| PERCENT
| CARET
| LT
| GT
| EQUAL
| LESS_EQUALS
| GREATER_EQUALS
| NOT_EQUALS
;
qual_op
: Operator
| KW_OPERATOR OPEN_PAREN any_operator CLOSE_PAREN
;
qual_all_op
: all_op
| KW_OPERATOR OPEN_PAREN any_operator CLOSE_PAREN
;
subquery_Op
: all_op
| KW_OPERATOR OPEN_PAREN any_operator CLOSE_PAREN
| KW_LIKE
| KW_NOT KW_LIKE
| KW_ILIKE
| KW_NOT KW_ILIKE
;
expr_list
: a_expr (COMMA a_expr)*
;
column_expr_list_noparen
: column_expr_noparen (COMMA column_expr_noparen)*
;
column_expr_list
: column_expr (COMMA column_expr)*
;
column_expr
: (OPEN_PAREN a_expr CLOSE_PAREN)
| column_name
;
column_expr_noparen
: a_expr
| column_name
;
func_arg_list
: func_arg_expr (COMMA func_arg_expr)*
;
func_arg_expr
: a_expr
| param_name (COLON_EQUALS | EQUALS_GREATER) a_expr
;
type_list
: typename (COMMA typename)*
;
array_expr
: OPEN_BRACKET (expr_list | array_expr_list)? CLOSE_BRACKET
;
array_expr_list
: array_expr (COMMA array_expr)*
;
extract_list
: extract_arg KW_FROM a_expr
;
extract_arg
: identifier
| KW_YEAR
| KW_MONTH
| KW_DAY
| KW_HOUR
| KW_MINUTE
| KW_SECOND
| sconst
;
unicode_normal_form
: KW_NFC
| KW_NFD
| KW_NFKC
| KW_NFKD
;
overlay_list
: a_expr KW_PLACING a_expr KW_FROM a_expr (KW_FOR a_expr)?
;
position_list
: b_expr KW_IN b_expr
;
substr_list
: a_expr KW_FROM a_expr KW_FOR a_expr
| a_expr KW_FOR a_expr KW_FROM a_expr
| a_expr KW_FROM a_expr
| a_expr KW_FOR a_expr
| a_expr KW_SIMILAR a_expr KW_ESCAPE a_expr
| expr_list
;
trim_list
: a_expr KW_FROM expr_list
| KW_FROM expr_list
| expr_list
;
in_expr
: select_with_parens # in_expr_select
| OPEN_PAREN expr_list CLOSE_PAREN # in_expr_list
;
case_expr
: KW_CASE case_arg? when_clause_list case_default? KW_END
;
when_clause_list
: when_clause+
;
when_clause
: KW_WHEN a_expr KW_THEN a_expr
;
case_default
: KW_ELSE a_expr
;
case_arg
: a_expr
;
columnref
: colid indirection?
;
indirection_el
: DOT (attr_name | STAR)
| OPEN_BRACKET (a_expr | opt_slice_bound? COLON opt_slice_bound?) CLOSE_BRACKET
;
opt_slice_bound
: a_expr
;
indirection
: indirection_el+
;
opt_indirection
: indirection_el*
;
opt_target_list
: target_list
;
target_list
: target_el (COMMA target_el)*
;
target_el
: column_expr_noparen (KW_AS collabel | identifier |) # target_label
| STAR # target_star
;
qualified_name_list
: qualified_name (COMMA qualified_name)*
;
table_name_list
: table_name (COMMA table_name)*
;
schema_name_list
: schema_name (COMMA schema_name)*
;
database_nameList
: database_name (COMMA database_name)*
;
procedure_name_list
: procedure_name (COMMA procedure_name)*
;
tablespace_name_create
: colid indirection? # tablespaceNameCreate
;
tablespace_name
: colid indirection? # tablespaceName
;
table_name_create
: colid indirection? # tableNameCreate
;
table_name
: colid indirection? # tableName
;
view_name_create
: colid indirection? # viewNameCreate
;
view_name
: colid attrs? # viewName
;
qualified_name
: colid indirection?
;
tablespace_name_list
: tablespace_name (COMMA tablespace_name)*
;
name_list
: name (COMMA name)*
;
database_name_create
: colid attrs? # databaseNameCreate
;
database_name
: colid attrs? # databaseName
;
schema_name
: colid attrs? # schemaName
;
routine_name_create
: colid # routineNameCreate
;
routine_name
: colid # routineName
;
procedure_name
: type_function_name # procedureName
| colid indirection # procedureName
;
procedure_name_create
: type_function_name # procedureNameCreate
| colid indirection # procedureNameCreate
;
column_name
: colid indirection_el* # columnName
| {this.shouldMatchEmpty()}? # columnNameMatch
;
column_name_create
: colid # columnNameCreate
;
name
: colid
;
attr_name
: collabel
;
file_name
: sconst
;
function_name_create
: type_function_name # functionNameCreate
| colid indirection # functionNameCreate
;
function_name
: type_function_name # functionName
| colid indirection # functionName
;
usual_name
: type_usual_name
| colid indirection
;
aexprconst
: iconst
| fconst
| sconst
| bconst
| xconst
| function_name (sconst | OPEN_PAREN func_arg_list opt_sort_clause? CLOSE_PAREN sconst)
| consttypename sconst
| constinterval ( sconst opt_interval? | OPEN_PAREN iconst CLOSE_PAREN sconst)
| KW_TRUE
| KW_FALSE
| KW_NULL
;
xconst
: HexadecimalStringConstant
;
bconst
: BinaryStringConstant
;
fconst
: Numeric
;
iconst
: Integral
;
sconst
: anysconst opt_uescape?
;
anysconst
: StringConstant
| UnicodeEscapeStringConstant
| BeginDollarStringConstant DollarText* EndDollarStringConstant
| EscapeStringConstant
;
opt_uescape
: KW_UESCAPE anysconst
;
signediconst
: iconst
| PLUS iconst
| MINUS iconst
;
groupname
: rolespec
;
roleid
: rolespec
;
rolespec
: nonreservedword
| KW_CURRENT_USER
| KW_CURRENT_ROLE
| KW_SESSION_USER
| KW_PUBLIC
;
role_list
: rolespec (COMMA rolespec)*
;
colid
: identifier
| unreserved_keyword
| col_name_keyword
| plsql_unreserved_keyword
;
index_method_choices
: identifier
;
exclude_element
: opt_definition
| (OPEN_PAREN a_expr CLOSE_PAREN) identifier opt_asc_desc? opt_nulls_order?
;
index_paramenters
: (KW_WITH reloptions)? optconstablespace?
;
type_function_name
: identifier
| unreserved_keyword
| plsql_unreserved_keyword
| type_func_name_keyword
;
type_usual_name
: identifier
| unreserved_keyword
| plsql_unreserved_keyword
| type_func_name_keyword
;
nonreservedword_column
: column_name
| type_func_name_keyword
;
nonreservedword
: identifier
| unreserved_keyword
| col_name_keyword
| type_func_name_keyword
;
collabel
: identifier
| plsql_unreserved_keyword
| unreserved_keyword
| col_name_keyword
| type_func_name_keyword
| reserved_keyword
;
identifier
: Identifier opt_uescape?
| sconst
| QuotedIdentifier
| UnicodeQuotedIdentifier
| plsqlvariablename
| plsqlidentifier
| plsql_unreserved_keyword
;
plsqlidentifier
: PLSQLIDENTIFIER
;
unreserved_keyword
: KW_ABORT
| KW_ABSOLUTE
| KW_ACCESS
| KW_ACTION
| KW_ADD
| KW_ADMIN
| KW_AFTER
| KW_AGGREGATE
| KW_ALSO
| KW_ALTER
| KW_ALWAYS
| KW_ASSERTION
| KW_ASSIGNMENT
| KW_AT
| KW_ATTACH
| KW_ATTRIBUTE
| KW_BACKWARD
| KW_BEFORE
| KW_BEGIN
| KW_BUFFER_USAGE_LIMIT
| KW_BY
| KW_CACHE
| KW_CALL
| KW_CALLED
| KW_CASCADE
| KW_CASCADED
| KW_CATALOG
| KW_CHAIN
| KW_CHARACTERISTICS
| KW_CHECKPOINT
| KW_CLASS
| KW_CLOSE
| KW_CLUSTER
| KW_COLUMNS
| KW_COMMENT
| KW_COMMENTS
| KW_COMMIT
| KW_COMMITTED
| KW_CONFIGURATION
| KW_CONFLICT
| KW_CONNECTION
| KW_CONSTRAINTS
| KW_CONTENT
| KW_CONTINUE
| KW_CONVERSION
| KW_COPY
| KW_COST
| KW_CSV
| KW_CUBE
| KW_CURRENT
| KW_CURSOR
| KW_CYCLE
| KW_DATA
| KW_DATABASE
| KW_DAY
| KW_DEALLOCATE
| KW_DECLARE
| KW_DEFAULTS
| KW_DEFERRED
| KW_DEFINER
| KW_DELETE
| KW_DELIMITER
| KW_DELIMITERS
| KW_DEPENDS
| KW_DETACH
| KW_DICTIONARY
| KW_DISABLE
| KW_DISCARD
| KW_DOCUMENT
| KW_DOMAIN
| KW_DOUBLE
| KW_DROP
| KW_EACH
| KW_ENABLE
| KW_ENCODING
| KW_ENCRYPTED
| KW_ENUM
| KW_ESCAPE
| KW_EVENT
| KW_EXCLUDE
| KW_EXCLUDING
| KW_EXCLUSIVE
| KW_EXECUTE
| KW_EXPLAIN
| KW_EXPRESSION
| KW_EXTENSION
| KW_EXTERNAL
| KW_FAMILY
| KW_FILTER
| KW_FIRST
| KW_FOLLOWING
| KW_FORCE
| KW_FORWARD
| KW_FUNCTION
| KW_FUNCTIONS
| KW_GENERATED
| KW_GLOBAL
| KW_GRANTED
| KW_GROUPS
| KW_HANDLER
| KW_HEADER
| KW_HOLD
| KW_HOUR
| KW_IDENTITY
| KW_IF
| KW_IMMEDIATE
| KW_IMMUTABLE
| KW_IMPLICIT
| KW_IMPORT
| KW_INCLUDE
| KW_INCLUDING
| KW_INCREMENT
| KW_INDEX
| KW_INDEXES
| KW_INHERIT
| KW_INHERITS
| KW_INLINE
| KW_INPUT
| KW_INSENSITIVE
| KW_INSERT
| KW_INSTEAD
| KW_INVOKER
| KW_ISOLATION
| KW_KEY
| KW_LABEL
| KW_LANGUAGE
| KW_LARGE
| KW_LAST
| KW_LEAKPROOF
| KW_LEVEL
| KW_LISTEN
| KW_LOAD
| KW_LOCAL
| KW_LOCATION
| KW_LOCK
| KW_LOCKED
| KW_LOGGED
| KW_MAPPING
| KW_MATCH
| KW_MATERIALIZED
| KW_MAXVALUE
| KW_METHOD
| KW_MINUTE
| KW_MINVALUE
| KW_MODE
| KW_MONTH
| KW_MOVE
| KW_NAME
| KW_NAMES
| KW_NEW
| KW_NEXT
| KW_NFC
| KW_NFD
| KW_NFKC
| KW_NFKD
| KW_NO
| KW_NORMALIZED
| KW_NOTHING
| KW_NOTIFY
| KW_NOWAIT
| KW_NULLS
| KW_OBJECT
| KW_OF
| KW_OFF
| KW_OIDS
| KW_OLD
| KW_OPERATOR
| KW_OPTION
| KW_OPTIONS
| KW_ORDINALITY
| KW_OTHERS
| KW_OVER
| KW_OVERRIDING
| KW_OWNED
| KW_OWNER
| KW_PARALLEL
| KW_PARSER
| KW_PARTIAL
| KW_PARTITION
| KW_PASSING
| KW_PASSWORD
| KW_PLANS
| KW_POLICY
| KW_PRECEDING
| KW_PREPARE
| KW_PREPARED
| KW_PRESERVE
| KW_PRIOR
| KW_PRIVILEGES
| KW_PROCEDURAL
| KW_PROCEDURE
| KW_PROCEDURES
| KW_PROGRAM
| KW_PUBLICATION
| KW_QUOTE
| KW_RANGE
| KW_READ
| KW_REASSIGN
| KW_RECHECK
| KW_RECURSIVE
| KW_REF
| KW_REFERENCING
| KW_REFRESH
| KW_REINDEX
| KW_RELATIVE
| KW_RELEASE
| KW_RENAME
| KW_REPEATABLE
| KW_REPLACE
| KW_REPLICA
| KW_RESET
| KW_RESTART
| KW_RESTRICT
| KW_RETURNS
| KW_REVOKE
| KW_ROLE
| KW_ROLLBACK
| KW_ROLLUP
| KW_ROUTINE
| KW_ROUTINES
| KW_ROWS
| KW_RULE
| KW_SAVEPOINT
| KW_SCHEMA
| KW_SCHEMAS
| KW_SCROLL
| KW_SEARCH
| KW_SECOND
| KW_SECURITY
| KW_SEQUENCE
| KW_SEQUENCES
| KW_SERIALIZABLE
| KW_SERVER
| KW_SESSION
| KW_SET
| KW_SETS
| KW_SHARE
| KW_SHOW
| KW_SIMPLE
| KW_SKIP
| KW_SKIP_LOCKED
| KW_SNAPSHOT
| KW_SQL
| KW_STABLE
| KW_STANDALONE
| KW_START
| KW_STATEMENT
| KW_STATISTICS
| KW_STDIN
| KW_STDOUT
| KW_STORAGE
| KW_STORED
| KW_STRICT
| KW_STRIP
| KW_SUBSCRIPTION
| KW_SUPPORT
| KW_SYSID
| KW_SYSTEM
| KW_TABLES
| KW_TABLESPACE
| KW_TEMP
| KW_TEMPLATE
| KW_TEMPORARY
| KW_TEXT
| KW_TIES
| KW_TRANSACTION
| KW_TRANSFORM
| KW_TRIGGER
| KW_TRUNCATE
| KW_TRUSTED
| KW_TYPE
| KW_TYPES
| KW_UESCAPE
| KW_UNBOUNDED
| KW_UNCOMMITTED
| KW_UNENCRYPTED
| KW_UNKNOWN
| KW_UNLISTEN
| KW_UNLOGGED
| KW_UNTIL
| KW_UPDATE
| KW_VACUUM
| KW_VALID
| KW_VALIDATE
| KW_VALIDATOR
| KW_VALUE
| KW_VARYING
| KW_VERSION
| KW_VIEW
| KW_VIEWS
| KW_VOLATILE
| KW_WHITESPACE
| KW_WITHIN
| KW_WITHOUT
| KW_WORK
| KW_WRAPPER
| KW_WRITE
| KW_XML
| KW_YEAR
| KW_YES
| KW_ZONE
;
col_name_keyword
: KW_BETWEEN
| KW_BIGINT
| bit
| KW_BOOLEAN
| KW_CHAR
| character
| KW_COALESCE
| KW_DEC
| KW_DECIMAL
| KW_EXISTS
| KW_EXTRACT
| KW_FLOAT
| KW_GREATEST
| KW_GROUPING
| KW_INOUT
| KW_INT
| KW_INTEGER
| KW_INTERVAL
| KW_LEAST
| KW_NATIONAL
| KW_NCHAR
| KW_NONE
| KW_NORMALIZE
| KW_NULLIF
| numeric
| KW_OUT
| KW_OVERLAY
| KW_POSITION
| KW_PRECISION
| KW_REAL
| KW_ROW
| KW_SETOF
| KW_SMALLINT
| KW_SUBSTRING
| KW_TIME
| KW_TIMESTAMP
| KW_TREAT
| KW_TRIM
| KW_VALUES
| KW_VARCHAR
| KW_XMLATTRIBUTES
| KW_XMLCONCAT
| KW_XMLELEMENT
| KW_XMLEXISTS
| KW_XMLFOREST
| KW_XMLNAMESPACES
| KW_XMLPARSE
| KW_XMLPI
| KW_XMLROOT
| KW_XMLSERIALIZE
| KW_XMLTABLE
;
type_func_name_keyword
: KW_AUTHORIZATION
| KW_BINARY
| KW_COLLATION
| KW_CONCURRENTLY
| KW_CROSS
| KW_CURRENT_SCHEMA
| KW_FREEZE
| KW_FULL
| KW_ILIKE
| KW_INNER
| KW_IS
| KW_ISNULL
| KW_JOIN
| KW_LEFT
| KW_LIKE
| KW_NATURAL
| KW_NOTNULL
| KW_OUTER
| KW_OVERLAPS
| KW_RIGHT
| KW_SIMILAR
| KW_TABLESAMPLE
| KW_VERBOSE
;
reserved_keyword
: KW_ALL
| KW_ANALYSE
| KW_ANALYZE
| KW_AND
| KW_ANY
| KW_ARRAY
| KW_AS
| KW_ASC
| KW_ASYMMETRIC
| KW_BOTH
| KW_CASE
| KW_CAST
| KW_CHECK
| KW_COLLATE
| KW_COLUMN
| KW_CONSTRAINT
| KW_CREATE
| KW_CURRENT_CATALOG
| KW_CURRENT_DATE
| KW_CURRENT_ROLE
| KW_CURRENT_TIME
| KW_CURRENT_TIMESTAMP
| KW_CURRENT_USER
// | KW_DEFAULT
| KW_DEFERRABLE
| KW_DESC
| KW_DISTINCT
| KW_DO
| KW_ELSE
| KW_END
| KW_EXCEPT
| KW_FALSE
| KW_FETCH
| KW_FOR
| KW_FOREIGN
| KW_FROM
| KW_GRANT
| KW_GROUP
| KW_HAVING
| KW_IN
| KW_INITIALLY
| KW_INTERSECT
/*
from pl_gram.y, line ~2982 Fortunately, INTO is a fully reserved word in the main grammar, so
at least we need not worry about it appearing as an identifier.
*/
// | INTO
| KW_LATERAL
| KW_LEADING
| KW_LIMIT
| KW_LOCALTIME
| KW_LOCALTIMESTAMP
| KW_NOT
| KW_NULL
| KW_OFFSET
| KW_ON
| KW_ONLY
| KW_OR
| KW_ORDER
| KW_PLACING
| KW_PRIMARY
| KW_REFERENCES
| KW_RETURNING
| KW_SELECT
| KW_SESSION_USER
| KW_SOME
| KW_SYMMETRIC
| KW_TABLE
| KW_THEN
| KW_TO
| KW_TRAILING
| KW_TRUE
| KW_UNION
| KW_UNIQUE
| KW_USER
| KW_USING
| KW_VARIADIC
| KW_WHEN
| KW_WHERE
| KW_WINDOW
| KW_WITH
;
/************************************************************************************************************************************************************/
/*PL/SQL GRAMMAR */
/*PLSQL grammar */
/************************************************************************************************************************************************************/
pl_function
: comp_options pl_block opt_semi
;
comp_options
: comp_option*
;
comp_option
: sharp KW_OPTION KW_DUMP
| sharp KW_PRINT_STRICT_PARAMS option_value
| sharp KW_VARIABLE_CONFLICT KW_ERROR
| sharp KW_VARIABLE_CONFLICT KW_USE_VARIABLE
| sharp KW_VARIABLE_CONFLICT KW_USE_COLUMN
;
sharp
: Operator
;
option_value
: sconst
| reserved_keyword
| plsql_unreserved_keyword
| unreserved_keyword
;
opt_semi
:
| SEMI
;
// exception_sect means opt_exception_sect in original grammar, don't be confused!
pl_block
: decl_sect KW_BEGIN proc_sect exception_sect KW_END opt_label
;
decl_sect
: opt_block_label (decl_start decl_stmts?)?
;
decl_start
: KW_DECLARE
;
decl_stmts
: decl_stmt+
;
label_decl
: LESS_LESS any_identifier GREATER_GREATER
;
decl_stmt
: decl_statement
| KW_DECLARE
| label_decl
;
decl_statement
: decl_varname (
KW_ALIAS KW_FOR decl_aliasitem
| decl_const decl_datatype decl_collate decl_notnull decl_defval
| opt_scrollable KW_CURSOR decl_cursor_args decl_is_for decl_cursor_query
) SEMI
;
opt_scrollable
:
| KW_NO KW_SCROLL
| KW_SCROLL
;
decl_cursor_query
: selectstmt
;
decl_cursor_args
:
| OPEN_PAREN decl_cursor_arglist CLOSE_PAREN
;
decl_cursor_arglist
: decl_cursor_arg (COMMA decl_cursor_arg)*
;
decl_cursor_arg
: decl_varname decl_datatype
;
decl_is_for
: KW_IS
| KW_FOR
;
decl_aliasitem
: PARAM
| colid
;
decl_varname
: any_identifier
;
decl_const
:
| KW_CONSTANT
;
decl_datatype
: typename
; //TODO: $$ = read_datatype(yychar);
decl_collate
:
| KW_COLLATE any_name
;
decl_notnull
:
| KW_NOT KW_NULL
;
decl_defval
:
| decl_defkey sql_expression
;
decl_defkey
: assign_operator
| KW_DEFAULT
;
assign_operator
: EQUAL
| COLON_EQUALS
;
proc_sect
: proc_stmt*
;
proc_stmt
: pl_block SEMI
| stmt_return
| stmt_raise
| stmt_assign
| stmt_if
| stmt_case
| stmt_loop
| stmt_while
| stmt_for
| stmt_foreach_a
| stmt_exit
| stmt_assert
| stmt_execsql
| stmt_dynexecute
| stmt_perform
| stmt_call
| stmt_getdiag
| stmt_open
| stmt_fetch
| stmt_move
| stmt_close
| stmt_null
| stmt_commit
| stmt_rollback
| stmt_set
;
stmt_perform
: KW_PERFORM expr_until_semi SEMI
;
stmt_call
: KW_CALL any_identifier (OPEN_PAREN opt_expr_list CLOSE_PAREN SEMI)?
| KW_DO any_identifier OPEN_PAREN opt_expr_list CLOSE_PAREN SEMI
;
opt_expr_list
:
| expr_list
;
stmt_assign
: assign_var assign_operator sql_expression SEMI
;
stmt_getdiag
: KW_GET getdiag_area_opt KW_DIAGNOSTICS getdiag_list SEMI
;
getdiag_area_opt
:
| KW_CURRENT
| KW_STACKED
;
getdiag_list
: getdiag_list_item (COMMA getdiag_list_item)*
;
getdiag_list_item
: getdiag_target assign_operator getdiag_item
;
getdiag_item
: colid
;
getdiag_target
: assign_var
;
assign_var
: (any_name | PARAM) (OPEN_BRACKET expr_until_rightbracket CLOSE_BRACKET)*
;
stmt_if
: KW_IF expr_until_then KW_THEN proc_sect stmt_elsifs stmt_else KW_END KW_IF SEMI
;
stmt_elsifs
: (KW_ELSIF a_expr KW_THEN proc_sect)*
;
stmt_else
:
| KW_ELSE proc_sect
;
stmt_case
: KW_CASE opt_expr_until_when case_when_list opt_case_else KW_END KW_CASE SEMI
;
opt_expr_until_when
:
| sql_expression
;
case_when_list
: case_when+
;
case_when
: KW_WHEN expr_list KW_THEN proc_sect
;
opt_case_else
:
| KW_ELSE proc_sect
;
stmt_loop
: opt_loop_label loop_body
;
stmt_while
: opt_loop_label KW_WHILE expr_until_loop loop_body
;
stmt_for
: opt_loop_label KW_FOR for_control loop_body
;
//TODO: rewrite using read_sql_expression logic?
for_control
: for_variable KW_IN (
cursor_name opt_cursor_parameters
| selectstmt
| explainstmt
| KW_EXECUTE a_expr opt_for_using_expression
| opt_reverse a_expr DOT_DOT a_expr opt_by_expression
)
;
opt_for_using_expression
:
| KW_USING expr_list
;
opt_cursor_parameters
:
| OPEN_PAREN a_expr (COMMA a_expr)* CLOSE_PAREN
;
opt_reverse
:
| KW_REVERSE
;
opt_by_expression
:
| KW_BY a_expr
;
for_variable
: any_name_list
;
stmt_foreach_a
: opt_loop_label KW_FOREACH for_variable foreach_slice KW_IN KW_ARRAY a_expr loop_body
;
foreach_slice
:
| KW_SLICE iconst
;
stmt_exit
: exit_type opt_label opt_exitcond? SEMI
;
exit_type
: KW_EXIT
| KW_CONTINUE
;
//todo implement RETURN statement according to initial grammar line 1754
stmt_return
: KW_RETURN (
KW_NEXT sql_expression
| KW_QUERY ( KW_EXECUTE a_expr opt_for_using_expression | selectstmt)
| opt_return_result
) SEMI
;
opt_return_result
:
| sql_expression
;
//https://www.postgresql.org/docs/current/plpgsql-errors-and-messages.html
//RAISE [ level ] 'format' [, expression [, ... ]] [ USING option = expression [, ... ] ];
//RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
//RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];
//RAISE [ level ] USING option = expression [, ... ];
//RAISE ;
stmt_raise
: KW_RAISE opt_stmt_raise_level? sconst opt_raise_list opt_raise_using SEMI
| KW_RAISE opt_stmt_raise_level? identifier opt_raise_using SEMI
| KW_RAISE opt_stmt_raise_level? KW_SQLSTATE sconst opt_raise_using SEMI
| KW_RAISE opt_stmt_raise_level? opt_raise_using SEMI
| KW_RAISE
;
opt_stmt_raise_level
: KW_DEBUG
| KW_LOG
| KW_INFO
| KW_NOTICE
| KW_WARNING
| KW_EXCEPTION
;
opt_raise_list
:
| (COMMA a_expr)+
;
opt_raise_using
:
| KW_USING opt_raise_using_elem_list
;
opt_raise_using_elem
: identifier EQUAL a_expr
;
opt_raise_using_elem_list
: opt_raise_using_elem (COMMA opt_raise_using_elem)*
;
//todo imnplement
stmt_assert
: KW_ASSERT sql_expression opt_stmt_assert_message SEMI
;
opt_stmt_assert_message
:
| COMMA sql_expression
;
loop_body
: KW_LOOP proc_sect KW_END KW_LOOP opt_label SEMI
;
//TODO: looks like all other statements like INSERT/SELECT/UPDATE/DELETE are handled here;
//pls take a look at original grammar
stmt_execsql
: make_execsql_stmt SEMI
/*K_IMPORT
| K_INSERT | t_word | t_cword
*/
;
//https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-NORESULT
//EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];
stmt_dynexecute
: KW_EXECUTE a_expr (
/*this is silly, but i have to time to find nice way to code */ opt_execute_into opt_execute_using
| opt_execute_using opt_execute_into
|
) SEMI
;
opt_execute_using
:
| KW_USING opt_execute_using_list
;
opt_execute_using_list
: a_expr (COMMA a_expr)*
;
opt_execute_into
:
| KW_INTO KW_STRICT? into_target
;
//https://www.postgresql.org/docs/current/plpgsql-cursors.html#PLPGSQL-CURSOR-OPENING
//OPEN unbound_cursorvar [ [ NO ] SCROLL ] KW_FOR query;
//OPEN unbound_cursorvar [ [ NO ] SCROLL ] KW_FOR EXECUTE query_string
// [ USING expression [, ... ] ];
//OPEN bound_cursorvar [ ( [ argument_name := ] argument_value [, ...] ) ];
stmt_open
: KW_OPEN (
cursor_variable opt_scroll_option KW_FOR (
selectstmt
| KW_EXECUTE sql_expression opt_open_using
)
| colid (OPEN_PAREN opt_open_bound_list CLOSE_PAREN)?
) SEMI
;
opt_open_bound_list_item
: colid COLON_EQUALS a_expr
| a_expr
;
opt_open_bound_list
: opt_open_bound_list_item (COMMA opt_open_bound_list_item)*
;
opt_open_using
:
| KW_USING expr_list
;
opt_scroll_option
:
| opt_scroll_option_no KW_SCROLL
;
opt_scroll_option_no
:
| KW_NO
;
//https://www.postgresql.org/docs/current/plpgsql-cursors.html#PLPGSQL-CURSOR-OPENING
//FETCH [ direction { KW_FROM | IN } ] cursor INTO target;
stmt_fetch
: KW_FETCH direction= opt_fetch_direction? opt_cursor_from cursor_variable KW_INTO into_target SEMI
;
into_target
: expr_list
;
opt_cursor_from
:
| KW_FROM
| KW_IN
;
opt_fetch_direction
: KW_NEXT
| KW_PRIOR
| KW_FIRST
| KW_LAST
| KW_ABSOLUTE a_expr
| KW_RELATIVE a_expr
| a_expr
| KW_ALL
| (KW_FORWARD | KW_BACKWARD) (a_expr | KW_ALL)?
;
//https://www.postgresql.org/docs/current/plpgsql-cursors.html#PLPGSQL-CURSOR-OPENING
//MOVE [ direction { KW_FROM | IN } ] cursor;
stmt_move
: KW_MOVE opt_fetch_direction? cursor_variable SEMI
;
mergestmt
: with_clause? KW_MERGE KW_INTO (KW_ONLY)? table_name (STAR)? (KW_AS? colid)? KW_USING data_source KW_ON join_condition merge_when_clause+
;
data_source
: ((KW_ONLY)? table_name (STAR)? | ( select_no_parens | values_clause)) (KW_AS? colid)?
;
join_condition
: a_expr
;
merge_when_clause
: KW_WHEN KW_MATCHED (KW_AND a_expr)? KW_THEN (merge_update | KW_DELETE | KW_DO KW_NOTHING)
| KW_WHEN KW_NOT KW_MATCHED (KW_AND a_expr)? KW_THEN (merge_insert | KW_DO KW_NOTHING)
;
merge_insert
: KW_INSERT (OPEN_PAREN column_list CLOSE_PAREN)? (
KW_OVERRIDING (KW_SYSTEM | KW_USER) KW_VALUE
)? default_values_or_values
;
merge_update
: KW_UPDATE KW_SET (
column_name EQUAL exprofdefault
| OPEN_PAREN column_list CLOSE_PAREN EQUAL OPEN_PAREN exprofdefaultlist CLOSE_PAREN
)+
;
default_values_or_values
: KW_VALUES exprofdefaultlist
| KW_DEFAULT KW_VALUES
;
exprofdefaultlist
: OPEN_PAREN exprofdefault (COMMA exprofdefault)* CLOSE_PAREN
;
exprofdefault
: sortby
| KW_DEFAULT
;
stmt_close
: KW_CLOSE cursor_variable SEMI
;
stmt_null
: KW_NULL SEMI
;
stmt_commit
: KW_COMMIT plsql_opt_transaction_chain? SEMI
;
stmt_rollback
: KW_ROLLBACK plsql_opt_transaction_chain? SEMI
;
plsql_opt_transaction_chain
: KW_AND KW_NO? KW_CHAIN
;
stmt_set
: KW_SET any_name KW_TO KW_DEFAULT SEMI
| KW_RESET (any_name | KW_ALL) SEMI
;
cursor_variable
: colid
| PARAM
;
exception_sect
:
| KW_EXCEPTION proc_exceptions
;
proc_exceptions
: proc_exception+
;
proc_exception
: KW_WHEN proc_conditions KW_THEN proc_sect
;
proc_conditions
: proc_condition (KW_OR proc_condition)*
;
proc_condition
: any_identifier
| KW_SQLSTATE sconst
;
//expr_until_semi:
//;
//expr_until_rightbracket:
//;
//expr_until_loop:
//;
opt_block_label
:
| label_decl
;
opt_loop_label
:
| label_decl
;
opt_label
:
| any_identifier
;
opt_exitcond
: KW_WHEN expr_until_semi
;
any_identifier
: colid
| plsql_unreserved_keyword
;
plsql_unreserved_keyword
: KW_ABSOLUTE
| KW_ALIAS
| KW_AND
| KW_ARRAY
| KW_ASSERT
| KW_BACKWARD
| KW_CALL
| KW_CHAIN
| KW_CLOSE
| KW_COLLATE
//| COLUMN_NAME
| KW_COMMIT
| KW_CONSTANT
| KW_CONSTRAINT
//| CONSTRAINT_NAME
| KW_CONTINUE
| KW_CURRENT
| KW_CURSOR
//| DATATYPE
| KW_DEBUG
| KW_DEFAULT
//| DETAIL
| KW_DIAGNOSTICS
| KW_DO
| KW_DUMP
| KW_ELSIF
//| ERRCODE
| KW_ERROR
| KW_EXCEPTION
| KW_EXIT
| KW_FETCH
| KW_FIRST
| KW_FORWARD
| KW_GET
//| HINT
//| IMPORT
| KW_INFO
| KW_INSERT
| KW_IS
| KW_LAST
| KW_LOG
//| MESSAGE
//| MESSAGE_TEXT
| KW_MOVE
| KW_NEXT
| KW_NO
| KW_NOTICE
| KW_OPEN
| KW_OPTION
| KW_PERFORM
//| PG_CONTEXT
//| PG_DATATYPE_NAME
//| PG_EXCEPTION_CONTEXT
//| PG_EXCEPTION_DETAIL
//| PG_EXCEPTION_HINT
| KW_PRINT_STRICT_PARAMS
| KW_PRIOR
| KW_QUERY
| KW_RAISE
| KW_RELATIVE
| KW_RESET
| KW_RETURN
//| RETURNED_SQLSTATE
| KW_REVERSE
| KW_ROLLBACK
//| ROW_COUNT
| KW_ROWTYPE
| KW_SCHEMA
//| SCHEMA_NAME
| KW_SCROLL
| KW_SET
| KW_SLICE
| KW_SQLSTATE
| KW_STACKED
//| TABLE_NAME
| KW_TYPE
| KW_USE_COLUMN
| KW_USE_VARIABLE
| KW_VARIABLE_CONFLICT
| KW_WARNING
| KW_OUTER
;
sql_expression
: opt_target_list? into_clause? from_clause? where_clause? group_clause? having_clause? window_clause?
;
expr_until_then
: sql_expression
;
expr_until_semi
: sql_expression
;
expr_until_rightbracket
: a_expr
;
expr_until_loop
: a_expr
;
make_execsql_stmt
: stmt opt_returning_clause_into?
;
opt_returning_clause_into
: KW_INTO opt_strict into_target
;