feat(fink): refactoring selectStatement

This commit is contained in:
Erindcl 2020-11-17 19:57:12 +08:00
parent a5ea7be606
commit d7d32a3824
2 changed files with 143 additions and 158 deletions

View File

@ -320,6 +320,8 @@ BIT_XOR_OP: '^';
// Constructors symbols
DOT: '.';
LS_BRACKET: '[';
RS_BRACKET: ']';
LR_BRACKET: '(';
RR_BRACKET: ')';
COMMA: ',';
@ -333,6 +335,7 @@ DOUBLE_QUOTE_SYMB: '"';
REVERSE_QUOTE_SYMB: '`';
COLON_SYMB: ':';
ASTERISK_SIGN: '*';
UNDERLINE_SIGN: '_';
STRING_LITERAL: DQUOTA_STRING | SQUOTA_STRING | BQUOTA_STRING;
DECIMAL_LITERAL: 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+ EXPONENT_NUM_PART;
BIT_STRING: BIT_STRING_L;
IDENTIFIER_BASE: (DEC_LETTER | DEC_DIGIT | UNDERLINE_SIGN)+;
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 DEC_DIGIT: [0-9];
fragment DEC_LETTER: [A-Za-z];
fragment DQUOTA_STRING: '"' ( '\\'. | '""' | ~('"'| '\\') )* '"';
fragment SQUOTA_STRING: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'';
fragment BIT_STRING_L: 'B' '\'' [01]+ '\'';

View File

@ -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
insertStatement
@ -272,8 +156,134 @@ allValueDifinition
: 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
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
: uid (',' uid)*
;
@ -298,43 +308,6 @@ keyValueDefinition
: 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
: AND | '&' '&' | OR | '|' '|'
;
@ -360,11 +333,13 @@ fullColumnName
;
constant
: stringLiteral | decimalLiteral
| '-' decimalLiteral
| booleanLiteral
| REAL_LITERAL | BIT_STRING
| NOT? NULL
: stringLiteral // 引号包含的字符串
| decimalLiteral // 整数
| '-' decimalLiteral // 负整数
| booleanLiteral // 布尔值
| REAL_LITERAL // 小数
| BIT_STRING
| NOT? NULL // 空 | 非空
;
stringLiteral
@ -377,3 +352,8 @@ decimalLiteral
booleanLiteral
: TRUE | FALSE;
setQuantifier
: DISTINCT
| ALL
;