DBZ-3575 Implement support for JSON_TABLE in MySQL parser

This commit is contained in:
Raul Estrada 2022-12-19 00:37:23 -06:00 committed by Jiri Pechanec
parent 351a0d73fe
commit 863e00e43b
3 changed files with 65 additions and 16 deletions

View File

@ -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';

View File

@ -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
;

View File

@ -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;