From 5bbc32c896fc032dd38d273e86f070c44df53aad Mon Sep 17 00:00:00 2001 From: AlexMiroshnikov Date: Sun, 8 May 2022 12:42:59 +0200 Subject: [PATCH] DBZ-4780 Introduce support of LATERAL operator --- .../ddl/parser/mysql/generated/MySqlLexer.g4 | 1 + .../ddl/parser/mysql/generated/MySqlParser.g4 | 10 ++++++++-- .../resources/mysql/examples/ddl_create.sql | 7 +++++++ .../resources/mysql/examples/dml_select.sql | 18 +++++++++++++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlLexer.g4 b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlLexer.g4 index 8f44dbbfa..de42f6a45 100644 --- a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlLexer.g4 +++ b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlLexer.g4 @@ -131,6 +131,7 @@ JOIN: 'JOIN'; KEY: 'KEY'; KEYS: 'KEYS'; KILL: 'KILL'; +LATERAL: 'LATERAL'; LEADING: 'LEADING'; LEAVE: 'LEAVE'; LEFT: 'LEFT'; diff --git a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlParser.g4 b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlParser.g4 index 6c8eacbc5..c19286a7f 100644 --- a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlParser.g4 +++ b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/generated/MySqlParser.g4 @@ -881,6 +881,7 @@ selectStatement queryExpression )? orderByClause? limitClause? lockClause? #unionParenthesisSelect + | querySpecificationNointo (',' lateralStatement)+ #withLateralStatement ; updateStatement @@ -1006,13 +1007,13 @@ indexHintType ; joinPart - : (INNER | CROSS)? JOIN tableSourceItem + : (INNER | CROSS)? JOIN LATERAL? tableSourceItem ( ON expression | USING '(' uidList ')' )? #innerJoin | STRAIGHT_JOIN tableSourceItem (ON expression)? #straightJoin - | (LEFT | RIGHT) OUTER? JOIN tableSourceItem + | (LEFT | RIGHT) OUTER? JOIN LATERAL? tableSourceItem ( ON expression | USING '(' uidList ')' @@ -1053,6 +1054,11 @@ unionStatement (querySpecificationNointo | queryExpressionNointo) ; +lateralStatement + : LATERAL (querySpecificationNointo | queryExpressionNointo) + | LATERAL '(' (querySpecificationNointo | queryExpressionNointo) ')' (AS? uid)? + ; + // details selectSpec diff --git a/debezium-ddl-parser/src/test/resources/mysql/examples/ddl_create.sql b/debezium-ddl-parser/src/test/resources/mysql/examples/ddl_create.sql index 4b3816df4..ff87b846e 100644 --- a/debezium-ddl-parser/src/test/resources/mysql/examples/ddl_create.sql +++ b/debezium-ddl-parser/src/test/resources/mysql/examples/ddl_create.sql @@ -475,3 +475,10 @@ WITH RECURSIVE cte (n) AS ) SELECT * FROM cte; #end + +#begin +CREATE VIEW `invoice_payments_stats` AS +SELECT + `i`.`id` AS `id` +FROM (`invoices` `i` JOIN lateral (SELECT MAX(`ip`.`date`) AS `latest_payment` FROM `invoice_payments` `ip`) `ps`); +#end diff --git a/debezium-ddl-parser/src/test/resources/mysql/examples/dml_select.sql b/debezium-ddl-parser/src/test/resources/mysql/examples/dml_select.sql index a91935533..86f31668f 100644 --- a/debezium-ddl-parser/src/test/resources/mysql/examples/dml_select.sql +++ b/debezium-ddl-parser/src/test/resources/mysql/examples/dml_select.sql @@ -194,4 +194,20 @@ SELECT GROUP_CONCAT(bin_volume order by id) AS `rank` FROM table2 WINDOW w AS (PARTITION BY id, bin_volume ORDER BY id ROWS UNBOUNDED PRECEDING), - w2 AS (PARTITION BY id, bin_volume ORDER BY id DESC ROWS 10 PRECEDING); \ No newline at end of file + w2 AS (PARTITION BY id, bin_volume ORDER BY id DESC ROWS 10 PRECEDING); + +#begin +-- https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html +SELECT + salesperson.name, + max_sale.amount, + max_sale.customer_name +FROM + salesperson, + LATERAL + (SELECT amount, customer_name + FROM all_sales + WHERE all_sales.salesperson_id = salesperson.id + ORDER BY amount DESC LIMIT 1) + AS max_sale; +#end