DBZ-4780 Introduce support of LATERAL operator

This commit is contained in:
AlexMiroshnikov 2022-05-08 12:42:59 +02:00 committed by Jiri Pechanec
parent 5ab416c86d
commit 5bbc32c896
4 changed files with 33 additions and 3 deletions

View File

@ -131,6 +131,7 @@ JOIN: 'JOIN';
KEY: 'KEY';
KEYS: 'KEYS';
KILL: 'KILL';
LATERAL: 'LATERAL';
LEADING: 'LEADING';
LEAVE: 'LEAVE';
LEFT: 'LEFT';

View File

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

View File

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

View File

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