* refactor: rename flinksql to flink * refactor: rename pgsql to postgresql * refactor: rename trinosql to trino * refactor: replace all default exports with named export * refactor: rename basicParser to basicSQL * refactor: rename basic-parser-types to types * refactor: replace arrow func with plain func
1216 lines
28 KiB
ANTLR
1216 lines
28 KiB
ANTLR
// $antlr-format alignTrailingComments true, columnLimit 150, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments false, useTab false
|
||
// $antlr-format allowShortRulesOnASingleLine false, allowShortBlocksOnASingleLine true, alignSemicolons hanging, alignColons hanging
|
||
// $antlr-format spaceBeforeAssignmentOperators false, keepEmptyLinesAtTheStartOfBlocks true
|
||
|
||
parser grammar FlinkSqlParser;
|
||
|
||
options {
|
||
tokenVocab=FlinkSqlLexer;
|
||
caseInsensitive= true;
|
||
superClass=SQLParserBase;
|
||
}
|
||
|
||
@header {
|
||
import { SQLParserBase } from '../SQLParserBase';
|
||
}
|
||
|
||
program
|
||
: singleStatement* EOF
|
||
;
|
||
|
||
singleStatement
|
||
: sqlStatement SEMICOLON?
|
||
| emptyStatement
|
||
;
|
||
|
||
sqlStatement
|
||
: ddlStatement
|
||
| dmlStatement
|
||
| describeStatement
|
||
| explainStatement
|
||
| useStatement
|
||
| showStatememt
|
||
| loadStatement
|
||
| unloadStatememt
|
||
| setStatememt
|
||
| resetStatememt
|
||
| jarStatememt
|
||
| dtAddStatement
|
||
;
|
||
|
||
emptyStatement
|
||
: SEMICOLON
|
||
;
|
||
|
||
ddlStatement
|
||
: createTable
|
||
| createDatabase
|
||
| createView
|
||
| createFunction
|
||
| createCatalog
|
||
| alterTable
|
||
| alertView
|
||
| alterDatabase
|
||
| alterFunction
|
||
| dropCatalog
|
||
| dropTable
|
||
| dropDatabase
|
||
| dropView
|
||
| dropFunction
|
||
;
|
||
|
||
dmlStatement
|
||
: queryStatement
|
||
| insertStatement
|
||
;
|
||
|
||
// some statemen
|
||
describeStatement
|
||
: (KW_DESCRIBE | KW_DESC) tablePath
|
||
;
|
||
|
||
explainStatement
|
||
: KW_EXPLAIN (explainDetails | KW_PLAN KW_FOR)? (
|
||
dmlStatement
|
||
| insertSimpleStatement
|
||
| insertMulStatement
|
||
)
|
||
;
|
||
|
||
explainDetails
|
||
: explainDetail (COMMA explainDetail)*
|
||
;
|
||
|
||
explainDetail
|
||
: KW_CHANGELOG_MODE
|
||
| KW_JSON_EXECUTION_PLAN
|
||
| KW_ESTIMATED_COST
|
||
;
|
||
|
||
useStatement
|
||
: KW_USE KW_CATALOG catalogPath
|
||
| KW_USE databasePath
|
||
| useModuleStatement
|
||
;
|
||
|
||
useModuleStatement
|
||
: KW_USE KW_MODULES uid (COMMA uid)*
|
||
;
|
||
|
||
showStatememt
|
||
: KW_SHOW (KW_CATALOGS | KW_DATABASES | KW_VIEWS | KW_JARS)
|
||
| KW_SHOW KW_CURRENT (KW_CATALOG | KW_DATABASE)
|
||
| KW_SHOW KW_TABLES (( KW_FROM | KW_IN) databasePath)? likePredicate?
|
||
| KW_SHOW KW_COLUMNS ( KW_FROM | KW_IN) (viewPath | tablePath) likePredicate?
|
||
| KW_SHOW KW_CREATE (KW_TABLE tablePath | KW_VIEW viewPath)
|
||
| KW_SHOW KW_USER? KW_FUNCTIONS
|
||
| KW_SHOW KW_FULL? KW_MODULES
|
||
;
|
||
|
||
loadStatement
|
||
: KW_LOAD KW_MODULE uid (KW_WITH tablePropertyList)?
|
||
;
|
||
|
||
unloadStatememt
|
||
: KW_UNLOAD KW_MODULE uid
|
||
;
|
||
|
||
setStatememt
|
||
: KW_SET (tableProperty)?
|
||
;
|
||
|
||
resetStatememt
|
||
: KW_RESET tablePropertyKey?
|
||
;
|
||
|
||
jarStatememt
|
||
: (KW_ADD | KW_REMOVE) KW_JAR jarFileName
|
||
;
|
||
|
||
// 数栈平台自研的添加文件语法
|
||
dtAddStatement
|
||
: KW_ADD KW_JAR KW_WITH dtFilePath (KW_AS uid)?
|
||
| KW_ADD KW_FILE KW_WITH dtFilePath (KW_AS uid)? (KW_RENAME uid)?
|
||
| KW_ADD (
|
||
KW_PYTHON_FILES
|
||
| KW_PYTHON_REQUIREMENTS
|
||
| KW_PYTHON_DEPENDENCIES
|
||
| KW_PYTHON_JAR
|
||
| KW_PYTHON_ARCHIVES
|
||
) KW_WITH dtFilePath KW_RENAME uid
|
||
| KW_ADD KW_PYTHON_PARAMETER dtFilePath
|
||
| KW_ADD KW_ENGINE KW_FILE KW_WITH dtFilePath KW_RENAME uid KW_KEY uid
|
||
| KW_ADD KW_CONFIG KW_FILE KW_WITH dtFilePath KW_FOR uid KW_AS uid
|
||
;
|
||
|
||
dtFilePath
|
||
: (SLASH_SIGN? uid)+
|
||
;
|
||
|
||
// Create statements
|
||
|
||
createTable
|
||
: (simpleCreateTable | createTableAsSelect)
|
||
;
|
||
|
||
simpleCreateTable
|
||
: KW_CREATE KW_TEMPORARY? KW_TABLE ifNotExists? tablePathCreate LR_BRACKET columnOptionDefinition (
|
||
COMMA columnOptionDefinition
|
||
)* (COMMA watermarkDefinition)? (COMMA tableConstraint)? (COMMA selfDefinitionClause)? RR_BRACKET commentSpec? partitionDefinition? withOption
|
||
likeDefinition?
|
||
;
|
||
|
||
/*
|
||
* 详见 https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/dev/table/sql/create/#as-select_statement
|
||
* CTAS 不支持指定显示指定列,不支持创建分区表,临时表
|
||
*/
|
||
createTableAsSelect
|
||
: KW_CREATE KW_TABLE ifNotExists? tablePathCreate withOption (KW_AS queryStatement)?
|
||
;
|
||
|
||
columnOptionDefinition
|
||
: physicalColumnDefinition
|
||
| metadataColumnDefinition
|
||
| computedColumnDefinition
|
||
;
|
||
|
||
physicalColumnDefinition
|
||
: columnNameCreate columnType columnConstraint? commentSpec?
|
||
;
|
||
|
||
columnNameCreate
|
||
: uid
|
||
| expression
|
||
;
|
||
|
||
columnName
|
||
: uid
|
||
| {this.shouldMatchEmpty()}?
|
||
;
|
||
|
||
columnNameList
|
||
: LR_BRACKET columnName (COMMA columnName)* RR_BRACKET
|
||
;
|
||
|
||
columnType
|
||
: typeName=(KW_DATE | KW_BOOLEAN | KW_NULL)
|
||
| typeName=(
|
||
KW_CHAR
|
||
| KW_VARCHAR
|
||
| KW_STRING
|
||
| KW_BINARY
|
||
| KW_VARBINARY
|
||
| KW_BYTES
|
||
| KW_TINYINT
|
||
| KW_SMALLINT
|
||
| KW_INT
|
||
| KW_INTEGER
|
||
| KW_BIGINT
|
||
| KW_TIME
|
||
| KW_TIMESTAMP_LTZ
|
||
| KW_DATETIME
|
||
) lengthOneDimension?
|
||
| typeName=KW_TIMESTAMP lengthOneDimension? ((KW_WITHOUT | KW_WITH) KW_LOCAL? KW_TIME KW_ZONE)?
|
||
| typeName=(KW_DECIMAL | KW_DEC | KW_NUMERIC | KW_FLOAT | KW_DOUBLE) lengthTwoOptionalDimension?
|
||
| type=(KW_ARRAY | KW_MULTISET) lengthOneTypeDimension?
|
||
| type=KW_MAP mapTypeDimension?
|
||
| type=KW_ROW rowTypeDimension?
|
||
| type=KW_RAW lengthTwoStringDimension?
|
||
;
|
||
|
||
lengthOneDimension
|
||
: LR_BRACKET decimalLiteral RR_BRACKET
|
||
;
|
||
|
||
lengthTwoOptionalDimension
|
||
: LR_BRACKET decimalLiteral (COMMA decimalLiteral)? RR_BRACKET
|
||
;
|
||
|
||
lengthTwoStringDimension
|
||
: LR_BRACKET stringLiteral (COMMA stringLiteral)? RR_BRACKET
|
||
;
|
||
|
||
lengthOneTypeDimension
|
||
: LESS_SYMBOL columnType GREATER_SYMBOL
|
||
;
|
||
|
||
mapTypeDimension
|
||
: LESS_SYMBOL columnType (COMMA columnType) GREATER_SYMBOL
|
||
;
|
||
|
||
rowTypeDimension
|
||
: LESS_SYMBOL columnName columnType (COMMA columnName columnType)* GREATER_SYMBOL
|
||
;
|
||
|
||
columnConstraint
|
||
: (KW_CONSTRAINT constraintName)? KW_PRIMARY KW_KEY (KW_NOT KW_ENFORCED)?
|
||
| KW_NOT? KW_NULL
|
||
;
|
||
|
||
commentSpec
|
||
: KW_COMMENT STRING_LITERAL
|
||
;
|
||
|
||
metadataColumnDefinition
|
||
: columnNameCreate columnType KW_METADATA (KW_FROM metadataKey)? KW_VIRTUAL?
|
||
;
|
||
|
||
metadataKey
|
||
: STRING_LITERAL
|
||
;
|
||
|
||
computedColumnDefinition
|
||
: columnNameCreate KW_AS computedColumnExpression commentSpec?
|
||
;
|
||
|
||
// 计算表达式
|
||
computedColumnExpression
|
||
: expression
|
||
;
|
||
|
||
watermarkDefinition
|
||
: KW_WATERMARK KW_FOR columnName KW_AS expression
|
||
;
|
||
|
||
tableConstraint
|
||
: (KW_CONSTRAINT constraintName)? KW_PRIMARY KW_KEY columnNameList KW_NOT KW_ENFORCED
|
||
;
|
||
|
||
constraintName
|
||
: identifier
|
||
;
|
||
|
||
selfDefinitionClause // 数栈自定义语句 ‘PERIOD KW_FOR SYSTEM_TIME’
|
||
: KW_PERIOD KW_FOR KW_SYSTEM_TIME
|
||
;
|
||
|
||
partitionDefinition
|
||
: KW_PARTITIONED KW_BY transformList
|
||
;
|
||
|
||
transformList
|
||
: LR_BRACKET transform (COMMA transform)* RR_BRACKET
|
||
;
|
||
|
||
transform
|
||
: columnName # identityTransform
|
||
| LR_BRACKET transformArgument (COMMA transformArgument)* RR_BRACKET # applyTransform
|
||
;
|
||
|
||
transformArgument
|
||
: qualifiedName
|
||
| constant
|
||
;
|
||
|
||
likeDefinition
|
||
: KW_LIKE tablePath (LR_BRACKET likeOption* RR_BRACKET)?
|
||
;
|
||
|
||
likeOption
|
||
: ((KW_INCLUDING | KW_EXCLUDING) (KW_ALL | KW_CONSTRAINTS | KW_PARTITIONS))
|
||
| ((KW_INCLUDING | KW_EXCLUDING | KW_OVERWRITING) (KW_GENERATED | KW_OPTIONS | KW_WATERMARKS))
|
||
;
|
||
|
||
createCatalog
|
||
: KW_CREATE KW_CATALOG catalogPathCreate withOption
|
||
;
|
||
|
||
createDatabase
|
||
: KW_CREATE KW_DATABASE ifNotExists? databasePathCreate commentSpec? withOption
|
||
;
|
||
|
||
createView
|
||
: KW_CREATE KW_TEMPORARY? KW_VIEW ifNotExists? viewPathCreate columnNameList? commentSpec? KW_AS queryStatement
|
||
;
|
||
|
||
createFunction
|
||
: KW_CREATE (KW_TEMPORARY | KW_TEMPORARY KW_SYSTEM)? KW_FUNCTION ifNotExists? functionNameCreate KW_AS identifier (
|
||
KW_LANGUAGE (KW_JAVA | KW_SCALA | KW_PYTHON)
|
||
)? usingClause?
|
||
;
|
||
|
||
usingClause
|
||
: KW_USING KW_JAR jarFileName (COMMA KW_JAR jarFileName)*
|
||
;
|
||
|
||
jarFileName
|
||
: STRING_LITERAL
|
||
;
|
||
|
||
// Alter statements
|
||
// Just for simple alter table statements,
|
||
// it only includes rename, set key, add constraint, drop constraint, add unique
|
||
|
||
alterTable
|
||
: KW_ALTER KW_TABLE ifExists? tablePath (
|
||
renameDefinition
|
||
| setKeyValueDefinition
|
||
| addConstraint
|
||
| dropConstraint
|
||
| addUnique
|
||
)
|
||
;
|
||
|
||
renameDefinition
|
||
: KW_RENAME uid? KW_TO uid
|
||
;
|
||
|
||
setKeyValueDefinition
|
||
: KW_SET tablePropertyList
|
||
;
|
||
|
||
addConstraint
|
||
: KW_ADD KW_CONSTRAINT constraintName KW_PRIMARY KW_KEY columnNameList notForced?
|
||
;
|
||
|
||
dropConstraint
|
||
: KW_DROP KW_CONSTRAINT constraintName
|
||
;
|
||
|
||
addUnique
|
||
: KW_ADD KW_UNIQUE columnNameList
|
||
;
|
||
|
||
notForced
|
||
: KW_NOT KW_ENFORCED
|
||
;
|
||
|
||
alertView
|
||
: KW_ALTER KW_VIEW viewPath (renameDefinition | KW_AS queryStatement)
|
||
;
|
||
|
||
alterDatabase
|
||
: KW_ALTER KW_DATABASE databasePath setKeyValueDefinition
|
||
;
|
||
|
||
alterFunction
|
||
: KW_ALTER (KW_TEMPORARY | KW_TEMPORARY KW_SYSTEM)? KW_FUNCTION ifExists? functionName KW_AS identifier (
|
||
KW_LANGUAGE (KW_JAVA | KW_SCALA | KW_PYTHON)
|
||
)? // TODO
|
||
;
|
||
|
||
// Drop statements
|
||
|
||
dropCatalog
|
||
: KW_DROP KW_CATALOG ifExists? catalogPath
|
||
;
|
||
|
||
dropTable
|
||
: KW_DROP KW_TEMPORARY? KW_TABLE ifExists? tablePath
|
||
;
|
||
|
||
dropDatabase
|
||
: KW_DROP KW_DATABASE ifExists? databasePath dropType=(KW_RESTRICT | KW_CASCADE)?
|
||
;
|
||
|
||
dropView
|
||
: KW_DROP KW_TEMPORARY? KW_VIEW ifExists? viewPath
|
||
;
|
||
|
||
dropFunction
|
||
: KW_DROP (KW_TEMPORARY | KW_TEMPORARY KW_SYSTEM)? KW_FUNCTION ifExists? functionName
|
||
;
|
||
|
||
// Insert statements
|
||
|
||
insertStatement
|
||
: (KW_EXECUTE? insertSimpleStatement)
|
||
| insertMulStatementCompatibility
|
||
| (KW_EXECUTE insertMulStatement)
|
||
;
|
||
|
||
insertSimpleStatement
|
||
: KW_INSERT (KW_INTO | KW_OVERWRITE) tablePath (
|
||
insertPartitionDefinition? columnNameList? queryStatement
|
||
| valuesDefinition
|
||
)
|
||
;
|
||
|
||
insertPartitionDefinition
|
||
: KW_PARTITION tablePropertyList
|
||
;
|
||
|
||
valuesDefinition
|
||
: KW_VALUES valuesRowDefinition (COMMA valuesRowDefinition)*
|
||
;
|
||
|
||
valuesRowDefinition
|
||
: LR_BRACKET constant (COMMA constant)* RR_BRACKET
|
||
;
|
||
|
||
insertMulStatementCompatibility
|
||
: KW_BEGIN KW_STATEMENT KW_SET SEMICOLON (insertSimpleStatement SEMICOLON)+ KW_END
|
||
;
|
||
|
||
insertMulStatement
|
||
: KW_STATEMENT KW_SET KW_BEGIN (insertSimpleStatement SEMICOLON)+ KW_END
|
||
;
|
||
|
||
// Select statements
|
||
|
||
queryStatement
|
||
: valuesCaluse
|
||
| withClause queryStatement
|
||
| LR_BRACKET queryStatement RR_BRACKET
|
||
| left=queryStatement operator=(KW_INTERSECT | KW_UNION | KW_EXCEPT) KW_ALL? right=queryStatement orderByCaluse? limitClause?
|
||
| selectClause orderByCaluse? limitClause?
|
||
| selectStatement orderByCaluse? limitClause?
|
||
;
|
||
|
||
valuesCaluse
|
||
: KW_VALUES expression (COMMA expression)*
|
||
;
|
||
|
||
withClause
|
||
: KW_WITH withItem (COMMA withItem)*
|
||
;
|
||
|
||
withItem
|
||
: withItemName (LR_BRACKET columnName (COMMA columnName)* RR_BRACKET)? KW_AS LR_BRACKET queryStatement RR_BRACKET
|
||
;
|
||
|
||
withItemName
|
||
: identifier
|
||
;
|
||
|
||
selectStatement
|
||
: selectClause fromClause? whereClause? groupByClause? havingClause? windowClause?
|
||
| selectClause fromClause matchRecognizeClause
|
||
;
|
||
|
||
selectClause
|
||
: KW_SELECT setQuantifier? (
|
||
ASTERISK_SIGN
|
||
| projectItemDefinition (COMMA projectItemDefinition)*
|
||
)
|
||
;
|
||
|
||
projectItemDefinition
|
||
: overWindowItem
|
||
| columnName (KW_AS? expression)?
|
||
| expression (KW_AS? columnName)?
|
||
;
|
||
|
||
overWindowItem
|
||
: primaryExpression KW_OVER windowSpec KW_AS identifier
|
||
| primaryExpression KW_OVER errorCapturingIdentifier KW_AS identifier
|
||
;
|
||
|
||
fromClause
|
||
: KW_FROM tableExpression
|
||
;
|
||
|
||
tableExpression
|
||
: tableReference (COMMA tableReference)*
|
||
| tableExpression KW_NATURAL? (KW_LEFT | KW_RIGHT | KW_FULL | KW_INNER)? KW_OUTER? KW_JOIN tableExpression joinCondition?
|
||
| tableExpression KW_CROSS KW_JOIN tableExpression
|
||
| inlineDataValueClause
|
||
| windoTVFClause
|
||
;
|
||
|
||
tableReference
|
||
: tablePrimary tableAlias?
|
||
;
|
||
|
||
tablePrimary
|
||
: KW_TABLE? tablePath systemTimePeriod? (KW_AS? correlationName)?
|
||
| viewPath systemTimePeriod? (KW_AS? correlationName)?
|
||
| KW_LATERAL KW_TABLE LR_BRACKET functionName LR_BRACKET functionParam (COMMA functionParam)* RR_BRACKET RR_BRACKET
|
||
| KW_LATERAL? LR_BRACKET queryStatement RR_BRACKET
|
||
| KW_UNNEST LR_BRACKET expression RR_BRACKET
|
||
;
|
||
|
||
systemTimePeriod
|
||
: KW_FOR KW_SYSTEM_TIME KW_AS KW_OF dateTimeExpression
|
||
;
|
||
|
||
dateTimeExpression
|
||
: expression
|
||
;
|
||
|
||
inlineDataValueClause
|
||
: LR_BRACKET valuesDefinition RR_BRACKET tableAlias
|
||
;
|
||
|
||
windoTVFClause
|
||
: KW_TABLE LR_BRACKET windowTVFExression RR_BRACKET
|
||
;
|
||
|
||
windowTVFExression
|
||
: windoTVFName LR_BRACKET windowTVFParam (COMMA windowTVFParam)* RR_BRACKET
|
||
;
|
||
|
||
windoTVFName
|
||
: KW_TUMBLE
|
||
| KW_HOP
|
||
| KW_CUMULATE
|
||
;
|
||
|
||
windowTVFParam
|
||
: KW_TABLE timeAttrColumn
|
||
| columnDescriptor
|
||
| timeIntervalExpression
|
||
| KW_DATA DOUBLE_RIGHT_ARROW KW_TABLE timeAttrColumn
|
||
| KW_TIMECOL DOUBLE_RIGHT_ARROW columnDescriptor
|
||
| timeIntervalParamName DOUBLE_RIGHT_ARROW timeIntervalExpression
|
||
;
|
||
|
||
timeIntervalParamName
|
||
: KW_DATA
|
||
| KW_TIMECOL
|
||
| KW_SIZE
|
||
| KW_OFFSET
|
||
| KW_STEP
|
||
| KW_SLIDE
|
||
;
|
||
|
||
columnDescriptor
|
||
: KW_DESCRIPTOR LR_BRACKET columnName RR_BRACKET
|
||
;
|
||
|
||
joinCondition
|
||
: KW_ON booleanExpression
|
||
| KW_USING columnNameList
|
||
;
|
||
|
||
whereClause
|
||
: KW_WHERE booleanExpression
|
||
;
|
||
|
||
groupByClause
|
||
: KW_GROUP KW_BY groupItemDefinition (COMMA groupItemDefinition)*
|
||
;
|
||
|
||
groupItemDefinition
|
||
: columnName
|
||
| groupWindowFunction
|
||
| LR_BRACKET RR_BRACKET
|
||
| LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
||
| groupingSetsNotaionName LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
||
| groupingSets LR_BRACKET groupItemDefinition (COMMA groupItemDefinition)* RR_BRACKET
|
||
| expression
|
||
;
|
||
|
||
groupingSets
|
||
: KW_GROUPING KW_SETS
|
||
;
|
||
|
||
groupingSetsNotaionName
|
||
: KW_CUBE
|
||
| KW_ROLLUP
|
||
;
|
||
|
||
groupWindowFunction
|
||
: groupWindowFunctionName LR_BRACKET timeAttrColumn COMMA timeIntervalExpression RR_BRACKET
|
||
;
|
||
|
||
groupWindowFunctionName
|
||
: KW_TUMBLE
|
||
| KW_HOP
|
||
| KW_SESSION
|
||
;
|
||
|
||
timeAttrColumn
|
||
: uid
|
||
;
|
||
|
||
havingClause
|
||
: KW_HAVING booleanExpression
|
||
;
|
||
|
||
windowClause
|
||
: KW_WINDOW namedWindow (COMMA namedWindow)*
|
||
;
|
||
|
||
namedWindow
|
||
: name=errorCapturingIdentifier KW_AS windowSpec
|
||
;
|
||
|
||
windowSpec
|
||
: name=errorCapturingIdentifier? LR_BRACKET partitionByClause? orderByCaluse? windowFrame? RR_BRACKET
|
||
;
|
||
|
||
matchRecognizeClause
|
||
: KW_MATCH_RECOGNIZE LR_BRACKET partitionByClause? orderByCaluse? measuresClause? outputMode? afterMatchStrategy? patternDefination?
|
||
patternVariablesDefination RR_BRACKET (KW_AS? identifier)?
|
||
;
|
||
|
||
orderByCaluse
|
||
: KW_ORDER KW_BY orderItemDefition (COMMA orderItemDefition)*
|
||
;
|
||
|
||
orderItemDefition
|
||
: columnName ordering=(KW_ASC | KW_DESC)? (KW_NULLS nullOrder=(KW_LAST | KW_FIRST))?
|
||
;
|
||
|
||
limitClause
|
||
: KW_LIMIT (KW_ALL | limit=expression)
|
||
;
|
||
|
||
partitionByClause
|
||
: KW_PARTITION KW_BY columnName (COMMA columnName)*
|
||
;
|
||
|
||
quantifiers
|
||
: (ASTERISK_SIGN)
|
||
| (ADD_SIGN)
|
||
| (QUESTION_MARK_SIGN)
|
||
| (LB_BRACKET DIG_LITERAL COMMA DIG_LITERAL RB_BRACKET)
|
||
| (LB_BRACKET DIG_LITERAL COMMA RB_BRACKET)
|
||
| (LB_BRACKET COMMA DIG_LITERAL RB_BRACKET)
|
||
;
|
||
|
||
measuresClause
|
||
: KW_MEASURES projectItemDefinition (COMMA projectItemDefinition)*
|
||
;
|
||
|
||
patternDefination
|
||
: KW_PATTERN LR_BRACKET patternVariable+ RR_BRACKET withinClause?
|
||
;
|
||
|
||
patternVariable
|
||
: unquotedIdentifier quantifiers?
|
||
;
|
||
|
||
outputMode
|
||
: KW_ALL KW_ROWS KW_PER KW_MATCH
|
||
| KW_ONE KW_ROW KW_PER KW_MATCH
|
||
;
|
||
|
||
afterMatchStrategy
|
||
: KW_AFTER KW_MATCH KW_SKIP KW_PAST KW_LAST KW_ROW
|
||
| KW_AFTER KW_MATCH KW_SKIP KW_TO KW_NEXT KW_ROW
|
||
| KW_AFTER KW_MATCH KW_SKIP KW_TO KW_LAST unquotedIdentifier
|
||
| KW_AFTER KW_MATCH KW_SKIP KW_TO KW_FIRST unquotedIdentifier
|
||
;
|
||
|
||
patternVariablesDefination
|
||
: KW_DEFINE projectItemDefinition (COMMA projectItemDefinition)*
|
||
;
|
||
|
||
windowFrame
|
||
: KW_RANGE KW_BETWEEN timeIntervalExpression frameBound
|
||
| KW_ROWS KW_BETWEEN DIG_LITERAL frameBound
|
||
;
|
||
|
||
frameBound
|
||
: KW_PRECEDING KW_AND KW_CURRENT KW_ROW
|
||
;
|
||
|
||
withinClause
|
||
: KW_WITHIN timeIntervalExpression
|
||
;
|
||
|
||
// expression
|
||
|
||
expression
|
||
: booleanExpression
|
||
;
|
||
|
||
booleanExpression
|
||
: KW_NOT booleanExpression # logicalNot
|
||
| KW_EXISTS LR_BRACKET queryStatement RR_BRACKET # exists
|
||
| valueExpression predicate? # predicated
|
||
| left=booleanExpression operator=KW_AND right=booleanExpression # logicalBinary
|
||
| left=booleanExpression operator=KW_OR right=booleanExpression # logicalBinary
|
||
| booleanExpression KW_IS KW_NOT? kind=(KW_TRUE | KW_FALSE | KW_UNKNOWN | KW_NULL) # logicalNested
|
||
;
|
||
|
||
predicate
|
||
: KW_NOT? kind=KW_BETWEEN (KW_ASYMMETRIC | KW_SYMMETRIC)? lower=valueExpression KW_AND upper=valueExpression
|
||
| KW_NOT? kind=KW_IN LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
||
| KW_NOT? kind=KW_IN LR_BRACKET queryStatement RR_BRACKET
|
||
| kind=KW_EXISTS LR_BRACKET queryStatement RR_BRACKET
|
||
| KW_NOT? kind=KW_RLIKE pattern=valueExpression
|
||
| likePredicate
|
||
| KW_IS KW_NOT? kind=(KW_TRUE | KW_FALSE | KW_UNKNOWN | KW_NULL)
|
||
| KW_IS KW_NOT? kind=KW_DISTINCT KW_FROM right=valueExpression
|
||
| KW_NOT? kind=KW_SIMILAR KW_TO right=valueExpression (KW_ESCAPE stringLiteral)?
|
||
;
|
||
|
||
likePredicate
|
||
: KW_NOT? kind=KW_LIKE quantifier=(KW_ANY | KW_ALL) (
|
||
LR_BRACKET RR_BRACKET
|
||
| LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
||
)
|
||
| KW_NOT? kind=KW_LIKE pattern=valueExpression (KW_ESCAPE stringLiteral)?
|
||
;
|
||
|
||
valueExpression
|
||
: primaryExpression # valueExpressionDefault
|
||
| operator=(HYPNEN_SIGN | ADD_SIGN | BIT_NOT_OP) valueExpression # arithmeticUnary
|
||
| left=valueExpression operator=(ASTERISK_SIGN | SLASH_SIGN | PENCENT_SIGN | KW_DIV) right=valueExpression # arithmeticBinary
|
||
| left=valueExpression operator=(ADD_SIGN | HYPNEN_SIGN | DOUBLE_VERTICAL_SIGN) right=valueExpression # arithmeticBinary
|
||
| left=valueExpression operator=BIT_AND_OP right=valueExpression # arithmeticBinary
|
||
| left=valueExpression operator=BIT_XOR_OP right=valueExpression # arithmeticBinary
|
||
| left=valueExpression operator=BIT_OR_OP right=valueExpression # arithmeticBinary
|
||
| left=valueExpression comparisonOperator right=valueExpression # comparison
|
||
;
|
||
|
||
primaryExpression
|
||
: KW_CASE whenClause+ (KW_ELSE elseExpression=expression)? KW_END # searchedCase
|
||
| KW_CASE value=expression whenClause+ (KW_ELSE elseExpression=expression)? KW_END # simpleCase
|
||
| KW_CAST LR_BRACKET expression KW_AS columnType RR_BRACKET # cast
|
||
// | STRUCT LR_BRACKET (argument+=namedExpression (COMMA argument+=namedExpression)*)? RR_BRACKET #struct
|
||
| KW_FIRST LR_BRACKET expression (KW_IGNORE KW_NULLS)? RR_BRACKET # first
|
||
| KW_LAST LR_BRACKET expression (KW_IGNORE KW_NULLS)? RR_BRACKET # last
|
||
| KW_POSITION LR_BRACKET substr=valueExpression KW_IN str=valueExpression RR_BRACKET # position
|
||
| constant # constantDefault
|
||
| ASTERISK_SIGN # star
|
||
| uid DOT ASTERISK_SIGN # star
|
||
// | LR_BRACKET namedExpression (COMMA namedExpression)+ RR_BRACKET #rowConstructor
|
||
| LR_BRACKET queryStatement RR_BRACKET # subqueryExpression
|
||
| functionName LR_BRACKET (setQuantifier? functionParam (COMMA functionParam)*)? RR_BRACKET # functionCall
|
||
// | identifier '->' expression #lambda
|
||
// | '(' identifier (',' identifier)+ ')' '->' expression #lambda
|
||
| value=primaryExpression LS_BRACKET index=valueExpression RS_BRACKET # subscript
|
||
| identifier # columnReference
|
||
| dereferenceDefinition # dereference
|
||
| LR_BRACKET expression RR_BRACKET # parenthesizedExpression
|
||
| KW_CURRENT_TIMESTAMP # dateFunctionExpression
|
||
// | EXTRACT LR_BRACKET field=identifier KW_FROM source=valueExpression RR_BRACKET #extract
|
||
// | (SUBSTR | SUBSTRING) LR_BRACKET str=valueExpression (KW_FROM | COMMA) pos=valueExpression
|
||
// ((KW_FOR | COMMA) len=valueExpression)? RR_BRACKET #substring
|
||
// | TRIM LR_BRACKET trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)?
|
||
// KW_FROM srcStr=valueExpression RR_BRACKET #trim
|
||
// | OVERLAY LR_BRACKET input=valueExpression PLACING replace=valueExpression
|
||
// KW_FROM position=valueExpression (KW_FOR length=valueExpression)? RR_BRACKET #overlay
|
||
;
|
||
|
||
functionNameCreate
|
||
: uid
|
||
;
|
||
|
||
functionName
|
||
: reservedKeywordsUsedAsFuncName
|
||
| uid
|
||
;
|
||
|
||
functionParam
|
||
: reservedKeywordsUsedAsFuncParam
|
||
| timeIntervalUnit
|
||
| timePointUnit
|
||
| expression
|
||
;
|
||
|
||
dereferenceDefinition
|
||
: uid
|
||
;
|
||
|
||
// base common
|
||
|
||
correlationName
|
||
: identifier
|
||
;
|
||
|
||
qualifiedName
|
||
: identifier
|
||
| dereferenceDefinition
|
||
;
|
||
|
||
timeIntervalExpression
|
||
: KW_INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)?
|
||
;
|
||
|
||
errorCapturingMultiUnitsInterval
|
||
: multiUnitsInterval unitToUnitInterval?
|
||
;
|
||
|
||
multiUnitsInterval
|
||
: (intervalValue timeIntervalUnit)+
|
||
;
|
||
|
||
errorCapturingUnitToUnitInterval
|
||
: body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)?
|
||
;
|
||
|
||
unitToUnitInterval
|
||
: value=intervalValue from=timeIntervalUnit KW_TO to=timeIntervalUnit
|
||
;
|
||
|
||
intervalValue
|
||
: (ADD_SIGN | HYPNEN_SIGN)? (DIG_LITERAL | REAL_LITERAL)
|
||
| STRING_LITERAL
|
||
;
|
||
|
||
tableAlias
|
||
: KW_AS? identifier identifierList?
|
||
;
|
||
|
||
errorCapturingIdentifier
|
||
: identifier errorCapturingIdentifierExtra
|
||
;
|
||
|
||
errorCapturingIdentifierExtra
|
||
: (KW_MINUS identifier)+ # errorIdent
|
||
| # realIdent
|
||
;
|
||
|
||
identifierList
|
||
: LR_BRACKET identifierSeq RR_BRACKET
|
||
;
|
||
|
||
identifierSeq
|
||
: identifier (COMMA identifier)*
|
||
;
|
||
|
||
identifier
|
||
: unquotedIdentifier # unquotedIdentifierAlternative
|
||
| quotedIdentifier # quotedIdentifierAlternative
|
||
| nonReservedKeywords # nonReservedKeywordsAlternative
|
||
;
|
||
|
||
unquotedIdentifier
|
||
: DIG_LITERAL
|
||
| ID_LITERAL
|
||
;
|
||
|
||
quotedIdentifier
|
||
: STRING_LITERAL
|
||
;
|
||
|
||
whenClause
|
||
: KW_WHEN condition=expression KW_THEN result=expression
|
||
;
|
||
|
||
catalogPath
|
||
: identifier
|
||
;
|
||
|
||
catalogPathCreate
|
||
: identifier
|
||
;
|
||
|
||
databasePath
|
||
: identifier (DOT identifier)?
|
||
;
|
||
|
||
databasePathCreate
|
||
: identifier (DOT identifier)?
|
||
;
|
||
|
||
tablePathCreate
|
||
: identifier (DOT identifier)?
|
||
| identifier DOT identifier (DOT identifier)?
|
||
;
|
||
|
||
tablePath
|
||
: identifier (DOT identifier)?
|
||
| identifier DOT identifier (DOT identifier)?
|
||
;
|
||
|
||
viewPath
|
||
: identifier (DOT identifier)?
|
||
| identifier DOT identifier (DOT identifier)?
|
||
;
|
||
|
||
viewPathCreate
|
||
: identifier (DOT identifier)?
|
||
| identifier DOT identifier (DOT identifier)?
|
||
;
|
||
|
||
uid
|
||
: identifier (DOT identifier)*?
|
||
;
|
||
|
||
withOption
|
||
: KW_WITH tablePropertyList
|
||
;
|
||
|
||
ifNotExists
|
||
: KW_IF KW_NOT KW_EXISTS
|
||
;
|
||
|
||
ifExists
|
||
: KW_IF KW_EXISTS
|
||
;
|
||
|
||
tablePropertyList
|
||
: LR_BRACKET tableProperty (COMMA tableProperty)* RR_BRACKET
|
||
;
|
||
|
||
tableProperty
|
||
: key=tablePropertyKey (EQUAL_SYMBOL? value=tablePropertyValue)?
|
||
;
|
||
|
||
tablePropertyKey
|
||
: identifier
|
||
| dereferenceDefinition
|
||
| STRING_LITERAL
|
||
;
|
||
|
||
tablePropertyValue
|
||
: DIG_LITERAL
|
||
| REAL_LITERAL
|
||
| booleanLiteral
|
||
| STRING_LITERAL
|
||
;
|
||
|
||
logicalOperator
|
||
: KW_AND
|
||
| BIT_AND_OP BIT_AND_OP
|
||
| KW_OR
|
||
| BIT_OR_OP BIT_OR_OP
|
||
;
|
||
|
||
comparisonOperator
|
||
: EQUAL_SYMBOL
|
||
| GREATER_SYMBOL
|
||
| LESS_SYMBOL
|
||
| LESS_SYMBOL EQUAL_SYMBOL
|
||
| GREATER_SYMBOL EQUAL_SYMBOL
|
||
| LESS_SYMBOL GREATER_SYMBOL
|
||
| EXCLAMATION_SYMBOL EQUAL_SYMBOL
|
||
| LESS_SYMBOL EQUAL_SYMBOL GREATER_SYMBOL
|
||
;
|
||
|
||
bitOperator
|
||
: LESS_SYMBOL LESS_SYMBOL
|
||
| GREATER_SYMBOL GREATER_SYMBOL
|
||
| BIT_AND_OP
|
||
| BIT_XOR_OP
|
||
| BIT_OR_OP
|
||
;
|
||
|
||
mathOperator
|
||
: ASTERISK_SIGN
|
||
| SLASH_SIGN
|
||
| PENCENT_SIGN
|
||
| KW_DIV
|
||
| ADD_SIGN
|
||
| HYPNEN_SIGN
|
||
| DOUBLE_HYPNEN_SIGN
|
||
;
|
||
|
||
unaryOperator
|
||
: EXCLAMATION_SYMBOL
|
||
| BIT_NOT_OP
|
||
| ADD_SIGN
|
||
| HYPNEN_SIGN
|
||
| KW_NOT
|
||
;
|
||
|
||
constant
|
||
: timeIntervalExpression
|
||
| timePointLiteral
|
||
| stringLiteral // 引号包含的字符串
|
||
| HYPNEN_SIGN? decimalLiteral // 正/负整数
|
||
| booleanLiteral // 布尔值
|
||
| REAL_LITERAL // 小数
|
||
| BIT_STRING
|
||
| KW_NOT? KW_NULL // 空 | 非空
|
||
;
|
||
|
||
timePointLiteral
|
||
: timePointUnit stringLiteral
|
||
;
|
||
|
||
stringLiteral
|
||
: STRING_LITERAL
|
||
;
|
||
|
||
decimalLiteral
|
||
: DIG_LITERAL
|
||
;
|
||
|
||
booleanLiteral
|
||
: KW_TRUE
|
||
| KW_FALSE
|
||
;
|
||
|
||
setQuantifier
|
||
: KW_DISTINCT
|
||
| KW_ALL
|
||
;
|
||
|
||
timePointUnit
|
||
: KW_YEAR
|
||
| KW_QUARTER
|
||
| KW_MONTH
|
||
| KW_WEEK
|
||
| KW_DAY
|
||
| KW_HOUR
|
||
| KW_MINUTE
|
||
| KW_SECOND
|
||
| KW_MILLISECOND
|
||
| KW_MICROSECOND
|
||
;
|
||
|
||
timeIntervalUnit
|
||
: KW_MILLENNIUM
|
||
| KW_CENTURY
|
||
| KW_DECADE
|
||
| KW_YEAR
|
||
| KW_YEARS
|
||
| KW_QUARTER
|
||
| KW_MONTH
|
||
| KW_MONTHS
|
||
| KW_WEEK
|
||
| KW_WEEKS
|
||
| KW_DAY
|
||
| KW_DAYS
|
||
| KW_HOUR
|
||
| KW_HOURS
|
||
| KW_MINUTE
|
||
| KW_MINUTES
|
||
| KW_SECOND
|
||
| KW_SECONDS
|
||
| KW_MILLISECOND
|
||
| KW_MICROSECOND
|
||
| KW_NANOSECOND
|
||
| KW_EPOCH
|
||
;
|
||
|
||
reservedKeywordsUsedAsFuncParam
|
||
: KW_ARRAY
|
||
| KW_ALL
|
||
| KW_BOTH
|
||
| KW_CURRENT_TIMESTAMP
|
||
| KW_DISTINCT
|
||
| KW_LEADING
|
||
| KW_TRAILING
|
||
| KW_VALUE
|
||
| ASTERISK_SIGN
|
||
;
|
||
|
||
reservedKeywordsUsedAsFuncName
|
||
: KW_ABS
|
||
| KW_ARRAY
|
||
| KW_AVG
|
||
| KW_CARDINALITY
|
||
| KW_CAST
|
||
| KW_CEIL
|
||
| KW_CEILING
|
||
| KW_COALESCE
|
||
| KW_COLLECT
|
||
| KW_COUNT
|
||
| KW_CUME_DIST
|
||
| KW_CURRENT_DATE
|
||
| KW_CURRENT_TIME
|
||
| KW_CURRENT_TIMESTAMP
|
||
| KW_DATE
|
||
| KW_DAYOFWEEK
|
||
| KW_DAYOFYEAR
|
||
| KW_DENSE_RANK
|
||
| KW_ELEMENT
|
||
| KW_EXP
|
||
| KW_EXTRACT
|
||
| KW_FIRST_VALUE
|
||
| KW_FLOOR
|
||
| KW_GROUPING
|
||
| KW_HOUR
|
||
| KW_IF
|
||
| KW_LAG
|
||
| KW_LAST_VALUE
|
||
| KW_LEAD
|
||
| KW_LEFT
|
||
| KW_LN
|
||
| KW_LOCALTIME
|
||
| KW_LOCALTIMESTAMP
|
||
| KW_LOWER
|
||
| KW_MAP
|
||
| KW_MAX
|
||
| KW_MIN
|
||
| KW_MINUTE
|
||
| KW_MOD
|
||
| KW_MONTH
|
||
| KW_NULLIF
|
||
| KW_NTILE
|
||
| KW_OVERLAY
|
||
| KW_PERCENT_RANK
|
||
| KW_POSITION
|
||
| KW_POWER
|
||
| KW_QUARTER
|
||
| KW_ROW
|
||
| KW_ROWS
|
||
| KW_ROW_NUMBER
|
||
| KW_RANK
|
||
| KW_RIGHT
|
||
| KW_SECOND
|
||
| KW_STDDEV_POP
|
||
| KW_STDDEV_SAMP
|
||
| KW_SUBSTRING
|
||
| KW_SUM
|
||
| KW_TIME
|
||
| KW_TIMESTAMP
|
||
| KW_TIMESTAMP_DIFF
|
||
| KW_TRIM
|
||
| KW_TRUNCATE
|
||
| KW_TRY_CAST
|
||
| KW_UPPER
|
||
| KW_VAR_POP
|
||
| KW_VAR_SAMP
|
||
| KW_WEEK
|
||
| KW_YEAR
|
||
;
|
||
|
||
nonReservedKeywords
|
||
: KW_ADD
|
||
| KW_AFTER
|
||
| KW_ASC
|
||
| KW_CASCADE
|
||
| KW_CATALOG
|
||
| KW_CENTURY
|
||
| KW_CONFIG
|
||
| KW_CONSTRAINTS
|
||
| KW_CUMULATE
|
||
| KW_DATA
|
||
| KW_DATABASE
|
||
| KW_DAYS
|
||
| KW_DECADE
|
||
| KW_DESC
|
||
| KW_DESCRIPTOR
|
||
| KW_DIV
|
||
| KW_ENGINE
|
||
| KW_EPOCH
|
||
| KW_EXCLUDING
|
||
| KW_FILE
|
||
| KW_FIRST
|
||
| KW_GENERATED
|
||
| KW_HOP
|
||
| KW_HOURS
|
||
| KW_IGNORE
|
||
| KW_INCLUDING
|
||
| KW_JAR
|
||
| KW_JARS
|
||
| KW_JAVA
|
||
| KW_KEY
|
||
| KW_LAST
|
||
| KW_LOAD
|
||
| KW_MAP
|
||
| KW_MICROSECOND
|
||
| KW_MILLENNIUM
|
||
| KW_MILLISECOND
|
||
| KW_MINUTES
|
||
| KW_MONTHS
|
||
| KW_NANOSECOND
|
||
| KW_NULLS
|
||
| KW_OPTIONS
|
||
| KW_PAST
|
||
| KW_PLAN
|
||
| KW_PRECEDING
|
||
| KW_PYTHON
|
||
| KW_PYTHON_ARCHIVES
|
||
| KW_PYTHON_DEPENDENCIES
|
||
| KW_PYTHON_FILES
|
||
| KW_PYTHON_JAR
|
||
| KW_PYTHON_PARAMETER
|
||
| KW_PYTHON_REQUIREMENTS
|
||
| KW_QUARTER
|
||
| KW_REMOVE
|
||
| KW_RESTRICT
|
||
| KW_SECONDS
|
||
| KW_SESSION
|
||
| KW_SETS
|
||
| KW_SIZE
|
||
| KW_SLIDE
|
||
| KW_STEP
|
||
| KW_TEMPORARY
|
||
| KW_TIMECOL
|
||
| KW_TUMBLE
|
||
| KW_UNLOAD
|
||
| KW_VIEW
|
||
| KW_WEEK
|
||
| KW_YEARS
|
||
| KW_ZONE
|
||
; |