lava-oushudb-dt-sql-parser/src/grammar/spark/SparkSqlParser.g4
Hayden 31a811d1bb
Feat column codeCompletion (#218)
* feat: flink support column suggestion

* feat: flink column suggestion unit test

* feat: hive support column suggestion

* feat: hive column suggestion unit test

* feat: trinosql support column suggestion

* feat: trino column suggest unit test

* feat: sparksql collect column suggesstion

* feat: spark column suggestion unit test

* feat: rebuild flinksql lib
2023-11-28 21:18:44 +08:00

1912 lines
48 KiB
ANTLR

/*
* 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 spark's spark/sql/api/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4 grammar.
* Reference: https://github.com/apache/spark/blob/master/sql/api/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4
*/
parser grammar SparkSqlParser;
options { tokenVocab = SparkSqlLexer; }
program
: singleStatement* EOF
;
singleStatement
: statement SEMICOLON ?
;
statement
: query
| ctes? dmlStatementNoWith
| KW_USE dbSchemaName
| KW_USE dbSchema dbSchemaName
| KW_SET KW_CATALOG (identifier | stringLit)
| KW_CREATE dbSchema (ifNotExists)? dbSchemaNameCreate
(commentSpec |
locationSpec |
(KW_WITH (KW_DBPROPERTIES | KW_PROPERTIES) propertyList))*
| KW_ALTER dbSchema dbSchemaName
KW_SET (KW_DBPROPERTIES | KW_PROPERTIES) propertyList
| KW_ALTER dbSchema dbSchemaName
KW_SET locationSpec
| KW_DROP dbSchema (ifExists)? dbSchemaName
(KW_RESTRICT | KW_CASCADE)?
| KW_SHOW dbSchemas ((KW_FROM | KW_IN) multipartIdentifier)?
(KW_LIKE? pattern=stringLit)?
| createTableHeader (LEFT_PAREN createOrReplaceTableColTypeList RIGHT_PAREN)? tableProvider?
createTableClauses
(KW_AS? query)?
| KW_CREATE KW_TABLE (ifNotExists)? target=tableNameCreate
KW_LIKE source=tableName
(tableProvider |
rowFormat |
createFileFormat |
locationSpec |
(KW_TBLPROPERTIES tableProps=propertyList))*
| replaceTableHeader (LEFT_PAREN createOrReplaceTableColTypeList RIGHT_PAREN)? tableProvider?
createTableClauses
(KW_AS? query)?
| KW_ANALYZE KW_TABLE tableName partitionSpec? KW_COMPUTE KW_STATISTICS
(KW_NOSCAN | KW_FOR KW_COLUMNS columnNameSeq | KW_FOR KW_ALL KW_COLUMNS)?
| KW_ANALYZE KW_TABLES ((KW_FROM | KW_IN) dbSchemaName)? KW_COMPUTE KW_STATISTICS
(KW_NOSCAN)?
| KW_ALTER KW_TABLE tableName
KW_ADD KW_COLUMN qualifiedColTypeWithPositionForAdd
| KW_ALTER KW_TABLE tableName
KW_ADD KW_COLUMNS LEFT_PAREN qualifiedColTypeWithPositionSeqForAdd RIGHT_PAREN
| KW_ALTER KW_TABLE table=tableName
KW_RENAME KW_COLUMN columnName KW_TO columnNameCreate
| KW_ALTER KW_TABLE tableName
KW_DROP KW_COLUMN (ifExists)? columnName
| KW_ALTER KW_TABLE tableName
KW_DROP KW_COLUMNS (ifExists)? LEFT_PAREN columnNameSeq RIGHT_PAREN
| KW_ALTER (KW_TABLE tableName | KW_VIEW viewName)
KW_RENAME KW_TO multipartIdentifier
| KW_ALTER (KW_TABLE tableName | KW_VIEW viewName)
KW_SET KW_TBLPROPERTIES propertyList
| KW_ALTER (KW_TABLE tableName | KW_VIEW viewName)
KW_UNSET KW_TBLPROPERTIES (ifExists)? propertyList
| KW_ALTER KW_TABLE table=tableName
(KW_ALTER | KW_CHANGE) KW_COLUMN? column=columnName
alterColumnAction?
| KW_ALTER KW_TABLE table=tableName partitionSpec?
KW_CHANGE KW_COLUMN?
colName=columnName colType colPosition?
| KW_ALTER KW_TABLE table=tableName partitionSpec?
KW_REPLACE KW_COLUMNS
LEFT_PAREN qualifiedColTypeWithPositionSeqForReplace
RIGHT_PAREN
| KW_ALTER KW_TABLE tableName (partitionSpec)?
KW_SET KW_SERDE stringLit (KW_WITH KW_SERDEPROPERTIES propertyList)?
| KW_ALTER KW_TABLE tableName (partitionSpec)?
KW_SET KW_SERDEPROPERTIES propertyList
| KW_ALTER (KW_TABLE tableName | KW_VIEW viewName) KW_ADD (ifNotExists)?
partitionSpecLocation+
| KW_ALTER KW_TABLE tableName
partitionSpec KW_RENAME KW_TO partitionSpec
| KW_ALTER (KW_TABLE tableName | KW_VIEW viewName)
KW_DROP (ifExists)? partitionSpec (COMMA partitionSpec)* KW_PURGE?
| KW_ALTER KW_TABLE tableName
(partitionSpec)? KW_SET locationSpec
| KW_ALTER KW_TABLE tableName KW_RECOVER KW_PARTITIONS
| KW_DROP KW_TABLE (ifExists)? tableName KW_PURGE?
| KW_DROP KW_VIEW (ifExists)? viewName
| KW_CREATE (KW_OR KW_REPLACE)? (KW_GLOBAL? KW_TEMPORARY)?
KW_VIEW (ifNotExists)? viewNameCreate
identifierCommentList?
(commentSpec |
(KW_PARTITIONED KW_ON identifierList) |
(KW_TBLPROPERTIES propertyList))*
KW_AS query
| KW_CREATE (KW_OR KW_REPLACE)? KW_GLOBAL? KW_TEMPORARY KW_VIEW
viewNameCreate (LEFT_PAREN colTypeList RIGHT_PAREN)? tableProvider
(KW_OPTIONS propertyList)?
| KW_ALTER KW_VIEW viewName KW_AS? query
| KW_CREATE (KW_OR KW_REPLACE)? KW_TEMPORARY? KW_FUNCTION (ifNotExists)?
functionNameCreate KW_AS className=stringLit
(KW_USING resource (COMMA resource)*)?
| KW_DROP KW_TEMPORARY? KW_FUNCTION (ifExists)? functionName
| KW_DECLARE (KW_OR KW_REPLACE)? KW_VARIABLE?
functionName dataType? variableDefaultExpression?
| KW_DROP KW_TEMPORARY KW_VARIABLE (ifExists)? (tableName | viewName | functionName)
| KW_EXPLAIN (KW_LOGICAL | KW_FORMATTED | KW_EXTENDED | KW_CODEGEN | KW_COST)?
statement
| KW_SHOW KW_TABLES ((KW_FROM | KW_IN) dbSchemaName)?
(KW_LIKE? pattern=stringLit)?
| KW_SHOW KW_TABLE KW_EXTENDED ((KW_FROM | KW_IN) ns=dbSchemaName)?
KW_LIKE pattern=stringLit partitionSpec?
| KW_SHOW KW_TBLPROPERTIES table=tableName
(LEFT_PAREN key=propertyKey RIGHT_PAREN)?
| KW_SHOW KW_COLUMNS (KW_FROM | KW_IN) table=tableName
((KW_FROM | KW_IN) dbSchemaName)?
| KW_SHOW KW_VIEWS ((KW_FROM | KW_IN) dbSchemaName)?
(KW_LIKE? pattern=stringLit)?
| KW_SHOW KW_PARTITIONS tableName partitionSpec?
| KW_SHOW functionKind? KW_FUNCTIONS ((KW_FROM | KW_IN) ns=dbSchemaName)?
(KW_LIKE? (legacy=multipartIdentifier | pattern=stringLit))?
| KW_SHOW KW_CREATE KW_TABLE tableName (KW_AS KW_SERDE)?
| KW_SHOW KW_CURRENT dbSchema
| KW_SHOW KW_CATALOGS (KW_LIKE? pattern=stringLit)?
| (KW_DESC | KW_DESCRIBE) KW_FUNCTION KW_EXTENDED? describeFuncName
| (KW_DESC | KW_DESCRIBE) KW_DATABASE KW_EXTENDED? dbSchemaName
| (KW_DESC | KW_DESCRIBE) KW_TABLE? option=(KW_EXTENDED | KW_FORMATTED)?
tableName partitionSpec? describeColName?
| (KW_DESC | KW_DESCRIBE) KW_QUERY? query
| KW_COMMENT KW_ON dbSchema dbSchemaName KW_IS
comment
| KW_COMMENT KW_ON KW_TABLE tableName KW_IS comment
| KW_REFRESH KW_TABLE tableName
| KW_REFRESH KW_FUNCTION functionName
| KW_REFRESH (stringLit | .*?)
| KW_CACHE KW_LAZY? KW_TABLE tableName
(KW_OPTIONS options=propertyList)? (KW_AS? query)?
| KW_UNCACHE KW_TABLE (ifExists)? tableName
| KW_CLEAR KW_CACHE
| KW_LOAD KW_DATA KW_LOCAL? KW_INPATH path=stringLit KW_OVERWRITE? KW_INTO KW_TABLE
tableName partitionSpec?
| KW_TRUNCATE KW_TABLE tableName partitionSpec?
| (KW_MSCK)? KW_REPAIR KW_TABLE tableName
(option=(KW_ADD|KW_DROP|KW_SYNC) KW_PARTITIONS)?
| op=(KW_ADD | KW_LIST) identifier .*?
| KW_SET KW_ROLE .*?
| KW_SET KW_TIME KW_ZONE interval
| KW_SET KW_TIME KW_ZONE timezone
| KW_SET KW_TIME KW_ZONE .*?
| KW_SET (KW_VARIABLE | KW_VAR) assignmentList
| KW_SET (KW_VARIABLE | KW_VAR) LEFT_PAREN multipartIdentifierList RIGHT_PAREN EQ
LEFT_PAREN query RIGHT_PAREN
| KW_SET configKey EQ configValue
| KW_SET configKey (EQ .*?)?
| KW_SET .*? EQ configValue
| KW_SET .*?
| KW_RESET configKey
| KW_RESET .*?
| KW_CREATE KW_INDEX (ifNotExists)? identifier KW_ON KW_TABLE?
tableName (KW_USING indexType=identifier)?
LEFT_PAREN multipartIdentifierPropertyList RIGHT_PAREN
(KW_OPTIONS options=propertyList)?
| KW_DROP KW_INDEX (ifExists)? identifier KW_ON KW_TABLE? tableName
| unsupportedHiveNativeCommands .*?
;
timezone
: stringLit
| KW_LOCAL
;
configKey
: quotedIdentifier
;
configValue
: backQuotedIdentifier
;
unsupportedHiveNativeCommands
: kw1=KW_CREATE kw2=KW_ROLE
| kw1=KW_DROP kw2=KW_ROLE
| kw1=KW_GRANT kw2=KW_ROLE?
| kw1=KW_REVOKE kw2=KW_ROLE?
| kw1=KW_SHOW kw2=KW_GRANT
| kw1=KW_SHOW kw2=KW_ROLE kw3=KW_GRANT?
| kw1=KW_SHOW kw2=KW_PRINCIPALS
| kw1=KW_SHOW kw2=KW_ROLES
| kw1=KW_SHOW kw2=KW_CURRENT kw3=KW_ROLES
| kw1=KW_EXPORT kw2=KW_TABLE
| kw1=KW_IMPORT kw2=KW_TABLE
| kw1=KW_SHOW kw2=KW_COMPACTIONS
| kw1=KW_SHOW kw2=KW_CREATE kw3=KW_TABLE
| kw1=KW_SHOW kw2=KW_TRANSACTIONS
| kw1=KW_SHOW kw2=KW_INDEXES
| kw1=KW_SHOW kw2=KW_LOCKS
| kw1=KW_CREATE kw2=KW_INDEX
| kw1=KW_DROP kw2=KW_INDEX
| kw1=KW_ALTER kw2=KW_INDEX
| kw1=KW_LOCK kw2=KW_TABLE
| kw1=KW_LOCK kw2=KW_DATABASE
| kw1=KW_UNLOCK kw2=KW_TABLE
| kw1=KW_UNLOCK kw2=KW_DATABASE
| kw1=KW_CREATE kw2=KW_TEMPORARY kw3=KW_MACRO
| kw1=KW_DROP kw2=KW_TEMPORARY kw3=KW_MACRO
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_NOT kw4=KW_CLUSTERED
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_CLUSTERED kw4=KW_BY
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_NOT kw4=KW_SORTED
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_SKEWED kw4=KW_BY
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_NOT kw4=KW_SKEWED
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_NOT kw4=KW_STORED kw5=KW_AS kw6=KW_DIRECTORIES
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_SET kw4=KW_SKEWED kw5=KW_LOCATION
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_EXCHANGE kw4=KW_PARTITION
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_ARCHIVE kw4=KW_PARTITION
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_UNARCHIVE kw4=KW_PARTITION
| kw1=KW_ALTER kw2=KW_TABLE tableName kw3=KW_TOUCH
| kw1=KW_ALTER kw2=KW_TABLE tableName partitionSpec? kw3=KW_COMPACT
| kw1=KW_ALTER kw2=KW_TABLE tableName partitionSpec? kw3=KW_CONCATENATE
| kw1=KW_ALTER kw2=KW_TABLE tableName partitionSpec? kw3=KW_SET kw4=KW_FILEFORMAT
| kw1=KW_ALTER kw2=KW_TABLE tableName partitionSpec? kw3=KW_REPLACE kw4=KW_COLUMNS
| kw1=KW_START kw2=KW_TRANSACTION
| kw1=KW_COMMIT
| kw1=KW_ROLLBACK
| kw1=KW_DFS
;
createTableHeader
: KW_CREATE KW_TEMPORARY? KW_EXTERNAL? KW_TABLE (ifNotExists)? tableNameCreate
;
replaceTableHeader
: (KW_CREATE KW_OR)? KW_REPLACE KW_TABLE tableNameCreate
;
bucketSpec
: KW_CLUSTERED KW_BY identifierList
(KW_SORTED KW_BY orderedIdentifierList)?
KW_INTO INTEGER_VALUE KW_BUCKETS
;
skewSpec
: KW_SKEWED KW_BY identifierList
KW_ON (constantList | nestedConstantList)
(KW_STORED KW_AS KW_DIRECTORIES)?
;
locationSpec
: KW_LOCATION stringLit
;
commentSpec
: KW_COMMENT stringLit
;
query
: ctes? queryTerm queryOrganization
;
insertInto
: KW_INSERT KW_OVERWRITE KW_TABLE? tableName (partitionSpec (ifNotExists)?)? ((KW_BY KW_NAME) | (LEFT_PAREN columnNameSeq RIGHT_PAREN ))?
| KW_INSERT KW_INTO KW_TABLE? tableName partitionSpec? (ifNotExists)? ((KW_BY KW_NAME) | (LEFT_PAREN columnNameSeq RIGHT_PAREN ))?
| KW_INSERT KW_INTO KW_TABLE? tableName KW_REPLACE whereClause
| KW_INSERT KW_OVERWRITE KW_LOCAL? KW_DIRECTORY path=stringLit rowFormat? createFileFormat?
| KW_INSERT KW_OVERWRITE KW_LOCAL? KW_DIRECTORY (path=stringLit)? tableProvider (KW_OPTIONS options=propertyList)?
;
partitionSpecLocation
: partitionSpec locationSpec?
;
partitionSpec
: KW_PARTITION LEFT_PAREN partitionVal (COMMA partitionVal)* RIGHT_PAREN
;
partitionVal
: identifier (EQ constant)?
| identifier EQ KW_DEFAULT
;
dbSchema
: KW_NAMESPACE
| KW_DATABASE
| KW_SCHEMA
;
dbSchemas
: KW_NAMESPACES
| KW_DATABASES
| KW_SCHEMAS
;
describeFuncName
: identifierReference
| stringLit
| comparisonOperator
| arithmeticOperator
| predicateOperator
;
describeColName
: nameParts+=identifier (DOT nameParts+=identifier)*
;
ctes
: KW_WITH namedQuery (COMMA namedQuery)*
;
namedQuery
: name=errorCapturingIdentifier (columnAliases=identifierList)? KW_AS? LEFT_PAREN query RIGHT_PAREN
;
tableProvider
: KW_USING multipartIdentifier
;
createTableClauses
:((KW_OPTIONS options=expressionPropertyList) |
(KW_PARTITIONED KW_BY partitioning=partitionFieldList) |
skewSpec |
bucketSpec |
rowFormat |
createFileFormat |
locationSpec |
commentSpec |
(KW_TBLPROPERTIES tableProps=propertyList))*
;
propertyList
: LEFT_PAREN property (COMMA property)* RIGHT_PAREN
;
property
: key=propertyKey (EQ? value=propertyValue)?
;
propertyKey
: identifier (DOT identifier)*
| 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
: KW_STORED KW_AS fileFormat
| KW_STORED KW_BY storageHandler
;
fileFormat
: KW_INPUTFORMAT inFmt=stringLit KW_OUTPUTFORMAT outFmt=stringLit
| identifier
;
storageHandler
: stringLit (KW_WITH KW_SERDEPROPERTIES propertyList)?
;
resource
: identifier stringLit
;
dmlStatementNoWith
: insertInto query
| fromClause multiInsertQueryBody+
| KW_DELETE KW_FROM tableName tableAlias whereClause?
| KW_UPDATE tableName tableAlias setClause whereClause?
| KW_MERGE KW_INTO target=tableName targetAlias=tableAlias
KW_USING (source=identifierReference |
LEFT_PAREN sourceQuery=query RIGHT_PAREN) sourceAlias=tableAlias
KW_ON mergeCondition=booleanExpression
matchedClause*
notMatchedClause*
notMatchedBySourceClause*
;
dbSchemaName: identifierReference;
dbSchemaNameCreate: identifierReference;
tableNameCreate: tableIdentifier;
tableName: tableIdentifier;
viewNameCreate: viewIdentifier;
viewName: viewIdentifier;
columnName: multipartIdentifier;
columnNameSeq: columnName (COMMA columnName)* ;
columnNameCreate: errorCapturingIdentifier;
identifierReference
: KW_IDENTIFIER LEFT_PAREN expression RIGHT_PAREN
| multipartIdentifier
;
queryOrganization
: (KW_ORDER KW_BY order+=sortItem (COMMA order+=sortItem)*)?
(KW_CLUSTER KW_BY clusterBy+=expression (COMMA clusterBy+=expression)*)?
(KW_DISTRIBUTE KW_BY distributeBy+=expression (COMMA distributeBy+=expression)*)?
(KW_SORT KW_BY sort+=sortItem (COMMA sort+=sortItem)*)?
windowClause?
(KW_LIMIT (KW_ALL | limit=expression))?
(KW_OFFSET offset=expression)?
;
multiInsertQueryBody
: insertInto fromStatementBody
;
queryTerm
: queryPrimary
| left=queryTerm
operator=(KW_INTERSECT | KW_UNION | KW_EXCEPT | KW_MINUS) setQuantifier? right=queryTerm
| left=queryTerm
operator=KW_INTERSECT setQuantifier? right=queryTerm
| left=queryTerm
operator=(KW_UNION | KW_EXCEPT | KW_MINUS) setQuantifier? right=queryTerm
;
queryPrimary
: querySpecification
| fromStatement
| KW_TABLE tableName
| inlineTable
| LEFT_PAREN query RIGHT_PAREN
;
sortItem
: (columnName | expression) ordering=(KW_ASC | KW_DESC)? (KW_NULLS nullOrder=(KW_LAST | KW_FIRST))?
;
fromStatement
: fromClause fromStatementBody+
;
fromStatementBody
: transformClause
whereClause?
queryOrganization
| selectClause
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause?
queryOrganization
;
querySpecification
: transformClause
fromClause?
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause?
| selectClause
fromClause?
lateralView*
whereClause?
aggregationClause?
havingClause?
windowClause?
;
transformClause
: (KW_SELECT kind=KW_TRANSFORM LEFT_PAREN setQuantifier? expressionSeq RIGHT_PAREN
| kind=KW_MAP setQuantifier? expressionSeq
| kind=KW_REDUCE setQuantifier? expressionSeq)
inRowFormat=rowFormat?
(KW_RECORDWRITER recordWriter=stringLit)?
KW_USING script=stringLit
(KW_AS (identifierSeq | colTypeList | (LEFT_PAREN (identifierSeq | colTypeList) RIGHT_PAREN)))?
outRowFormat=rowFormat?
(KW_RECORDREADER recordReader=stringLit)?
;
selectClause
: KW_SELECT (hints+=hint)* setQuantifier? namedExpressionSeq
;
setClause
: KW_SET assignmentList
;
matchedClause
: KW_WHEN KW_MATCHED (KW_AND matchedCond=booleanExpression)? KW_THEN matchedAction
;
notMatchedClause
: KW_WHEN KW_NOT KW_MATCHED (KW_BY KW_TARGET)? (KW_AND notMatchedCond=booleanExpression)? KW_THEN notMatchedAction
;
notMatchedBySourceClause
: KW_WHEN KW_NOT KW_MATCHED KW_BY KW_SOURCE (KW_AND notMatchedBySourceCond=booleanExpression)? KW_THEN notMatchedBySourceAction
;
matchedAction
: KW_DELETE
| KW_UPDATE KW_SET ASTERISK
| KW_UPDATE KW_SET assignmentList
;
notMatchedAction
: KW_INSERT ASTERISK
| KW_INSERT LEFT_PAREN multipartIdentifierList RIGHT_PAREN
KW_VALUES LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN
;
notMatchedBySourceAction
: KW_DELETE
| KW_UPDATE KW_SET assignmentList
;
assignmentList
: assignment (COMMA assignment)*
;
assignment
: key=multipartIdentifier EQ value=expression
;
whereClause
: KW_WHERE booleanExpression
;
havingClause
: KW_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
: KW_FROM relation (COMMA relation)* lateralView* pivotClause? unpivotClause?
;
functionKind
: KW_USER | KW_SYSTEM | KW_ALL
;
temporalClause
: KW_FOR? (KW_SYSTEM_VERSION | KW_VERSION) KW_AS KW_OF version
| KW_FOR? (KW_SYSTEM_TIME | KW_TIMESTAMP) KW_AS KW_OF timestamp=valueExpression
;
aggregationClause
: KW_GROUP KW_BY groupingExpressionsWithGroupingAnalytics+=groupByClause
(COMMA groupingExpressionsWithGroupingAnalytics+=groupByClause)*
| KW_GROUP KW_BY groupingExpressions+=expression (COMMA groupingExpressions+=expression)* (
KW_WITH kind=KW_ROLLUP
| KW_WITH kind=KW_CUBE
| kind=KW_GROUPING KW_SETS LEFT_PAREN groupingSet (COMMA groupingSet)* RIGHT_PAREN)?
;
groupByClause
: columnName
| groupingAnalytics
| expression
;
groupingAnalytics
: (KW_ROLLUP | KW_CUBE) LEFT_PAREN groupingSet (COMMA groupingSet)* RIGHT_PAREN
| KW_GROUPING KW_SETS LEFT_PAREN groupingElement (COMMA groupingElement)* RIGHT_PAREN
;
groupingElement
: groupingAnalytics
| groupingSet
;
groupingSet
: columnName
| expression
| LEFT_PAREN ((columnName | expression) (COMMA (columnName | expression))*)? RIGHT_PAREN
;
pivotClause
: KW_PIVOT LEFT_PAREN aggregates=namedExpressionSeq KW_FOR pivotColumn KW_IN LEFT_PAREN pivotValues+=pivotValue (COMMA pivotValues+=pivotValue)* RIGHT_PAREN RIGHT_PAREN
;
pivotColumn
: identifiers+=identifier
| LEFT_PAREN identifiers+=identifier (COMMA identifiers+=identifier)* RIGHT_PAREN
;
pivotValue
: expression (KW_AS? identifier)?
;
unpivotClause
: KW_UNPIVOT nullOperator=unpivotNullClause? LEFT_PAREN
operator=unpivotOperator
RIGHT_PAREN (KW_AS? identifier)?
;
unpivotNullClause
: (KW_INCLUDE | KW_EXCLUDE) KW_NULLS
;
unpivotOperator
: (unpivotSingleValueColumnClause | unpivotMultiValueColumnClause)
;
unpivotSingleValueColumnClause
: unpivotValueColumn KW_FOR unpivotNameColumn KW_IN LEFT_PAREN unpivotColumns+=unpivotColumnAndAlias (COMMA unpivotColumns+=unpivotColumnAndAlias)* RIGHT_PAREN
;
unpivotMultiValueColumnClause
: LEFT_PAREN unpivotValueColumns+=unpivotValueColumn (COMMA unpivotValueColumns+=unpivotValueColumn)* RIGHT_PAREN
KW_FOR unpivotNameColumn
KW_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
: KW_AS? identifier
;
ifNotExists
: KW_IF KW_NOT KW_EXISTS;
ifExists
: KW_IF KW_EXISTS;
lateralView
: KW_LATERAL KW_VIEW (KW_OUTER)? viewName LEFT_PAREN (expression (COMMA expression)*)? RIGHT_PAREN tableAlias (KW_AS? colName+=identifier (COMMA colName+=identifier)*)?
;
setQuantifier
: KW_DISTINCT
| KW_ALL
;
relation
: KW_LATERAL? relationPrimary relationExtension*
| tableName
;
relationExtension
: joinRelation
| pivotClause
| unpivotClause
;
joinRelation
: (joinType) KW_JOIN KW_LATERAL? right=relationPrimary joinCriteria?
| KW_NATURAL joinType KW_JOIN KW_LATERAL? right=relationPrimary
;
joinType
: KW_INNER?
| KW_CROSS
| KW_LEFT KW_OUTER?
| KW_LEFT? KW_SEMI
| KW_RIGHT KW_OUTER?
| KW_FULL KW_OUTER?
| KW_LEFT? KW_ANTI
;
joinCriteria
: KW_ON booleanExpression
| KW_USING identifierList
;
sample
: KW_TABLESAMPLE LEFT_PAREN sampleMethod? RIGHT_PAREN (KW_REPEATABLE LEFT_PAREN seed=INTEGER_VALUE RIGHT_PAREN)?
;
sampleMethod
: negativeSign=MINUS? percentage=(INTEGER_VALUE | DECIMAL_VALUE) KW_PERCENTLIT
| expression KW_ROWS
| sampleType=KW_BUCKET numerator=INTEGER_VALUE KW_OUT KW_OF denominator=INTEGER_VALUE
(KW_ON (identifier | qualifiedName LEFT_PAREN RIGHT_PAREN))?
| bytes=expression
;
identifierList
: LEFT_PAREN identifierSeq RIGHT_PAREN
;
identifierSeq
: ident+=errorCapturingIdentifier (COMMA ident+=errorCapturingIdentifier)*
;
orderedIdentifierList
: LEFT_PAREN orderedIdentifier (COMMA orderedIdentifier)* RIGHT_PAREN
;
orderedIdentifier
: ident=errorCapturingIdentifier ordering=(KW_ASC | KW_DESC)?
;
identifierCommentList
: LEFT_PAREN identifierComment (COMMA identifierComment)* RIGHT_PAREN
;
identifierComment
: identifier commentSpec?
;
relationPrimary
: identifierReference temporalClause?
sample? tableAlias
| LEFT_PAREN query RIGHT_PAREN sample? tableAlias
| LEFT_PAREN relation RIGHT_PAREN sample? tableAlias
| inlineTable
| functionTable
;
inlineTable
: KW_VALUES expression (COMMA expression)* tableAlias
;
functionTableSubqueryArgument
: KW_TABLE tableName tableArgumentPartitioning?
| KW_TABLE LEFT_PAREN tableName RIGHT_PAREN tableArgumentPartitioning?
| KW_TABLE LEFT_PAREN query RIGHT_PAREN tableArgumentPartitioning?
;
tableArgumentPartitioning
: ((KW_WITH KW_SINGLE KW_PARTITION)
| ((KW_PARTITION | KW_DISTRIBUTE) KW_BY
(((LEFT_PAREN partition+=expression (COMMA partition+=expression)* RIGHT_PAREN))
| partition+=expression)))
((KW_ORDER | KW_SORT) KW_BY
(((LEFT_PAREN sortItem (COMMA sortItem)* RIGHT_PAREN)
| sortItem)))?
;
functionTableNamedArgumentExpression
: key=identifier FAT_ARROW table=functionTableSubqueryArgument
;
functionTableReferenceArgument
: functionTableSubqueryArgument
| functionTableNamedArgumentExpression
;
functionTableArgument
: functionTableReferenceArgument
| functionArgument
;
functionTable
: functionName LEFT_PAREN
(functionTableArgument (COMMA functionTableArgument)*)?
RIGHT_PAREN tableAlias
;
tableAlias
: (KW_AS? strictIdentifier identifierList?)?
;
rowFormat
: KW_ROW KW_FORMAT KW_SERDE name=stringLit (KW_WITH KW_SERDEPROPERTIES props=propertyList)?
| KW_ROW KW_FORMAT KW_DELIMITED
(KW_FIELDS KW_TERMINATED KW_BY fieldsTerminatedBy=stringLit (KW_ESCAPED KW_BY escapedBy=stringLit)?)?
(KW_COLLECTION KW_ITEMS KW_TERMINATED KW_BY collectionItemsTerminatedBy=stringLit)?
(KW_MAP KW_KEYS KW_TERMINATED KW_BY keysTerminatedBy=stringLit)?
(KW_LINES KW_TERMINATED KW_BY linesSeparatedBy=stringLit)?
(KW_NULL KW_DEFINED KW_AS nullDefinedAs=stringLit)?
;
multipartIdentifierList
: multipartIdentifier (COMMA multipartIdentifier)*
;
multipartIdentifier
: parts+=errorCapturingIdentifier (DOT parts+=errorCapturingIdentifier)*
;
multipartIdentifierPropertyList
: multipartIdentifierProperty (COMMA multipartIdentifierProperty)*
;
multipartIdentifierProperty
: multipartIdentifier (KW_OPTIONS options=propertyList)?
;
tableIdentifier
: (db=errorCapturingIdentifier DOT)? table=errorCapturingIdentifier
;
viewIdentifier
: (db=errorCapturingIdentifier DOT)? view=errorCapturingIdentifier
;
namedExpression
: (columnName | expression) (KW_AS? (name=errorCapturingIdentifier | identifierList))?
;
namedExpressionSeq
: namedExpression (COMMA namedExpression)*
;
partitionFieldList
: LEFT_PAREN fields+=partitionField (COMMA fields+=partitionField)* RIGHT_PAREN
;
partitionField
: transform
| colType
;
transform
: qualifiedName
| transformName=identifier
LEFT_PAREN transformArgument (COMMA transformArgument)* RIGHT_PAREN
;
transformArgument
: qualifiedName
| constant
;
expression
: booleanExpression
;
namedArgumentExpression
: key=identifier FAT_ARROW value=expression
;
functionArgument
: expression
| namedArgumentExpression
;
expressionSeq
: expression (COMMA expression)*
;
booleanExpression
: (KW_NOT | NOT) booleanExpression
| KW_EXISTS LEFT_PAREN query RIGHT_PAREN
| valueExpression predicate?
| left=booleanExpression operator=KW_AND right=booleanExpression
| left=booleanExpression operator=KW_OR right=booleanExpression
;
predicate
: KW_NOT? kind=KW_BETWEEN lower=valueExpression KW_AND upper=valueExpression
| KW_NOT? kind=KW_IN LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN
| KW_NOT? kind=KW_IN LEFT_PAREN query RIGHT_PAREN
| KW_NOT? kind=(KW_RLIKE | KW_REGEXP) pattern=valueExpression
| KW_NOT? kind=(KW_LIKE | KW_ILIKE) quantifier=(KW_ANY | KW_SOME | KW_ALL) (LEFT_PAREN RIGHT_PAREN | LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN)
| KW_NOT? kind=(KW_LIKE | KW_ILIKE) pattern=valueExpression (KW_ESCAPE escapeChar=stringLit)?
| KW_IS KW_NOT? kind=KW_NULL
| KW_IS KW_NOT? kind=(KW_TRUE | KW_FALSE | KW_UNKNOWN)
| KW_IS KW_NOT? kind=KW_DISTINCT KW_FROM right=valueExpression
;
valueExpression
: primaryExpression
| operator=(MINUS | PLUS | TILDE) valueExpression
| left=valueExpression operator=(ASTERISK | SLASH | PERCENT | KW_DIV) right=valueExpression
| left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression
| left=valueExpression operator=AMPERSAND right=valueExpression
| left=valueExpression operator=HAT right=valueExpression
| left=valueExpression operator=PIPE right=valueExpression
| left=valueExpression comparisonOperator right=valueExpression
;
datetimeUnit
: KW_YEAR | KW_QUARTER | KW_MONTH
| KW_WEEK | KW_DAY | KW_DAYOFYEAR
| KW_HOUR | KW_MINUTE | KW_SECOND | KW_MILLISECOND | KW_MICROSECOND
;
primaryExpression
: name=(KW_CURRENT_DATE | KW_CURRENT_TIMESTAMP | KW_CURRENT_USER | KW_USER | KW_SESSION_USER)
| name=(KW_TIMESTAMPADD | KW_DATEADD | KW_DATE_ADD) LEFT_PAREN (unit=datetimeUnit | invalidUnit=stringLit) COMMA unitsAmount=valueExpression COMMA timestamp=valueExpression RIGHT_PAREN
| name=(KW_TIMESTAMPDIFF | KW_DATEDIFF | KW_DATE_DIFF | KW_TIMEDIFF) LEFT_PAREN (unit=datetimeUnit | invalidUnit=stringLit) COMMA startTimestamp=valueExpression COMMA endTimestamp=valueExpression RIGHT_PAREN
| KW_CASE whenClause+ (KW_ELSE elseExpression=expression)? KW_END
| KW_CASE expression whenClause+ (KW_ELSE elseExpression=expression)? KW_END
| name=(KW_CAST | KW_TRY_CAST) LEFT_PAREN expression KW_AS dataType RIGHT_PAREN
| KW_STRUCT LEFT_PAREN (namedExpression (COMMA namedExpression)*)? RIGHT_PAREN
| KW_FIRST LEFT_PAREN expression (KW_IGNORE KW_NULLS)? RIGHT_PAREN
| KW_ANY_VALUE LEFT_PAREN expression (KW_IGNORE KW_NULLS)? RIGHT_PAREN
| KW_LAST LEFT_PAREN expression (KW_IGNORE KW_NULLS)? RIGHT_PAREN
| KW_POSITION LEFT_PAREN substr=valueExpression KW_IN str=valueExpression RIGHT_PAREN
| constant
| ASTERISK
| qualifiedName DOT ASTERISK
| LEFT_PAREN namedExpression (COMMA namedExpression)+ RIGHT_PAREN
| LEFT_PAREN query RIGHT_PAREN
| KW_IDENTIFIER LEFT_PAREN expression RIGHT_PAREN
| functionName LEFT_PAREN (setQuantifier? functionArgument
(COMMA functionArgument)*)? RIGHT_PAREN
(KW_FILTER LEFT_PAREN KW_WHERE where=booleanExpression RIGHT_PAREN)?
(nullsOption=(KW_IGNORE | KW_RESPECT) KW_NULLS)? ( KW_OVER windowSpec)?
| identifier ARROW expression
| LEFT_PAREN identifier (COMMA identifier)+ RIGHT_PAREN ARROW expression
| value=primaryExpression LEFT_BRACKET index=valueExpression RIGHT_BRACKET
| identifier
| base=primaryExpression DOT fieldName=identifier
| LEFT_PAREN expression RIGHT_PAREN
| KW_EXTRACT LEFT_PAREN field=identifier KW_FROM source=valueExpression RIGHT_PAREN
| (KW_SUBSTR | KW_SUBSTRING) LEFT_PAREN str=valueExpression (KW_FROM | COMMA) pos=valueExpression
((KW_FOR | COMMA) len=valueExpression)? RIGHT_PAREN
| KW_TRIM LEFT_PAREN trimOption=(KW_BOTH | KW_LEADING | KW_TRAILING)? (trimStr=valueExpression)?
KW_FROM srcStr=valueExpression RIGHT_PAREN
| KW_OVERLAY LEFT_PAREN input=valueExpression KW_PLACING replace=valueExpression
KW_FROM position=valueExpression (KW_FOR length=valueExpression)? RIGHT_PAREN
| name=(KW_PERCENTILE_CONT | KW_PERCENTILE_DISC) LEFT_PAREN percentage=valueExpression RIGHT_PAREN
KW_WITHIN KW_GROUP LEFT_PAREN KW_ORDER KW_BY sortItem RIGHT_PAREN
(KW_FILTER LEFT_PAREN KW_WHERE where=booleanExpression RIGHT_PAREN)? ( KW_OVER windowSpec)?
;
literalType
: KW_DATE
| KW_TIMESTAMP | KW_TIMESTAMP_LTZ | KW_TIMESTAMP_NTZ
| KW_INTERVAL
| KW_BINARY_HEX
| unsupportedType=identifier
;
constant
: KW_NULL
| QUESTION
| COLON identifier
| interval
| literalType stringLit
| number
| booleanValue
| stringLit+
;
comparisonOperator
: EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ
;
arithmeticOperator
: PLUS | MINUS | ASTERISK | SLASH | PERCENT | KW_DIV | TILDE | AMPERSAND | PIPE | CONCAT_PIPE | HAT
;
predicateOperator
: KW_OR | KW_AND | KW_IN | KW_NOT
;
booleanValue
: KW_TRUE | KW_FALSE
;
interval
: KW_INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)
;
errorCapturingMultiUnitsInterval
: body=multiUnitsInterval unitToUnitInterval?
;
multiUnitsInterval
: (intervalValue unit+=unitInMultiUnits)+
;
errorCapturingUnitToUnitInterval
: body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)?
;
unitToUnitInterval
: value=intervalValue unitInUnitToUnit KW_TO unitInUnitToUnit
;
intervalValue
: (PLUS | MINUS)?
(INTEGER_VALUE | DECIMAL_VALUE | stringLit)
;
unitInMultiUnits
: KW_NANOSECOND | KW_NANOSECONDS | KW_MICROSECOND | KW_MICROSECONDS | KW_MILLISECOND | KW_MILLISECONDS
| KW_SECOND | KW_SECONDS | KW_MINUTE | KW_MINUTES | KW_HOUR | KW_HOURS | KW_DAY | KW_DAYS | KW_WEEK | KW_WEEKS
| KW_MONTH | KW_MONTHS | KW_YEAR | KW_YEARS
;
unitInUnitToUnit
: KW_SECOND | KW_MINUTE | KW_HOUR | KW_DAY | KW_MONTH | KW_YEAR
;
colPosition
: position=KW_FIRST | position=KW_AFTER afterCol=errorCapturingIdentifier
;
type
: KW_BOOLEAN
| KW_TINYINT | KW_BYTE
| KW_SMALLINT | KW_SHORT
| KW_INT | KW_INTEGER
| KW_BIGINT | KW_LONG
| KW_FLOAT | KW_REAL
| KW_DOUBLE
| KW_DATE
| KW_TIMESTAMP | KW_TIMESTAMP_NTZ | KW_TIMESTAMP_LTZ
| KW_STRING
| KW_CHARACTER | KW_CHAR
| KW_VARCHAR
| KW_BINARY
| KW_DECIMAL | KW_DEC | KW_NUMERIC
| KW_VOID
| KW_INTERVAL
| KW_ARRAY | KW_STRUCT | KW_MAP
| unsupportedType=identifier
;
dataType
: complex=KW_ARRAY LT dataType GT
| complex=KW_MAP LT dataType COMMA dataType GT
| complex=KW_STRUCT (LT complexColTypeList? GT | NEQ)
| KW_INTERVAL (KW_YEAR | KW_MONTH) (KW_TO KW_MONTH)?
| KW_INTERVAL (KW_DAY | KW_HOUR | KW_MINUTE | KW_SECOND)
(KW_TO (KW_HOUR | KW_MINUTE | KW_SECOND))?
| type (LEFT_PAREN INTEGER_VALUE
(COMMA INTEGER_VALUE)* RIGHT_PAREN)?
;
qualifiedColTypeWithPositionSeqForAdd
: qualifiedColTypeWithPositionForAdd (COMMA qualifiedColTypeWithPositionForAdd)*
;
qualifiedColTypeWithPositionForAdd
: name=columnNameCreate dataType colDefinitionDescriptorWithPosition*
;
qualifiedColTypeWithPositionSeqForReplace
: qualifiedColTypeWithPositionForReplace (COMMA qualifiedColTypeWithPositionForReplace)*
;
qualifiedColTypeWithPositionForReplace
: name=columnName dataType colDefinitionDescriptorWithPosition*
;
colDefinitionDescriptorWithPosition
: KW_NOT KW_NULL
| defaultExpression
| commentSpec
| colPosition
;
defaultExpression
: KW_DEFAULT expression
;
variableDefaultExpression
: (KW_DEFAULT | EQ) expression
;
colTypeList
: colType (COMMA colType)*
;
colType
: colName=errorCapturingIdentifier dataType (KW_NOT KW_NULL)? commentSpec?
;
createOrReplaceTableColTypeList
: createOrReplaceTableColType (COMMA createOrReplaceTableColType)*
;
createOrReplaceTableColType
: colName=columnNameCreate dataType colDefinitionOption*
;
colDefinitionOption
: KW_NOT KW_NULL
| defaultExpression
| generationExpression
| commentSpec
;
generationExpression
: KW_GENERATED KW_ALWAYS KW_AS LEFT_PAREN expression RIGHT_PAREN
;
complexColTypeList
: complexColType (COMMA complexColType)*
;
complexColType
: identifier COLON? dataType (KW_NOT KW_NULL)? commentSpec?
;
whenClause
: KW_WHEN condition=expression KW_THEN result=expression
;
windowClause
: KW_WINDOW namedWindow (COMMA namedWindow)*
;
namedWindow
: name=errorCapturingIdentifier KW_AS windowSpec
;
windowSpec
: name=errorCapturingIdentifier
| LEFT_PAREN name=errorCapturingIdentifier RIGHT_PAREN
| LEFT_PAREN
( KW_CLUSTER KW_BY partition+=expression (COMMA partition+=expression)*
| ((KW_PARTITION | KW_DISTRIBUTE) KW_BY partition+=expression (COMMA partition+=expression)*)?
((KW_ORDER | KW_SORT) KW_BY sortItem (COMMA sortItem)*)?)
windowFrame?
RIGHT_PAREN
;
/**
* replace start identifier with start_ in grammar.
* https://github.com/tunnelvisionlabs/antlr4ts/issues/417
*/
windowFrame
: frameType=KW_RANGE start_=frameBound
| frameType=KW_ROWS start_=frameBound
| frameType=KW_RANGE KW_BETWEEN start_=frameBound KW_AND end=frameBound
| frameType=KW_ROWS KW_BETWEEN start_=frameBound KW_AND end=frameBound
;
frameBound
: KW_UNBOUNDED boundType=(KW_PRECEDING | KW_FOLLOWING)
| boundType=KW_CURRENT KW_ROW
| expression boundType=(KW_PRECEDING | KW_FOLLOWING)
;
qualifiedNameList
: qualifiedName (COMMA qualifiedName)*
;
functionName
: KW_IDENTIFIER LEFT_PAREN expression RIGHT_PAREN
| qualifiedName
| KW_FILTER
| KW_LEFT
| KW_RIGHT
;
functionNameCreate
: qualifiedName
;
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)+
|
;
identifier
: strictIdentifier
| strictNonReserved
;
strictIdentifier
: IDENTIFIER
| quotedIdentifier
| ansiNonReserved
| nonReserved
;
quotedIdentifier
: BACKQUOTED_IDENTIFIER
| DOUBLEQUOTED_STRING
;
backQuotedIdentifier
: BACKQUOTED_IDENTIFIER
;
number
: MINUS? EXPONENT_VALUE
| MINUS? DECIMAL_VALUE
| MINUS? (EXPONENT_VALUE | DECIMAL_VALUE)
| MINUS? INTEGER_VALUE
| MINUS? BIGINT_LITERAL
| MINUS? SMALLINT_LITERAL
| MINUS? TINYINT_LITERAL
| MINUS? DOUBLE_LITERAL
| MINUS? FLOAT_LITERAL
| MINUS? BIGDECIMAL_LITERAL
;
alterColumnAction
: KW_TYPE dataType
| commentSpec
| colPosition
| setOrDrop=(KW_SET | KW_DROP) KW_NOT KW_NULL
| KW_SET defaultExpression
| dropDefault=KW_DROP KW_DEFAULT
;
stringLit
: STRING_LITERAL
| DOUBLEQUOTED_STRING
;
comment
: stringLit
| KW_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
: KW_ADD
| KW_AFTER
| KW_ALTER
| KW_ALWAYS
| KW_ANALYZE
| KW_ANTI
| KW_ANY_VALUE
| KW_ARCHIVE
| KW_ARRAY
| KW_ASC
| KW_AT
| KW_BETWEEN
| KW_BIGINT
| KW_BINARY
| KW_BINARY_HEX
| KW_BOOLEAN
| KW_BUCKET
| KW_BUCKETS
| KW_BY
| KW_BYTE
| KW_CACHE
| KW_CASCADE
| KW_CATALOG
| KW_CATALOGS
| KW_CHANGE
| KW_CHAR
| KW_CHARACTER
| KW_CLEAR
| KW_CLUSTER
| KW_CLUSTERED
| KW_CODEGEN
| KW_COLLECTION
| KW_COLUMNS
| KW_COMMENT
| KW_COMMIT
| KW_COMPACT
| KW_COMPACTIONS
| KW_COMPUTE
| KW_CONCATENATE
| KW_COST
| KW_CUBE
| KW_CURRENT
| KW_DATA
| KW_DATABASE
| KW_DATABASES
| KW_DATE
| KW_DATEADD
| KW_DATE_ADD
| KW_DATEDIFF
| KW_DATE_DIFF
| KW_DAY
| KW_DAYS
| KW_DAYOFYEAR
| KW_DBPROPERTIES
| KW_DEC
| KW_DECIMAL
| KW_DECLARE
| KW_DEFAULT
| KW_DEFINED
| KW_DELETE
| KW_DELIMITED
| KW_DESC
| KW_DESCRIBE
| KW_DFS
| KW_DIRECTORIES
| KW_DIRECTORY
| KW_DISTRIBUTE
| KW_DIV
| KW_DOUBLE
| KW_DROP
| KW_ESCAPED
| KW_EXCHANGE
| KW_EXCLUDE
| KW_EXISTS
| KW_EXPLAIN
| KW_EXPORT
| KW_EXTENDED
| KW_EXTERNAL
| KW_EXTRACT
| KW_FIELDS
| KW_FILEFORMAT
| KW_FIRST
| KW_FLOAT
| KW_FOLLOWING
| KW_FORMAT
| KW_FORMATTED
| KW_FUNCTION
| KW_FUNCTIONS
| KW_GENERATED
| KW_GLOBAL
| KW_GROUPING
| KW_HOUR
| KW_HOURS
| KW_IDENTIFIER
| KW_IF
| KW_IGNORE
| KW_IMPORT
| KW_INCLUDE
| KW_INDEX
| KW_INDEXES
| KW_INPATH
| KW_INPUTFORMAT
| KW_INSERT
| KW_INT
| KW_INTEGER
| KW_INTERVAL
| KW_ITEMS
| KW_KEYS
| KW_LAST
| KW_LAZY
| KW_LIKE
| KW_ILIKE
| KW_LIMIT
| KW_LINES
| KW_LIST
| KW_LOAD
| KW_LOCAL
| KW_LOCATION
| KW_LOCK
| KW_LOCKS
| KW_LOGICAL
| KW_LONG
| KW_MACRO
| KW_MAP
| KW_MATCHED
| KW_MERGE
| KW_MICROSECOND
| KW_MICROSECONDS
| KW_MILLISECOND
| KW_MILLISECONDS
| KW_MINUTE
| KW_MINUTES
| KW_MONTH
| KW_MONTHS
| KW_MSCK
| KW_NAME
| KW_NAMESPACE
| KW_NAMESPACES
| KW_NANOSECOND
| KW_NANOSECONDS
| KW_NO
| KW_NULLS
| KW_NUMERIC
| KW_OF
| KW_OPTION
| KW_OPTIONS
| KW_OUT
| KW_OUTPUTFORMAT
| KW_OVER
| KW_OVERLAY
| KW_OVERWRITE
| KW_PARTITION
| KW_PARTITIONED
| KW_PARTITIONS
| KW_PERCENTLIT
| KW_PIVOT
| KW_PLACING
| KW_POSITION
| KW_PRECEDING
| KW_PRINCIPALS
| KW_PROPERTIES
| KW_PURGE
| KW_QUARTER
| KW_QUERY
| KW_RANGE
| KW_REAL
| KW_RECORDREADER
| KW_RECORDWRITER
| KW_RECOVER
| KW_REDUCE
| KW_REFRESH
| KW_RENAME
| KW_REPAIR
| KW_REPEATABLE
| KW_REPLACE
| KW_RESET
| KW_RESPECT
| KW_RESTRICT
| KW_REVOKE
| KW_RLIKE
| KW_REGEXP
| KW_ROLE
| KW_ROLES
| KW_ROLLBACK
| KW_ROLLUP
| KW_ROW
| KW_ROWS
| KW_SCHEMA
| KW_SCHEMAS
| KW_SECOND
| KW_SECONDS
| KW_SEMI
| KW_SEPARATED
| KW_SERDE
| KW_SERDEPROPERTIES
| KW_SET
| KW_MINUS
| KW_SETS
| KW_SHORT
| KW_SHOW
| KW_SINGLE
| KW_SKEWED
| KW_SMALLINT
| KW_SORT
| KW_SORTED
| KW_SOURCE
| KW_START
| KW_STATISTICS
| KW_STORED
| KW_STRATIFY
| KW_STRING
| KW_STRUCT
| KW_SUBSTR
| KW_SUBSTRING
| KW_SYNC
| KW_SYSTEM
| KW_SYSTEM_TIME
| KW_SYSTEM_VERSION
| KW_TABLES
| KW_TABLESAMPLE
| KW_TARGET
| KW_TBLPROPERTIES
| KW_TEMPORARY
| KW_TERMINATED
| KW_TIMEDIFF
| KW_TIMESTAMP
| KW_TIMESTAMP_LTZ
| KW_TIMESTAMP_NTZ
| KW_TIMESTAMPADD
| KW_TIMESTAMPDIFF
| KW_TINYINT
| KW_TOUCH
| KW_TRANSACTION
| KW_TRANSACTIONS
| KW_TRANSFORM
| KW_TRIM
| KW_TRUE
| KW_TRUNCATE
| KW_TRY_CAST
| KW_TYPE
| KW_UNARCHIVE
| KW_UNBOUNDED
| KW_UNCACHE
| KW_UNLOCK
| KW_UNPIVOT
| KW_UNSET
| KW_UPDATE
| KW_USE
| KW_VALUES
| KW_VARCHAR
| KW_VAR
| KW_VARIABLE
| KW_VERSION
| KW_VIEW
| KW_VIEWS
| KW_VOID
| KW_WEEK
| KW_WEEKS
| KW_WINDOW
| KW_YEAR
| KW_YEARS
| KW_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
: KW_ANTI
| KW_CROSS
| KW_EXCEPT
| KW_FULL
| KW_INNER
| KW_INTERSECT
| KW_JOIN
| KW_LATERAL
| KW_LEFT
| KW_NATURAL
| KW_ON
| KW_RIGHT
| KW_SEMI
| KW_MINUS
| KW_UNION
| KW_USING
;
nonReserved
//--DEFAULT-NON-RESERVED-START
: KW_ADD
| KW_AFTER
| KW_ALL
| KW_ALTER
| KW_ALWAYS
| KW_ANALYZE
| KW_AND
| KW_ANY
| KW_ANY_VALUE
| KW_ARCHIVE
| KW_ARRAY
| KW_AS
| KW_ASC
| KW_AT
| KW_AUTHORIZATION
| KW_BETWEEN
| KW_BIGINT
| KW_BINARY
| KW_BINARY_HEX
| KW_BOOLEAN
| KW_BOTH
| KW_BUCKET
| KW_BUCKETS
| KW_BY
| KW_BYTE
| KW_CACHE
| KW_CASCADE
| KW_CASE
| KW_CAST
| KW_CATALOG
| KW_CATALOGS
| KW_CHANGE
| KW_CHAR
| KW_CHARACTER
| KW_CHECK
| KW_CLEAR
| KW_CLUSTER
| KW_CLUSTERED
| KW_CODEGEN
| KW_COLLATE
| KW_COLLECTION
| KW_COLUMN
| KW_COLUMNS
| KW_COMMENT
| KW_COMMIT
| KW_COMPACT
| KW_COMPACTIONS
| KW_COMPUTE
| KW_CONCATENATE
| KW_CONSTRAINT
| KW_COST
| KW_CREATE
| KW_CUBE
| KW_CURRENT
| KW_CURRENT_DATE
| KW_CURRENT_TIME
| KW_CURRENT_TIMESTAMP
| KW_CURRENT_USER
| KW_DATA
| KW_DATABASE
| KW_DATABASES
| KW_DATE
| KW_DATEADD
| KW_DATE_ADD
| KW_DATEDIFF
| KW_DATE_DIFF
| KW_DAY
| KW_DAYS
| KW_DAYOFYEAR
| KW_DBPROPERTIES
| KW_DEC
| KW_DECIMAL
| KW_DECLARE
| KW_DEFAULT
| KW_DEFINED
| KW_DELETE
| KW_DELIMITED
| KW_DESC
| KW_DESCRIBE
| KW_DFS
| KW_DIRECTORIES
| KW_DIRECTORY
| KW_DISTINCT
| KW_DISTRIBUTE
| KW_DIV
| KW_DOUBLE
| KW_DROP
| KW_ELSE
| KW_END
| KW_ESCAPE
| KW_ESCAPED
| KW_EXCHANGE
| KW_EXCLUDE
| KW_EXISTS
| KW_EXPLAIN
| KW_EXPORT
| KW_EXTENDED
| KW_EXTERNAL
| KW_EXTRACT
| KW_FALSE
| KW_FETCH
| KW_FILTER
| KW_FIELDS
| KW_FILEFORMAT
| KW_FIRST
| KW_FLOAT
| KW_FOLLOWING
| KW_FOR
| KW_FOREIGN
| KW_FORMAT
| KW_FORMATTED
| KW_FROM
| KW_FUNCTION
| KW_FUNCTIONS
| KW_GENERATED
| KW_GLOBAL
| KW_GRANT
| KW_GROUP
| KW_GROUPING
| KW_HAVING
| KW_HOUR
| KW_HOURS
| KW_IDENTIFIER
| KW_IF
| KW_IGNORE
| KW_IMPORT
| KW_IN
| KW_INCLUDE
| KW_INDEX
| KW_INDEXES
| KW_INPATH
| KW_INPUTFORMAT
| KW_INSERT
| KW_INT
| KW_INTEGER
| KW_INTERVAL
| KW_INTO
| KW_IS
| KW_ITEMS
| KW_KEYS
| KW_LAST
| KW_LAZY
| KW_LEADING
| KW_LIKE
| KW_LONG
| KW_ILIKE
| KW_LIMIT
| KW_LINES
| KW_LIST
| KW_LOAD
| KW_LOCAL
| KW_LOCATION
| KW_LOCK
| KW_LOCKS
| KW_LOGICAL
| KW_LONG
| KW_MACRO
| KW_MAP
| KW_MATCHED
| KW_MERGE
| KW_MICROSECOND
| KW_MICROSECONDS
| KW_MILLISECOND
| KW_MILLISECONDS
| KW_MINUTE
| KW_MINUTES
| KW_MONTH
| KW_MONTHS
| KW_MSCK
| KW_NAME
| KW_NAMESPACE
| KW_NAMESPACES
| KW_NANOSECOND
| KW_NANOSECONDS
| KW_NO
| KW_NOT
| KW_NULL
| KW_NULLS
| KW_NUMERIC
| KW_OF
| KW_OFFSET
| KW_ONLY
| KW_OPTION
| KW_OPTIONS
| KW_OR
| KW_ORDER
| KW_OUT
| KW_OUTER
| KW_OUTPUTFORMAT
| KW_OVER
| KW_OVERLAPS
| KW_OVERLAY
| KW_OVERWRITE
| KW_PARTITION
| KW_PARTITIONED
| KW_PARTITIONS
| KW_PERCENTILE_CONT
| KW_PERCENTILE_DISC
| KW_PERCENTLIT
| KW_PIVOT
| KW_PLACING
| KW_POSITION
| KW_PRECEDING
| KW_PRIMARY
| KW_PRINCIPALS
| KW_PROPERTIES
| KW_PURGE
| KW_QUARTER
| KW_QUERY
| KW_RANGE
| KW_REAL
| KW_RECORDREADER
| KW_RECORDWRITER
| KW_RECOVER
| KW_REDUCE
| KW_REFERENCES
| KW_REFRESH
| KW_RENAME
| KW_REPAIR
| KW_REPEATABLE
| KW_REPLACE
| KW_RESET
| KW_RESPECT
| KW_RESTRICT
| KW_REVOKE
| KW_RLIKE
| KW_REGEXP
| KW_ROLE
| KW_ROLES
| KW_ROLLBACK
| KW_ROLLUP
| KW_ROW
| KW_ROWS
| KW_SCHEMA
| KW_SCHEMAS
| KW_SECOND
| KW_SECONDS
| KW_SELECT
| KW_SEPARATED
| KW_SERDE
| KW_SERDEPROPERTIES
| KW_SESSION_USER
| KW_SET
| KW_SETS
| KW_SHORT
| KW_SHOW
| KW_SINGLE
| KW_SKEWED
| KW_SMALLINT
| KW_SOME
| KW_SORT
| KW_SORTED
| KW_SOURCE
| KW_START
| KW_STATISTICS
| KW_STORED
| KW_STRATIFY
| KW_STRING
| KW_STRUCT
| KW_SUBSTR
| KW_SUBSTRING
| KW_SYNC
| KW_SYSTEM
| KW_SYSTEM_TIME
| KW_SYSTEM_VERSION
| KW_TABLE
| KW_TABLES
| KW_TABLESAMPLE
| KW_TARGET
| KW_TBLPROPERTIES
| KW_TEMPORARY
| KW_TERMINATED
| KW_THEN
| KW_TIME
| KW_TIMEDIFF
| KW_TIMESTAMP
| KW_TIMESTAMP_LTZ
| KW_TIMESTAMP_NTZ
| KW_TIMESTAMPADD
| KW_TIMESTAMPDIFF
| KW_TINYINT
| KW_TO
| KW_TOUCH
| KW_TRAILING
| KW_TRANSACTION
| KW_TRANSACTIONS
| KW_TRANSFORM
| KW_TRIM
| KW_TRUE
| KW_TRUNCATE
| KW_TRY_CAST
| KW_TYPE
| KW_UNARCHIVE
| KW_UNBOUNDED
| KW_UNCACHE
| KW_UNIQUE
| KW_UNKNOWN
| KW_UNLOCK
| KW_UNPIVOT
| KW_UNSET
| KW_UPDATE
| KW_USE
| KW_USER
| KW_VALUES
| KW_VARCHAR
| KW_VAR
| KW_VARIABLE
| KW_VERSION
| KW_VIEW
| KW_VIEWS
| KW_VOID
| KW_WEEK
| KW_WEEKS
| KW_WHEN
| KW_WHERE
| KW_WINDOW
| KW_WITH
| KW_WITHIN
| KW_YEAR
| KW_YEARS
| KW_ZONE
//--DEFAULT-NON-RESERVED-END
;