blob: 249f55fa40ac5a54188ec116b32ce378b01fa008 [file] [log] [blame]
/*
* Licensed 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.
*
* This file is an adaptation of Presto's presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 grammar.
*/
parser grammar SqlBaseParser;
options { tokenVocab = SqlBaseLexer; }
@members {
/**
* When false, INTERSECT is given the greater precedence over the other set
* operations (UNION, EXCEPT and MINUS) as per the SQL standard.
*/
public boolean legacy_setops_precedence_enabled = false;
/**
* When false, a literal with an exponent would be converted into
* double type rather than decimal type.
*/
public boolean legacy_exponent_literal_as_decimal_enabled = false;
/**
* When true, the behavior of keywords follows ANSI SQL standard.
*/
public boolean SQL_standard_keyword_behavior = false;
/**
* When true, double quoted literals are identifiers rather than STRINGs.
*/
public boolean double_quoted_identifiers = false;
}
singleStatement
: statement SEMICOLON* EOF
;
singleExpression
: namedExpression EOF
;
singleTableIdentifier
: tableIdentifier EOF
;
singleMultipartIdentifier
: multipartIdentifier EOF
;
singleFunctionIdentifier
: functionIdentifier EOF
;
singleDataType
: dataType EOF
;
singleTableSchema
: colTypeList EOF
;
statement
: query #statementDefault
| executeImmediate #visitExecuteImmediate
| ctes? dmlStatementNoWith #dmlStatement
| USE identifierReference #use
| USE namespace identifierReference #useNamespace
| SET CATALOG (errorCapturingIdentifier | stringLit) #setCatalog
| CREATE namespace (IF errorCapturingNot EXISTS)? identifierReference
(commentSpec |
locationSpec |
(WITH (DBPROPERTIES | PROPERTIES) propertyList))* #createNamespace
| ALTER namespace identifierReference
SET (DBPROPERTIES | PROPERTIES) propertyList #setNamespaceProperties
| ALTER namespace identifierReference
SET locationSpec #setNamespaceLocation
| DROP namespace (IF EXISTS)? identifierReference
(RESTRICT | CASCADE)? #dropNamespace
| SHOW namespaces ((FROM | IN) multipartIdentifier)?
(LIKE? pattern=stringLit)? #showNamespaces
| createTableHeader (LEFT_PAREN createOrReplaceTableColTypeList RIGHT_PAREN)? tableProvider?
createTableClauses
(AS? query)? #createTable
| CREATE TABLE (IF errorCapturingNot EXISTS)? target=tableIdentifier
LIKE source=tableIdentifier
(tableProvider |
rowFormat |
createFileFormat |
locationSpec |
(TBLPROPERTIES tableProps=propertyList))* #createTableLike
| replaceTableHeader (LEFT_PAREN createOrReplaceTableColTypeList RIGHT_PAREN)? tableProvider?
createTableClauses
(AS? query)? #replaceTable
| ANALYZE TABLE identifierReference partitionSpec? COMPUTE STATISTICS
(identifier | FOR COLUMNS identifierSeq | FOR ALL COLUMNS)? #analyze
| ANALYZE TABLES ((FROM | IN) identifierReference)? COMPUTE STATISTICS
(identifier)? #analyzeTables
| ALTER TABLE identifierReference
ADD (COLUMN | COLUMNS)
columns=qualifiedColTypeWithPositionList #addTableColumns
| ALTER TABLE identifierReference
ADD (COLUMN | COLUMNS)
LEFT_PAREN columns=qualifiedColTypeWithPositionList RIGHT_PAREN #addTableColumns
| ALTER TABLE table=identifierReference
RENAME COLUMN
from=multipartIdentifier TO to=errorCapturingIdentifier #renameTableColumn
| ALTER TABLE identifierReference
DROP (COLUMN | COLUMNS) (IF EXISTS)?
LEFT_PAREN columns=multipartIdentifierList RIGHT_PAREN #dropTableColumns
| ALTER TABLE identifierReference
DROP (COLUMN | COLUMNS) (IF EXISTS)?
columns=multipartIdentifierList #dropTableColumns
| ALTER (TABLE | VIEW) from=identifierReference
RENAME TO to=multipartIdentifier #renameTable
| ALTER (TABLE | VIEW) identifierReference
SET TBLPROPERTIES propertyList #setTableProperties
| ALTER (TABLE | VIEW) identifierReference
UNSET TBLPROPERTIES (IF EXISTS)? propertyList #unsetTableProperties
| ALTER TABLE table=identifierReference
(ALTER | CHANGE) COLUMN? column=multipartIdentifier
alterColumnAction? #alterTableAlterColumn
| ALTER TABLE table=identifierReference partitionSpec?
CHANGE COLUMN?
colName=multipartIdentifier colType colPosition? #hiveChangeColumn
| ALTER TABLE table=identifierReference partitionSpec?
REPLACE COLUMNS
LEFT_PAREN columns=qualifiedColTypeWithPositionList
RIGHT_PAREN #hiveReplaceColumns
| ALTER TABLE identifierReference (partitionSpec)?
SET SERDE stringLit (WITH SERDEPROPERTIES propertyList)? #setTableSerDe
| ALTER TABLE identifierReference (partitionSpec)?
SET SERDEPROPERTIES propertyList #setTableSerDe
| ALTER (TABLE | VIEW) identifierReference ADD (IF errorCapturingNot EXISTS)?
partitionSpecLocation+ #addTablePartition
| ALTER TABLE identifierReference
from=partitionSpec RENAME TO to=partitionSpec #renameTablePartition
| ALTER (TABLE | VIEW) identifierReference
DROP (IF EXISTS)? partitionSpec (COMMA partitionSpec)* PURGE? #dropTablePartitions
| ALTER TABLE identifierReference
(partitionSpec)? SET locationSpec #setTableLocation
| ALTER TABLE identifierReference RECOVER PARTITIONS #recoverPartitions
| DROP TABLE (IF EXISTS)? identifierReference PURGE? #dropTable
| DROP VIEW (IF EXISTS)? identifierReference #dropView
| CREATE (OR REPLACE)? (GLOBAL? TEMPORARY)?
VIEW (IF errorCapturingNot EXISTS)? identifierReference
identifierCommentList?
(commentSpec |
(PARTITIONED ON identifierList) |
(TBLPROPERTIES propertyList))*
AS query #createView
| CREATE (OR REPLACE)? GLOBAL? TEMPORARY VIEW
tableIdentifier (LEFT_PAREN colTypeList RIGHT_PAREN)? tableProvider
(OPTIONS propertyList)? #createTempViewUsing
| ALTER VIEW identifierReference AS? query #alterViewQuery
| CREATE (OR REPLACE)? TEMPORARY? FUNCTION (IF errorCapturingNot EXISTS)?
identifierReference AS className=stringLit
(USING resource (COMMA resource)*)? #createFunction
| DROP TEMPORARY? FUNCTION (IF EXISTS)? identifierReference #dropFunction
| DECLARE (OR REPLACE)? VARIABLE?
identifierReference dataType? variableDefaultExpression? #createVariable
| DROP TEMPORARY VARIABLE (IF EXISTS)? identifierReference #dropVariable
| EXPLAIN (LOGICAL | FORMATTED | EXTENDED | CODEGEN | COST)?
statement #explain
| SHOW TABLES ((FROM | IN) identifierReference)?
(LIKE? pattern=stringLit)? #showTables
| SHOW TABLE EXTENDED ((FROM | IN) ns=identifierReference)?
LIKE pattern=stringLit partitionSpec? #showTableExtended
| SHOW TBLPROPERTIES table=identifierReference
(LEFT_PAREN key=propertyKey RIGHT_PAREN)? #showTblProperties
| SHOW COLUMNS (FROM | IN) table=identifierReference
((FROM | IN) ns=multipartIdentifier)? #showColumns
| SHOW VIEWS ((FROM | IN) identifierReference)?
(LIKE? pattern=stringLit)? #showViews
| SHOW PARTITIONS identifierReference partitionSpec? #showPartitions
| SHOW identifier? FUNCTIONS ((FROM | IN) ns=identifierReference)?
(LIKE? (legacy=multipartIdentifier | pattern=stringLit))? #showFunctions
| SHOW CREATE TABLE identifierReference (AS SERDE)? #showCreateTable
| SHOW CURRENT namespace #showCurrentNamespace
| SHOW CATALOGS (LIKE? pattern=stringLit)? #showCatalogs
| (DESC | DESCRIBE) FUNCTION EXTENDED? describeFuncName #describeFunction
| (DESC | DESCRIBE) namespace EXTENDED?
identifierReference #describeNamespace
| (DESC | DESCRIBE) TABLE? option=(EXTENDED | FORMATTED)?
identifierReference partitionSpec? describeColName? #describeRelation
| (DESC | DESCRIBE) QUERY? query #describeQuery
| COMMENT ON namespace identifierReference IS
comment #commentNamespace
| COMMENT ON TABLE identifierReference IS comment #commentTable
| REFRESH TABLE identifierReference #refreshTable
| REFRESH FUNCTION identifierReference #refreshFunction
| REFRESH (stringLit | .*?) #refreshResource
| CACHE LAZY? TABLE identifierReference
(OPTIONS options=propertyList)? (AS? query)? #cacheTable
| UNCACHE TABLE (IF EXISTS)? identifierReference #uncacheTable
| CLEAR CACHE #clearCache
| LOAD DATA LOCAL? INPATH path=stringLit OVERWRITE? INTO TABLE
identifierReference partitionSpec? #loadData
| TRUNCATE TABLE identifierReference partitionSpec? #truncateTable
| (MSCK)? REPAIR TABLE identifierReference
(option=(ADD|DROP|SYNC) PARTITIONS)? #repairTable
| op=(ADD | LIST) identifier .*? #manageResource
| SET COLLATION collationName=identifier #setCollation
| SET ROLE .*? #failNativeCommand
| SET TIME ZONE interval #setTimeZone
| SET TIME ZONE timezone #setTimeZone
| SET TIME ZONE .*? #setTimeZone
| SET (VARIABLE | VAR) assignmentList #setVariable
| SET (VARIABLE | VAR) LEFT_PAREN multipartIdentifierList RIGHT_PAREN EQ
LEFT_PAREN query RIGHT_PAREN #setVariable
| SET configKey EQ configValue #setQuotedConfiguration
| SET configKey (EQ .*?)? #setConfiguration
| SET .*? EQ configValue #setQuotedConfiguration
| SET .*? #setConfiguration
| RESET configKey #resetQuotedConfiguration
| RESET .*? #resetConfiguration
| CREATE INDEX (IF errorCapturingNot EXISTS)? identifier ON TABLE?
identifierReference (USING indexType=identifier)?
LEFT_PAREN columns=multipartIdentifierPropertyList RIGHT_PAREN
(OPTIONS options=propertyList)? #createIndex
| DROP INDEX (IF EXISTS)? identifier ON TABLE? identifierReference #dropIndex
| unsupportedHiveNativeCommands .*? #failNativeCommand
;
executeImmediate
: EXECUTE IMMEDIATE queryParam=executeImmediateQueryParam (INTO targetVariable=multipartIdentifierList)? executeImmediateUsing?
;
executeImmediateUsing
: USING LEFT_PAREN params=namedExpressionSeq RIGHT_PAREN
| USING params=namedExpressionSeq
;
executeImmediateQueryParam
: stringLit
| multipartIdentifier
;
executeImmediateArgument
: (constant|multipartIdentifier) (AS name=errorCapturingIdentifier)?
;
executeImmediateArgumentSeq
: executeImmediateArgument (COMMA executeImmediateArgument)*
;
timezone
: stringLit
| LOCAL
;
configKey
: quotedIdentifier
;
configValue
: backQuotedIdentifier
;
unsupportedHiveNativeCommands
: kw1=CREATE kw2=ROLE
| kw1=DROP kw2=ROLE
| kw1=GRANT kw2=ROLE?
| kw1=REVOKE kw2=ROLE?
| kw1=SHOW kw2=GRANT
| kw1=SHOW kw2=ROLE kw3=GRANT?
| kw1=SHOW kw2=PRINCIPALS
| kw1=SHOW kw2=ROLES
| kw1=SHOW kw2=CURRENT kw3=ROLES
| kw1=EXPORT kw2=TABLE
| kw1=IMPORT kw2=TABLE
| kw1=SHOW kw2=COMPACTIONS
| kw1=SHOW kw2=CREATE kw3=TABLE
| kw1=SHOW kw2=TRANSACTIONS
| kw1=SHOW kw2=INDEXES
| kw1=SHOW kw2=LOCKS
| kw1=CREATE kw2=INDEX
| kw1=DROP kw2=INDEX
| kw1=ALTER kw2=INDEX
| kw1=LOCK kw2=TABLE
| kw1=LOCK kw2=DATABASE
| kw1=UNLOCK kw2=TABLE
| kw1=UNLOCK kw2=DATABASE
| kw1=CREATE kw2=TEMPORARY kw3=MACRO
| kw1=DROP kw2=TEMPORARY kw3=MACRO
| kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=CLUSTERED
| kw1=ALTER kw2=TABLE tableIdentifier kw3=CLUSTERED kw4=BY
| kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SORTED
| kw1=ALTER kw2=TABLE tableIdentifier kw3=SKEWED kw4=BY
| kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SKEWED
| kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=STORED kw5=AS kw6=DIRECTORIES
| kw1=ALTER kw2=TABLE tableIdentifier kw3=SET kw4=SKEWED kw5=LOCATION
| kw1=ALTER kw2=TABLE tableIdentifier kw3=EXCHANGE kw4=PARTITION
| kw1=ALTER kw2=TABLE tableIdentifier kw3=ARCHIVE kw4=PARTITION
| kw1=ALTER kw2=TABLE tableIdentifier kw3=UNARCHIVE kw4=PARTITION
| kw1=ALTER kw2=TABLE tableIdentifier kw3=TOUCH
| kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=COMPACT
| kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=CONCATENATE
| kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=SET kw4=FILEFORMAT
| kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=REPLACE kw4=COLUMNS
| kw1=START kw2=TRANSACTION
| kw1=COMMIT
| kw1=ROLLBACK
| kw1=DFS
;
createTableHeader
: CREATE TEMPORARY? EXTERNAL? TABLE (IF errorCapturingNot EXISTS)? identifierReference
;
replaceTableHeader
: (CREATE OR)? REPLACE TABLE identifierReference
;
clusterBySpec
: CLUSTER BY LEFT_PAREN multipartIdentifierList RIGHT_PAREN
;
bucketSpec
: CLUSTERED BY identifierList
(SORTED BY orderedIdentifierList)?
INTO INTEGER_VALUE BUCKETS
;
skewSpec
: SKEWED BY identifierList
ON (constantList | nestedConstantList)
(STORED AS DIRECTORIES)?
;
locationSpec
: LOCATION stringLit
;
commentSpec
: COMMENT stringLit
;
query
: ctes? queryTerm queryOrganization
;
insertInto
: INSERT OVERWRITE TABLE? identifierReference (partitionSpec (IF errorCapturingNot EXISTS)?)? ((BY NAME) | identifierList)? #insertOverwriteTable
| INSERT INTO TABLE? identifierReference partitionSpec? (IF errorCapturingNot EXISTS)? ((BY NAME) | identifierList)? #insertIntoTable
| INSERT INTO TABLE? identifierReference REPLACE whereClause #insertIntoReplaceWhere
| INSERT OVERWRITE LOCAL? DIRECTORY path=stringLit rowFormat? createFileFormat? #insertOverwriteHiveDir
| INSERT OVERWRITE LOCAL? DIRECTORY (path=stringLit)? tableProvider (OPTIONS options=propertyList)? #insertOverwriteDir
;
partitionSpecLocation
: partitionSpec locationSpec?
;
partitionSpec
: PARTITION LEFT_PAREN partitionVal (COMMA partitionVal)* RIGHT_PAREN
;
partitionVal
: identifier (EQ constant)?
| identifier EQ DEFAULT
;
namespace
: NAMESPACE
| DATABASE
| SCHEMA
;
namespaces
: NAMESPACES
| DATABASES
| SCHEMAS
;
describeFuncName
: identifierReference
| stringLit
| comparisonOperator
| arithmeticOperator
| predicateOperator
| BANG
;
describeColName
: nameParts+=errorCapturingIdentifier (DOT nameParts+=errorCapturingIdentifier)*
;
ctes
: WITH namedQuery (COMMA namedQuery)*
;
namedQuery
: name=errorCapturingIdentifier (columnAliases=identifierList)? AS? LEFT_PAREN query RIGHT_PAREN
;
tableProvider
: USING multipartIdentifier
;
createTableClauses
:((OPTIONS options=expressionPropertyList) |
(PARTITIONED BY partitioning=partitionFieldList) |
skewSpec |
clusterBySpec |
bucketSpec |
rowFormat |
createFileFormat |
locationSpec |
commentSpec |
(TBLPROPERTIES tableProps=propertyList))*
;
propertyList
: LEFT_PAREN property (COMMA property)* RIGHT_PAREN
;
property
: key=propertyKey (EQ? value=propertyValue)?
;
propertyKey
: errorCapturingIdentifier (DOT errorCapturingIdentifier)*
| stringLit
;
propertyValue
: INTEGER_VALUE
| DECIMAL_VALUE
| booleanValue
| stringLit
;
expressionPropertyList
: LEFT_PAREN expressionProperty (COMMA expressionProperty)* RIGHT_PAREN
;
expressionProperty
: key=propertyKey (EQ? value=expression)?
;
constantList
: LEFT_PAREN constant (COMMA constant)* RIGHT_PAREN
;
nestedConstantList
: LEFT_PAREN constantList (COMMA constantList)* RIGHT_PAREN
;
createFileFormat
: STORED AS fileFormat
| STORED BY storageHandler
;
fileFormat
: INPUTFORMAT inFmt=stringLit OUTPUTFORMAT outFmt=stringLit #tableFileFormat
| identifier #genericFileFormat
;
storageHandler
: stringLit (WITH SERDEPROPERTIES propertyList)?
;
resource
: identifier stringLit
;
dmlStatementNoWith
: insertInto query #singleInsertQuery
| fromClause multiInsertQueryBody+ #multiInsertQuery
| DELETE FROM identifierReference tableAlias whereClause? #deleteFromTable
| UPDATE identifierReference tableAlias setClause whereClause? #updateTable
| MERGE (WITH SCHEMA EVOLUTION)? INTO target=identifierReference targetAlias=tableAlias
USING (source=identifierReference |
LEFT_PAREN sourceQuery=query RIGHT_PAREN) sourceAlias=tableAlias
ON mergeCondition=booleanExpression
matchedClause*
notMatchedClause*
notMatchedBySourceClause* #mergeIntoTable
;
identifierReference
: IDENTIFIER_KW LEFT_PAREN expression RIGHT_PAREN
| multipartIdentifier
;
queryOrganization
: (ORDER BY order+=sortItem (COMMA order+=sortItem)*)?
(CLUSTER BY clusterBy+=expression (COMMA clusterBy+=expression)*)?
(DISTRIBUTE BY distributeBy+=expression (COMMA distributeBy+=expression)*)?
(SORT BY sort+=sortItem (COMMA sort+=sortItem)*)?
windowClause?
(LIMIT (ALL | limit=expression))?
(OFFSET offset=expression)?
;
multiInsertQueryBody
: insertInto fromStatementBody
;
queryTerm
: queryPrimary #queryTermDefault
| left=queryTerm {legacy_setops_precedence_enabled}?
operator=(INTERSECT | UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation
| left=queryTerm {!legacy_setops_precedence_enabled}?
operator=INTERSECT setQuantifier? right=queryTerm #setOperation
| left=queryTerm {!legacy_setops_precedence_enabled}?
operator=(UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation
;
queryPrimary
: querySpecification #queryPrimaryDefault
| fromStatement #fromStmt
| TABLE identifierReference #table
| inlineTable #inlineTableDefault1
| LEFT_PAREN query RIGHT_PAREN #subquery
;
sortItem
: expression ordering=(ASC | DESC)? (NULLS nullOrder=(LAST | FIRST))?
;
fromStatement
: fromClause fromStatementBody+
;
fromStatementBody
: transformClause
whereClause?
queryOrganization
| selectClause
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause?
queryOrganization
;
querySpecification
: transformClause
fromClause?
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause? #transformQuerySpecification
| selectClause
fromClause?
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause? #regularQuerySpecification
;
transformClause
: (SELECT kind=TRANSFORM LEFT_PAREN setQuantifier? expressionSeq RIGHT_PAREN
| kind=MAP setQuantifier? expressionSeq
| kind=REDUCE setQuantifier? expressionSeq)
inRowFormat=rowFormat?
(RECORDWRITER recordWriter=stringLit)?
USING script=stringLit
(AS (identifierSeq | colTypeList | (LEFT_PAREN (identifierSeq | colTypeList) RIGHT_PAREN)))?
outRowFormat=rowFormat?
(RECORDREADER recordReader=stringLit)?
;
selectClause
: SELECT (hints+=hint)* setQuantifier? namedExpressionSeq
;
setClause
: SET assignmentList
;
matchedClause
: WHEN MATCHED (AND matchedCond=booleanExpression)? THEN matchedAction
;
notMatchedClause
: WHEN errorCapturingNot MATCHED (BY TARGET)? (AND notMatchedCond=booleanExpression)? THEN notMatchedAction
;
notMatchedBySourceClause
: WHEN errorCapturingNot MATCHED BY SOURCE (AND notMatchedBySourceCond=booleanExpression)? THEN notMatchedBySourceAction
;
matchedAction
: DELETE
| UPDATE SET ASTERISK
| UPDATE SET assignmentList
;
notMatchedAction
: INSERT ASTERISK
| INSERT LEFT_PAREN columns=multipartIdentifierList RIGHT_PAREN
VALUES LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN
;
notMatchedBySourceAction
: DELETE
| UPDATE SET assignmentList
;
exceptClause
: EXCEPT LEFT_PAREN exceptCols=multipartIdentifierList RIGHT_PAREN
;
assignmentList
: assignment (COMMA assignment)*
;
assignment
: key=multipartIdentifier EQ value=expression
;
whereClause
: WHERE booleanExpression
;
havingClause
: HAVING booleanExpression
;
hint
: HENT_START hintStatements+=hintStatement (COMMA? hintStatements+=hintStatement)* HENT_END
;
hintStatement
: hintName=identifier
| hintName=identifier LEFT_PAREN parameters+=primaryExpression (COMMA parameters+=primaryExpression)* RIGHT_PAREN
;
fromClause
: FROM relation (COMMA relation)* lateralView* pivotClause? unpivotClause?
;
temporalClause
: FOR? (SYSTEM_VERSION | VERSION) AS OF version
| FOR? (SYSTEM_TIME | TIMESTAMP) AS OF timestamp=valueExpression
;
aggregationClause
: GROUP BY groupingExpressionsWithGroupingAnalytics+=groupByClause
(COMMA groupingExpressionsWithGroupingAnalytics+=groupByClause)*
| GROUP BY groupingExpressions+=expression (COMMA groupingExpressions+=expression)* (
WITH kind=ROLLUP
| WITH kind=CUBE
| kind=GROUPING SETS LEFT_PAREN groupingSet (COMMA groupingSet)* RIGHT_PAREN)?
;
groupByClause
: groupingAnalytics
| expression
;
groupingAnalytics
: (ROLLUP | CUBE) LEFT_PAREN groupingSet (COMMA groupingSet)* RIGHT_PAREN
| GROUPING SETS LEFT_PAREN groupingElement (COMMA groupingElement)* RIGHT_PAREN
;
groupingElement
: groupingAnalytics
| groupingSet
;
groupingSet
: LEFT_PAREN (expression (COMMA expression)*)? RIGHT_PAREN
| expression
;
pivotClause
: PIVOT LEFT_PAREN aggregates=namedExpressionSeq FOR pivotColumn IN LEFT_PAREN pivotValues+=pivotValue (COMMA pivotValues+=pivotValue)* RIGHT_PAREN RIGHT_PAREN
;
pivotColumn
: identifiers+=errorCapturingIdentifier
| LEFT_PAREN identifiers+=errorCapturingIdentifier (COMMA identifiers+=errorCapturingIdentifier)* RIGHT_PAREN
;
pivotValue
: expression (AS? errorCapturingIdentifier)?
;
unpivotClause
: UNPIVOT nullOperator=unpivotNullClause? LEFT_PAREN
operator=unpivotOperator
RIGHT_PAREN (AS? errorCapturingIdentifier)?
;
unpivotNullClause
: (INCLUDE | EXCLUDE) NULLS
;
unpivotOperator
: (unpivotSingleValueColumnClause | unpivotMultiValueColumnClause)
;
unpivotSingleValueColumnClause
: unpivotValueColumn FOR unpivotNameColumn IN LEFT_PAREN unpivotColumns+=unpivotColumnAndAlias (COMMA unpivotColumns+=unpivotColumnAndAlias)* RIGHT_PAREN
;
unpivotMultiValueColumnClause
: LEFT_PAREN unpivotValueColumns+=unpivotValueColumn (COMMA unpivotValueColumns+=unpivotValueColumn)* RIGHT_PAREN
FOR unpivotNameColumn
IN LEFT_PAREN unpivotColumnSets+=unpivotColumnSet (COMMA unpivotColumnSets+=unpivotColumnSet)* RIGHT_PAREN
;
unpivotColumnSet
: LEFT_PAREN unpivotColumns+=unpivotColumn (COMMA unpivotColumns+=unpivotColumn)* RIGHT_PAREN unpivotAlias?
;
unpivotValueColumn
: identifier
;
unpivotNameColumn
: identifier
;
unpivotColumnAndAlias
: unpivotColumn unpivotAlias?
;
unpivotColumn
: multipartIdentifier
;
unpivotAlias
: AS? errorCapturingIdentifier
;
lateralView
: LATERAL VIEW (OUTER)? qualifiedName LEFT_PAREN (expression (COMMA expression)*)? RIGHT_PAREN tblName=identifier (AS? colName+=identifier (COMMA colName+=identifier)*)?
;
setQuantifier
: DISTINCT
| ALL
;
relation
: LATERAL? relationPrimary relationExtension*
;
relationExtension
: joinRelation
| pivotClause
| unpivotClause
;
joinRelation
: (joinType) JOIN LATERAL? right=relationPrimary joinCriteria?
| NATURAL joinType JOIN LATERAL? right=relationPrimary
;
joinType
: INNER?
| CROSS
| LEFT OUTER?
| LEFT? SEMI
| RIGHT OUTER?
| FULL OUTER?
| LEFT? ANTI
;
joinCriteria
: ON booleanExpression
| USING identifierList
;
sample
: TABLESAMPLE LEFT_PAREN sampleMethod? RIGHT_PAREN (REPEATABLE LEFT_PAREN seed=INTEGER_VALUE RIGHT_PAREN)?
;
sampleMethod
: negativeSign=MINUS? percentage=(INTEGER_VALUE | DECIMAL_VALUE) PERCENTLIT #sampleByPercentile
| expression ROWS #sampleByRows
| sampleType=BUCKET numerator=INTEGER_VALUE OUT OF denominator=INTEGER_VALUE
(ON (identifier | qualifiedName LEFT_PAREN RIGHT_PAREN))? #sampleByBucket
| bytes=expression #sampleByBytes
;
identifierList
: LEFT_PAREN identifierSeq RIGHT_PAREN
;
identifierSeq
: ident+=errorCapturingIdentifier (COMMA ident+=errorCapturingIdentifier)*
;
orderedIdentifierList
: LEFT_PAREN orderedIdentifier (COMMA orderedIdentifier)* RIGHT_PAREN
;
orderedIdentifier
: ident=errorCapturingIdentifier ordering=(ASC | DESC)?
;
identifierCommentList
: LEFT_PAREN identifierComment (COMMA identifierComment)* RIGHT_PAREN
;
identifierComment
: identifier commentSpec?
;
relationPrimary
: identifierReference temporalClause?
sample? tableAlias #tableName
| LEFT_PAREN query RIGHT_PAREN sample? tableAlias #aliasedQuery
| LEFT_PAREN relation RIGHT_PAREN sample? tableAlias #aliasedRelation
| inlineTable #inlineTableDefault2
| functionTable #tableValuedFunction
;
inlineTable
: VALUES expression (COMMA expression)* tableAlias
;
functionTableSubqueryArgument
: TABLE identifierReference tableArgumentPartitioning?
| TABLE LEFT_PAREN identifierReference RIGHT_PAREN tableArgumentPartitioning?
| TABLE LEFT_PAREN query RIGHT_PAREN tableArgumentPartitioning?
;
tableArgumentPartitioning
: ((WITH SINGLE PARTITION)
| ((PARTITION | DISTRIBUTE) BY
(((LEFT_PAREN partition+=expression (COMMA partition+=expression)* RIGHT_PAREN))
| (expression (COMMA invalidMultiPartitionExpression=expression)+)
| partition+=expression)))
((ORDER | SORT) BY
(((LEFT_PAREN sortItem (COMMA sortItem)* RIGHT_PAREN)
| (sortItem (COMMA invalidMultiSortItem=sortItem)+)
| sortItem)))?
;
functionTableNamedArgumentExpression
: key=identifier FAT_ARROW table=functionTableSubqueryArgument
;
functionTableReferenceArgument
: functionTableSubqueryArgument
| functionTableNamedArgumentExpression
;
functionTableArgument
: functionTableReferenceArgument
| functionArgument
;
functionTable
: funcName=functionName LEFT_PAREN
(functionTableArgument (COMMA functionTableArgument)*)?
RIGHT_PAREN tableAlias
;
tableAlias
: (AS? strictIdentifier identifierList?)?
;
rowFormat
: ROW FORMAT SERDE name=stringLit (WITH SERDEPROPERTIES props=propertyList)? #rowFormatSerde
| ROW FORMAT DELIMITED
(FIELDS TERMINATED BY fieldsTerminatedBy=stringLit (ESCAPED BY escapedBy=stringLit)?)?
(COLLECTION ITEMS TERMINATED BY collectionItemsTerminatedBy=stringLit)?
(MAP KEYS TERMINATED BY keysTerminatedBy=stringLit)?
(LINES TERMINATED BY linesSeparatedBy=stringLit)?
(NULL DEFINED AS nullDefinedAs=stringLit)? #rowFormatDelimited
;
multipartIdentifierList
: multipartIdentifier (COMMA multipartIdentifier)*
;
multipartIdentifier
: parts+=errorCapturingIdentifier (DOT parts+=errorCapturingIdentifier)*
;
multipartIdentifierPropertyList
: multipartIdentifierProperty (COMMA multipartIdentifierProperty)*
;
multipartIdentifierProperty
: multipartIdentifier (OPTIONS options=propertyList)?
;
tableIdentifier
: (db=errorCapturingIdentifier DOT)? table=errorCapturingIdentifier
;
functionIdentifier
: (db=errorCapturingIdentifier DOT)? function=errorCapturingIdentifier
;
namedExpression
: expression (AS? (name=errorCapturingIdentifier | identifierList))?
;
namedExpressionSeq
: namedExpression (COMMA namedExpression)*
;
partitionFieldList
: LEFT_PAREN fields+=partitionField (COMMA fields+=partitionField)* RIGHT_PAREN
;
partitionField
: transform #partitionTransform
| colType #partitionColumn
;
transform
: qualifiedName #identityTransform
| transformName=identifier
LEFT_PAREN argument+=transformArgument (COMMA argument+=transformArgument)* RIGHT_PAREN #applyTransform
;
transformArgument
: qualifiedName
| constant
;
expression
: booleanExpression
;
namedArgumentExpression
: key=identifier FAT_ARROW value=expression
;
functionArgument
: expression
| namedArgumentExpression
;
expressionSeq
: expression (COMMA expression)*
;
booleanExpression
: (NOT | BANG) booleanExpression #logicalNot
| EXISTS LEFT_PAREN query RIGHT_PAREN #exists
| valueExpression predicate? #predicated
| left=booleanExpression operator=AND right=booleanExpression #logicalBinary
| left=booleanExpression operator=OR right=booleanExpression #logicalBinary
;
predicate
: errorCapturingNot? kind=BETWEEN lower=valueExpression AND upper=valueExpression
| errorCapturingNot? kind=IN LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN
| errorCapturingNot? kind=IN LEFT_PAREN query RIGHT_PAREN
| errorCapturingNot? kind=RLIKE pattern=valueExpression
| errorCapturingNot? kind=(LIKE | ILIKE) quantifier=(ANY | SOME | ALL) (LEFT_PAREN RIGHT_PAREN | LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN)
| errorCapturingNot? kind=(LIKE | ILIKE) pattern=valueExpression (ESCAPE escapeChar=stringLit)?
| IS errorCapturingNot? kind=NULL
| IS errorCapturingNot? kind=(TRUE | FALSE | UNKNOWN)
| IS errorCapturingNot? kind=DISTINCT FROM right=valueExpression
;
errorCapturingNot
: NOT
| BANG
;
valueExpression
: primaryExpression #valueExpressionDefault
| operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary
| left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary
| left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression #arithmeticBinary
| left=valueExpression operator=AMPERSAND right=valueExpression #arithmeticBinary
| left=valueExpression operator=HAT right=valueExpression #arithmeticBinary
| left=valueExpression operator=PIPE right=valueExpression #arithmeticBinary
| left=valueExpression comparisonOperator right=valueExpression #comparison
;
datetimeUnit
: YEAR | QUARTER | MONTH
| WEEK | DAY | DAYOFYEAR
| HOUR | MINUTE | SECOND | MILLISECOND | MICROSECOND
;
primaryExpression
: name=(CURRENT_DATE | CURRENT_TIMESTAMP | CURRENT_USER | USER | SESSION_USER) #currentLike
| name=(TIMESTAMPADD | DATEADD | DATE_ADD) LEFT_PAREN (unit=datetimeUnit | invalidUnit=stringLit) COMMA unitsAmount=valueExpression COMMA timestamp=valueExpression RIGHT_PAREN #timestampadd
| name=(TIMESTAMPDIFF | DATEDIFF | DATE_DIFF | TIMEDIFF) LEFT_PAREN (unit=datetimeUnit | invalidUnit=stringLit) COMMA startTimestamp=valueExpression COMMA endTimestamp=valueExpression RIGHT_PAREN #timestampdiff
| CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
| CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase
| name=(CAST | TRY_CAST) LEFT_PAREN expression AS dataType RIGHT_PAREN #cast
| primaryExpression collateClause #collate
| primaryExpression DOUBLE_COLON dataType #castByColon
| STRUCT LEFT_PAREN (argument+=namedExpression (COMMA argument+=namedExpression)*)? RIGHT_PAREN #struct
| FIRST LEFT_PAREN expression (IGNORE NULLS)? RIGHT_PAREN #first
| ANY_VALUE LEFT_PAREN expression (IGNORE NULLS)? RIGHT_PAREN #any_value
| LAST LEFT_PAREN expression (IGNORE NULLS)? RIGHT_PAREN #last
| POSITION LEFT_PAREN substr=valueExpression IN str=valueExpression RIGHT_PAREN #position
| constant #constantDefault
| ASTERISK exceptClause? #star
| qualifiedName DOT ASTERISK exceptClause? #star
| LEFT_PAREN namedExpression (COMMA namedExpression)+ RIGHT_PAREN #rowConstructor
| LEFT_PAREN query RIGHT_PAREN #subqueryExpression
| functionName LEFT_PAREN (setQuantifier? argument+=functionArgument
(COMMA argument+=functionArgument)*)? RIGHT_PAREN
(WITHIN GROUP LEFT_PAREN ORDER BY sortItem (COMMA sortItem)* RIGHT_PAREN)?
(FILTER LEFT_PAREN WHERE where=booleanExpression RIGHT_PAREN)?
(nullsOption=(IGNORE | RESPECT) NULLS)? ( OVER windowSpec)? #functionCall
| identifier ARROW expression #lambda
| LEFT_PAREN identifier (COMMA identifier)+ RIGHT_PAREN ARROW expression #lambda
| value=primaryExpression LEFT_BRACKET index=valueExpression RIGHT_BRACKET #subscript
| identifier #columnReference
| base=primaryExpression DOT fieldName=identifier #dereference
| LEFT_PAREN expression RIGHT_PAREN #parenthesizedExpression
| EXTRACT LEFT_PAREN field=identifier FROM source=valueExpression RIGHT_PAREN #extract
| (SUBSTR | SUBSTRING) LEFT_PAREN str=valueExpression (FROM | COMMA) pos=valueExpression
((FOR | COMMA) len=valueExpression)? RIGHT_PAREN #substring
| TRIM LEFT_PAREN trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)?
FROM srcStr=valueExpression RIGHT_PAREN #trim
| OVERLAY LEFT_PAREN input=valueExpression PLACING replace=valueExpression
FROM position=valueExpression (FOR length=valueExpression)? RIGHT_PAREN #overlay
;
literalType
: DATE
| TIMESTAMP | TIMESTAMP_LTZ | TIMESTAMP_NTZ
| INTERVAL
| BINARY_HEX
| unsupportedType=identifier
;
constant
: NULL #nullLiteral
| QUESTION #posParameterLiteral
| COLON identifier #namedParameterLiteral
| interval #intervalLiteral
| literalType stringLit #typeConstructor
| number #numericLiteral
| booleanValue #booleanLiteral
| stringLit+ #stringLiteral
;
comparisonOperator
: EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ
;
arithmeticOperator
: PLUS | MINUS | ASTERISK | SLASH | PERCENT | DIV | TILDE | AMPERSAND | PIPE | CONCAT_PIPE | HAT
;
predicateOperator
: OR | AND | IN | NOT
;
booleanValue
: TRUE | FALSE
;
interval
: INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)
;
errorCapturingMultiUnitsInterval
: body=multiUnitsInterval unitToUnitInterval?
;
multiUnitsInterval
: (intervalValue unit+=unitInMultiUnits)+
;
errorCapturingUnitToUnitInterval
: body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)?
;
unitToUnitInterval
: value=intervalValue from=unitInUnitToUnit TO to=unitInUnitToUnit
;
intervalValue
: (PLUS | MINUS)?
(INTEGER_VALUE | DECIMAL_VALUE | stringLit)
;
unitInMultiUnits
: NANOSECOND | NANOSECONDS | MICROSECOND | MICROSECONDS | MILLISECOND | MILLISECONDS
| SECOND | SECONDS | MINUTE | MINUTES | HOUR | HOURS | DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS
;
unitInUnitToUnit
: SECOND | MINUTE | HOUR | DAY | MONTH | YEAR
;
colPosition
: position=FIRST | position=AFTER afterCol=errorCapturingIdentifier
;
collateClause
: COLLATE collationName=identifier
;
type
: BOOLEAN
| TINYINT | BYTE
| SMALLINT | SHORT
| INT | INTEGER
| BIGINT | LONG
| FLOAT | REAL
| DOUBLE
| DATE
| TIMESTAMP | TIMESTAMP_NTZ | TIMESTAMP_LTZ
| STRING collateClause?
| CHARACTER | CHAR
| VARCHAR
| BINARY
| DECIMAL | DEC | NUMERIC
| VOID
| INTERVAL
| VARIANT
| ARRAY | STRUCT | MAP
| unsupportedType=identifier
;
dataType
: complex=ARRAY LT dataType GT #complexDataType
| complex=MAP LT dataType COMMA dataType GT #complexDataType
| complex=STRUCT (LT complexColTypeList? GT | NEQ) #complexDataType
| INTERVAL from=(YEAR | MONTH) (TO to=MONTH)? #yearMonthIntervalDataType
| INTERVAL from=(DAY | HOUR | MINUTE | SECOND)
(TO to=(HOUR | MINUTE | SECOND))? #dayTimeIntervalDataType
| type (LEFT_PAREN INTEGER_VALUE
(COMMA INTEGER_VALUE)* RIGHT_PAREN)? #primitiveDataType
;
qualifiedColTypeWithPositionList
: qualifiedColTypeWithPosition (COMMA qualifiedColTypeWithPosition)*
;
qualifiedColTypeWithPosition
: name=multipartIdentifier dataType colDefinitionDescriptorWithPosition*
;
colDefinitionDescriptorWithPosition
: errorCapturingNot NULL
| defaultExpression
| commentSpec
| colPosition
;
defaultExpression
: DEFAULT expression
;
variableDefaultExpression
: (DEFAULT | EQ) expression
;
colTypeList
: colType (COMMA colType)*
;
colType
: colName=errorCapturingIdentifier dataType (errorCapturingNot NULL)? commentSpec?
;
createOrReplaceTableColTypeList
: createOrReplaceTableColType (COMMA createOrReplaceTableColType)*
;
createOrReplaceTableColType
: colName=errorCapturingIdentifier dataType colDefinitionOption*
;
colDefinitionOption
: errorCapturingNot NULL
| defaultExpression
| generationExpression
| commentSpec
;
generationExpression
: GENERATED ALWAYS AS LEFT_PAREN expression RIGHT_PAREN
;
complexColTypeList
: complexColType (COMMA complexColType)*
;
complexColType
: errorCapturingIdentifier COLON? dataType (errorCapturingNot NULL)? commentSpec?
;
whenClause
: WHEN condition=expression THEN result=expression
;
windowClause
: WINDOW namedWindow (COMMA namedWindow)*
;
namedWindow
: name=errorCapturingIdentifier AS windowSpec
;
windowSpec
: name=errorCapturingIdentifier #windowRef
| LEFT_PAREN name=errorCapturingIdentifier RIGHT_PAREN #windowRef
| LEFT_PAREN
( CLUSTER BY partition+=expression (COMMA partition+=expression)*
| ((PARTITION | DISTRIBUTE) BY partition+=expression (COMMA partition+=expression)*)?
((ORDER | SORT) BY sortItem (COMMA sortItem)*)?)
windowFrame?
RIGHT_PAREN #windowDef
;
windowFrame
: frameType=RANGE start=frameBound
| frameType=ROWS start=frameBound
| frameType=RANGE BETWEEN start=frameBound AND end=frameBound
| frameType=ROWS BETWEEN start=frameBound AND end=frameBound
;
frameBound
: UNBOUNDED boundType=(PRECEDING | FOLLOWING)
| boundType=CURRENT ROW
| expression boundType=(PRECEDING | FOLLOWING)
;
qualifiedNameList
: qualifiedName (COMMA qualifiedName)*
;
functionName
: IDENTIFIER_KW LEFT_PAREN expression RIGHT_PAREN
| identFunc=IDENTIFIER_KW // IDENTIFIER itself is also a valid function name.
| qualifiedName
| FILTER
| LEFT
| RIGHT
;
qualifiedName
: identifier (DOT identifier)*
;
// this rule is used for explicitly capturing wrong identifiers such as test-table, which should actually be `test-table`
// replace identifier with errorCapturingIdentifier where the immediate follow symbol is not an expression, otherwise
// valid expressions such as "a-b" can be recognized as an identifier
errorCapturingIdentifier
: identifier errorCapturingIdentifierExtra
;
// extra left-factoring grammar
errorCapturingIdentifierExtra
: (MINUS identifier)+ #errorIdent
| #realIdent
;
identifier
: strictIdentifier
| {!SQL_standard_keyword_behavior}? strictNonReserved
;
strictIdentifier
: IDENTIFIER #unquotedIdentifier
| quotedIdentifier #quotedIdentifierAlternative
| {SQL_standard_keyword_behavior}? ansiNonReserved #unquotedIdentifier
| {!SQL_standard_keyword_behavior}? nonReserved #unquotedIdentifier
;
quotedIdentifier
: BACKQUOTED_IDENTIFIER
| {double_quoted_identifiers}? DOUBLEQUOTED_STRING
;
backQuotedIdentifier
: BACKQUOTED_IDENTIFIER
;
number
: {!legacy_exponent_literal_as_decimal_enabled}? MINUS? EXPONENT_VALUE #exponentLiteral
| {!legacy_exponent_literal_as_decimal_enabled}? MINUS? DECIMAL_VALUE #decimalLiteral
| {legacy_exponent_literal_as_decimal_enabled}? MINUS? (EXPONENT_VALUE | DECIMAL_VALUE) #legacyDecimalLiteral
| MINUS? INTEGER_VALUE #integerLiteral
| MINUS? BIGINT_LITERAL #bigIntLiteral
| MINUS? SMALLINT_LITERAL #smallIntLiteral
| MINUS? TINYINT_LITERAL #tinyIntLiteral
| MINUS? DOUBLE_LITERAL #doubleLiteral
| MINUS? FLOAT_LITERAL #floatLiteral
| MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral
;
alterColumnAction
: TYPE dataType
| commentSpec
| colPosition
| setOrDrop=(SET | DROP) errorCapturingNot NULL
| SET defaultExpression
| dropDefault=DROP DEFAULT
;
stringLit
: STRING_LITERAL
| {!double_quoted_identifiers}? DOUBLEQUOTED_STRING
;
comment
: stringLit
| NULL
;
version
: INTEGER_VALUE
| stringLit
;
// When `SQL_standard_keyword_behavior=true`, there are 2 kinds of keywords in Spark SQL.
// - Reserved keywords:
// Keywords that are reserved and can't be used as identifiers for table, view, column,
// function, alias, etc.
// - Non-reserved keywords:
// Keywords that have a special meaning only in particular contexts and can be used as
// identifiers in other contexts. For example, `EXPLAIN SELECT ...` is a command, but EXPLAIN
// can be used as identifiers in other places.
// You can find the full keywords list by searching "Start of the keywords list" in this file.
// The non-reserved keywords are listed below. Keywords not in this list are reserved keywords.
ansiNonReserved
//--ANSI-NON-RESERVED-START
: ADD
| AFTER
| ALTER
| ALWAYS
| ANALYZE
| ANTI
| ANY_VALUE
| ARCHIVE
| ARRAY
| ASC
| AT
| BETWEEN
| BIGINT
| BINARY
| BINARY_HEX
| BOOLEAN
| BUCKET
| BUCKETS
| BY
| BYTE
| CACHE
| CASCADE
| CATALOG
| CATALOGS
| CHANGE
| CHAR
| CHARACTER
| CLEAR
| CLUSTER
| CLUSTERED
| CODEGEN
| COLLECTION
| COLUMNS
| COMMENT
| COMMIT
| COMPACT
| COMPACTIONS
| COMPUTE
| CONCATENATE
| COST
| CUBE
| CURRENT
| DATA
| DATABASE
| DATABASES
| DATE
| DATEADD
| DATE_ADD
| DATEDIFF
| DATE_DIFF
| DAY
| DAYS
| DAYOFYEAR
| DBPROPERTIES
| DEC
| DECIMAL
| DECLARE
| DEFAULT
| DEFINED
| DELETE
| DELIMITED
| DESC
| DESCRIBE
| DFS
| DIRECTORIES
| DIRECTORY
| DISTRIBUTE
| DIV
| DOUBLE
| DROP
| ESCAPED
| EVOLUTION
| EXCHANGE
| EXCLUDE
| EXISTS
| EXPLAIN
| EXPORT
| EXTENDED
| EXTERNAL
| EXTRACT
| FIELDS
| FILEFORMAT
| FIRST
| FLOAT
| FOLLOWING
| FORMAT
| FORMATTED
| FUNCTION
| FUNCTIONS
| GENERATED
| GLOBAL
| GROUPING
| HOUR
| HOURS
| IDENTIFIER_KW
| IF
| IGNORE
| IMMEDIATE
| IMPORT
| INCLUDE
| INDEX
| INDEXES
| INPATH
| INPUTFORMAT
| INSERT
| INT
| INTEGER
| INTERVAL
| ITEMS
| KEYS
| LAST
| LAZY
| LIKE
| ILIKE
| LIMIT
| LINES
| LIST
| LOAD
| LOCAL
| LOCATION
| LOCK
| LOCKS
| LOGICAL
| LONG
| MACRO
| MAP
| MATCHED
| MERGE
| MICROSECOND
| MICROSECONDS
| MILLISECOND
| MILLISECONDS
| MINUTE
| MINUTES
| MONTH
| MONTHS
| MSCK
| NAME
| NAMESPACE
| NAMESPACES
| NANOSECOND
| NANOSECONDS
| NO
| NULLS
| NUMERIC
| OF
| OPTION
| OPTIONS
| OUT
| OUTPUTFORMAT
| OVER
| OVERLAY
| OVERWRITE
| PARTITION
| PARTITIONED
| PARTITIONS
| PERCENTLIT
| PIVOT
| PLACING
| POSITION
| PRECEDING
| PRINCIPALS
| PROPERTIES
| PURGE
| QUARTER
| QUERY
| RANGE
| REAL
| RECORDREADER
| RECORDWRITER
| RECOVER
| REDUCE
| REFRESH
| RENAME
| REPAIR
| REPEATABLE
| REPLACE
| RESET
| RESPECT
| RESTRICT
| REVOKE
| RLIKE
| ROLE
| ROLES
| ROLLBACK
| ROLLUP
| ROW
| ROWS
| SCHEMA
| SCHEMAS
| SECOND
| SECONDS
| SEMI
| SEPARATED
| SERDE
| SERDEPROPERTIES
| SET
| SETMINUS
| SETS
| SHORT
| SHOW
| SINGLE
| SKEWED
| SMALLINT
| SORT
| SORTED
| SOURCE
| START
| STATISTICS
| STORED
| STRATIFY
| STRING
| STRUCT
| SUBSTR
| SUBSTRING
| SYNC
| SYSTEM_TIME
| SYSTEM_VERSION
| TABLES
| TABLESAMPLE
| TARGET
| TBLPROPERTIES
| TEMPORARY
| TERMINATED
| TIMEDIFF
| TIMESTAMP
| TIMESTAMP_LTZ
| TIMESTAMP_NTZ
| TIMESTAMPADD
| TIMESTAMPDIFF
| TINYINT
| TOUCH
| TRANSACTION
| TRANSACTIONS
| TRANSFORM
| TRIM
| TRUE
| TRUNCATE
| TRY_CAST
| TYPE
| UNARCHIVE
| UNBOUNDED
| UNCACHE
| UNLOCK
| UNPIVOT
| UNSET
| UPDATE
| USE
| VALUES
| VARCHAR
| VAR
| VARIABLE
| VARIANT
| VERSION
| VIEW
| VIEWS
| VOID
| WEEK
| WEEKS
| WINDOW
| YEAR
| YEARS
| ZONE
//--ANSI-NON-RESERVED-END
;
// When `SQL_standard_keyword_behavior=false`, there are 2 kinds of keywords in Spark SQL.
// - Non-reserved keywords:
// Same definition as the one when `SQL_standard_keyword_behavior=true`.
// - Strict-non-reserved keywords:
// A strict version of non-reserved keywords, which can not be used as table alias.
// You can find the full keywords list by searching "Start of the keywords list" in this file.
// The strict-non-reserved keywords are listed in `strictNonReserved`.
// The non-reserved keywords are listed in `nonReserved`.
// These 2 together contain all the keywords.
strictNonReserved
: ANTI
| CROSS
| EXCEPT
| FULL
| INNER
| INTERSECT
| JOIN
| LATERAL
| LEFT
| NATURAL
| ON
| RIGHT
| SEMI
| SETMINUS
| UNION
| USING
;
nonReserved
//--DEFAULT-NON-RESERVED-START
: ADD
| AFTER
| ALL
| ALTER
| ALWAYS
| ANALYZE
| AND
| ANY
| ANY_VALUE
| ARCHIVE
| ARRAY
| AS
| ASC
| AT
| AUTHORIZATION
| BETWEEN
| BIGINT
| BINARY
| BINARY_HEX
| BOOLEAN
| BOTH
| BUCKET
| BUCKETS
| BY
| BYTE
| CACHE
| CASCADE
| CASE
| CAST
| CATALOG
| CATALOGS
| CHANGE
| CHAR
| CHARACTER
| CHECK
| CLEAR
| CLUSTER
| CLUSTERED
| CODEGEN
| COLLATE
| COLLATION
| COLLECTION
| COLUMN
| COLUMNS
| COMMENT
| COMMIT
| COMPACT
| COMPACTIONS
| COMPUTE
| CONCATENATE
| CONSTRAINT
| COST
| CREATE
| CUBE
| CURRENT
| CURRENT_DATE
| CURRENT_TIME
| CURRENT_TIMESTAMP
| CURRENT_USER
| DATA
| DATABASE
| DATABASES
| DATE
| DATEADD
| DATE_ADD
| DATEDIFF
| DATE_DIFF
| DAY
| DAYS
| DAYOFYEAR
| DBPROPERTIES
| DEC
| DECIMAL
| DECLARE
| DEFAULT
| DEFINED
| DELETE
| DELIMITED
| DESC
| DESCRIBE
| DFS
| DIRECTORIES
| DIRECTORY
| DISTINCT
| DISTRIBUTE
| DIV
| DOUBLE
| DROP
| ELSE
| END
| ESCAPE
| ESCAPED
| EVOLUTION
| EXCHANGE
| EXCLUDE
| EXECUTE
| EXISTS
| EXPLAIN
| EXPORT
| EXTENDED
| EXTERNAL
| EXTRACT
| FALSE
| FETCH
| FILTER
| FIELDS
| FILEFORMAT
| FIRST
| FLOAT
| FOLLOWING
| FOR
| FOREIGN
| FORMAT
| FORMATTED
| FROM
| FUNCTION
| FUNCTIONS
| GENERATED
| GLOBAL
| GRANT
| GROUP
| GROUPING
| HAVING
| HOUR
| HOURS
| IDENTIFIER_KW
| IF
| IGNORE
| IMMEDIATE
| IMPORT
| IN
| INCLUDE
| INDEX
| INDEXES
| INPATH
| INPUTFORMAT
| INSERT
| INT
| INTEGER
| INTERVAL
| INTO
| IS
| ITEMS
| KEYS
| LAST
| LAZY
| LEADING
| LIKE
| LONG
| ILIKE
| LIMIT
| LINES
| LIST
| LOAD
| LOCAL
| LOCATION
| LOCK
| LOCKS
| LOGICAL
| LONG
| MACRO
| MAP
| MATCHED
| MERGE
| MICROSECOND
| MICROSECONDS
| MILLISECOND
| MILLISECONDS
| MINUTE
| MINUTES
| MONTH
| MONTHS
| MSCK
| NAME
| NAMESPACE
| NAMESPACES
| NANOSECOND
| NANOSECONDS
| NO
| NOT
| NULL
| NULLS
| NUMERIC
| OF
| OFFSET
| ONLY
| OPTION
| OPTIONS
| OR
| ORDER
| OUT
| OUTER
| OUTPUTFORMAT
| OVER
| OVERLAPS
| OVERLAY
| OVERWRITE
| PARTITION
| PARTITIONED
| PARTITIONS
| PERCENTLIT
| PIVOT
| PLACING
| POSITION
| PRECEDING
| PRIMARY
| PRINCIPALS
| PROPERTIES
| PURGE
| QUARTER
| QUERY
| RANGE
| REAL
| RECORDREADER
| RECORDWRITER
| RECOVER
| REDUCE
| REFERENCES
| REFRESH
| RENAME
| REPAIR
| REPEATABLE
| REPLACE
| RESET
| RESPECT
| RESTRICT
| REVOKE
| RLIKE
| ROLE
| ROLES
| ROLLBACK
| ROLLUP
| ROW
| ROWS
| SCHEMA
| SCHEMAS
| SECOND
| SECONDS
| SELECT
| SEPARATED
| SERDE
| SERDEPROPERTIES
| SESSION_USER
| SET
| SETS
| SHORT
| SHOW
| SINGLE
| SKEWED
| SMALLINT
| SOME
| SORT
| SORTED
| SOURCE
| START
| STATISTICS
| STORED
| STRATIFY
| STRING
| STRUCT
| SUBSTR
| SUBSTRING
| SYNC
| SYSTEM_TIME
| SYSTEM_VERSION
| TABLE
| TABLES
| TABLESAMPLE
| TARGET
| TBLPROPERTIES
| TEMPORARY
| TERMINATED
| THEN
| TIME
| TIMEDIFF
| TIMESTAMP
| TIMESTAMP_LTZ
| TIMESTAMP_NTZ
| TIMESTAMPADD
| TIMESTAMPDIFF
| TINYINT
| TO
| TOUCH
| TRAILING
| TRANSACTION
| TRANSACTIONS
| TRANSFORM
| TRIM
| TRUE
| TRUNCATE
| TRY_CAST
| TYPE
| UNARCHIVE
| UNBOUNDED
| UNCACHE
| UNIQUE
| UNKNOWN
| UNLOCK
| UNPIVOT
| UNSET
| UPDATE
| USE
| USER
| VALUES
| VARCHAR
| VAR
| VARIABLE
| VARIANT
| VERSION
| VIEW
| VIEWS
| VOID
| WEEK
| WEEKS
| WHEN
| WHERE
| WINDOW
| WITH
| WITHIN
| YEAR
| YEARS
| ZONE
//--DEFAULT-NON-RESERVED-END
;