DBZ-3575 Implement support for JSON_TABLE in MySQL parser
This commit is contained in:
parent
351a0d73fe
commit
863e00e43b
@ -27,6 +27,8 @@ THE SOFTWARE.
|
||||
|
||||
lexer grammar MySqlLexer;
|
||||
|
||||
options { caseInsensitive = true; }
|
||||
|
||||
channels { MYSQLCOMMENT, ERRORCHANNEL }
|
||||
|
||||
// SKIP
|
||||
@ -35,7 +37,7 @@ SPACE: [ \t\r\n]+ -> channel(HIDDEN);
|
||||
SPEC_MYSQL_COMMENT: '/*!' .+? '*/' -> channel(MYSQLCOMMENT);
|
||||
COMMENT_INPUT: '/*' .*? '*/' -> channel(HIDDEN);
|
||||
LINE_COMMENT: (
|
||||
('--' [ \t] | '#') ~[\r\n]* ('\r'? '\n' | EOF)
|
||||
('--' [ \t]* | '#') ~[\r\n]* ('\r'? '\n' | EOF)
|
||||
| '--' ('\r'? '\n' | EOF)
|
||||
) -> channel(HIDDEN);
|
||||
|
||||
@ -122,7 +124,6 @@ INDEX: 'INDEX';
|
||||
INFILE: 'INFILE';
|
||||
INNER: 'INNER';
|
||||
INOUT: 'INOUT';
|
||||
IN_OUT: 'IN OUT';
|
||||
INSERT: 'INSERT';
|
||||
INTERVAL: 'INTERVAL';
|
||||
INTO: 'INTO';
|
||||
@ -329,6 +330,9 @@ JSON_STORAGE_FREE: 'JSON_STORAGE_FREE';
|
||||
JSON_STORAGE_SIZE: 'JSON_STORAGE_SIZE';
|
||||
JSON_ARRAYAGG: 'JSON_ARRAYAGG';
|
||||
JSON_OBJECTAGG: 'JSON_OBJECTAGG';
|
||||
NESTED: 'NESTED';
|
||||
ORDINALITY: 'ORDINALITY';
|
||||
PATH: 'PATH';
|
||||
|
||||
// Group function Keywords
|
||||
|
||||
@ -426,7 +430,7 @@ COMMIT: 'COMMIT';
|
||||
COMPACT: 'COMPACT';
|
||||
COMPLETION: 'COMPLETION';
|
||||
COMPRESSED: 'COMPRESSED';
|
||||
COMPRESSION: QUOTE_SYMB? 'COMPRESSION' QUOTE_SYMB?;
|
||||
COMPRESSION: 'COMPRESSION' | QUOTE_SYMB? 'COMPRESSION' QUOTE_SYMB?;
|
||||
CONCURRENT: 'CONCURRENT';
|
||||
CONNECT: 'CONNECT';
|
||||
CONNECTION: 'CONNECTION';
|
||||
|
@ -1042,6 +1042,7 @@ tableSources
|
||||
tableSource
|
||||
: tableSourceItem joinPart* #tableSourceBase
|
||||
| '(' tableSourceItem joinPart* ')' #tableSourceNested
|
||||
| jsonTable #tableJson
|
||||
;
|
||||
|
||||
tableSourceItem
|
||||
@ -1115,8 +1116,40 @@ unionStatement
|
||||
;
|
||||
|
||||
lateralStatement
|
||||
: LATERAL (querySpecificationNointo | queryExpressionNointo)
|
||||
| LATERAL '(' (querySpecificationNointo | queryExpressionNointo) ')' (AS? uid)?
|
||||
: LATERAL (querySpecificationNointo |
|
||||
queryExpressionNointo |
|
||||
('(' (querySpecificationNointo | queryExpressionNointo) ')' (AS? uid)?)
|
||||
)
|
||||
;
|
||||
|
||||
// JSON
|
||||
|
||||
// https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
|
||||
jsonTable
|
||||
: JSON_TABLE '('
|
||||
STRING_LITERAL ','
|
||||
STRING_LITERAL
|
||||
COLUMNS '(' jsonColumnList ')'
|
||||
')' (AS? uid)?
|
||||
;
|
||||
|
||||
jsonColumnList
|
||||
: jsonColumn (',' jsonColumn)*
|
||||
;
|
||||
|
||||
jsonColumn
|
||||
: fullColumnName FOR ORDINALITY
|
||||
| fullColumnName dataType PATH STRING_LITERAL jsonOnEmpty? jsonOnError?
|
||||
| fullColumnName dataType EXISTS PATH STRING_LITERAL
|
||||
| NESTED PATH? STRING_LITERAL COLUMNS '(' jsonColumnList ')'
|
||||
;
|
||||
|
||||
jsonOnEmpty
|
||||
: (NULL_LITERAL | ERROR | (DEFAULT defaultValue)) ON EMPTY
|
||||
;
|
||||
|
||||
jsonOnError
|
||||
: (NULL_LITERAL | ERROR | (DEFAULT defaultValue)) ON ERROR
|
||||
;
|
||||
|
||||
// details
|
||||
@ -2257,11 +2290,7 @@ dataType
|
||||
;
|
||||
|
||||
collectionOptions
|
||||
: '(' collectionOption (',' collectionOption)* ')'
|
||||
;
|
||||
|
||||
collectionOption
|
||||
: STRING_LITERAL
|
||||
: '(' STRING_LITERAL (',' STRING_LITERAL)* ')'
|
||||
;
|
||||
|
||||
convertedDataType
|
||||
@ -2483,8 +2512,8 @@ specificFunction
|
||||
'(' expression
|
||||
',' expression
|
||||
(RETURNING convertedDataType)?
|
||||
((NULL_LITERAL | ERROR | (DEFAULT defaultValue)) ON EMPTY)?
|
||||
((NULL_LITERAL | ERROR | (DEFAULT defaultValue)) ON ERROR)?
|
||||
jsonOnEmpty?
|
||||
jsonOnError?
|
||||
')' #jsonValueFunctionCall
|
||||
;
|
||||
|
||||
@ -2760,9 +2789,9 @@ keywordsCanBeId
|
||||
| VALIDATION | VALUE | VAR_POP | VAR_SAMP | VARIABLES | VARIANCE | VERSION_TOKEN_ADMIN | VIEW | VIRTUAL
|
||||
| WAIT | WARNINGS | WITHOUT | WORK | WRAPPER | X509 | XA | XA_RECOVER_ADMIN | XML
|
||||
// MariaDB-specific only
|
||||
| BINLOG_MONITOR | BINLOG_REPLAY | CURRENT_ROLE | CYCLE | ENCRYPTED | ENCRYPTION_KEY_ID | FEDERATED_ADMIN
|
||||
| INCREMENT | LASTVAL | LOCKED | MAXVALUE | MINVALUE | NEXTVAL | NOCACHE | NOCYCLE | NOMAXVALUE | NOMINVALUE
|
||||
| PERSISTENT | PREVIOUS | READ_ONLY_ADMIN | REPLICA | REPLICATION_MASTER_ADMIN | RESTART | SEQUENCE | SETVAL | SKIP_ | STATEMENT | VIA
|
||||
| BINLOG_MONITOR | BINLOG_REPLAY | CURRENT_ROLE | CYCLE | ENCRYPTED | ENCRYPTION_KEY_ID | FEDERATED_ADMIN
|
||||
| INCREMENT | LASTVAL | LOCKED | MAXVALUE | MINVALUE | NEXTVAL | NOCACHE | NOCYCLE | NOMAXVALUE | NOMINVALUE
|
||||
| PERSISTENT | PREVIOUS | READ_ONLY_ADMIN | REPLICA | REPLICATION_MASTER_ADMIN | RESTART | SEQUENCE | SETVAL | SKIP_ | STATEMENT | VIA
|
||||
;
|
||||
|
||||
functionNameBase
|
||||
@ -2856,4 +2885,3 @@ functionNameBase
|
||||
// MariaDB
|
||||
| LASTVAL | NEXTVAL | SETVAL
|
||||
;
|
||||
|
||||
|
@ -239,3 +239,20 @@ SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 A
|
||||
SELECT * FROM table1 FORCE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;
|
||||
SELECT * FROM t1 USE INDEX (PRIMARY) ORDER BY a;
|
||||
SELECT * FROM t1 FORCE INDEX (PRIMARY) ORDER BY a;
|
||||
|
||||
-- JSON_TABLE
|
||||
-- https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
|
||||
SELECT *
|
||||
FROM
|
||||
JSON_TABLE (
|
||||
'[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',
|
||||
"$[*]"
|
||||
COLUMNS (
|
||||
rowid FOR ORDINALITY,
|
||||
ac VARCHAR(100) PATH "$.a" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
|
||||
aj JSON PATH "$.a" DEFAULT '{"x": 333}' ON EMPTY,
|
||||
bx INT EXISTS PATH "$.b",
|
||||
NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$')
|
||||
)
|
||||
) AS tt;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user