Files
spring-tools/headless-services/commons/jpql/grammars/PostgreSqlParser.g4

1923 lines
60 KiB
ANTLR

// The MIT License
// Copyright 2018 Tal Shprecher
// 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:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// 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.
parser grammar PostgreSqlParser;
options { tokenVocab=PostgreSqlLexer; }
root
: stmt ((SEMI stmt)* SEMI)? EOF
;
// Top Level Description
// TODO: consolidate rollback* into a rollback_stmt a la alter/create/drop
stmt
: (abort_stmt
| alter_stmt
| analyze_stmt
| create_stmt
| close_stmt
| cluster_stmt
| comment_stmt
| commit_stmt
| commit_prepared_stmt
| copy_stmt
| deallocate_stmt
| declare_stmt
| delete_stmt
| discard_stmt
| drop_stmt
| execute_stmt
| explain_stmt
| fetch_stmt
| grant_stmt
| import_foreign_schema_stmt
| insert_stmt
| listen_stmt
| load_stmt
| lock_stmt
| move_stmt
| notify_stmt
| prepare_stmt
| prepare_transaction_stmt
| reassign_owned_stmt
| refresh_materialized_view_stmt
| reindex_stmt
| release_savepoint_stmt
| reset_stmt
| revoke_stmt
| rollback_stmt
| rollback_prepared_stmt
| rollback_to_savepoint_stmt
| savepoint_stmt
| security_label_stmt
| select_stmt
| select_into_stmt
| set_stmt
| set_constraints_stmt
| set_role_stmt
| set_session_authorization_stmt
| set_transaction_stmt
| show_stmt
| truncate_stmt
| unlisten_stmt
| update_stmt
| vacuum_stmt
| values_stmt)
;
abort_stmt
: identifier
;
alter_stmt
: alter_aggregate_stmt
| alter_collation_stmt
| alter_conversion_stmt
| alter_database_stmt
| alter_default_privileges_stmt
| alter_domain_stmt
| alter_event_trigger_stmt
| alter_extension_stmt
| alter_foreign_data_wrapper_stmt
| alter_foreign_table_stmt
| alter_function_stmt
| alter_group_stmt
| alter_index_stmt
| alter_language_stmt
| alter_large_object_stmt
| alter_materialize_view_stmt
| alter_operator_stmt
| alter_operator_class_stmt
| alter_operator_family_stmt
| alter_policy_stmt
| alter_publication_stmt
| alter_role_stmt
| alter_rule_stmt
| alter_schema_stmt
| alter_sequence_stmt
| alter_server_stmt
| alter_statistics_stmt
| alter_subscription_stmt
| alter_system_stmt
| alter_table_stmt
| alter_tablespace_stmt
| alter_text_search_config_stmt
| alter_text_search_dict_stmt
| alter_text_search_parser_stmt
| alter_text_search_template_stmt
| alter_trigger_stmt
| alter_type_stmt
| alter_user_stmt
| alter_user_mapping_stmt
| alter_view_stmt
;
alter_aggregate_stmt
: ALTER AGGREGATE name=identifier OPEN_PAREN aggregate_signature CLOSE_PAREN RENAME TO new_name=identifier
| ALTER AGGREGATE name=identifier OPEN_PAREN aggregate_signature CLOSE_PAREN OWNER TO new_owner=role_name
| ALTER AGGREGATE name=identifier OPEN_PAREN aggregate_signature CLOSE_PAREN SET SCHEMA new_schema=identifier
;
alter_collation_stmt
: ALTER COLLATION name=name_ REFRESH VERSION
| ALTER COLLATION name=name_ RENAME TO new_name=identifier
| ALTER COLLATION name=name_ OWNER TO new_owner=role_name
| ALTER COLLATION name=name_ SET SCHEMA new_schema=identifier
;
alter_conversion_stmt
: ALTER CONVERSION name=identifier RENAME TO new_name=identifier
| ALTER CONVERSION name=identifier OWNER TO new_owner=role_name
| ALTER CONVERSION name=identifier SET SCHEMA new_schema=identifier
;
alter_database_stmt
: todo_implement
;
alter_default_privileges_stmt
: todo_implement
;
alter_domain_stmt
: ALTER DOMAIN name=identifier (SET DEFAULT expr | DROP DEFAULT)
| ALTER DOMAIN name=identifier (SET|DROP) NOT NULL
| ALTER DOMAIN name=identifier ADD domain_constraint (NOT VALID)?
| ALTER DOMAIN name=identifier DROP CONSTRAINT (IF EXISTS)? constraint_name=identifier (RESTRICT|CASCADE)?
| ALTER DOMAIN name=identifier RENAME CONSTRAINT constraint_name=identifier TO new_constraint_name=identifier
| ALTER DOMAIN name=identifier VALIDATE CONSTRAINT constraint_name=identifier
| ALTER DOMAIN name=identifier OWNER TO new_owner=role_name
| ALTER DOMAIN name=identifier RENAME TO new_name=identifier
| ALTER DOMAIN name=identifier SET SCHEMA new_schema=identifier
;
alter_event_trigger_stmt
: ALTER EVENT TRIGGER name=identifier DISABLE
| ALTER EVENT TRIGGER name=identifier ENABLE (REPLICA|ALWAYS)?
| ALTER EVENT TRIGGER name=identifier OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
| ALTER EVENT TRIGGER name=identifier RENAME TO new_name=identifier
;
alter_extension_stmt
: ALTER EXTENSION name=identifier UPDATE (TO new_version=identifier)?
| ALTER EXTENSION name=identifier SET SCHEMA new_schema=identifier
;
alter_foreign_data_wrapper_stmt
: todo_implement
;
alter_foreign_table_action
// TODO: fix data_type?
: ADD COLUMN? column_name_=column_name data_type_=data_type (COLLATE collation=identifier)? (column_constraints_=column_constraints)?
| DROP COLUMN? (IF EXISTS)? column_name_=column_name (RESTRICT|CASCADE)?
| ALTER COLUMN? column_name_=column_name (SET DATA)? TYPE data_type_=data_type (COLLATE collation=identifier)?
| ALTER COLUMN? column_name_=column_name SET DEFAULT expr
| ALTER COLUMN? column_name_=column_name DROP DEFAULT
| ALTER COLUMN? column_name_=column_name (SET|DROP) NOT NULL
| ALTER COLUMN? column_name_=column_name SET STATISTICS INTEGER
| ALTER COLUMN? column_name_=column_name SET OPEN_PAREN attribute_values=option_list CLOSE_PAREN
| ALTER COLUMN? column_name_=column_name RESET OPEN_PAREN attributes=identifier_list CLOSE_PAREN
| ALTER COLUMN? column_name_=column_name SET STORAGE (PLAIN|EXTERNAL|EXTENDED|MAIN)
| ALTER COLUMN? column_name_=column_name OPTIONS ((ADD|SET|DROP)?)
| ADD table_constraint (NOT VALID)?
| VALIDATE CONSTRAINT constraint_name=todo_fill_in
| DROP CONSTRAINT (IF EXISTS)? constraint_name=todo_fill_in (RESTRICT|CASCADE)?
| DISABLE TRIGGER (trigger_name=todo_fill_in|ALL|USER)?
| ENABLE TRIGGER (trigger_name=todo_fill_in|ALL|USER)?
| ENABLE REPLICA TRIGGER trigger_name=todo_fill_in
| ENABLE ALWAYS TRIGGER trigger_name=todo_fill_in
| SET WITH OIDS
| SET WITHOUT OIDS
| INHERIT parent_table=identifier
| NO INHERIT parent_table=identifier
| OWNER TO new_owner=role_name
| OPTIONS ((ADD|SET|DROP)?)
;
alter_foreign_table_action_list
: alter_foreign_table_action (COMMA alter_foreign_table_action)*
;
alter_foreign_table_stmt
: ALTER FOREIGN TABLE (IF EXISTS)? ONLY? name=identifier STAR? actions=alter_foreign_table_action_list
| ALTER FOREIGN TABLE (IF EXISTS)? ONLY? name=identifier STAR?
RENAME COLUMN? column_name_=column_name TO new_column_name=identifier
| ALTER FOREIGN TABLE (IF EXISTS)? name=identifier RENAME TO new_name=identifier
| ALTER FOREIGN TABLE (IF EXISTS)? name=identifier SET SCHEMA new_schama=identifier
;
alter_function_stmt
: todo_implement
;
alter_group_stmt
: ALTER GROUP role=role_name ADD USER users=identifier_list
| ALTER GROUP role=role_name DROP USER users=identifier_list
| ALTER GROUP group_name=identifier RENAME TO new_name=identifier
;
alter_index_stmt
: ALTER INDEX (IF EXISTS)? name=identifier RENAME TO new_name=identifier
| ALTER INDEX (IF EXISTS)? name=identifier SET TABLESPACE tablespace_name=identifier
| ALTER INDEX name=identifier DEPENDS ON EXTENSION extension_name=identifier
| ALTER INDEX (IF EXISTS)? name=identifier SET OPEN_PAREN option_list CLOSE_PAREN
| ALTER INDEX (IF EXISTS)? RESET OPEN_PAREN identifier_list CLOSE_PAREN
| ALTER INDEX ALL IN TABLESPACE name=identifier (OWNED BY roles=identifier_list)?
SET TABLESPACE new_tablespace=identifier NOWAIT?
;
alter_language_stmt
: ALTER PROCEDURAL? LANGUAGE name=identifier RENAME TO new_name=identifier
| ALTER PROCEDURAL? LANGUAGE name=identifier OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
;
alter_large_object_stmt
: ALTER LARGE OBJECT large_object_oid=INTEGER_LITERAL OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
;
alter_materialize_view_stmt
: todo_implement
;
alter_operator_stmt
: todo_implement
;
alter_operator_class_stmt
: ALTER OPERATOR CLASS name=identifier USING index_method RENAME TO new_name=identifier
| ALTER OPERATOR CLASS name=identifier USING index_method OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
| ALTER OPERATOR CLASS name=identifier USING index_method SET SCHEMA new_schema=identifier
;
alter_operator_family_stmt
: todo_implement
;
alter_policy_stmt
: ALTER POLICY name=identifier ON table_name=identifier RENAME TO new_name=identifier
| ALTER POLICY name=identifier ON table_name=identifier
(TO roles=role_name_list)?
(USING predicate)?
(WITH CHECK predicate)?
;
alter_publication_stmt
: ALTER PUBLICATION name=identifier ADD TABLE ONLY? table_names=identifier_list
| ALTER PUBLICATION name=identifier SET TABLE ONLY? table_names=identifier_list
| ALTER PUBLICATION name=identifier DROP TABLE ONLY? table_names=identifier_list
| ALTER PUBLICATION name=identifier SET OPEN_PAREN option_list CLOSE_PAREN
| ALTER PUBLICATION name=identifier OWNER TO new_owner=role_name
| ALTER PUBLICATION name=identifier RENAME TO new_name=name_
;
alter_role_options
: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE |
INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS |
NOBYPASSRLS | CONNECTION LIMIT connlimit=INTEGER | ENCRYPTED? PASSWORD SINGLEQ_STRING_LITERAL |
VALID UNTIL SINGLEQ_STRING_LITERAL
;
alter_role_stmt
: ALTER ROLE role=role_name WITH? options=alter_role_options+
| ALTER ROLE name=name_ RENAME TO new_name=name_
| ALTER ROLE (role=role_name | ALL) (IN DATABASE database_name=name_)? SET configuration_parameter=identifier (TO | EQUAL) (value=param_value | DEFAULT)
| ALTER ROLE (role=role_name | ALL) (IN DATABASE database_name=name_)? SET configuration_parameter=identifier FROM CURRENT
| ALTER ROLE (role=role_name | ALL) (IN DATABASE database_name=name_)? RESET configuration_parameter=identifier
| ALTER ROLE (role=role_name | ALL) (IN DATABASE database_name=name_)? RESET ALL
;
alter_rule_stmt
: ALTER RULE name=name_ ON table_name=identifier RENAME TO new_name=name_
;
alter_schema_stmt
: ALTER SCHEMA name=identifier RENAME TO new_name=identifier
| ALTER SCHEMA name=identifier OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
;
alter_sequence_stmt
: ALTER SEQUENCE (IF EXISTS)? name=name_
;
alter_server_options_list
: ((ADD|SET|DROP)? option=identifier (value=param_value)?)
(COMMA (ADD|SET|DROP)? option=identifier (value=param_value)?)*
;
alter_server_stmt
: ALTER SERVER name=identifier (
(VERSION SINGLEQ_STRING_LITERAL) |
((VERSION SINGLEQ_STRING_LITERAL)? (OPTIONS OPEN_PAREN alter_server_options_list CLOSE_PAREN)))
| ALTER SERVER name=identifier OWNER TO new_owner=role_name
| ALTER SERVER name=identifier RENAME TO new_name=name_
;
alter_statistics_stmt
: ALTER STATISTICS name=identifier OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
| ALTER STATISTICS name=identifier RENAME TO new_name=identifier
| ALTER STATISTICS name=identifier SET SCHEMA new_schema=identifier
;
alter_subscription_stmt
: ALTER SUBSCRIPTION name=identifier CONNECTION conninfo=param_value
| ALTER SUBSCRIPTION name=identifier SET PUBLICATION publication_name=name_list
(WITH OPEN_PAREN option_list CLOSE_PAREN)?
| ALTER SUBSCRIPTION name=identifier REFRESH PUBLICATION (WITH OPEN_PAREN option_list CLOSE_PAREN)?
| ALTER SUBSCRIPTION name=identifier ENABLE
| ALTER SUBSCRIPTION name=identifier DISABLE
| ALTER SUBSCRIPTION name=identifier SET OPEN_PAREN option_list CLOSE_PAREN
| ALTER SUBSCRIPTION name=identifier OWNER TO new_owner=role_name
| ALTER SUBSCRIPTION name=identifier RENAME TO new_name=identifier
;
alter_system_stmt
: ALTER SYSTEM SET param=IDENTIFIER (TO|EQUAL) value=param_value
| ALTER SYSTEM RESET param=IDENTIFIER
| ALTER SYSTEM RESET ALL
;
alter_table_stmt
: todo_implement
;
alter_tablespace_stmt
: ALTER TABLESPACE name=identifier RENAME TO new_name=identifier
| ALTER TABLESPACE name=identifier OWNER TO (new_owner=identifier|CURRENT_USER|SESSION_USER)
| ALTER TABLESPACE name=identifier SET OPEN_PAREN option_list CLOSE_PAREN
| ALTER TABLESPACE name=identifier RESET OPEN_PAREN identifier_list CLOSE_PAREN
;
alter_text_search_config_stmt
: ALTER TEXT SEARCH CONFIGURATION name=identifier
ADD MAPPING FOR token_types=identifier_list WITH dictionary_names=identifier_list
| ALTER TEXT SEARCH CONFIGURATION name=identifier
ALTER MAPPING FOR token_types=identifier_list WITH dictionary_names=identifier_list
| ALTER TEXT SEARCH CONFIGURATION name=identifier
ALTER MAPPING REPLACE old_dictionary=identifier WITH new_dictionary=identifier
| ALTER TEXT SEARCH CONFIGURATION name=identifier
ALTER MAPPING FOR token_types=identifier_list REPLACE old_dictionary=identifier WITH new_dictionary=identifier
| ALTER TEXT SEARCH CONFIGURATION name=identifier
DROP MAPPING (IF EXISTS)? FOR token_types=identifier_list
| ALTER TEXT SEARCH CONFIGURATION name=identifier RENAME TO new_name=identifier
| ALTER TEXT SEARCH CONFIGURATION name=identifier OWNER TO new_owner=role_name
| ALTER TEXT SEARCH CONFIGURATION name=identifier SET SCHEMA new_schema=identifier
;
alter_text_search_dict_stmt
: todo_implement
;
alter_text_search_parser_stmt
: todo_implement
;
alter_text_search_template_stmt
: ALTER TEXT SEARCH TEMPLATE name=identifier RENAME TO new_name=identifier
| ALTER TEXT SEARCH TEMPLATE name=identifier SET SCHEMA new_schema=identifier
;
alter_trigger_stmt
: ALTER TRIGGER name=identifier ON table_name=identifier RENAME TO new_name=identifier
| ALTER TRIGGER name=identifier ON table_name=identifier DEPENDS ON EXTENSION extension_name=identifier
;
alter_type_stmt
: todo_implement
;
alter_user_stmt
: todo_implement
;
alter_user_mapping_stmt
: ALTER USER MAPPING FOR user=role_name
SERVER server_name=identifier
OPTIONS (OPEN_PAREN alter_server_options_list CLOSE_PAREN)
;
alter_view_stmt
: todo_implement
;
analyze_stmt
: ANALYZE VERBOSE? table_name_ (OPEN_PAREN name_list CLOSE_PAREN)?
;
close_stmt
: todo_implement
;
cluster_stmt
: todo_implement
;
comment_stmt
: todo_implement
;
commit_stmt
: todo_implement
;
commit_prepared_stmt
: todo_implement
;
copy_stmt
: todo_implement
;
create_stmt
: create_access_method_stmt
| create_aggregate_stmt
| create_cast_stmt
| create_collation_stmt
| create_conversion_stmt
| create_database_stmt
| create_domain_stmt
| create_event_trigger_stmt
| create_foreign_data_stmt
| create_foreign_table_stmt
| create_function_stmt
| create_group_stmt
| create_index_stmt
| create_language_stmt
| create_materialized_view_stmt
| create_operator_stmt
| create_operator_class_stmt
| create_operator_family_stmt
| create_policy_stmt
| create_role_stmt
| create_rule_stmt
| create_schema_stmt
| create_sequence_stmt
| create_server_stmt
| create_statistics_stmt
| create_subscription_stmt
| create_table_stmt
| create_table_as_stmt
| create_tablespace_stmt
| create_text_search_config_stmt
| create_text_search_dict_stmt
| create_text_search_parser_stmt
| create_text_search_template_stmt
| create_transform_stmt
| create_trigger_stmt
| create_type_stmt
| create_user_stmt
| create_user_mapping_stmt
| create_view_stmt
;
create_access_method_stmt
: CREATE ACCESS METHOD name_ TYPE INDEX HANDLER name_;
create_aggregate_stmt
: (CREATE AGGREGATE name_ OPEN_PAREN (IN | VARIADIC)? name_? data_type_list CLOSE_PAREN
OPEN_PAREN
SFUNC EQUAL identifier COMMA
STYPE EQUAL identifier
(COMMA SSPACE EQUAL INTEGER_LITERAL)?
(COMMA FINALFUNC EQUAL identifier)?
(COMMA FINALFUNC_EXTRA)?
(COMMA COMBINEFUNC EQUAL identifier)?
(COMMA SERIALFUNC EQUAL identifier)?
(COMMA DESERIALFUNC EQUAL identifier)?
(COMMA INITCOND EQUAL expr)?
(COMMA MSFUNC EQUAL identifier)?
(COMMA MINVFUNC EQUAL identifier)?
(COMMA MSTYPE EQUAL identifier)?
(COMMA MSSPACE EQUAL INTEGER_LITERAL)?
(COMMA MFINALFUNC EQUAL identifier)?
(COMMA MFINALFUNC_EXTRA)?
(COMMA MINITCOND EQUAL identifier)?
(COMMA SORTOP EQUAL identifier)?
(COMMA PARALLEL EQUAL (SAFE | RESTRICTED | UNSAFE))?
CLOSE_PAREN)
| (CREATE AGGREGATE name_ OPEN_PAREN ((IN | VARIADIC)? name_? data_type_list)?
ORDER BY (IN | VARIADIC)? name_? data_type_list CLOSE_PAREN
OPEN_PAREN
SFUNC EQUAL identifier COMMA
STYPE EQUAL identifier
(COMMA SSPACE EQUAL INTEGER_LITERAL)?
(COMMA FINALFUNC EQUAL identifier)?
(COMMA FINALFUNC_EXTRA)?
(COMMA INITCOND EQUAL expr)?
(COMMA PARALLEL EQUAL (SAFE | RESTRICTED | UNSAFE))?
(COMMA HYPOTHETICAL)?
CLOSE_PAREN)
| (CREATE AGGREGATE name_
OPEN_PAREN
BASETYPE EQUAL data_type COMMA
SFUNC EQUAL identifier COMMA
STYPE EQUAL identifier
(COMMA SSPACE EQUAL INTEGER_LITERAL)?
(COMMA FINALFUNC EQUAL identifier)?
(COMMA FINALFUNC_EXTRA)?
(COMMA COMBINEFUNC EQUAL identifier)?
(COMMA SERIALFUNC EQUAL identifier)?
(COMMA DESERIALFUNC EQUAL identifier)?
(COMMA INITCOND EQUAL expr)?
(COMMA MSFUNC EQUAL identifier)?
(COMMA MINVFUNC EQUAL identifier)?
(COMMA MSTYPE EQUAL identifier)?
(COMMA MSSPACE EQUAL INTEGER_LITERAL)?
(COMMA MFINALFUNC EQUAL identifier)?
(COMMA MFINALFUNC_EXTRA)?
(COMMA MINITCOND EQUAL identifier)?
(COMMA SORTOP EQUAL identifier)?
CLOSE_PAREN)
;
create_cast_stmt
: CREATE CAST OPEN_PAREN data_type AS data_type CLOSE_PAREN
((WITH FUNCTION identifier ( OPEN_PAREN data_type_list CLOSE_PAREN )?)
| (WITHOUT FUNCTION)
| (WITH INOUT))
(AS ASSIGNMENT | AS IMPLICIT)?
;
create_collation_opt
: LOCALE EQUAL expr
| LC_COLLATE EQUAL expr
| LC_CTYPE EQUAL expr
| PROVIDER EQUAL expr
| VERSION EQUAL expr
| DOUBLEQ_STRING_LITERAL EQUAL expr
;
create_collation_opt_list
: create_collation_opt (COMMA create_collation_opt)*
;
create_collation_stmt
: (CREATE COLLATION (IF NOT EXISTS)? name_ OPEN_PAREN
create_collation_opt_list CLOSE_PAREN)
| (CREATE COLLATION (IF NOT EXISTS)? name_ FROM name_)
;
create_conversion_stmt
: CREATE DEFAULT? CONVERSION identifier
FOR SINGLEQ_STRING_LITERAL TO SINGLEQ_STRING_LITERAL FROM name_
;
create_database_stmt
: CREATE DATABASE name_
( WITH?
(OWNER EQUAL name_)?
(TEMPLATE EQUAL name_)?
(ENCODING EQUAL name_)?
(LC_COLLATE EQUAL name_)?
(LC_CTYPE EQUAL name_)?
(TABLESPACE EQUAL name_)?
(ALLOW_CONNECTIONS EQUAL name_)?
(CONNECTION LIMIT EQUAL parameterOrIntegerLiteral)?
(IS_TEMPLATE EQUAL parameterOrIntegerLiteral)?
)
;
domain_constraint
: (CONSTRAINT name_)? ( NOT NULL | NULL | CHECK OPEN_PAREN expr CLOSE_PAREN )
;
create_domain_stmt
: CREATE DOMAIN name_ AS? data_type
((COLLATE name_) |
(DEFAULT expr) |
domain_constraint)*
;
create_event_trigger_cond
: filter_stmt=identifier IN OPEN_PAREN SINGLEQ_STRING_LITERAL (COMMA SINGLEQ_STRING_LITERAL)* CLOSE_PAREN
(AND create_event_trigger_cond)*
;
create_event_trigger_stmt
: CREATE EVENT TRIGGER trigger=identifier ON event=identifier
(WHEN create_event_trigger_cond)?
EXECUTE PROCEDURE fn_name=identifier OPEN_PAREN CLOSE_PAREN
;
// TODO: rename to options_list?
create_foreign_data_options
: opt=name_ SINGLEQ_STRING_LITERAL
(COMMA create_foreign_data_options)*
;
create_foreign_data_stmt
: CREATE FOREIGN DATA WRAPPER wrapper=identifier
(HANDLER handler=identifier | NO HANDLER)*
(VALIDATOR validator=identifier | NO VALIDATOR)?
(OPTIONS OPEN_PAREN opts=create_foreign_data_options CLOSE_PAREN)?
;
create_foreign_table_stmt
: CREATE FOREIGN TABLE (IF NOT EXISTS)? table_name_TODO=identifier
OPEN_PAREN column_name_TODO=identifier column_type=identifier
(OPTIONS OPEN_PAREN opts=create_foreign_data_options CLOSE_PAREN)?
(COLLATE create_collation_opt)?
CLOSE_PAREN
(INHERITS name_list)?
SERVER server_name=name_
(OPTIONS OPEN_PAREN opts=create_foreign_data_options CLOSE_PAREN)?
;
create_function_stmt
: CREATE (OR REPLACE)? FUNCTION fn_name=name_
;
create_group_stmt
: CREATE GROUP group=identifier
(WITH?
(SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB |
CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER |
INHERIT | NOINHERIT | LOGIN | NOLOGIN |
(ENCRYPTED | UNENCRYPTED)? PASSWORD (SINGLEQ_STRING_LITERAL | NULL) |
VALID UNTIL SINGLEQ_STRING_LITERAL | IN ROLE name_list | IN GROUP name_list | ROLE name_list |
ADMIN name_list | USER name_list | SYSID INTEGER_LITERAL)+)?
;
create_index_stmt
: CREATE UNIQUE? INDEX CONCURRENTLY? ((IF NOT EXISTS)? index_name=identifier)?
ON tableName=identifier (USING index_method)?
(TABLESPACE tablespace_name=identifier)?
(WHERE predicate)?
;
create_language_stmt
: (CREATE (OR REPLACE)? PROCEDURAL? LANGUAGE language_name=identifier) |
(CREATE (OR REPLACE)? TRUSTED? PROCEDURAL? LANGUAGE language_name=identifier
HANDLER call_handler=identifier (INLINE inline_handler=identifier)? (VALIDATOR valfunction=identifier)?)
;
// TODO: normalize aliases so we don't have tableName and table_name
create_materialized_view_stmt
: CREATE MATERIALIZED VIEW (IF NOT EXISTS)? tableName=identifier
(OPEN_PAREN columns=identifier_list CLOSE_PAREN)?
(WITH /* todo: implement */)?
(TABLESPACE tablespace_name=identifier)?
AS query=select_stmt
(WITH NO? DATA)?
;
// TODO: this one is tricky because of the yet undefined 'operator' lexeme
create_operator_stmt
: CREATE OPERATOR opName=identifier
OPEN_PAREN
PROCEDURE EQUAL function_name=identifier
(COMMA LEFTARG EQUAL left_type=name_)?
(COMMA RIGHTARG EQUAL right_type=name_)?
(COMMA COMMUTATOR EQUAL com_op=name_)?
(COMMA NEGATOR EQUAL neg_op=name_)?
(COMMA RESTRICT EQUAL res_proc=name_)?
(COMMA JOIN EQUAL join_proc=name_)?
(COMMA HASHES)?
(COMMA MERGES)?
CLOSE_PAREN
;
create_operator_class_opt
: (OPERATOR strategy_number=INTEGER_LITERAL opName=identifier (OPEN_PAREN identifier COMMA identifier CLOSE_PAREN)?) |
(FUNCTION support_number=INTEGER_LITERAL (OPEN_PAREN identifier (COMMA identifier)? CLOSE_PAREN)? func_name_=identifier OPEN_PAREN data_type_list CLOSE_PAREN) |
(STORAGE storage_type=identifier)
;
create_operator_class_stmt
: CREATE OPERATOR CLASS name=identifier DEFAULT? FOR TYPE op_type=identifier
USING index_method (FAMILY family_name=identifier)? AS
create_operator_class_opt (COMMA create_operator_class_opt)*
;
create_operator_family_stmt
: CREATE OPERATOR FAMILY name=identifier USING index_method
;
create_policy_stmt
: CREATE POLICY name=identifier ON tableName=identifier
(FOR (ALL | SELECT | INSERT | UPDATE | DELETE))?
(TO role=role_name)? // TODO: make a list here
(USING OPEN_PAREN predicate CLOSE_PAREN)?
(WITH CHECK OPEN_PAREN predicate CLOSE_PAREN)?
;
create_role_stmt
: CREATE ROLE role=role_name
(WITH?
(SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB |
CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN |
REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS |
CONNECTION LIMIT parameterOrIntegerLiteral | ENCRYPTED? PASSWORD (SINGLEQ_STRING_LITERAL | NULL) |
VALID UNTIL SINGLEQ_STRING_LITERAL | IN ROLE name_list | IN GROUP name_list | ROLE name_list |
ADMIN name_list | USER name_list | SYSID INTEGER_LITERAL)+)?
;
create_rule_event
: SELECT | INSERT | UPDATE | DELETE
;
// TODO: resolve 'command' to its proper definition
create_rule_stmt
: CREATE (OR REPLACE)? RULE name=name_ AS ON event=create_rule_event
TO tableName=identifier (WHERE predicate)?
DO (ALSO | INSTEAD)? (NOTHING | command=identifier)
;
create_schema_stmt
: (CREATE SCHEMA schema_name=identifier (AUTHORIZATION role_name)? todo_fill_in? ) |
(CREATE SCHEMA AUTHORIZATION role_name todo_fill_in?) |
(CREATE SCHEMA IF NOT EXISTS schema_name=identifier (AUTHORIZATION role_name)?) |
(CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_name)
;
create_sequence_stmt
: CREATE (TEMPORARY | TEMP)? SEQUENCE (IF NOT EXISTS)? name=identifier (INCREMENT BY? increment=parameterOrIntegerLiteral)?
(MINVALUE minvalue=parameterOrIntegerLiteral | NO MINVALUE)?
(MAXVALUE maxvalue=parameterOrIntegerLiteral | NO MAXVALUE)?
(START WITH? start=parameterOrIntegerLiteral)? (CACHE cache=parameterOrIntegerLiteral)? (NO? CYCLE)?
(OWNED BY ((table_name=identifier DOT column_name_=identifier) | NONE))?
;
create_server_stmt
: todo_implement
;
create_statistics_stmt
: todo_implement
;
create_subscription_stmt
: todo_implement
;
create_table_stmt
: todo_implement
;
create_table_as_stmt
: todo_implement
;
create_tablespace_stmt
: todo_implement
;
create_text_search_config_stmt
: todo_implement
;
create_text_search_dict_stmt
: todo_implement
;
create_text_search_parser_stmt
: todo_implement
;
create_text_search_template_stmt
: todo_implement
;
create_transform_stmt
: todo_implement
;
create_trigger_stmt
: todo_implement
;
create_type_stmt
: todo_implement
;
create_user_stmt
: todo_implement
;
create_user_mapping_stmt
: todo_implement
;
create_view_stmt
: CREATE (OR REPLACE)? (TEMP|TEMPORARY)? RECURSIVE? VIEW name=name_ (OPEN_PAREN name_list CLOSE_PAREN)?
(WITH OPEN_PAREN option_list CLOSE_PAREN)?
AS (select_stmt | values_stmt)
(WITH (CASCADED|LOCAL)? CHECK OPTION)?
;
deallocate_stmt
: todo_implement
;
declare_stmt
: todo_implement
;
delete_stmt
: with_clause?
DELETE FROM ONLY? table_name_ STAR? (AS? alias)?
(USING identifier_list)?
(where_clause | (WHERE CURRENT OF cursor_name_=identifier))?
returning_clause?
;
discard_stmt
: DISCARD (ALL | PLANS | SEQUENCES | TEMPORARY | TEMP)
;
drop_stmt
: drop_access_method_stmt
| drop_aggregate_stmt
| drop_cast_stmt
| drop_collation_stmt
| drop_conversion_stmt
| drop_database_stmt
| drop_domain_stmt
| drop_event_trigger_stmt
| drop_extension_stmt
| drop_foreign_data_wrapper_stmt
| drop_foreign_table_stmt
| drop_function_stmt
| drop_group_stmt
| drop_index_stmt
| drop_language_stmt
| drop_materialized_view_stmt
| drop_operator_stmt
| drop_operator_class_stmt
| drop_operator_family_stmt
| drop_owned_stmt
| drop_policy_stmt
| drop_publication_stmt
| drop_role_stmt
| drop_rule_stmt
| drop_schema_stmt
| drop_sequence_stmt
| drop_server_stmt
| drop_statistics_stmt
| drop_subscription_stmt
| drop_table_stmt
| drop_tablespace_stmt
| drop_text_search_config_stmt
| drop_text_search_dict_stmt
| drop_text_search_parser_stmt
| drop_text_search_template_stmt
| drop_transform_stmt
| drop_trigger_stmt
| drop_type_stmt
| drop_user_stmt
| drop_user_mapping_stmt
| drop_view_stmt
;
drop_access_method_stmt
: DROP ACCESS METHOD (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_aggregate_stmt
: DROP AGGREGATE (IF EXISTS)? name=identifier OPEN_PAREN aggregate_signature CLOSE_PAREN
;
drop_cast_stmt
: DROP CAST (IF EXISTS)? OPEN_PAREN source_type=data_type AS target_type=identifier CLOSE_PAREN (CASCADE|RESTRICT)?
;
drop_collation_stmt
: DROP COLLATION (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_conversion_stmt
: DROP CONVERSION (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_database_stmt
: DROP DATABASE (IF EXISTS)? name=identifier
;
drop_domain_stmt
: DROP DOMAIN (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_event_trigger_stmt
: DROP EVENT TRIGGER (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_extension_stmt
: DROP EXTENSION (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_foreign_data_wrapper_stmt
: DROP FOREIGN DATA WRAPPER (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_foreign_table_stmt
: DROP FOREIGN TABLE (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_function_stmt
: DROP FUNCTION (IF EXISTS)? functions=func_sig_list (CASCADE|RESTRICT)?
;
drop_group_stmt
: DROP GROUP (IF EXISTS)? names=identifier_list
;
drop_index_stmt
: DROP INDEX CONCURRENTLY? (IF EXISTS)? names=name_list (CASCADE|RESTRICT)?
;
drop_language_stmt
: DROP PROCEDURAL? LANGUAGE (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_materialized_view_stmt
: DROP MATERIALIZED VIEW (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_operator_stmt
: todo_implement
;
drop_operator_class_stmt
: DROP OPERATOR CLASS (IF EXISTS)? name=identifier USING index_method (CASCADE|RESTRICT)?
;
drop_operator_family_stmt
: DROP OPERATOR FAMILY (IF EXISTS)? name=identifier USING index_method (CASCADE|RESTRICT)?
;
drop_owned_stmt
: DROP OWNED BY role_name_list (CASCADE|RESTRICT)?
;
drop_policy_stmt
: DROP POLICY (IF EXISTS)? name=identifier ON table_name=identifier (CASCADE|RESTRICT)?
;
drop_publication_stmt
: DROP PUBLICATION (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_role_stmt
: DROP ROLE (IF EXISTS)? names=identifier_list
;
drop_rule_stmt
: DROP RULE (IF EXISTS)? name=name_ ON table_name=identifier (CASCADE|RESTRICT)?
;
drop_schema_stmt
: DROP SCHEMA (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_sequence_stmt
: DROP SEQUENCE (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_server_stmt
: DROP SERVER (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_statistics_stmt
: DROP STATISTICS (IF EXISTS)? names=identifier_list
;
drop_subscription_stmt
: DROP SUBSCRIPTION (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_table_stmt
: DROP TABLE (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_tablespace_stmt
: DROP TABLESPACE (IF EXISTS)? name=identifier
;
drop_text_search_config_stmt
: DROP TEXT SEARCH CONFIGURATION (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_text_search_dict_stmt
: DROP TEXT SEARCH DICTIONARY (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_text_search_parser_stmt
: DROP TEXT SEARCH PARSER (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_text_search_template_stmt
: DROP TEXT SEARCH TEMPLATE (IF EXISTS)? name=identifier (CASCADE|RESTRICT)?
;
drop_transform_stmt
: DROP TRANSFORM (IF EXISTS)? FOR type_name_=identifier LANGUAGE lang_name=identifier (CASCADE|RESTRICT)
;
drop_trigger_stmt
: DROP TRIGGER (IF EXISTS)? name=identifier ON table_name=identifier (CASCADE|RESTRICT)?
;
drop_type_stmt
: DROP TYPE (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
drop_user_stmt
: DROP USER (IF EXISTS)? names=identifier_list
;
drop_user_mapping_stmt
: DROP USER MAPPING (IF EXISTS)? FOR (user_name=name_|USER|CURRENT_USER|SESSION_USER|PUBLIC) SERVER server_name=identifier
;
drop_view_stmt
: DROP VIEW (IF EXISTS)? names=identifier_list (CASCADE|RESTRICT)?
;
execute_stmt
: EXECUTE name=identifier expr_list?
;
explain_stmt
: ((EXPLAIN ANALYZE? VERBOSE?)
| (EXPLAIN OPEN_PAREN explain_parameter (COMMA explain_parameter)* CLOSE_PAREN))
(select_stmt|insert_stmt|update_stmt|delete_stmt|values_stmt|execute_stmt|declare_stmt|create_table_as_stmt|create_materialized_view_stmt)
;
fetch_stmt
: todo_implement
;
grant_stmt
: todo_implement
;
import_foreign_schema_stmt
: todo_implement
;
insert_stmt
: with_clause?
INSERT INTO table_name_ (AS alias_=identifier)? (OPEN_PAREN name_list CLOSE_PAREN)?
(OVERRIDING (SYSTEM | USER)? VALUE)?
(DEFAULT VALUES | select_stmt | values_stmt)
(ON CONFLICT
(OPEN_PAREN column_name CLOSE_PAREN)?
(ON CONSTRAINT column_name)?
where_clause?
((DO NOTHING)|(DO UPDATE SET updater_clause where_clause?))
)?
returning_clause?
;
listen_stmt
: LISTEN channel=identifier
;
load_stmt
: todo_implement
;
lock_stmt
: LOCK TABLE? ONLY? name=name_ STAR? (IN
(ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE) MODE)? NOWAIT?
;
move_stmt
: MOVE ((NEXT | PRIOR | FIRST | LAST | ABSOLUTE INTEGER | RELATIVE parameterOrIntegerLiteral | parameterOrIntegerLiteral |
ALL | FORWARD (parameterOrIntegerLiteral|ALL)? | BACKWARD (parameterOrIntegerLiteral|ALL)?) (FROM|IN)?)? cursor_name=name_
;
notify_stmt
: NOTIFY channel=name_ (COMMA payload=SINGLEQ_STRING_LITERAL)?
;
prepare_stmt
: PREPARE name=identifier (OPEN_PAREN data_type_list CLOSE_PAREN)? AS
(select_stmt|insert_stmt|update_stmt|delete_stmt|values_stmt)
;
prepare_transaction_stmt
: PREPARE TRANSACTION name=name_
;
reassign_owned_stmt
: REASSIGN OWNED
BY ((identifier|CURRENT_USER|SESSION_USER) (COMMA (identifier|CURRENT_USER|SESSION_USER))*)
TO (identifier|CURRENT_USER|SESSION_USER)
;
refresh_materialized_view_stmt
: todo_implement
;
reindex_stmt
: REINDEX (OPEN_PAREN VERBOSE CLOSE_PAREN)? (INDEX | TABLE | SCHEMA | DATABASE | SYSTEM) name=identifier
;
release_savepoint_stmt
: RELEASE SAVEPOINT? savepoint_name=identifier
;
reset_stmt
: RESET (configuration_parameter=identifier | ALL)
;
revoke_stmt
: todo_implement
;
rollback_stmt
: ROLLBACK (WORK | TRANSACTION)?
;
rollback_prepared_stmt
: ROLLBACK PREPARED transaction_id=INTEGER_LITERAL
;
rollback_to_savepoint_stmt
: ROLLBACK (WORK | TRANSACTION)? TO SAVEPOINT? savepoint_name=identifier
;
savepoint_stmt
: SAVEPOINT savepoint_name=identifier
;
security_label_stmt
: SECURITY LABEL (FOR provider=name_)? ON
( TABLE object_name=identifier
| COLUMN table_name=identifier DOT column_name_=column_name
| AGGREGATE aggregate_name=identifier OPEN_PAREN aggregate_signature CLOSE_PAREN
| DATABASE object_name=identifier
| DOMAIN object_name=identifier
| EVENT TRIGGER object_name=identifier
| FOREIGN TABLE object_name=identifier
| FUNCTION function_name=identifier func_sig
| LARGE OBJECT large_object_oid=INTEGER_LITERAL
| MATERIALIZED VIEW object_name=identifier
| PROCEDURAL? LANGUAGE object_name=identifier
| PUBLICATION object_name=identifier
| ROLE object_name=identifier
| SCHEMA object_name=identifier
| SEQUENCE object_name=identifier
| SUBSCRIPTION object_name=identifier
| TABLESPACE object_name=identifier
| TYPE object_name=identifier
| VIEW object_name=identifier
) IS label=SINGLEQ_STRING_LITERAL
;
select_stmt
: with_clause?
((SELECT
selector_clause
from_clause?)
| (TABLE ONLY? table_name_ STAR?)
| (OPEN_PAREN+ select_stmt CLOSE_PAREN+ combine_clause)
)
where_clause?
group_by_clause?
having_clause?
window_clause?
combine_clause?
order_by_clause?
limit_clause?
offset_clause?
fetch_clause?
for_clause?
;
select_into_stmt
: with_clause?
((SELECT
selector_clause
INTO (TEMPORARY | TEMP | UNLOGGED)? TABLE? new_table=table_name_
from_clause?)
| (TABLE ONLY? table_name_ STAR?)
| (OPEN_PAREN+ select_stmt CLOSE_PAREN+ combine_clause)
)
where_clause?
group_by_clause?
having_clause?
window_clause?
combine_clause?
order_by_clause?
limit_clause?
offset_clause?
fetch_clause?
for_clause?
;
with_clause:
WITH RECURSIVE? with_expr (COMMA with_expr)*
;
with_expr:
table_name_ (OPEN_PAREN name_list CLOSE_PAREN)?
AS OPEN_PAREN (select_stmt|insert_stmt|delete_stmt|update_stmt|values_stmt) CLOSE_PAREN
;
set_stmt
: SET (SESSION | LOCAL)? configuration_parameter=identifier (TO | EQUAL) (value=param_value | DEFAULT)
| SET (SESSION | LOCAL)? TIME ZONE (timezone | LOCAL | DEFAULT)
;
set_constraints_stmt
: SET CONSTRAINTS (ALL | constraints=identifier_list) (DEFERRED | IMMEDIATE)
;
set_role_stmt
: SET (SESSION | LOCAL)? ROLE (role_name_=role_name | NONE)
| RESET ROLE
;
set_session_authorization_stmt
: todo_implement
;
transaction_mode
: ISOLATION LEVEL (SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED)
| READ WRITE
| READ ONLY
| NOT? DEFERRABLE
;
transaction_mode_list
: transaction_mode (COMMA transaction_mode)*
;
set_transaction_stmt
: SET TRANSACTION transaction_mode_list
| SET TRANSACTION SNAPSHOT snapshot_id=SINGLEQ_STRING_LITERAL
| SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
;
show_stmt
: SHOW (name=identifier | TIME ZONE | ALL)
;
truncate_stmt
: TRUNCATE TABLE? ONLY? table_name_ STAR? (COMMA ONLY? identifier_list)?
((RESTART | CONTINUE) IDENTITY)? (CASCADE | RESTRICT)?
;
unlisten_stmt
: UNLISTEN (channel=identifier | STAR)
;
update_stmt
: with_clause?
UPDATE ONLY? table_name_ STAR? (AS? alias_=identifier)?
SET updater_clause
from_clause?
(where_clause | (WHERE CURRENT OF cursor_name_=identifier))?
returning_clause?
;
vacuum_opt
: FULL | FREEZE | VERBOSE | ANALYZE | DISABLE_PAGE_SKIPPING
;
vacuum_opt_list
: vacuum_opt (COMMA vacuum_opt)*
;
vacuum_stmt
: VACUUM (OPEN_PAREN vacuum_opt_list CLOSE_PAREN)? (table_name=table_name_ (OPEN_PAREN column_list CLOSE_PAREN)?)
| VACUUM FULL? FREEZE? VERBOSE? (table_name=table_name_)?
| VACUUM FULL? FREEZE? VERBOSE? ANALYZE (table_name=table_name_ (OPEN_PAREN column_list CLOSE_PAREN)?)?
;
values_stmt
: with_clause?
((VALUES expr_list_list)
| (OPEN_PAREN+ values_stmt CLOSE_PAREN+ combine_clause)
)
order_by_clause?
combine_clause?
limit_clause?
offset_clause?
fetch_clause?
;
selector_clause
:(ALL | (DISTINCT (ON expr_list)?))? column_list
;
from_clause
: FROM from_item (COMMA from_item)*
;
where_clause
: WHERE predicate
;
group_by_clause
: GROUP BY grouping_elem (COMMA grouping_elem)*
;
grouping_elem
: OPEN_PAREN CLOSE_PAREN
| expr
| expr_list
| (ROLLUP | CUBE) OPEN_PAREN (expr | expr_list) (COMMA (expr | expr_list))* CLOSE_PAREN
| GROUPING SETS grouping_elem_list
;
grouping_elem_list
: OPEN_PAREN grouping_elem (COMMA grouping_elem)* CLOSE_PAREN
;
having_clause
: HAVING predicate (COMMA predicate)*
;
column_list
: ((column_name_=expr (AS? output_name=name_)?) | STAR)
(COMMA ((column_name_=expr (AS? output_name=name_)?) | STAR))*
;
explain_parameter
: (ANALYZE | VERBOSE | COSTS | BUFFERS | TIMING) param_value?
| FORMAT (TEXT | XML | JSON | YAML)
;
frame
: UNBOUNDED PRECEDING
| parameterOrIntegerLiteral PRECEDING
| CURRENT ROW
| parameterOrIntegerLiteral FOLLOWING
| UNBOUNDED FOLLOWING
;
frame_start
: frame
;
frame_end
: frame
;
frame_clause
: (RANGE | ROWS) frame_start
| (RANGE | ROWS) BETWEEN frame_start AND frame_end
;
window_definition
: window_name
| PARTITION BY expr (COMMA expr)*
| order_by_clause
;
window_clause
: WINDOW window_name AS OPEN_PAREN window_definition CLOSE_PAREN
;
combine_clause
: ( UNION | INTERSECT | EXCEPT ) ( ALL | DISTINCT)? OPEN_PAREN* (select_stmt | values_stmt) CLOSE_PAREN* combine_clause?
;
order_by_clause
: ORDER BY order_by_item (COMMA order_by_item)*
;
order_by_item
: (expr | DOUBLEQ_STRING_LITERAL) (ASC | DESC | USING expr)? ( (NULLS (FIRST | LAST)) (COMMA (NULLS (FIRST | LAST)))*)?
;
limit_clause
: LIMIT (parameterOrIntegerLiteral | ALL | func_call)
;
offset_clause
: OFFSET parameterOrIntegerLiteral (ROW | ROWS)?
;
fetch_clause
: FETCH (FIRST | NEXT) parameterOrIntegerLiteral? (ROW | ROWS) ONLY
;
for_clause
: FOR ( UPDATE | NO KEY UPDATE | SHARE | KEY SHARE ) (OF table_name_ (COMMA table_name_)*)? ( NOWAIT | SKIP_ LOCKED)*
;
updater_clause
: updater_expr (COMMA updater_expr)*
;
updater_expr
: expr
| (OPEN_PAREN name_list CLOSE_PAREN EQUAL (expr | expr_list))
;
returning_clause
: RETURNING column_list
;
// TODO: split into more granular expression types?
// TODO: handle operators like BETWEEN in a more normalized way
expr
: NULL
| CURRENT_DATE
| CURRENT_ROLE
| CURRENT_TIME
| CURRENT_TIMESTAMP
| CURRENT_USER
| DEFAULT //used in insert_stmt in values
| INTEGER_LITERAL
| HEX_INTEGER_LITERAL // TODO: consolidate all integer literals under a rule
| NUMERIC_LITERAL
| SINGLEQ_STRING_LITERAL
| BIT_STRING
| REGEX_STRING
| DOLLAR_DOLLAR (~DOLLAR)+ DOLLAR_DOLLAR
| DOLLAR identifier (~DOLLAR)+ DOLLAR identifier DOLLAR
| bool_expr
| values_stmt
| expr_list
// order of these terms implies order of operations
// see: https://www.postgresql.org/docs/10/static/sql-syntax-lexical.html#SQL-SYNTAX-OPERATORS
| expr OPEN_BRACKET expr CLOSE_BRACKET
| OPEN_PAREN expr CLOSE_PAREN
| type_name SINGLEQ_STRING_LITERAL
| op=(BANG_BANG | AT_SIGN | PLUS | MINUS) expr
| op=(TIL | QMARK_HYPHEN) expr
| expr op=BANG
| expr op=(CARET | PIPE_SLASH | PIPE_PIPE_SLASH) expr
| expr op=(STAR | SLASH | PERCENT) expr
| expr op=(PLUS | MINUS) expr
| expr op=(
AMP | PIPE | HASH | TIL | LT_LT | LT_LT_EQ | GT_GT |
AT_AT | LT_HYPHEN_GT | AT_GT | LT_AT | TIL_EQ | TIL_STAR| TIL_TIL | TIL_LT_TIL | TIL_GT_TIL | TIL_LTE_TIL |
TIL_GTE_TIL | LT_QMARK_GT | HYPHEN_GT | HYPHEN_GT_GT | HASH_HASH | HASH_GT | HASH_GT_GT | QMARK | QMARK_PIPE |
QMARK_AMP | QMARK_HASH | LT_CARET | AMP_LT | HYPHEN_PIPE_HYPHEN | HASH_EQ | AMP_AMP | PIPE_PIPE | EQUAL_GT |
NOT | AND | OR
) expr
| expr (NOT LIKE | LIKE) expr //(STRING_LITERAL_SINGLE_Q | REGEX_STRING)
| expr NOT? BETWEEN expr AND expr
| expr IN expr
| expr op=(LT | GT | EQUAL | LTE | GTE | LT_GT | BANG_EQUAL) expr
| expr op=IS (bool_expr | NULL | NOT NULL)
| expr IS NOT? DISTINCT FROM expr
| op=(NOT | ALL ) expr
| func_call
| identifier
| CAST OPEN_PAREN expr AS data_type CLOSE_PAREN
| correlation_name DOT column_name
| case_expr
| expr (OPEN_BRACKET expr? COLON expr? CLOSE_BRACKET)+
| expr (COLON_COLON data_type)+
| data_type expr
| expr IS OF OPEN_PAREN data_type CLOSE_PAREN
| expr DOT (identifier | STAR)
| aggregate // TODO: should there be a difference between an aggregate and a func_call?
| array_cons_expr
| expr (AT TIME ZONE) SINGLEQ_STRING_LITERAL // https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT
| EXISTS expr // NOT EXISTS will be in `op=(NOT | ALL) expr`
| DOLLAR_DEC
| OPEN_PAREN select_stmt CLOSE_PAREN
| parameter
;
parameter
: COLON SPEL
| COLON identifier
| COLON reserved_keyword
| COLON INTEGER_LITERAL
| prefix='?' SPEL
| prefix='?' INTEGER_LITERAL?
;
parameterOrIntegerLiteral
: parameter
| INTEGER_LITERAL
;
parameterOrNumericLiteral
: parameter
| NUMERIC_LITERAL
;
// TODO: is this necessary. can we just encapsulate within expr's operator precedence?
bool_expr
: TRUE
| FALSE
| NOT bool_expr
| bool_expr AND bool_expr
| bool_expr OR bool_expr
;
case_expr
: CASE expr (WHEN expr THEN expr)+ (ELSE expr)? END
| CASE (WHEN predicate THEN expr)+ (ELSE expr)? END
;
expr_list
: OPEN_PAREN expr (COMMA expr)* CLOSE_PAREN
;
expr_list_list
: OPEN_PAREN? expr_list (COMMA expr_list)* CLOSE_PAREN?
;
func_sig_arg
: ((argmode=(IN|OUT|INOUT|VARIADIC))? (argname=identifier)? argtype=data_type)?
;
func_sig_arg_list
: func_sig_arg (COMMA func_sig_arg)*
;
func_sig
: name=identifier (OPEN_PAREN func_sig_arg_list CLOSE_PAREN)?
;
func_sig_list
: func_sig (COMMA func_sig)*
;
// TODO: rename prefix notation type casts
// Actual list on https://www.postgresql.org/docs/current/datatype.htm
type_name
: ABSTIME //obsolete, internal use only
| RELTIME //obsolete, internal use only
| BIGINT
| BIGSERIAL
| BIT (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| BIT_VARYING (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| BOOL
| BOOLEAN
| BOX
| BYTEA
| CHAR (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| CHARACTER (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| CHARACTER_VARYING (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| CIDR
| CIRCLE
| DATE
| DECIMAL (OPEN_PAREN INTEGER_LITERAL COMMA INTEGER_LITERAL CLOSE_PAREN)?
| DOUBLE PRECISION
| FLOAT4
| FLOAT8
| INET
| INT
| INT4
| INT2
| INT8
| INTEGER
| INTERVAL FIELDS? (INTEGER_LITERAL)?
| JSON
| JSONB
| LINE
| LSEG
| MACADDR
| MACADDR8
| MONEY
| NUMERIC (OPEN_PAREN INTEGER_LITERAL COMMA INTEGER_LITERAL CLOSE_PAREN)?
| PATH
| PG_LSN
| POINT
| POLYGON
| REAL
| SERIAL
| SERIAL2
| SERIAL4
| SERIAL8
| SMALLINT
| SMALLSERIAL
| TEXT
| TIME (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)? ((WITH|WITHOUT) TIME ZONE)?
| TIMESTAMP (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)? ((WITH|WITHOUT) TIME ZONE)?
| TIMETZ (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| TIMESTAMPTZ (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| TSQUERY
| TSVECTOR
| TXID_SNAPSHOT
| UUID
| VARBIT (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| VARCHAR (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)?
| XML
;
timezone
: SINGLEQ_STRING_LITERAL
| DOUBLEQ_STRING_LITERAL
| INTEGER_LITERAL
| NUMERIC_LITERAL
;
// TODO: what to do with this?
oper
:
| IS OF
| ALL
;
// TODO: explicit aggregate list or no?
// TODO: see test 27e55664.sql (create domain) for an example where a fn call isn't an aggregate
aggregate
: identifier OPEN_PAREN (ALL | DISTINCT)? expr (COMMA expr)* order_by_clause? CLOSE_PAREN
(FILTER OPEN_PAREN WHERE where_clause CLOSE_PAREN)?
| identifier OPEN_PAREN STAR CLOSE_PAREN (FILTER OPEN_PAREN WHERE where_clause CLOSE_PAREN)?
| identifier OPEN_PAREN (expr (COMMA expr)*)? CLOSE_PAREN WITHIN GROUP
OPEN_PAREN order_by_clause CLOSE_PAREN
(FILTER OPEN_PAREN WHERE where_clause CLOSE_PAREN)?
;
// TODO: rename aliases of [a-z]+_name to just name for clarity
name_
: SINGLEQ_STRING_LITERAL
| identifier
;
name_list
: name_ (COMMA name_)*
;
identifier_list
: identifier (COMMA identifier)*
;
// TODD: should this be used outside
option_expr
: option_name=identifier (EQUAL value=param_value)?
;
option_list
: option_expr (COMMA option_expr)*
;
// TODO: remove
table_name_
: identifier
;
// identifier used in create_domain_stmt as custom type
// Maybe need to add (OPEN_PAREN INTEGER_LITERAL CLOSE_PAREN)? after identifier for length of custom type
data_type
: (type_name|identifier) (OPEN_BRACKET INTEGER_LITERAL? CLOSE_BRACKET)*
;
data_type_list
: data_type (COMMA data_type)*
;
index_method
: builtin=(BTREE | HASH_ | GIST | SPGIST | GIN | BRIN)
| unknown=identifier
;
func_name
: identifier
;
func_call
: func_name OPEN_PAREN VARIADIC expr CLOSE_PAREN
| func_name OPEN_PAREN (expr (COMMA expr)* (COMMA VARIADIC expr)?)? CLOSE_PAREN
| func_name OPEN_PAREN todo_fill_in FROM expr (FOR expr)? CLOSE_PAREN
;
array_cons_expr
: ARRAY OPEN_BRACKET (expr (COMMA expr)*)? CLOSE_BRACKET
;
from_item
: ONLY? table_name_ STAR? with_column_alias?
(TABLESAMPLE todo_fill_in OPEN_PAREN expr (COMMA expr)* CLOSE_PAREN (REPEATABLE OPEN_PAREN todo_fill_in CLOSE_PAREN)?)?
| LATERAL? OPEN_PAREN stmt CLOSE_PAREN AS? alias (OPEN_PAREN column_alias (COMMA column_alias)* CLOSE_PAREN)?
| LATERAL? func_call (WITH ORDINALITY)? with_column_alias?
| LATERAL? func_call AS OPEN_PAREN column_definition (COMMA column_definition)* CLOSE_PAREN
| LATERAL? ROWS FROM OPEN_PAREN func_call CLOSE_PAREN
(AS OPEN_PAREN column_definition (COMMA column_definition)* CLOSE_PAREN)? CLOSE_PAREN
| from_item NATURAL? join_type OPEN_PAREN? from_item join_clause? CLOSE_PAREN? // TODO: fix 'left' being treated as an alias
;
with_column_alias
: AS? alias (column_alias (COMMA column_alias)*)?
| AS? alias OPEN_PAREN name_list CLOSE_PAREN
;
join_type
: INNER? JOIN
| LEFT OUTER? JOIN
| RIGHT OUTER? JOIN
| FULL OUTER? JOIN
| CROSS JOIN
;
join_clause
: ON predicate
| USING OPEN_PAREN column_name (COMMA column_name)* CLOSE_PAREN // TODO: consolidate column_name (,column_name *) into its own production
;
// TODO: fill in
// TODO: have explicity binary operator completion?
predicate
: expr
| expr oper expr
| OPEN_PAREN predicate CLOSE_PAREN
| predicate AND predicate
| predicate OR predicate
| NOT predicate
;
aggregate_signature
: STAR
// TODO: can we combine the two using the ? operator
| (argmode=(IN|VARIADIC))? (argname=identifier)? argtype=data_type_list
| ((argmode=(IN|VARIADIC))? (argname=identifier)? argtype=data_type_list)
ORDER BY (argmode=(IN|VARIADIC))? (argname=identifier)? argtype=data_type_list
;
column_constraint
: NOT NULL;
column_constraints
: column_constraint+
;
index_parameters
: (WITH OPEN_PAREN option_list CLOSE_PAREN)? (USING INDEX TABLESPACE tablespace=identifier)?
;
exclude_element
: (column_name_=identifier | OPEN_PAREN expr CLOSE_PAREN) (opclass=identifier)? (ASC | DESC)? (NULLS (FIRST | LAST))?
;
table_constraint
: (CONSTRAINT constraint_name=name_)?
( (CHECK OPEN_PAREN expr CLOSE_PAREN (NO INHERIT)?)
| (UNIQUE OPEN_PAREN columns=identifier_list CLOSE_PAREN)
| (PRIMARY KEY OPEN_PAREN columns=identifier_list CLOSE_PAREN index_parameters)
| (EXCLUDE (USING index_method)? OPEN_PAREN exclude_element WITH operators=identifier_list CLOSE_PAREN index_parameters (WHERE OPEN_PAREN predicate CLOSE_PAREN))?
| (FOREIGN KEY OPEN_PAREN columns=identifier_list CLOSE_PAREN REFERENCES reftable=identifier (columns=identifier_list)?
(MATCH FULL | MATCH PARTIAL | MATCH_SIMPLE)? (ON DELETE action=identifier)? (ON UPDATE action=identifier)?)
)
(NOT? DEFERABLE)? (INITIALLY (DEFERRED|IMMEDIATE))?
;
role_name
: name=name_ | CURRENT_USER | SESSION_USER | PUBLIC
;
role_name_list
: role_name (COMMA role_name)*
;
param_value
: ON | OFF | TRUE | FALSE | YES | NO | NONE
| SINGLEQ_STRING_LITERAL
| parameterOrNumericLiteral
| parameterOrIntegerLiteral
| identifier
;
reserved_keyword
: CREATE | DROP | FROM | GROUP | LIMIT | ORDER | SELECT | UNION
;
// allow non-reserved keywords as identifiers
// TODO: is this necessary?
// easier to whitelist than blacklist
non_reserved_keyword
: A_ | ABORT | ABS | ABSOLUTE | ACCESS
| ACTION | ADA | ADD | ADMIN | AFTER
| AGGREGATE | ALLOCATE | ALSO | ALTER | ALWAYS | ANY
| ARE | ASENSITIVE | ASSERTION | ASSIGNMENT | AT
| ATOMIC | ATTRIBUTE | ATTRIBUTES | AVG | BACKWARD
| BEFORE | BEGIN | BERNOULLI | BETWEEN | BIGINT
| BIT | BIT_LENGTH | BLOB | BOOLEAN | BREADTH
| BY | C_ | CACHE | CALL | CALLED
| CARDINALITY | CASCADE | CASCADED | CATALOG | CATALOG_NAME
| CEIL | CEILING | CHAIN | CHAR | CHARACTER
| CHARACTERISTICS | CHARACTERS | CHARACTER_LENGTH | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME
| CHARACTER_SET_SCHEMA | CHAR_LENGTH | CHECKPOINT | CLASS | CLASS_ORIGIN
| CLOB | CLOSE | CLUSTER | COALESCE | COBOL
| COLLATION_CATALOG | COLLATION_NAME | COLLATION_SCHEMA | COLLECT | COLUMN_NAME
| COMMAND_FUNCTION | COMMAND_FUNCTION_CODE | COMMENT | COMMIT | COMMITTED
| CONDITION | CONDITION_NUMBER | CONNECT | CONNECTION | CONNECTION_NAME
| CONSTRAINTS | CONSTRAINT_CATALOG | CONSTRAINT_NAME | CONSTRAINT_SCHEMA | CONSTRUCTOR
| CONTAINS | CONTINUE | CONVERSION | CONVERT | COPY
| CORR | CORRESPONDING | COUNT | COVAR_POP | COVAR_SAMP
| CSV | CUBE | CUME_DIST | CURRENT | CURRENT_DEFAULT_TRANSFORM_GROUP
| CURRENT_PATH | CURRENT_TRANSFORM_GROUP_FOR_TYPE | CURSOR | CURSOR_NAME | CYCLE
| DATA | DATABASE | DATE | DATETIME_INTERVAL_CODE | DATETIME_INTERVAL_PRECISION
| DAY | DEALLOCATE | DEC | DECIMAL | DECLARE
| DEFAULTS | DEFERRED | DEFINED | DEFINER | DEGREE
| DELETE | DELIMITER | DELIMITERS | DENSE_RANK | DEPTH
| DEREF | DERIVED | DESCRIBE | DESCRIPTOR | DETERMINISTIC
| DIAGNOSTICS | DICTIONARY | DISCONNECT | DISPATCH | DOMAIN
| DOUBLE | DYNAMIC | DYNAMIC_FUNCTION | DYNAMIC_FUNCTION_CODE
| EACH | ELEMENT | ENCODING | ENCRYPTED | END
| EQUALS | ESCAPE | EVERY | EXCEPTION | EXCLUDE
| EXCLUDING | EXCLUSIVE | EXEC | EXECUTE | EXISTS
| EXP | EXPLAIN | EXTENSION | EXTERNAL | EXTRACT | FILTER
| FINAL | FIRST | FLOAT | FLOOR | FOLLOWING
| FORCE | FORMAT | FORTRAN | FORWARD | FOUND | FREE
| FUNCTION | FUSION | G_ | GENERAL | GENERATED
| GET | GLOBAL | GO | GOTO | GREATEST | GRANTED
| GROUPING | HANDLER | HIERARCHY | HOLD | HOST | HOUR
| IDENTITY | IGNORE | IMMEDIATE | IMMUTABLE | IMPLEMENTATION
| IMPLICIT | INCLUDING | INCREMENT | INDEX | INDICATOR
| INHERITS | INOUT | INPUT | INSENSITIVE | INSERT
| INSTANCE | INSTANTIABLE | INSTEAD | INT | INTEGER
| INTERSECTION | INTERVAL | INVOKER | ISOLATION | K_
| KEY | KEY_MEMBER | KEY_TYPE | LANGUAGE | LARGE
| LAST | LEAST | LEFT | LENGTH | LEVEL | LISTEN | LN
| LOAD | LOCAL | LOCATION | LOCATOR | LOCK
| LOCKED | LOWER | M_ | MAP | MATCH
| MATCHED | MAX | MAXVALUE | MEMBER | MERGE
| MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | METHOD | MIN
| MINUTE | MINVALUE | MOD | MODE | MODIFIES
| MODULE | MONTH | MORE_ | MOVE | MULTISET
| MUMPS | NAME | NAMES | NATIONAL | NCHAR
| NCLOB | NESTING | NEW | NEXT | NO
| NONE | NORMALIZE | NORMALIZED | NOTHING | NOTIFY
| NOWAIT | NULLABLE | NULLIF | NULLS | NUMBER
| NUMERIC | OBJECT | OCTETS | OCTET_LENGTH | OF
| OFF | OIDS | OLD | OPEN | OPERATOR
| OPTION | OPTIONS | ORDERING | ORDINALITY | OTHERS
| OUT | OUTPUT | OVER | OVERLAY | OVERRIDING
| OWNER | PAD | PARAMETER | PARAMETER_MODE | PARAMETER_NAME
| PARAMETER_ORDINAL_POSITION | PARAMETER_SPECIFIC_CATALOG | PARAMETER_SPECIFIC_NAME | PARAMETER_SPECIFIC_SCHEMA
| PARTIAL | PARTITION | PASCAL | PASSWORD | PATH
| PERCENTILE_CONT | PERCENTILE_DISC | PERCENT_RANK | PLAIN | PLI | POSITION
| POWER | PRECEDING | PRECISION | PREPARE | PRESERVE
| PRIOR | PRIVILEGES | PROCEDURAL | PROCEDURE | PUBLIC
| QUOTE | RANGE | RANK | READ | READS
| REAL | RECHECK | RECURSIVE | REF | REFERENCING | REFRESH
| REGR_AVGX | REGR_AVGY | REGR_COUNT | REGR_INTERCEPT | REGR_SLOPE
| REGR_SXX | REGR_SXY | REGR_SYY | REINDEX | RELATIVE
| RELEASE | RENAME | REPEATABLE | REPLACE | RESET
| RESTART | RESTRICT | RESULT | RETURN | RETURNED_CARDINALITY
| RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE | RETURNS | REVOKE
| RIGHT | ROLE | ROLLBACK | ROLLUP | ROUTINE | ROUTINE_CATALOG
| ROUTINE_NAME | ROUTINE_SCHEMA | ROW | ROWS | ROW_COUNT
| ROW_NUMBER | RULE | SAVEPOINT | SCALE | SCHEMA
| SCHEMA_NAME | SCOPE | SCOPE_CATALOG | SCOPE_NAME | SCOPE_SCHEMA
| SCROLL | SEARCH | SECOND | SECTION | SECURITY
| SELF | SENSITIVE | SEQUENCE | SEQUENCES | SERIALIZABLE | SERVER_NAME
| SESSION | SET | SETOF | SETS | SHARE
| SHOW | SIMPLE | SIZE | SMALLINT | SOME | SOURCE
| SPACE | SPECIFIC | SPECIFICTYPE | SPECIFIC_NAME | SQL
| SQLCODE | SQLERROR | SQLEXCEPTION | SQLSTATE | SQLWARNING
| SQRT | STABLE | START | STATE | STATEMENT
| STATIC | STATISTICS | STDDEV_POP | STDDEV_SAMP | STDIN
| STDOUT | STORAGE | STRICT | STRUCTURE | STYLE
| SUBCLASS_ORIGIN | SUBMULTISET | SUBSTRING | SUM | SYSID
| SYSTEM | SYSTEM_USER | TABLESPACE | TABLE_NAME
| TEMP | TEMPLATE | TEMPORARY | TEXT | TIES | TIME
| TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE | TOP_LEVEL_COUNT | TRANSACTION
| TRANSACTIONS_COMMITTED | TRANSACTIONS_ROLLED_BACK | TRANSACTION_ACTIVE | TRANSFORM | TRANSFORMS
| TRANSLATE | TRANSLATION | TREAT | TRIGGER | TRIGGER_CATALOG
| TRIGGER_NAME | TRIGGER_SCHEMA | TRIM | TRUE | TRUNCATE | TRUSTED
| TYPE | UESCAPE | UNBOUNDED | UNCOMMITTED | UNDER
| UNENCRYPTED | UNKNOWN | UNLISTEN | UNNAMED | UNNEST
| UNTIL | UPDATE | UPPER | USAGE | USER_DEFINED_TYPE_CATALOG
| USER_DEFINED_TYPE_CODE | USER_DEFINED_TYPE_NAME | USER_DEFINED_TYPE_SCHEMA | VACUUM | VALID
| VALIDATOR | VALUE | VALUES | VARCHAR | VARYING
| VAR_POP | VAR_SAMP | VIEW | VOLATILE | WHENEVER
| WHITESPACE | WIDTH_BUCKET | WITHIN | WITHOUT | WORK
| WRITE | YEAR | ZONE
;
identifier
: non_reserved_keyword
| DOUBLEQ_STRING_LITERAL
| IDENTIFIER
| identifier DOT identifier
| type_name
| IDENTIFIER_UNICODE
;
todo_fill_in : . ; // TODO: Fill in with proper identification
todo_implement : identifier;
correlation_name : identifier;
// TODO: rename
column_name : identifier;
alias : identifier;
column_alias : identifier;
column_definition : identifier;
window_name : identifier;