123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621 |
- grammar KsqlGrammar;
- tokens {
- DELIMITER
- }
- @lexer::members {
- public static final int COMMENTS = 2;
- public static final int WHITESPACE = 3;
- public static final int DIRECTIVES = 4;
- }
- statements
- : (singleStatement)* EOF
- ;
- testStatement
- : (singleStatement | assertStatement ';' | runScript ';') EOF?
- ;
- singleStatement
- : statement ';'
- ;
- singleExpression
- : expression EOF
- ;
- statement
- : query #queryStatement
- | (LIST | SHOW) PROPERTIES #listProperties
- | (LIST | SHOW) ALL? TOPICS EXTENDED? #listTopics
- | (LIST | SHOW) STREAMS EXTENDED? #listStreams
- | (LIST | SHOW) TABLES EXTENDED? #listTables
- | (LIST | SHOW) FUNCTIONS #listFunctions
- | (LIST | SHOW) (SOURCE | SINK)? CONNECTORS #listConnectors
- | (LIST | SHOW) CONNECTOR PLUGINS #listConnectorPlugins
- | (LIST | SHOW) TYPES #listTypes
- | (LIST | SHOW) VARIABLES #listVariables
- | DESCRIBE sourceName EXTENDED? #showColumns
- | DESCRIBE STREAMS EXTENDED? #describeStreams
- | DESCRIBE FUNCTION identifier #describeFunction
- | DESCRIBE CONNECTOR identifier #describeConnector
- | PRINT (identifier| STRING) printClause #printTopic
- | (LIST | SHOW) QUERIES EXTENDED? #listQueries
- | TERMINATE identifier #terminateQuery
- | TERMINATE ALL #terminateQuery
- | SET STRING EQ STRING #setProperty
- | UNSET STRING #unsetProperty
- | DEFINE variableName EQ variableValue #defineVariable
- | UNDEFINE variableName #undefineVariable
- | CREATE (OR REPLACE)? (SOURCE)? STREAM (IF NOT EXISTS)? sourceName
- (tableElements)?
- (WITH tableProperties)? #createStream
- | CREATE (OR REPLACE)? STREAM (IF NOT EXISTS)? sourceName
- (WITH tableProperties)? AS query #createStreamAs
- | CREATE (OR REPLACE)? (SOURCE)? TABLE (IF NOT EXISTS)? sourceName
- (tableElements)?
- (WITH tableProperties)? #createTable
- | CREATE (OR REPLACE)? TABLE (IF NOT EXISTS)? sourceName
- (WITH tableProperties)? AS query #createTableAs
- | CREATE (SINK | SOURCE) CONNECTOR (IF NOT EXISTS)? identifier
- WITH tableProperties #createConnector
- | INSERT INTO sourceName (WITH tableProperties)? query #insertInto
- | INSERT INTO sourceName (columns)? VALUES values #insertValues
- | DROP STREAM (IF EXISTS)? sourceName (DELETE TOPIC)? #dropStream
- | DROP TABLE (IF EXISTS)? sourceName (DELETE TOPIC)? #dropTable
- | DROP CONNECTOR (IF EXISTS)? identifier #dropConnector
- | EXPLAIN (statement | identifier) #explain
- | CREATE TYPE (IF NOT EXISTS)? identifier AS type #registerType
- | DROP TYPE (IF EXISTS)? identifier #dropType
- | ALTER (STREAM | TABLE) sourceName alterOption (',' alterOption)* #alterSource
- ;
- assertStatement
- : ASSERT VALUES sourceName (columns)? VALUES values #assertValues
- | ASSERT NULL VALUES sourceName (columns)? KEY values #assertTombstone
- | ASSERT STREAM sourceName (tableElements)? (WITH tableProperties)? #assertStream
- | ASSERT TABLE sourceName (tableElements)? (WITH tableProperties)? #assertTable
- ;
- runScript
- : RUN SCRIPT STRING
- ;
- query
- : SELECT selectItem (',' selectItem)*
- FROM from=relation
- (WINDOW windowExpression)?
- (WHERE where=booleanExpression)?
- (GROUP BY groupBy)?
- (PARTITION BY partitionBy)?
- (HAVING having=booleanExpression)?
- (EMIT resultMaterialization)?
- limitClause?
- ;
- resultMaterialization
- : CHANGES
- | FINAL
- ;
- alterOption
- : ADD (COLUMN)? identifier type
- ;
- tableElements
- : '(' tableElement (',' tableElement)* ')'
- ;
- tableElement
- : identifier type columnConstraints?
- ;
- columnConstraints
- : ((PRIMARY)? KEY)
- | HEADERS
- | HEADER '(' STRING ')'
- ;
- tableProperties
- : '(' tableProperty (',' tableProperty)* ')'
- ;
- tableProperty
- : (identifier | STRING) EQ literal
- ;
- printClause
- : (FROM BEGINNING)? intervalClause? limitClause?
- ;
- intervalClause
- : (INTERVAL | SAMPLE) number
- ;
- limitClause
- : LIMIT number
- ;
- retentionClause
- : RETENTION number windowUnit
- ;
- gracePeriodClause
- : GRACE PERIOD number windowUnit
- ;
- windowExpression
- : (IDENTIFIER)?
- ( tumblingWindowExpression | hoppingWindowExpression | sessionWindowExpression )
- ;
- tumblingWindowExpression
- : TUMBLING '(' SIZE number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
- ;
- hoppingWindowExpression
- : HOPPING '(' SIZE number windowUnit ',' ADVANCE BY number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
- ;
- sessionWindowExpression
- : SESSION '(' number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
- ;
- windowUnit
- : DAY
- | HOUR
- | MINUTE
- | SECOND
- | MILLISECOND
- | DAYS
- | HOURS
- | MINUTES
- | SECONDS
- | MILLISECONDS
- ;
- groupBy
- : valueExpression (',' valueExpression)*
- | '(' (valueExpression (',' valueExpression)*)? ')'
- ;
- partitionBy
- : valueExpression (',' valueExpression)*
- | '(' (valueExpression (',' valueExpression)*)? ')'
- ;
- values
- : '(' (valueExpression (',' valueExpression)*)? ')'
- ;
- selectItem
- : expression (AS? identifier)? #selectSingle
- | identifier '.' ASTERISK #selectAll
- | ASTERISK #selectAll
- ;
- relation
- : left=aliasedRelation joinedSource+ #joinRelation
- | aliasedRelation #relationDefault
- ;
- joinedSource
- : joinType JOIN aliasedRelation joinWindow? joinCriteria
- ;
- joinType
- : INNER? #innerJoin
- | FULL OUTER? #outerJoin
- | LEFT OUTER? #leftJoin
- ;
- joinWindow
- : WITHIN withinExpression
- ;
- withinExpression
- : '(' joinWindowSize ',' joinWindowSize ')' (gracePeriodClause)? # joinWindowWithBeforeAndAfter
- | joinWindowSize (gracePeriodClause)? # singleJoinWindow
- ;
- joinWindowSize
- : number windowUnit
- ;
- joinCriteria
- : ON booleanExpression
- ;
- aliasedRelation
- : relationPrimary (AS? sourceName)?
- ;
- columns
- : '(' identifier (',' identifier)* ')'
- ;
- relationPrimary
- : sourceName #tableName
- ;
- expression
- : booleanExpression
- ;
- booleanExpression
- : predicated #booleanDefault
- | NOT booleanExpression #logicalNot
- | left=booleanExpression operator=AND right=booleanExpression #logicalBinary
- | left=booleanExpression operator=OR right=booleanExpression #logicalBinary
- ;
- predicated
- : valueExpression predicate[$valueExpression.ctx]?
- ;
- predicate[ParserRuleContext value]
- : comparisonOperator right=valueExpression #comparison
- | NOT? BETWEEN lower=valueExpression AND upper=valueExpression #between
- | NOT? IN '(' expression (',' expression)* ')' #inList
- | NOT? LIKE pattern=valueExpression (ESCAPE escape=STRING)? #like
- | IS NOT? NULL #nullPredicate
- | IS NOT? DISTINCT FROM right=valueExpression #distinctFrom
- ;
- valueExpression
- : primaryExpression #valueExpressionDefault
- | valueExpression AT timeZoneSpecifier #atTimeZone
- | operator=(MINUS | PLUS) valueExpression #arithmeticUnary
- | left=valueExpression operator=(ASTERISK | SLASH | PERCENT) right=valueExpression #arithmeticBinary
- | left=valueExpression operator=(PLUS | MINUS) right=valueExpression #arithmeticBinary
- | left=valueExpression CONCAT right=valueExpression #concatenation
- ;
- primaryExpression
- : literal #literalExpression
- | identifier STRING #typeConstructor
- | CASE valueExpression whenClause+ (ELSE elseExpression=expression)? END #simpleCase
- | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
- | CAST '(' expression AS type ')' #cast
- | ARRAY '[' (expression (',' expression)*)? ']' #arrayConstructor
- | MAP '(' (expression ASSIGN expression (',' expression ASSIGN expression)*)? ')' #mapConstructor
- | STRUCT '(' (identifier ASSIGN expression (',' identifier ASSIGN expression)*)? ')' #structConstructor
- | identifier '(' ASTERISK ')' #functionCall
- | identifier '(' (functionArgument (',' functionArgument)* (',' lambdaFunction)*)? ')' #functionCall
- | value=primaryExpression '[' index=valueExpression ']' #subscript
- | identifier #columnReference
- | identifier '.' identifier #qualifiedColumnReference
- | base=primaryExpression STRUCT_FIELD_REF fieldName=identifier #dereference
- | '(' expression ')' #parenthesizedExpression
- ;
- functionArgument
- : expression
- | windowUnit
- ;
- timeZoneSpecifier
- : TIME ZONE STRING #timeZoneString
- ;
- comparisonOperator
- : EQ | NEQ | LT | LTE | GT | GTE
- ;
- booleanValue
- : TRUE | FALSE
- ;
- type
- : type ARRAY
- | ARRAY '<' type '>'
- | MAP '<' type ',' type '>'
- | STRUCT '<' (identifier type (',' identifier type)*)? '>'
- | DECIMAL '(' number ',' number ')'
- | baseType ('(' typeParameter (',' typeParameter)* ')')?
- ;
- typeParameter
- : INTEGER_VALUE | 'STRING'
- ;
- baseType
- : identifier
- ;
- whenClause
- : WHEN condition=expression THEN result=expression
- ;
- identifier
- : VARIABLE #variableIdentifier
- | IDENTIFIER #unquotedIdentifier
- | QUOTED_IDENTIFIER #quotedIdentifierAlternative
- | nonReserved #unquotedIdentifier
- | BACKQUOTED_IDENTIFIER #backQuotedIdentifier
- | DIGIT_IDENTIFIER #digitIdentifier
- ;
- lambdaFunction
- : identifier '=>' expression #lambda
- | '(' identifier (',' identifier)* ')' '=>' expression #lambda
- ;
- variableName
- : IDENTIFIER
- ;
- variableValue
- : STRING
- ;
- sourceName
- : identifier
- ;
- number
- : MINUS? DECIMAL_VALUE #decimalLiteral
- | MINUS? FLOATING_POINT_VALUE #floatLiteral
- | MINUS? INTEGER_VALUE #integerLiteral
- ;
- literal
- : NULL #nullLiteral
- | number #numericLiteral
- | booleanValue #booleanLiteral
- | STRING #stringLiteral
- | VARIABLE #variableLiteral
- ;
- nonReserved
- : SHOW | TABLES | COLUMNS | COLUMN | PARTITIONS | FUNCTIONS | FUNCTION | SESSION
- | STRUCT | MAP | ARRAY | PARTITION
- | INTEGER | DATE | TIME | TIMESTAMP | INTERVAL | ZONE | 'STRING'
- | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND
- | EXPLAIN | ANALYZE | TYPE | TYPES
- | SET | RESET
- | IF
- | SOURCE | SINK
- | PRIMARY | KEY
- | EMIT
- | CHANGES
- | FINAL
- | ESCAPE
- | REPLACE
- | ASSERT
- | ALTER
- | ADD
- ;
- EMIT: 'EMIT';
- CHANGES: 'CHANGES';
- FINAL: 'FINAL';
- SELECT: 'SELECT';
- FROM: 'FROM';
- AS: 'AS';
- ALL: 'ALL';
- DISTINCT: 'DISTINCT';
- WHERE: 'WHERE';
- WITHIN: 'WITHIN';
- WINDOW: 'WINDOW';
- GROUP: 'GROUP';
- BY: 'BY';
- HAVING: 'HAVING';
- LIMIT: 'LIMIT';
- AT: 'AT';
- OR: 'OR';
- AND: 'AND';
- IN: 'IN';
- NOT: 'NOT';
- EXISTS: 'EXISTS';
- BETWEEN: 'BETWEEN';
- LIKE: 'LIKE';
- ESCAPE: 'ESCAPE';
- IS: 'IS';
- NULL: 'NULL';
- TRUE: 'TRUE';
- FALSE: 'FALSE';
- INTEGER: 'INTEGER';
- DATE: 'DATE';
- TIME: 'TIME';
- TIMESTAMP: 'TIMESTAMP';
- INTERVAL: 'INTERVAL';
- YEAR: 'YEAR';
- MONTH: 'MONTH';
- DAY: 'DAY';
- HOUR: 'HOUR';
- MINUTE: 'MINUTE';
- SECOND: 'SECOND';
- MILLISECOND: 'MILLISECOND';
- YEARS: 'YEARS';
- MONTHS: 'MONTHS';
- DAYS: 'DAYS';
- HOURS: 'HOURS';
- MINUTES: 'MINUTES';
- SECONDS: 'SECONDS';
- MILLISECONDS: 'MILLISECONDS';
- ZONE: 'ZONE';
- TUMBLING: 'TUMBLING';
- HOPPING: 'HOPPING';
- SIZE: 'SIZE';
- ADVANCE: 'ADVANCE';
- RETENTION: 'RETENTION';
- GRACE: 'GRACE';
- PERIOD: 'PERIOD';
- CASE: 'CASE';
- WHEN: 'WHEN';
- THEN: 'THEN';
- ELSE: 'ELSE';
- END: 'END';
- JOIN: 'JOIN';
- FULL: 'FULL';
- OUTER: 'OUTER';
- INNER: 'INNER';
- LEFT: 'LEFT';
- RIGHT: 'RIGHT';
- ON: 'ON';
- PARTITION: 'PARTITION';
- STRUCT: 'STRUCT';
- WITH: 'WITH';
- VALUES: 'VALUES';
- CREATE: 'CREATE';
- TABLE: 'TABLE';
- TOPIC: 'TOPIC';
- STREAM: 'STREAM';
- STREAMS: 'STREAMS';
- INSERT: 'INSERT';
- DELETE: 'DELETE';
- INTO: 'INTO';
- DESCRIBE: 'DESCRIBE';
- EXTENDED: 'EXTENDED';
- PRINT: 'PRINT';
- EXPLAIN: 'EXPLAIN';
- ANALYZE: 'ANALYZE';
- TYPE: 'TYPE';
- TYPES: 'TYPES';
- CAST: 'CAST';
- SHOW: 'SHOW';
- LIST: 'LIST';
- TABLES: 'TABLES';
- TOPICS: 'TOPICS';
- QUERY: 'QUERY';
- QUERIES: 'QUERIES';
- TERMINATE: 'TERMINATE';
- LOAD: 'LOAD';
- COLUMNS: 'COLUMNS';
- COLUMN: 'COLUMN';
- PARTITIONS: 'PARTITIONS';
- FUNCTIONS: 'FUNCTIONS';
- FUNCTION: 'FUNCTION';
- DROP: 'DROP';
- TO: 'TO';
- RENAME: 'RENAME';
- ARRAY: 'ARRAY';
- MAP: 'MAP';
- SET: 'SET';
- DEFINE: 'DEFINE';
- UNDEFINE: 'UNDEFINE';
- RESET: 'RESET';
- SESSION: 'SESSION';
- SAMPLE: 'SAMPLE';
- EXPORT: 'EXPORT';
- CATALOG: 'CATALOG';
- PROPERTIES: 'PROPERTIES';
- BEGINNING: 'BEGINNING';
- UNSET: 'UNSET';
- RUN: 'RUN';
- SCRIPT: 'SCRIPT';
- DECIMAL: 'DECIMAL';
- KEY: 'KEY';
- CONNECTOR: 'CONNECTOR';
- CONNECTORS: 'CONNECTORS';
- SINK: 'SINK';
- SOURCE: 'SOURCE';
- NAMESPACE: 'NAMESPACE';
- MATERIALIZED: 'MATERIALIZED';
- VIEW: 'VIEW';
- PRIMARY: 'PRIMARY';
- REPLACE: 'REPLACE';
- ASSERT: 'ASSERT';
- ADD: 'ADD';
- ALTER: 'ALTER';
- VARIABLES: 'VARIABLES';
- PLUGINS: 'PLUGINS';
- HEADERS: 'HEADERS';
- HEADER: 'HEADER';
- IF: 'IF';
- EQ : '=';
- NEQ : '<>' | '!=';
- LT : '<';
- LTE : '<=';
- GT : '>';
- GTE : '>=';
- PLUS: '+';
- MINUS: '-';
- ASTERISK: '*';
- SLASH: '/';
- PERCENT: '%';
- CONCAT: '||';
- ASSIGN: ':=';
- STRUCT_FIELD_REF: '->';
- LAMBDA_EXPRESSION: '=>';
- STRING
- : '\'' ( ~'\'' | '\'\'' )* '\''
- ;
- INTEGER_VALUE
- : DIGIT+
- ;
- DECIMAL_VALUE
- : DIGIT+ '.' DIGIT*
- | '.' DIGIT+
- ;
- FLOATING_POINT_VALUE
- : DIGIT+ ('.' DIGIT*)? EXPONENT
- | '.' DIGIT+ EXPONENT
- ;
- IDENTIFIER
- : (LETTER | '_') (LETTER | DIGIT | '_' | '@' )*
- ;
- DIGIT_IDENTIFIER
- : DIGIT (LETTER | DIGIT | '_' | '@' )+
- ;
- QUOTED_IDENTIFIER
- : '"' ( ~'"' | '""' )* '"'
- ;
- BACKQUOTED_IDENTIFIER
- : '`' ( ~'`' | '``' )* '`'
- ;
- VARIABLE
- : '${' IDENTIFIER '}'
- ;
- fragment EXPONENT
- : 'E' [+-]? DIGIT+
- ;
- fragment DIGIT
- : [0-9]
- ;
- fragment LETTER
- : [A-Z]
- ;
- SIMPLE_COMMENT
- : '--' ~'@' ~[\r\n]* '\r'? '\n'? -> channel(2) // channel(COMMENTS)
- ;
- DIRECTIVE_COMMENT
- : '--@' ~[\r\n]* '\r'? '\n'? -> channel(4) // channel(DIRECTIVES)
- ;
- BRACKETED_COMMENT
- : '/*' .*? '*/' -> channel(2) // channel(COMMENTS)
- ;
- WS
- : [ \r\n\t]+ -> channel(3) // channel(WHITESPACE)
- ;
- // Catch-all for anything we can't recognize.
- // We use this to be able to ignore and recover all the text
- // when splitting statements with DelimiterLexer
- UNRECOGNIZED
- : .
- ;
|