blob: b76b5d9e89d8ea33033e06d724e1b3288137f396 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
parser grammar SQLParser;
options {
language=Java;
tokenVocab=SQLLexer;
}
@header {
}
@members {
}
/*
===============================================================================
SQL statement (Start Symbol)
===============================================================================
*/
sql
: (explain_clause)? statement (SEMI_COLON)? EOF
;
explain_clause
: EXPLAIN (GLOBAL)?
;
statement
: session_statement
| data_statement
| data_change_statement
| schema_statement
| index_statement
;
session_statement
: SET CATALOG dbname = identifier
| SET TIME ZONE (TO | EQUAL)? (Character_String_Literal | signed_numerical_literal | DEFAULT)
| SET (SESSION)? name=identifier (TO | EQUAL)? (Character_String_Literal | signed_numerical_literal | boolean_literal | DEFAULT)
| RESET name=identifier
;
data_statement
: query_expression
;
data_change_statement
: insert_statement
;
schema_statement
: database_definition
| drop_database_statement
| create_table_statement
| drop_table_statement
| alter_tablespace_statement
| alter_table_statement
| truncate_table_statement
;
index_statement
: create_index_statement
| drop_index_statement
;
create_index_statement
: CREATE (u=UNIQUE)? INDEX index_name = identifier ON table_name (method_specifier)?
LEFT_PAREN sort_specifier_list RIGHT_PAREN param_clause? (where_clause)? (LOCATION path=Character_String_Literal)?
;
drop_index_statement
: DROP INDEX index_name = identifier
;
database_definition
: CREATE DATABASE (if_not_exists)? dbname = identifier
;
if_not_exists
: IF NOT EXISTS
;
drop_database_statement
: DROP DATABASE (if_exists)? dbname = identifier
;
if_exists
: IF EXISTS
;
create_table_statement
: CREATE EXTERNAL TABLE (if_not_exists)? table_name table_elements (TABLESPACE spacename=identifier)? USING storage_type=identifier
(param_clause)? (table_partitioning_clauses)? (LOCATION uri=Character_String_Literal)?
| CREATE TABLE (if_not_exists)? table_name table_elements (TABLESPACE spacename=identifier)? (USING storage_type=identifier)?
(param_clause)? (table_partitioning_clauses)? (AS query_expression)?
| CREATE TABLE (if_not_exists)? table_name (TABLESPACE spacename=identifier)? (USING storage_type=identifier)?
(param_clause)? (table_partitioning_clauses)? AS query_expression
| CREATE TABLE (if_not_exists)? table_name LIKE like_table_name=table_name
;
table_elements
: LEFT_PAREN field_element (COMMA field_element)* RIGHT_PAREN
| LEFT_PAREN asterisk RIGHT_PAREN
;
field_element
: name=identifier field_type
;
field_type
: data_type
;
param_clause
: WITH LEFT_PAREN param (COMMA param)* RIGHT_PAREN
;
param
: key=Character_String_Literal EQUAL value=numeric_value_expression
;
method_specifier
: USING m=identifier
;
table_space_specifier
: TABLESPACE table_space_name
;
table_space_name
: identifier
;
table_partitioning_clauses
: range_partitions
| hash_partitions
| list_partitions
| column_partitions
;
range_partitions
: PARTITION BY RANGE LEFT_PAREN column_reference_list RIGHT_PAREN
LEFT_PAREN range_value_clause_list RIGHT_PAREN
;
range_value_clause_list
: range_value_clause (COMMA range_value_clause)*
;
range_value_clause
: PARTITION partition_name VALUES LESS THAN (LEFT_PAREN value_expression RIGHT_PAREN | LEFT_PAREN? MAXVALUE RIGHT_PAREN?)
;
hash_partitions
: PARTITION BY HASH LEFT_PAREN column_reference_list RIGHT_PAREN
(LEFT_PAREN individual_hash_partitions RIGHT_PAREN | hash_partitions_by_quantity)
;
individual_hash_partitions
: individual_hash_partition (COMMA individual_hash_partition)*
;
individual_hash_partition
: PARTITION partition_name
;
hash_partitions_by_quantity
: PARTITIONS quantity = numeric_value_expression
;
list_partitions
: PARTITION BY LIST LEFT_PAREN column_reference_list RIGHT_PAREN LEFT_PAREN list_value_clause_list RIGHT_PAREN
;
list_value_clause_list
: list_value_partition (COMMA list_value_partition)*
;
list_value_partition
: PARTITION partition_name VALUES (IN)? LEFT_PAREN in_value_list RIGHT_PAREN
;
column_partitions
: PARTITION BY COLUMN table_elements
;
partition_name
: identifier
;
truncate_table_statement
: TRUNCATE (TABLE)? table_name (COMMA table_name)*
;
/*
===============================================================================
11.21 <drop table statement>
===============================================================================
*/
drop_table_statement
: DROP TABLE (if_exists)? table_name (PURGE)?
;
/*
===============================================================================
5.2 <token and separator>
Specifying lexical units (tokens and separators) that participate in SQL language
===============================================================================
*/
identifier
: Regular_Identifier
| nonreserved_keywords
| Quoted_Identifier
;
nonreserved_keywords
: ADD
| AVG
| ALTER
| BETWEEN
| BY
| CATALOG
| CENTURY
| CHARACTER
| COALESCE
| COLLECT
| COLUMN
| COUNT
| CUBE
| CUME_DIST
| CURRENT
| DAY
| DEC
| DECADE
| DEFAULT
| DENSE_RANK
| DOW
| DOY
| DROP
| EPOCH
| EVERY
| EXISTS
| EXCLUDE
| EXPLAIN
| EXTERNAL
| EXTRACT
| FILTER
| FIRST
| FIRST_VALUE
| FOLLOWING
| FORMAT
| FUSION
| GROUPING
| HASH
| INDEX
| INSERT
| INTERSECTION
| ISODOW
| ISOYEAR
| LAST
| LAST_VALUE
| LESS
| LIST
| LOCATION
| MAP
| MAX
| MAXVALUE
| MICROSECONDS
| MILLENNIUM
| MILLISECONDS
| MIN
| MINUTE
| MONTH
| NATIONAL
| NO
| NULLIF
| OVERWRITE
| OTHERS
| PARTITION
| PARTITIONS
| PERCENT_RANK
| PRECEDING
| PRECISION
| PURGE
| QUARTER
| RANGE
| RANK
| RECORD
| REGEXP
| RENAME
| REPAIR
| RESET
| RLIKE
| ROLLUP
| ROW
| ROWS
| ROW_NUMBER
| SECOND
| SET
| SESSION
| SIMILAR
| STDDEV_POP
| STDDEV_SAMP
| SUBPARTITION
| SUM
| TABLESPACE
| THAN
| TIES
| TIMEZONE
| TIMEZONE_HOUR
| TIMEZONE_MINUTE
| TRIM
| TO
| UNBOUNDED
| UNKNOWN
| VALUES
| VAR_POP
| VAR_SAMP
| VARYING
| WEEK
| YEAR
| ZONE
| BIGINT
| BIT
| BLOB
| BOOL
| BOOLEAN
| BYTEA
| CHAR
| DATE
| DECIMAL
| DOUBLE
| FLOAT
| FLOAT4
| FLOAT8
| INET4
| INT
| INT1
| INT2
| INT4
| INT8
| INTEGER
| INTERVAL
| NCHAR
| NUMERIC
| NVARCHAR
| REAL
| SMALLINT
| TEXT
| TIME
| TIMESTAMP
| TIMESTAMPTZ
| TIMETZ
| TINYINT
| VARBINARY
| VARBIT
| VARCHAR
;
/*
===============================================================================
5.3 <literal>
===============================================================================
*/
unsigned_literal
: unsigned_numeric_literal
| general_literal
;
general_literal
: Character_String_Literal
| datetime_literal
| boolean_literal
;
datetime_literal
: timestamp_literal
| time_literal
| date_literal
| interval_literal
;
time_literal
: TIME time_string=Character_String_Literal
;
timestamp_literal
: TIMESTAMP timestamp_string=Character_String_Literal
;
date_literal
: DATE date_string=Character_String_Literal
;
interval_literal
: INTERVAL interval_string=Character_String_Literal
;
boolean_literal
: TRUE | FALSE | UNKNOWN
;
/*
===============================================================================
6.1 <data types>
===============================================================================
*/
data_type
: predefined_type
;
predefined_type
: character_string_type
| national_character_string_type
| binary_large_object_string_type
| numeric_type
| boolean_type
| datetime_type
| bit_type
| binary_type
| network_type
| complex_type
;
character_string_type
: CHARACTER type_length?
| CHAR type_length?
| CHARACTER VARYING type_length?
| CHAR VARYING type_length?
| VARCHAR type_length?
| TEXT
;
type_length
: LEFT_PAREN NUMBER RIGHT_PAREN
;
national_character_string_type
: NATIONAL CHARACTER type_length?
| NATIONAL CHAR type_length?
| NCHAR type_length?
| NATIONAL CHARACTER VARYING type_length?
| NATIONAL CHAR VARYING type_length?
| NCHAR VARYING type_length?
| NVARCHAR type_length?
;
binary_large_object_string_type
: BLOB type_length?
| BYTEA type_length?
;
numeric_type
: exact_numeric_type | approximate_numeric_type
;
exact_numeric_type
: NUMERIC (precision_param)?
| DECIMAL (precision_param)?
| DEC (precision_param)?
| INT1
| TINYINT
| INT2
| SMALLINT
| INT4
| INT
| INTEGER
| INT8
| BIGINT
;
approximate_numeric_type
: FLOAT (precision_param)?
| FLOAT4
| REAL
| FLOAT8
| DOUBLE
| DOUBLE PRECISION
;
precision_param
: LEFT_PAREN precision=NUMBER RIGHT_PAREN
| LEFT_PAREN precision=NUMBER COMMA scale=NUMBER RIGHT_PAREN
;
boolean_type
: BOOLEAN
| BOOL
;
datetime_type
: DATE
| INTERVAL
| TIME
| TIME WITH TIME ZONE
| TIMETZ
| TIMESTAMP
| TIMESTAMP WITH TIME ZONE
| TIMESTAMPTZ
;
bit_type
: BIT type_length?
| VARBIT type_length?
| BIT VARYING type_length?
;
binary_type
: BINARY type_length?
| BINARY VARYING type_length?
| VARBINARY type_length?
;
network_type
: INET4
;
complex_type
: array_type
| record_type
| map_type
;
array_type
: ARRAY LTH data_type GTH
;
record_type
: RECORD table_elements
;
map_type
: MAP LTH key_type=data_type COMMA value_type=data_type GTH
;
/*
===============================================================================
6.3 <value_expression_primary>
===============================================================================
*/
value_expression_primary
: parenthesized_value_expression
| nonparenthesized_value_expression_primary
;
parenthesized_value_expression
: LEFT_PAREN value_expression RIGHT_PAREN
;
nonparenthesized_value_expression_primary
: unsigned_value_specification
| column_reference
| set_function_specification
| window_function
| scalar_subquery
| case_expression
| cast_specification
| routine_invocation
;
/*
===============================================================================
6.4 <unsigned value specification>
===============================================================================
*/
unsigned_value_specification
: unsigned_literal
;
unsigned_numeric_literal
: NUMBER
| REAL_NUMBER
;
signed_numerical_literal
: sign? unsigned_numeric_literal
;
/*
===============================================================================
6.9 <set function specification>
Invoke an SQL-invoked routine.
===============================================================================
*/
set_function_specification
: aggregate_function
;
aggregate_function
: COUNT LEFT_PAREN MULTIPLY RIGHT_PAREN
| general_set_function filter_clause?
;
general_set_function
: set_function_type LEFT_PAREN set_qualifier? value_expression RIGHT_PAREN
;
set_function_type
: AVG
| MAX
| MIN
| SUM
| EVERY
| ANY
| SOME
| COUNT
| STDDEV_POP
| STDDEV_SAMP
| VAR_SAMP
| VAR_POP
| COLLECT
| FUSION
| INTERSECTION
;
filter_clause
: FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN
;
grouping_operation
: GROUPING LEFT_PAREN column_reference_list RIGHT_PAREN
;
/*
===============================================================================
6.10 window function
===============================================================================
*/
window_function
: window_function_type OVER window_name_or_specification
;
window_function_type
: rank_function_type LEFT_PAREN RIGHT_PAREN
| ROW_NUMBER LEFT_PAREN RIGHT_PAREN
| aggregate_function
| FIRST_VALUE LEFT_PAREN column_reference RIGHT_PAREN
| LAST_VALUE LEFT_PAREN column_reference RIGHT_PAREN
| LAG LEFT_PAREN column_reference ( COMMA numeric_value_expression ( COMMA common_value_expression )? )? RIGHT_PAREN
| LEAD LEFT_PAREN column_reference ( COMMA numeric_value_expression ( COMMA common_value_expression )? )? RIGHT_PAREN
;
rank_function_type
: RANK | DENSE_RANK | PERCENT_RANK | CUME_DIST
;
window_name_or_specification
: window_name
| window_specification
;
/*
===============================================================================
6.11 <case expression>
===============================================================================
*/
case_expression
: case_specification
;
case_abbreviation
: NULLIF LEFT_PAREN numeric_value_expression COMMA boolean_value_expression RIGHT_PAREN
| COALESCE LEFT_PAREN numeric_value_expression ( COMMA boolean_value_expression )+ RIGHT_PAREN
;
case_specification
: simple_case
| searched_case
;
simple_case
: CASE boolean_value_expression ( simple_when_clause )+ ( else_clause )? END
;
searched_case
: CASE (searched_when_clause)+ (else_clause)? END
;
simple_when_clause : WHEN search_condition THEN result ;
searched_when_clause
: WHEN c=search_condition THEN r=result
;
else_clause
: ELSE r=result
;
result
: value_expression | NULL
;
/*
===============================================================================
6.12 <cast specification>
===============================================================================
*/
cast_specification
: CAST LEFT_PAREN cast_operand AS cast_target RIGHT_PAREN
;
cast_operand
: value_expression
;
cast_target
: data_type
;
/*
===============================================================================
6.25 <value expression>
===============================================================================
*/
value_expression
: common_value_expression
| row_value_expression
| boolean_value_expression
;
common_value_expression
: numeric_value_expression
| string_value_expression
| datetime_value_expression
| NULL
;
/*
===============================================================================
6.26 <numeric value expression>
Specify a comparison of two row values.
===============================================================================
*/
numeric_value_expression
: left=term ((PLUS|MINUS) right=term)*
;
term
: left=factor ((MULTIPLY|DIVIDE|MODULAR) right=factor)*
;
factor
: (sign)? numeric_primary
;
numeric_primary
: value_expression_primary (CAST_EXPRESSION cast_target)*
| numeric_value_function
;
sign
: PLUS | MINUS
;
/*
===============================================================================
6.27 <numeric value function>
===============================================================================
*/
numeric_value_function
: extract_expression
| datetime_value_function
;
extract_expression
: EXTRACT LEFT_PAREN extract_field_string=extract_field FROM extract_source RIGHT_PAREN
;
extract_field
: primary_datetime_field
| time_zone_field
| extended_datetime_field
;
time_zone_field
: TIMEZONE | TIMEZONE_HOUR | TIMEZONE_MINUTE
;
extract_source
: datetime_value_expression
;
/*
===============================================================================
6.28 <string value expression>
===============================================================================
*/
string_value_expression
: character_value_expression
;
character_value_expression
: character_factor (CONCATENATION_OPERATOR character_factor)*
;
character_factor
: character_primary
;
character_primary
: value_expression_primary
| string_value_function
;
/*
===============================================================================
6.29 <string value function>
===============================================================================
*/
string_value_function
: trim_function
;
trim_function
: TRIM LEFT_PAREN trim_operands RIGHT_PAREN
;
trim_operands
: ((trim_specification)? (trim_character=character_value_expression)? FROM)? trim_source=character_value_expression
| trim_source=character_value_expression COMMA trim_character=character_value_expression
;
trim_specification
: LEADING | TRAILING | BOTH
;
/*
===============================================================================
6.30 <datetime_value_expression>
===============================================================================
*/
datetime_value_expression
: datetime_term
;
datetime_term
: datetime_factor
;
datetime_factor
: datetime_primary
;
datetime_primary
: value_expression_primary
| datetime_value_function
;
/*
===============================================================================
6.31 <datetime_value_function>
===============================================================================
*/
datetime_value_function
: current_date_value_function
| current_time_value_function
| current_timestamp_value_function
;
current_date_value_function
: CURRENT_DATE
| CURRENT_DATE LEFT_PAREN RIGHT_PAREN
;
current_time_value_function
: CURRENT_TIME
| CURRENT_TIME LEFT_PAREN RIGHT_PAREN
;
current_timestamp_value_function
: CURRENT_TIMESTAMP
;
/*
===============================================================================
6.34 <boolean value expression>
===============================================================================
*/
boolean_value_expression
: or_predicate
;
or_predicate
: and_predicate (OR or_predicate)*
;
and_predicate
: boolean_factor (AND and_predicate)*
;
boolean_factor
: boolean_test
| NOT boolean_test
;
boolean_test
: boolean_primary is_clause?
;
is_clause
: IS NOT? t=truth_value
;
truth_value
: TRUE | FALSE | UNKNOWN
;
boolean_primary
: predicate
| boolean_predicand
;
boolean_predicand
: parenthesized_boolean_value_expression
| nonparenthesized_value_expression_primary
;
parenthesized_boolean_value_expression
: LEFT_PAREN boolean_value_expression RIGHT_PAREN
;
/*
===============================================================================
7.2 <row value expression> (p293)
===============================================================================
*/
row_value_expression
: row_value_special_case
| explicit_row_value_constructor
;
explicit_row_value_constructor
: NULL
;
row_value_predicand
: row_value_special_case
| row_value_constructor_predicand
;
row_value_constructor_predicand
: common_value_expression
| boolean_predicand
// | explicit_row_value_constructor
;
row_value_special_case
: nonparenthesized_value_expression_primary
;
/*
===============================================================================
7.4 <table expression>
===============================================================================
*/
table_expression
: from_clause
where_clause?
groupby_clause?
having_clause?
orderby_clause?
window_clause?
limit_clause?
;
/*
===============================================================================
7.5 <from clause>
===============================================================================
*/
from_clause
: FROM table_reference_list
;
table_reference_list
:table_reference (COMMA table_reference)*
;
/*
===============================================================================
7.6 <table reference>
===============================================================================
*/
table_reference
: joined_table
| table_primary
;
/*
===============================================================================
7.7 <joined table>
===============================================================================
*/
joined_table
: table_primary joined_table_primary+
;
joined_table_primary
: CROSS JOIN right=table_primary
| (t=join_type)? JOIN right=table_primary s=join_specification
| NATURAL (t=join_type)? JOIN right=table_primary
| UNION JOIN right=table_primary
;
cross_join
: CROSS JOIN r=table_primary
;
qualified_join
: (t=join_type)? JOIN r=table_primary s=join_specification
;
natural_join
: NATURAL (t=join_type)? JOIN r=table_primary
;
union_join
: UNION JOIN r=table_primary
;
join_type
: INNER
| t=outer_join_type
;
outer_join_type
: outer_join_type_part2 OUTER?
;
outer_join_type_part2
: LEFT
| RIGHT
| FULL
;
join_specification
: join_condition
| named_columns_join
;
join_condition
: ON search_condition
;
named_columns_join
: USING LEFT_PAREN f=column_reference_list RIGHT_PAREN
;
table_primary
: table_or_query_name ((AS)? alias=identifier)? (LEFT_PAREN column_name_list RIGHT_PAREN)?
| LEFT_PAREN table_or_query_name ((AS)? alias=identifier)? (LEFT_PAREN column_name_list RIGHT_PAREN)? RIGHT_PAREN
| derived_table (AS)? name=identifier (LEFT_PAREN column_name_list RIGHT_PAREN)?
;
column_name_list
: identifier ( COMMA identifier )*
;
derived_table
: table_subquery
;
/*
===============================================================================
7.8 <where clause>
===============================================================================
*/
where_clause
: WHERE search_condition
;
search_condition
: value_expression // instead of boolean_value_expression, we use value_expression for more flexibility.
;
/*
===============================================================================
7.9 <group by clause>
===============================================================================
*/
groupby_clause
: GROUP BY g=grouping_element_list
;
grouping_element_list
: grouping_element (COMMA grouping_element)*
;
grouping_element
: rollup_list
| cube_list
| empty_grouping_set
| ordinary_grouping_set
;
ordinary_grouping_set
: row_value_predicand
| LEFT_PAREN row_value_predicand_list RIGHT_PAREN
;
ordinary_grouping_set_list
: ordinary_grouping_set (COMMA ordinary_grouping_set)*
;
rollup_list
: ROLLUP LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN
;
cube_list
: CUBE LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN
;
empty_grouping_set
: LEFT_PAREN RIGHT_PAREN
;
having_clause
: HAVING boolean_value_expression
;
row_value_predicand_list
: row_value_predicand (COMMA row_value_predicand)*
;
/*
===============================================================================
7.11 <window clause> (p331)
===============================================================================
*/
window_clause
: WINDOW window_definition_list;
window_definition_list
: window_definition (COMMA window_definition)*
;
window_definition
: window_name AS window_specification
;
window_name
: identifier
;
window_specification
: LEFT_PAREN window_specification_details RIGHT_PAREN
;
window_specification_details
: (existing_window_name)? (window_partition_clause)? (window_order_clause)? (window_frame_clause)?
;
existing_window_name
: window_name
;
window_partition_clause
: PARTITION BY row_value_predicand_list
;
window_order_clause
: orderby_clause
;
window_frame_clause
: window_frame_units window_frame_extent (window_frame_exclusion)?
;
window_frame_units
: ROWS | RANGE
;
window_frame_extent
: window_frame_start_bound
| window_frame_between
;
window_frame_start_bound
: UNBOUNDED PRECEDING
| unsigned_value_specification PRECEDING // window_frame_preceding
| CURRENT ROW
;
window_frame_between
: BETWEEN bound1=window_frame_start_bound AND bound2=window_frame_end_bound
;
window_frame_end_bound
: UNBOUNDED FOLLOWING
| unsigned_value_specification FOLLOWING // window_frame_following FOLLOWING
| CURRENT ROW
;
window_frame_exclusion
: EXCLUDE CURRENT ROW
| EXCLUDE GROUP
| EXCLUDE TIES
| EXCLUDE NO OTHERS
;
/*
===============================================================================
7.13 <query expression>
===============================================================================
*/
query_expression
: query_expression_body
;
query_expression_body
: non_join_query_expression
| joined_table
;
non_join_query_expression
: (non_join_query_term
| joined_table (UNION | EXCEPT) (ALL|DISTINCT)? query_term)
((UNION | EXCEPT) (ALL|DISTINCT)? query_term)*
;
query_term
: non_join_query_term
| joined_table
;
non_join_query_term
: ( non_join_query_primary
| joined_table INTERSECT (ALL|DISTINCT)? query_primary)
(INTERSECT (ALL|DISTINCT)? query_primary)*
;
query_primary
: non_join_query_primary
| joined_table
;
non_join_query_primary
: simple_table
| LEFT_PAREN non_join_query_expression RIGHT_PAREN
;
simple_table
: query_specification
| explicit_table
;
explicit_table
: TABLE table_or_query_name
;
table_or_query_name
: table_name
| identifier
;
table_name
: identifier (DOT identifier ( DOT identifier)? )?
;
column_name
: identifier
;
query_specification
: SELECT set_qualifier? select_list table_expression?
;
select_list
: select_sublist (COMMA select_sublist)*
;
select_sublist
: derived_column
| qualified_asterisk
;
derived_column
: value_expression as_clause?
;
qualified_asterisk
: (tb_name=identifier DOT)? asterisk
;
asterisk
: MULTIPLY
;
set_qualifier
: DISTINCT
| ALL
;
column_reference
: identifier (DOT identifier)*
;
as_clause
: (AS)? identifier
;
column_reference_list
: column_reference (COMMA column_reference)*
;
/*
==============================================================================================
7.15 <subquery>
Specify a scalar value, a row, or a table derived from a query_expression .
==============================================================================================
*/
scalar_subquery
: subquery
;
row_subquery
: subquery
;
table_subquery
: subquery
;
subquery
: LEFT_PAREN query_expression RIGHT_PAREN
;
/*
===============================================================================
8.1 <predicate>
===============================================================================
*/
predicate
: comparison_predicate
| between_predicate
| in_predicate
| pattern_matching_predicate // like predicate and other similar predicates
| null_predicate
| exists_predicate
;
/*
===============================================================================
8.2 <comparison predicate>
Specify a comparison of two row values.
===============================================================================
*/
comparison_predicate
: left=row_value_predicand c=comp_op right=row_value_predicand
;
comp_op
: EQUAL
| NOT_EQUAL
| LTH
| LEQ
| GTH
| GEQ
;
/*
===============================================================================
8.3 <between predicate>
===============================================================================
*/
between_predicate
: predicand=row_value_predicand between_predicate_part_2
;
between_predicate_part_2
: (NOT)? BETWEEN (ASYMMETRIC | SYMMETRIC)? begin=row_value_predicand AND end=row_value_predicand
;
/*
===============================================================================
8.4 <in predicate>
===============================================================================
*/
in_predicate
: predicand=numeric_value_expression NOT? IN in_predicate_value
;
in_predicate_value
: table_subquery
| LEFT_PAREN in_value_list RIGHT_PAREN
;
in_value_list
: row_value_predicand ( COMMA row_value_predicand )*
;
/*
===============================================================================
8.5, 8.6 <pattern matching predicate>
Specify a pattern-matching comparison.
===============================================================================
*/
pattern_matching_predicate
: f=row_value_predicand pattern_matcher s=Character_String_Literal
;
pattern_matcher
: NOT? negativable_matcher
| regex_matcher
;
negativable_matcher
: LIKE
| ILIKE
| SIMILAR TO
| REGEXP
| RLIKE
;
regex_matcher
: Similar_To
| Not_Similar_To
| Similar_To_Case_Insensitive
| Not_Similar_To_Case_Insensitive
;
/*
===============================================================================
8.7 <null predicate>
Specify a test for a null value.
===============================================================================
*/
null_predicate
: predicand=row_value_predicand IS (n=NOT)? NULL
;
/*
==============================================================================================
8.8 <quantified comparison predicate>
Specify a quantified comparison.
==============================================================================================
*/
quantified_comparison_predicate
: l=numeric_value_expression c=comp_op q=quantifier s=table_subquery
;
quantifier : all | some ;
all : ALL;
some : SOME | ANY;
/*
==============================================================================================
8.9 <exists predicate>
Specify a test for a non_empty set.
==============================================================================================
*/
exists_predicate
: NOT? EXISTS s=table_subquery
;
/*
==============================================================================================
8.10 <unique predicate>
Specify a test for the absence of duplicate rows
==============================================================================================
*/
unique_predicate
: UNIQUE s=table_subquery
;
/*
===============================================================================
10.1 <interval qualifier>
Specify the precision of an interval data type.
===============================================================================
*/
primary_datetime_field
: non_second_primary_datetime_field
| SECOND
;
non_second_primary_datetime_field
: YEAR | MONTH | DAY | HOUR | MINUTE
;
extended_datetime_field
: CENTURY | DECADE | DOW | DOY | EPOCH | ISODOW | ISOYEAR | MICROSECONDS | MILLENNIUM | MILLISECONDS | QUARTER | WEEK
;
/*
===============================================================================
10.4 <routine invocation>
Invoke an SQL-invoked routine.
===============================================================================
*/
routine_invocation
: function_name LEFT_PAREN sql_argument_list? RIGHT_PAREN
;
function_names_for_reserved_words
: LEFT
| RIGHT
;
function_name
: identifier
| function_names_for_reserved_words
;
sql_argument_list
: value_expression (COMMA value_expression)*
;
/*
===============================================================================
14.1 <declare cursor>
===============================================================================
*/
orderby_clause
: ORDER BY sort_specifier_list
;
sort_specifier_list
: sort_specifier (COMMA sort_specifier)*
;
sort_specifier
: key=row_value_predicand order=order_specification? null_order=null_ordering?
;
order_specification
: ASC
| DESC
;
limit_clause
: LIMIT e=numeric_value_expression
;
null_ordering
: NULLS FIRST
| NULLS LAST
;
/*
===============================================================================
14.8 <insert statement>
===============================================================================
*/
insert_statement
: INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_reference_list RIGHT_PAREN)? query_expression
| INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_reference_list RIGHT_PAREN)? VALUES
LEFT_PAREN row_value_predicand (COMMA row_value_predicand)* RIGHT_PAREN
| INSERT (OVERWRITE)? INTO LOCATION path=Character_String_Literal (USING storage_type=identifier (param_clause)?)? query_expression
;
/*
===============================================================================
<alter table>
===============================================================================
*/
alter_tablespace_statement
: ALTER TABLESPACE space_name=identifier LOCATION uri=Character_String_Literal
;
alter_table_statement
: ALTER TABLE table_name RENAME TO table_name
| ALTER TABLE table_name RENAME COLUMN column_name TO column_name
| ALTER TABLE table_name ADD COLUMN field_element
| ALTER TABLE table_name ADD (if_not_exists)? PARTITION LEFT_PAREN partition_column_value_list RIGHT_PAREN (LOCATION path=Character_String_Literal)?
| ALTER TABLE table_name DROP (if_exists)? PARTITION LEFT_PAREN partition_column_value_list RIGHT_PAREN (PURGE)?
| ALTER TABLE table_name SET PROPERTY property_list
| ALTER TABLE table_name REPAIR PARTITION
;
partition_column_value_list
: partition_column_value (COMMA partition_column_value)*
;
partition_column_value
: identifier EQUAL row_value_predicand
;
property_list
: property (COMMA property)*
;
property
: key=Character_String_Literal EQUAL value=Character_String_Literal
;