parser grammar FlinkSqlParser; options { tokenVocab=FlinkSqlLexer; } program: statement EOF; statement : sqlStatements EOF ; sqlStatements : (sqlStatement | emptyStatement)* ; sqlStatement : ddlStatement SEMICOLON? | dmlStatement SEMICOLON? | describeStatement SEMICOLON? | explainStatement SEMICOLON? | useStatement SEMICOLON?| showStatememt SEMICOLON? | loadStatement SEMICOLON?| unloadStatememt SEMICOLON?| setStatememt SEMICOLON? | resetStatememt SEMICOLON?| jarStatememt SEMICOLON?| dtAddStatement SEMICOLON? ; 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 ) tablePath)? likePredicate? | KW_SHOW KW_COLUMNS ( KW_FROM | KW_IN ) uid likePredicate? | KW_SHOW KW_CREATE (KW_TABLE | KW_VIEW) uid | 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_TEXT+ ; // 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 : columnName columnType columnConstraint? commentSpec? ; columnName : uid | expression ; columnNameList : LR_BRACKET columnName (',' 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 : '(' decimalLiteral ')' ; lengthTwoOptionalDimension : '(' decimalLiteral (',' decimalLiteral)? ')' ; lengthTwoStringDimension : '(' stringLiteral (',' stringLiteral)? ')' ; 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 : columnName columnType KW_METADATA (KW_FROM metadataKey)? KW_VIRTUAL? ; metadataKey : STRING_LITERAL ; computedColumnDefinition : columnName KW_AS computedColumnExpression commentSpec? ; // 计算表达式 computedColumnExpression : expression ; watermarkDefinition : KW_WATERMARK KW_FOR expression 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 : '(' transform (',' transform)* ')' ; transform : qualifiedName #identityTransform | transformName=identifier '(' transformArgument (',' transformArgument)* ')' #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 uid withOption ; createDatabase : KW_CREATE KW_DATABASE ifNotExists? databasePathCreate commentSpec? withOption ; createView : KW_CREATE KW_TEMPORARY? KW_VIEW ifNotExists? uid columnNameList? commentSpec? KW_AS queryStatement ; createFunction : KW_CREATE (KW_TEMPORARY|KW_TEMPORARY KW_SYSTEM)? KW_FUNCTION ifNotExists? functionName 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 uid (renameDefinition | KW_AS queryStatement) ; alterDatabase : KW_ALTER KW_DATABASE databasePath setKeyValueDefinition ; alterFunction : KW_ALTER (KW_TEMPORARY|KW_TEMPORARY KW_SYSTEM)? KW_FUNCTION ifExists? uid KW_AS identifier (KW_LANGUAGE (KW_JAVA|KW_SCALA|KW_PYTHON))? ; // 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? uid ; 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 | '(' queryStatement ')' | 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 | expression (KW_AS? expression)? ; 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)? | 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 uid RR_BRACKET ; joinCondition : KW_ON booleanExpression | KW_USING LR_BRACKET uid (COMMA uid)* RR_BRACKET ; whereClause : KW_WHERE booleanExpression ; groupByClause : KW_GROUP KW_BY groupItemDefinition (COMMA groupItemDefinition)* ; groupItemDefinition : expression | 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 ; 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 (',' 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 : expression ordering=(KW_ASC | KW_DESC)? (KW_NULLS nullOrder=(KW_LAST | KW_FIRST))? ; limitClause : KW_LIMIT (KW_ALL | limit=expression) ; partitionByClause : KW_PARTITION KW_BY expression (COMMA expression)* ; 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 '(' queryStatement ')' #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 '(' expression (',' expression)* ')' | KW_NOT? kind=KW_IN '(' queryStatement ')' | kind=KW_EXISTS '(' queryStatement ')' | 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) ('('')' | '(' expression (',' expression)* ')') | KW_NOT? kind=KW_LIKE pattern=valueExpression (KW_ESCAPE stringLiteral)? ; valueExpression : primaryExpression #valueExpressionDefault | operator=('-' | '+' | '~') valueExpression #arithmeticUnary | left=valueExpression operator=('*' | '/' | '%' | KW_DIV) right=valueExpression #arithmeticBinary | left=valueExpression operator=('+' | '-' | DOUBLE_VERTICAL_SIGN) right=valueExpression #arithmeticBinary | left=valueExpression operator='&' right=valueExpression #arithmeticBinary | left=valueExpression operator='^' right=valueExpression #arithmeticBinary | left=valueExpression operator='|' right=valueExpression #arithmeticBinary | left=valueExpression comparisonOperator right=valueExpression #comparison | left=valueExpression right=SLASH_TEXT #arithmeticBinaryAlternate ; 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 '(' expression KW_AS columnType ')' #cast // | STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct | KW_FIRST '(' expression (KW_IGNORE KW_NULLS)? ')' #first | KW_LAST '(' expression (KW_IGNORE KW_NULLS)? ')' #last | KW_POSITION '(' substr=valueExpression KW_IN str=valueExpression ')' #position | constant #constantDefault | '*' #star | uid '.' '*' #star // | '(' namedExpression (',' namedExpression)+ ')' #rowConstructor | '(' queryStatement ')' #subqueryExpression | functionName '(' (setQuantifier? functionParam (',' functionParam)*)? ')' #functionCall // | identifier '->' expression #lambda // | '(' identifier (',' identifier)+ ')' '->' expression #lambda | value=primaryExpression LS_BRACKET index=valueExpression RS_BRACKET #subscript | identifier #columnReference | dereferenceDefinition #dereference | '(' expression ')' #parenthesizedExpression // | EXTRACT '(' field=identifier KW_FROM source=valueExpression ')' #extract // | (SUBSTR | SUBSTRING) '(' str=valueExpression (KW_FROM | ',') pos=valueExpression // ((KW_FOR | ',') len=valueExpression)? ')' #substring // | TRIM '(' trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)? // KW_FROM srcStr=valueExpression ')' #trim // | OVERLAY '(' input=valueExpression PLACING replace=valueExpression // KW_FROM position=valueExpression (KW_FOR length=valueExpression)? ')' #overlay ; functionName : reservedKeywordsUsedAsFuncName | nonReservedKeywords | 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 : ('+' | '-')? (DIG_LITERAL | REAL_LITERAL) | STRING_LITERAL ; columnAlias : KW_AS? identifier identifierList? ; tableAlias : KW_AS? identifier identifierList? ; errorCapturingIdentifier : identifier errorCapturingIdentifierExtra ; errorCapturingIdentifierExtra : (KW_MINUS identifier)+ #errorIdent | #realIdent ; identifierList : '(' identifierSeq ')' ; 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 : uid ; databasePath : uid ; databasePathCreate : uid ; tablePathCreate : uid ; tablePath : uid ; uid : identifier (DOT identifier)*? ; withOption : KW_WITH tablePropertyList ; ifNotExists : KW_IF KW_NOT KW_EXISTS; ifExists : KW_IF KW_EXISTS; tablePropertyList : '(' tableProperty (',' tableProperty)* ')' ; tableProperty : key=tablePropertyKey (EQUAL_SYMBOL? value=tablePropertyValue)? ; tablePropertyKey : identifier | dereferenceDefinition | STRING_LITERAL ; tablePropertyValue : DIG_LITERAL | REAL_LITERAL | booleanLiteral | STRING_LITERAL ; logicalOperator : KW_AND | '&' '&' | KW_OR | '|' '|' ; comparisonOperator : '=' | '>' | '<' | '<' '=' | '>' '=' | '<' '>' | '!' '=' | '<' '=' '>' ; bitOperator : '<' '<' | '>' '>' | '&' | '^' | '|' ; mathOperator : '*' | SLASH_SIGN | PENCENT_SIGN | KW_DIV | '+' | '-' | DOUBLE_HYPNEN_SIGN ; unaryOperator : '!' | '~' | ADD_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_LEADING | KW_TRAILING | KW_BOTH | KW_ALL | KW_DISTINCT | ASTERISK_SIGN ; reservedKeywordsUsedAsFuncName : KW_ABS | KW_ARRAY | KW_AVG | KW_CAST | KW_CEIL | KW_COALESCE | KW_COLLECT | KW_COUNT | KW_DATE | KW_GROUPING | KW_HOUR | KW_IF | KW_LAG | KW_LEFT | KW_MAP | KW_MINUTE | KW_MONTH | KW_OVERLAY | KW_POSITION | KW_POWER | KW_QUARTER | KW_ROW | KW_ROWS | KW_RANK | KW_RIGHT | KW_SECOND | KW_SUBSTRING | KW_SUM | KW_TIME | KW_TIMESTAMP | KW_TRUNCATE | KW_UPPER | KW_WEEK | KW_YEAR ; reservedKeywords : KW_ABS | KW_ALL | KW_ALLOW | KW_ALTER | KW_AND | KW_ANY | KW_ARE | KW_ARRAY | KW_AS | KW_ASYMMETRIC | KW_AT | KW_AVG | KW_BEGIN | KW_BETWEEN | KW_BIGINT | KW_BINARY | KW_BIT | KW_BLOB | KW_BOOLEAN | KW_BOTH | KW_BY | KW_CALL | KW_CALLED | KW_CASCADED | KW_CASE | KW_CAST | KW_CEIL | KW_CHAR | KW_CHARACTER | KW_CHECK | KW_CLOB | KW_CLOSE | KW_COALESCE | KW_COLLATE | KW_COLLECT | KW_COLUMN | KW_COMMIT | KW_CONNECT | KW_CONSTRAINT | KW_CONTAINS | KW_CONVERT | KW_COUNT | KW_CREATE | KW_CROSS | KW_CUBE | KW_CURRENT | KW_CURSOR | KW_CYCLE | KW_DATE | KW_DATETIME | KW_DAY | KW_DEC | KW_DECIMAL | KW_DECLARE | KW_DEFAULT | KW_DEFINE | KW_DELETE | KW_DESCRIBE | KW_DISTINCT | KW_DOUBLE | KW_DROP | KW_EACH | KW_ELSE | KW_END | KW_EQUALS | KW_EXCEPT | KW_EXECUTE | KW_EXISTS | KW_EXPLAIN | KW_EXTERNAL | KW_EXTRACT | KW_FALSE | KW_FLOAT | KW_FOR | KW_FROM | KW_FULL | KW_FUNCTION | KW_GLOBAL | KW_GRANT | KW_GROUP | KW_GROUPING | KW_GROUPS | KW_HAVING | KW_HOUR | KW_IMPORT | KW_IN | KW_INCLUDING | KW_INNER | KW_INOUT | KW_INSERT | KW_INT | KW_INTEGER | KW_INTERSECT | KW_INTERVAL | KW_INTO | KW_IS | KW_JOIN | KW_LAG | KW_LANGUAGE | KW_LATERAL | KW_LEADING | KW_LEFT | KW_LIKE | KW_LIMIT | KW_LOCAL | KW_MATCH | KW_MATCH_RECOGNIZE | KW_MEASURES | KW_MERGE | KW_METADATA | KW_MINUS | KW_MINUTE | KW_MODIFIES | KW_MODULE | KW_MONTH | KW_MULTISET | KW_NATURAL | KW_NEXT | KW_NO | KW_NONE | KW_NOT | KW_NULL | KW_NUMERIC | KW_OF | KW_OFFSET | KW_ON | KW_ONE | KW_OR | KW_ORDER | KW_OUT | KW_OUTER | KW_OVER | KW_OVERLAY | KW_PARTITION | KW_PATTERN | KW_PER | KW_PERCENT | KW_PERIOD | KW_POSITION | KW_PRIMARY | KW_RANGE | KW_RANK | KW_RESET | KW_REVOKE | KW_RIGHT | KW_RLIKE | KW_ROLLBACK | KW_ROLLUP | KW_ROW | KW_ROWS | KW_SECOND | KW_SELECT | KW_SET | KW_SHOW | KW_SIMILAR | KW_SKIP | KW_SMALLINT | KW_START | KW_STATIC | KW_SUBSTRING | KW_SUM | KW_SYSTEM_TIME | KW_SYSTEM | KW_SYSTEM_TIME | KW_SYSTEM_USER | KW_TABLE | KW_TABLESAMPLE | KW_THEN | KW_TIME | KW_TIMESTAMP | KW_TINYINT | KW_TO | KW_TRUE | KW_TRUNCATE | KW_UNION | KW_UNIQUE | KW_UNKNOWN | KW_UNNEST | KW_UPPER | KW_UPSERT | KW_USER | KW_USING | KW_VALUE | KW_VALUES | KW_VARBINARY | KW_VARCHAR | KW_WHEN | KW_WHERE | KW_WINDOW | KW_WITH | KW_WITHIN | KW_WITHOUT | KW_YEAR ; nonReservedKeywords :KW_ADD |KW_ADMIN |KW_AFTER |KW_ANALYZE |KW_ASC |KW_BEFORE |KW_BYTES |KW_CASCADE |KW_CATALOG |KW_CATALOGS |KW_CENTURY |KW_CHAIN |KW_CHANGELOG_MODE |KW_CHARACTERS |KW_COMMENT |KW_COMPACT |KW_COLUMNS |KW_CONSTRAINTS |KW_CONSTRUCTOR |KW_CUMULATE |KW_DATA |KW_DATABASE |KW_DATABASES |KW_DAYS |KW_DECADE |KW_DEFINED |KW_DESC |KW_DESCRIPTOR |KW_DIV |KW_ENCODING |KW_ENFORCED |KW_ENGINE |KW_ERROR |KW_ESTIMATED_COST |KW_EXCEPTION |KW_EXCLUDE |KW_EXCLUDING |KW_EXTENDED |KW_FILE |KW_FINAL |KW_FIRST |KW_FOLLOWING |KW_FORMAT |KW_FORTRAN |KW_FOUND |KW_FRAC_SECOND |KW_FUNCTIONS |KW_GENERAL |KW_GENERATED |KW_GO |KW_GOTO |KW_GRANTED |KW_HOP |KW_HOURS |KW_IF |KW_IGNORE |KW_INCREMENT |KW_INPUT |KW_INVOKER |KW_JAR |KW_JARS |KW_JAVA |KW_JSON |KW_JSON_EXECUTION_PLAN |KW_KEY |KW_KEY_MEMBER |KW_KEY_TYPE |KW_LABEL |KW_LAST |KW_LENGTH |KW_LEVEL |KW_LOAD |KW_MAP |KW_MICROSECOND |KW_MILLENNIUM |KW_MILLISECOND |KW_MINUTES |KW_MINVALUE |KW_MODIFY |KW_MODULES |KW_MONTHS |KW_NANOSECOND |KW_NULLS |KW_NUMBER |KW_OPTION |KW_OPTIONS |KW_ORDERING |KW_OUTPUT |KW_OVERWRITE |KW_OVERWRITING |KW_PARTITIONED |KW_PARTITIONS |KW_PASSING |KW_PAST |KW_PATH |KW_PLACING |KW_PLAN |KW_PRECEDING |KW_PRESERVE |KW_PRIOR |KW_PRIVILEGES |KW_PUBLIC |KW_PYTHON |KW_PYTHON_FILES |KW_PYTHON_REQUIREMENTS |KW_PYTHON_DEPENDENCIES |KW_PYTHON_JAR |KW_PYTHON_ARCHIVES |KW_PYTHON_PARAMETER |KW_QUARTER |KW_RAW |KW_READ |KW_RELATIVE |KW_REMOVE |KW_RENAME |KW_REPLACE |KW_RESPECT |KW_RESTART |KW_RESTRICT |KW_ROLE |KW_ROW_COUNT |KW_SCALA |KW_SCALAR |KW_SCALE |KW_SCHEMA |KW_SECONDS |KW_SECTION |KW_SECURITY |KW_SELF |KW_SERVER |KW_SERVER_NAME |KW_SESSION |KW_SETS |KW_SIMPLE |KW_SIZE |KW_SLIDE |KW_SOURCE |KW_SPACE |KW_STATE |KW_STATEMENT |KW_STEP |KW_STRING |KW_STRUCTURE |KW_STYLE |KW_TABLES |KW_TEMPORARY |KW_TIMECOL |KW_TIMESTAMP_LTZ |KW_TIMESTAMPADD |KW_TIMESTAMPDIFF |KW_TRANSFORM |KW_TUMBLE |KW_TYPE |KW_UNDER |KW_UNLOAD |KW_USAGE |KW_USE |KW_UTF16 |KW_UTF32 |KW_UTF8 |KW_VERSION |KW_VIEW |KW_VIEWS |KW_VIRTUAL |KW_WATERMARK |KW_WATERMARKS |KW_WEEK |KW_WORK |KW_WRAPPER |KW_YEARS |KW_ZONE ;