feat(fink): refactoring selectStatement
This commit is contained in:
parent
a5ea7be606
commit
d7d32a3824
@ -320,6 +320,8 @@ BIT_XOR_OP: '^';
|
|||||||
// Constructors symbols
|
// Constructors symbols
|
||||||
|
|
||||||
DOT: '.';
|
DOT: '.';
|
||||||
|
LS_BRACKET: '[';
|
||||||
|
RS_BRACKET: ']';
|
||||||
LR_BRACKET: '(';
|
LR_BRACKET: '(';
|
||||||
RR_BRACKET: ')';
|
RR_BRACKET: ')';
|
||||||
COMMA: ',';
|
COMMA: ',';
|
||||||
@ -333,6 +335,7 @@ DOUBLE_QUOTE_SYMB: '"';
|
|||||||
REVERSE_QUOTE_SYMB: '`';
|
REVERSE_QUOTE_SYMB: '`';
|
||||||
COLON_SYMB: ':';
|
COLON_SYMB: ':';
|
||||||
ASTERISK_SIGN: '*';
|
ASTERISK_SIGN: '*';
|
||||||
|
UNDERLINE_SIGN: '_';
|
||||||
STRING_LITERAL: DQUOTA_STRING | SQUOTA_STRING | BQUOTA_STRING;
|
STRING_LITERAL: DQUOTA_STRING | SQUOTA_STRING | BQUOTA_STRING;
|
||||||
DECIMAL_LITERAL: DEC_DIGIT+;
|
DECIMAL_LITERAL: DEC_DIGIT+;
|
||||||
REAL_LITERAL: (DEC_DIGIT+)? '.' DEC_DIGIT+
|
REAL_LITERAL: (DEC_DIGIT+)? '.' DEC_DIGIT+
|
||||||
@ -340,10 +343,12 @@ REAL_LITERAL: (DEC_DIGIT+)? '.' DEC_DIGIT+
|
|||||||
| (DEC_DIGIT+)? '.' (DEC_DIGIT+ EXPONENT_NUM_PART)
|
| (DEC_DIGIT+)? '.' (DEC_DIGIT+ EXPONENT_NUM_PART)
|
||||||
| DEC_DIGIT+ EXPONENT_NUM_PART;
|
| DEC_DIGIT+ EXPONENT_NUM_PART;
|
||||||
BIT_STRING: BIT_STRING_L;
|
BIT_STRING: BIT_STRING_L;
|
||||||
|
IDENTIFIER_BASE: (DEC_LETTER | DEC_DIGIT | UNDERLINE_SIGN)+;
|
||||||
|
|
||||||
fragment EXPONENT_NUM_PART: 'E' [-+]? DEC_DIGIT+;
|
fragment EXPONENT_NUM_PART: 'E' [-+]? DEC_DIGIT+;
|
||||||
fragment ID_LITERAL: [A-Z_0-9a-z]*?[A-Z_a-z]+?[A-Z_0-9a-z]*;
|
fragment ID_LITERAL: [A-Z_0-9a-z]*?[A-Z_a-z]+?[A-Z_0-9a-z]*;
|
||||||
fragment DEC_DIGIT: [0-9];
|
fragment DEC_DIGIT: [0-9];
|
||||||
|
fragment DEC_LETTER: [A-Za-z];
|
||||||
fragment DQUOTA_STRING: '"' ( '\\'. | '""' | ~('"'| '\\') )* '"';
|
fragment DQUOTA_STRING: '"' ( '\\'. | '""' | ~('"'| '\\') )* '"';
|
||||||
fragment SQUOTA_STRING: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'';
|
fragment SQUOTA_STRING: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'';
|
||||||
fragment BIT_STRING_L: 'B' '\'' [01]+ '\'';
|
fragment BIT_STRING_L: 'B' '\'' [01]+ '\'';
|
||||||
|
@ -126,122 +126,6 @@ dropFunction
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
// Select statements
|
|
||||||
|
|
||||||
queryStatement
|
|
||||||
: valuesDefinition | selectStatements queryOrderByDefinition? queryLimitDefinition? queryOffsetDefinition? queryFetchDefinition?
|
|
||||||
;
|
|
||||||
|
|
||||||
selectStatements
|
|
||||||
: selectStatement
|
|
||||||
| selectWithoutFromDefinition
|
|
||||||
// | queryStatement UNION ALL? queryStatement
|
|
||||||
// | queryStatement EXCEPT queryStatement
|
|
||||||
// | queryStatement INTERSECT queryStatement
|
|
||||||
;
|
|
||||||
|
|
||||||
selectStatement
|
|
||||||
: SELECT (ALL | DISTINCT)?
|
|
||||||
(ASTERISK_SIGN | projectItemDefinition (COMMA projectItemDefinition)*)
|
|
||||||
FROM tableExpression
|
|
||||||
(WHERE expression)?
|
|
||||||
(GROUP BY groupItemDefinition (COMMA groupItemDefinition)*)
|
|
||||||
(HAVING expression)?
|
|
||||||
// (WINDOW windowName AS windowSpec (COMMA windowName AS windowSpec)*)?
|
|
||||||
;
|
|
||||||
|
|
||||||
projectItemDefinition
|
|
||||||
: expression (AS? uid)? | uid '.' '*'
|
|
||||||
;
|
|
||||||
|
|
||||||
tableExpression
|
|
||||||
: tableReference (COMMA tableReference)*
|
|
||||||
| tableExpression NATURAL? (LEFT | RIGHT | FULL)? JOIN tableExpression joinCondition?
|
|
||||||
;
|
|
||||||
|
|
||||||
tableReference
|
|
||||||
: tablePrimary matchRecognize? (AS? uid (LR_BRACKET uid (COMMA uid)* RR_BRACKET)?)?
|
|
||||||
;
|
|
||||||
|
|
||||||
matchRecognize
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
tablePrimary
|
|
||||||
: TABLE? uid dynamicTableOptions?
|
|
||||||
| LATERAL TABLE LR_BRACKET uid LR_BRACKET expression (COMMA expression)* RR_BRACKET RR_BRACKET
|
|
||||||
| UNNEST LR_BRACKET expression RR_BRACKET
|
|
||||||
;
|
|
||||||
|
|
||||||
dynamicTableOptions
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
joinCondition
|
|
||||||
: ON booleanExpression | USING LR_BRACKET uid (COMMA uid)* RR_BRACKET
|
|
||||||
;
|
|
||||||
|
|
||||||
booleanExpression
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
groupItemDefinition
|
|
||||||
: expression
|
|
||||||
| LR_BRACKET RR_BRACKET
|
|
||||||
| LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
|
||||||
| CUBE LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
|
||||||
| ROLLUP LR_BRACKET expression (COMMA expression)* RR_BRACKET
|
|
||||||
| GROUPING SETS LR_BRACKET groupItemDefinition (COMMA groupItemDefinition)* RR_BRACKET
|
|
||||||
;
|
|
||||||
|
|
||||||
// windowRef
|
|
||||||
// : windowName | windowSpec
|
|
||||||
// ;
|
|
||||||
|
|
||||||
// windowSpec
|
|
||||||
// : windowName
|
|
||||||
// LR_BRACKET
|
|
||||||
// (ORDER BY orderItem (COMMA orderItem)*)?
|
|
||||||
// (PARTITION BY expression (COMMA expression)*)
|
|
||||||
// (
|
|
||||||
// RANGE numericOrIntervalExpression PRECEDING
|
|
||||||
// | ROWS numericExpression PRECEDING
|
|
||||||
// )?
|
|
||||||
// RR_BRACKET
|
|
||||||
// ;
|
|
||||||
|
|
||||||
selectWithoutFromDefinition
|
|
||||||
: SELECT (ALL | DISTINCT)? (ASTERISK_SIGN | projectItem (COMMA projectItem)*)
|
|
||||||
;
|
|
||||||
|
|
||||||
projectItem
|
|
||||||
: expression (AS? uid)? | uid '.' '*'
|
|
||||||
;
|
|
||||||
|
|
||||||
queryOrderByDefinition
|
|
||||||
: ORDER BY orderItemDefition (COMMA orderItemDefition)*
|
|
||||||
;
|
|
||||||
|
|
||||||
orderItemDefition
|
|
||||||
: expression (ASC | DESC)
|
|
||||||
;
|
|
||||||
|
|
||||||
queryLimitDefinition
|
|
||||||
: LIMIT (countDefinition | ALL)
|
|
||||||
;
|
|
||||||
|
|
||||||
countDefinition
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
queryOffsetDefinition // OFFSET start (ROW | ROWS)
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
queryFetchDefinition // FETCH (FIRST | NEXT) countDefinition? (ROW | ROWS) ONLY
|
|
||||||
:
|
|
||||||
;
|
|
||||||
|
|
||||||
// Insert statements
|
// Insert statements
|
||||||
|
|
||||||
insertStatement
|
insertStatement
|
||||||
@ -272,8 +156,134 @@ allValueDifinition
|
|||||||
: stringLiteral | booleanLiteral | DEC_DIGIT | NULL
|
: stringLiteral | booleanLiteral | DEC_DIGIT | NULL
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
// Select statements
|
||||||
|
|
||||||
|
queryStatement
|
||||||
|
:
|
||||||
|
;
|
||||||
|
|
||||||
|
selectStatement
|
||||||
|
: SELECT setQuantifier?
|
||||||
|
(ASTERISK_SIGN | projectItemDefinition (COMMA projectItemDefinition)*)
|
||||||
|
FROM tableExpression
|
||||||
|
;
|
||||||
|
|
||||||
|
projectItemDefinition
|
||||||
|
: expression (AS? uid)? | uid '.' '*'
|
||||||
|
;
|
||||||
|
|
||||||
|
tableExpression
|
||||||
|
: tableReference (COMMA tableReference)*
|
||||||
|
;
|
||||||
|
|
||||||
|
tableReference
|
||||||
|
: tablePrimary tableAlias
|
||||||
|
;
|
||||||
|
|
||||||
|
tablePrimary
|
||||||
|
: TABLE? uid
|
||||||
|
;
|
||||||
|
|
||||||
|
// expression
|
||||||
|
|
||||||
|
expression
|
||||||
|
: booleanExpression
|
||||||
|
;
|
||||||
|
|
||||||
|
booleanExpression
|
||||||
|
: NOT booleanExpression #logicalNot
|
||||||
|
// | EXISTS '(' query ')' #exists
|
||||||
|
| valueExpression predicate? #predicated
|
||||||
|
| left=booleanExpression operator=AND right=booleanExpression #logicalBinary
|
||||||
|
| left=booleanExpression operator=OR right=booleanExpression #logicalBinary
|
||||||
|
;
|
||||||
|
|
||||||
|
predicate
|
||||||
|
: NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression
|
||||||
|
| NOT? kind=IN '(' expression (',' expression)* ')'
|
||||||
|
// | NOT? kind=IN '(' query ')'
|
||||||
|
| NOT? kind=RLIKE pattern=valueExpression
|
||||||
|
| NOT? kind=LIKE quantifier=(ANY | ALL) ('('')' | '(' expression (',' expression)* ')')
|
||||||
|
| NOT? kind=LIKE pattern=valueExpression
|
||||||
|
| IS NOT? kind=NULL
|
||||||
|
| IS NOT? kind=(TRUE | FALSE)
|
||||||
|
| IS NOT? kind=DISTINCT FROM right=valueExpression
|
||||||
|
;
|
||||||
|
|
||||||
|
valueExpression
|
||||||
|
: primaryExpression #valueExpressionDefault
|
||||||
|
| operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary
|
||||||
|
| left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary
|
||||||
|
| left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression #arithmeticBinary
|
||||||
|
| left=valueExpression operator=AMPERSAND right=valueExpression #arithmeticBinary
|
||||||
|
| left=valueExpression operator=HAT right=valueExpression #arithmeticBinary
|
||||||
|
| left=valueExpression operator=PIPE right=valueExpression #arithmeticBinary
|
||||||
|
| left=valueExpression comparisonOperator right=valueExpression #comparison
|
||||||
|
;
|
||||||
|
|
||||||
|
primaryExpression
|
||||||
|
: CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
|
||||||
|
| CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase
|
||||||
|
// | CAST '(' expression AS dataType ')' #cast
|
||||||
|
// | STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct
|
||||||
|
| FIRST '(' expression (IGNORE NULLS)? ')' #first
|
||||||
|
| LAST '(' expression (IGNORE NULLS)? ')' #last
|
||||||
|
| POSITION '(' substr=valueExpression IN str=valueExpression ')' #position
|
||||||
|
| constant #constantDefault
|
||||||
|
| ASTERISK #star
|
||||||
|
// | qualifiedName '.' ASTERISK #star
|
||||||
|
// | '(' namedExpression (',' namedExpression)+ ')' #rowConstructor
|
||||||
|
// | '(' query ')' #subqueryExpression
|
||||||
|
// | functionName '(' (setQuantifier? argument+=expression (',' argument+=expression)*)? ')'
|
||||||
|
// (FILTER '(' WHERE where=booleanExpression ')')? (OVER windowSpec)? #functionCall
|
||||||
|
// | identifier '->' expression #lambda
|
||||||
|
// | '(' identifier (',' identifier)+ ')' '->' expression #lambda
|
||||||
|
| value=primaryExpression LS_BRACKET index=valueExpression RS_BRACKET #subscript
|
||||||
|
// | identifier #columnReference
|
||||||
|
// | base=primaryExpression '.' fieldName=identifier #dereference
|
||||||
|
| '(' expression ')' #parenthesizedExpression
|
||||||
|
// | EXTRACT '(' field=identifier FROM source=valueExpression ')' #extract
|
||||||
|
// | (SUBSTR | SUBSTRING) '(' str=valueExpression (FROM | ',') pos=valueExpression
|
||||||
|
// ((FOR | ',') len=valueExpression)? ')' #substring
|
||||||
|
// | TRIM '(' trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)?
|
||||||
|
// FROM srcStr=valueExpression ')' #trim
|
||||||
|
// | OVERLAY '(' input=valueExpression PLACING replace=valueExpression
|
||||||
|
// FROM position=valueExpression (FOR length=valueExpression)? ')' #overlay
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
// base common
|
// base common
|
||||||
|
|
||||||
|
tableAlias
|
||||||
|
: (AS? strictIdentifier identifierList?)?
|
||||||
|
;
|
||||||
|
|
||||||
|
identifierList
|
||||||
|
: '(' identifierSeq ')'
|
||||||
|
;
|
||||||
|
|
||||||
|
identifierSeq
|
||||||
|
: identifier (COMMA identifier)*
|
||||||
|
;
|
||||||
|
|
||||||
|
identifier
|
||||||
|
: strictIdentifier
|
||||||
|
;
|
||||||
|
|
||||||
|
strictIdentifier
|
||||||
|
: IDENTIFIER_BASE #unquotedIdentifier
|
||||||
|
| quotedIdentifier #quotedIdentifierAlternative
|
||||||
|
;
|
||||||
|
|
||||||
|
quotedIdentifier
|
||||||
|
: STRING_LITERAL
|
||||||
|
;
|
||||||
|
|
||||||
|
whenClause
|
||||||
|
: WHEN condition=expression THEN result=expression
|
||||||
|
;
|
||||||
|
|
||||||
uidList
|
uidList
|
||||||
: uid (',' uid)*
|
: uid (',' uid)*
|
||||||
;
|
;
|
||||||
@ -298,43 +308,6 @@ keyValueDefinition
|
|||||||
: DOUBLE_QUOTE_ID EQUAL_SYMBOL DOUBLE_QUOTE_ID
|
: DOUBLE_QUOTE_ID EQUAL_SYMBOL DOUBLE_QUOTE_ID
|
||||||
;
|
;
|
||||||
|
|
||||||
expressions
|
|
||||||
: expression (',' expression)*
|
|
||||||
;
|
|
||||||
|
|
||||||
// Expressions, predicates
|
|
||||||
|
|
||||||
// Simplified approach for expression
|
|
||||||
expression
|
|
||||||
: notOperator=(NOT | '!') expression #notExpression
|
|
||||||
| expression logicalOperator expression #logicalExpression
|
|
||||||
| predicate IS NOT? testValue=(TRUE | FALSE) #isExpression
|
|
||||||
| predicate #predicateExpression
|
|
||||||
;
|
|
||||||
|
|
||||||
predicate
|
|
||||||
: predicate NOT? IN '(' (selectStatement | expressions) ')' #inPredicate
|
|
||||||
| left=predicate comparisonOperator right=predicate #binaryComparasionPredicate
|
|
||||||
| predicate comparisonOperator
|
|
||||||
quantifier=(ALL | ANY) '(' selectStatement ')' #subqueryComparasionPredicate
|
|
||||||
| predicate NOT? BETWEEN predicate AND predicate #betweenPredicate
|
|
||||||
| predicate NOT? LIKE predicate #likePredicate
|
|
||||||
| expressionAtom #expressionAtomPredicate
|
|
||||||
;
|
|
||||||
|
|
||||||
expressionAtom
|
|
||||||
: constant #constantExpressionAtom
|
|
||||||
| fullColumnName #fullColumnNameExpressionAtom
|
|
||||||
| unaryOperator expressionAtom #unaryExpressionAtom
|
|
||||||
| BINARY expressionAtom #binaryExpressionAtom
|
|
||||||
| '(' expression (',' expression)* ')' #nestedExpressionAtom
|
|
||||||
| ROW '(' expression (',' expression)+ ')' #nestedRowExpressionAtom
|
|
||||||
| EXISTS '(' selectStatement ')' #existsExpessionAtom
|
|
||||||
| '(' selectStatement ')' #subqueryExpessionAtom
|
|
||||||
| left=expressionAtom bitOperator right=expressionAtom #bitExpressionAtom
|
|
||||||
| left=expressionAtom mathOperator right=expressionAtom #mathExpressionAtom
|
|
||||||
;
|
|
||||||
|
|
||||||
logicalOperator
|
logicalOperator
|
||||||
: AND | '&' '&' | OR | '|' '|'
|
: AND | '&' '&' | OR | '|' '|'
|
||||||
;
|
;
|
||||||
@ -360,11 +333,13 @@ fullColumnName
|
|||||||
;
|
;
|
||||||
|
|
||||||
constant
|
constant
|
||||||
: stringLiteral | decimalLiteral
|
: stringLiteral // 引号包含的字符串
|
||||||
| '-' decimalLiteral
|
| decimalLiteral // 整数
|
||||||
| booleanLiteral
|
| '-' decimalLiteral // 负整数
|
||||||
| REAL_LITERAL | BIT_STRING
|
| booleanLiteral // 布尔值
|
||||||
| NOT? NULL
|
| REAL_LITERAL // 小数
|
||||||
|
| BIT_STRING
|
||||||
|
| NOT? NULL // 空 | 非空
|
||||||
;
|
;
|
||||||
|
|
||||||
stringLiteral
|
stringLiteral
|
||||||
@ -377,3 +352,8 @@ decimalLiteral
|
|||||||
|
|
||||||
booleanLiteral
|
booleanLiteral
|
||||||
: TRUE | FALSE;
|
: TRUE | FALSE;
|
||||||
|
|
||||||
|
setQuantifier
|
||||||
|
: DISTINCT
|
||||||
|
| ALL
|
||||||
|
;
|
||||||
|
Loading…
Reference in New Issue
Block a user