Merge branch 'main' into fix7091

pull/7641/head
copetol 2024-08-19 16:12:06 +03:00 committed by GitHub
commit 2e463d6c40
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 120 additions and 8 deletions

View File

@ -4753,22 +4753,35 @@ WorkerLimitCount(Node *limitCount, Node *limitOffset, OrderByLimitReference
if (workerLimitNode != NULL && limitOffset != NULL) if (workerLimitNode != NULL && limitOffset != NULL)
{ {
Const *workerLimitConst = (Const *) workerLimitNode; Const *workerLimitConst = (Const *) workerLimitNode;
Const *workerOffsetConst = (Const *) limitOffset;
int64 workerLimitCount = DatumGetInt64(workerLimitConst->constvalue);
int64 workerOffsetCount = DatumGetInt64(workerOffsetConst->constvalue);
workerLimitCount = workerLimitCount + workerOffsetCount; /* Only update the worker limit if the const is not null.*/
workerLimitNode = (Node *) MakeIntegerConstInt64(workerLimitCount); if (!workerLimitConst->constisnull)
{
Const *workerOffsetConst = (Const *) limitOffset;
int64 workerLimitCount = DatumGetInt64(workerLimitConst->constvalue);
/* If the offset is null, it defaults to 0 when cast to int64. */
int64 workerOffsetCount = DatumGetInt64(workerOffsetConst->constvalue);
workerLimitCount = workerLimitCount + workerOffsetCount;
workerLimitNode = (Node *) MakeIntegerConstInt64(workerLimitCount);
}
} }
/* display debug message on limit push down */ /* display debug message on limit push down */
if (workerLimitNode != NULL) if (workerLimitNode != NULL)
{ {
Const *workerLimitConst = (Const *) workerLimitNode; Const *workerLimitConst = (Const *) workerLimitNode;
int64 workerLimitCount = DatumGetInt64(workerLimitConst->constvalue); if (!workerLimitConst->constisnull)
{
int64 workerLimitCount = DatumGetInt64(workerLimitConst->constvalue);
ereport(DEBUG1, (errmsg("push down of limit count: " INT64_FORMAT, ereport(DEBUG1, (errmsg("push down of limit count: " INT64_FORMAT,
workerLimitCount))); workerLimitCount)));
}
else
{
ereport(DEBUG1, (errmsg("push down of limit count: ALL")));
}
} }
return workerLimitNode; return workerLimitNode;

View File

@ -521,6 +521,86 @@ SELECT
1 | 1 1 | 1
(1 row) (1 row)
-- check if we can correctly push the limit when it is null
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey LIMIT null;
DEBUG: push down of limit count: ALL
l_orderkey
---------------------------------------------------------------------
1
1
1
1
1
1
2
(7 rows)
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET 1 LIMIT null;
DEBUG: push down of limit count: ALL
l_orderkey
---------------------------------------------------------------------
1
1
1
1
1
2
(6 rows)
SELECT count(*) FROM lineitem LIMIT null;
DEBUG: push down of limit count: ALL
count
---------------------------------------------------------------------
12000
(1 row)
SELECT count(*) FROM lineitem OFFSET 0 LIMIT null;
DEBUG: push down of limit count: ALL
count
---------------------------------------------------------------------
12000
(1 row)
-- check if we push the right limit when both offset and limit are given
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET 1 LIMIT 3;
DEBUG: push down of limit count: 4
l_orderkey
---------------------------------------------------------------------
1
1
1
(3 rows)
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET null LIMIT 1;
DEBUG: push down of limit count: 1
l_orderkey
---------------------------------------------------------------------
1
(1 row)
-- check if we can correctly push the limit when it is all
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 2 LIMIT all;
DEBUG: push down of limit count: ALL
l_orderkey
---------------------------------------------------------------------
1
1
1
1
1
1
(6 rows)
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 2 OFFSET 2 LIMIT all;
DEBUG: push down of limit count: ALL
l_orderkey
---------------------------------------------------------------------
1
1
1
1
(4 rows)
SET client_min_messages TO NOTICE; SET client_min_messages TO NOTICE;
-- non constants should not push down -- non constants should not push down
CREATE OR REPLACE FUNCTION my_limit() CREATE OR REPLACE FUNCTION my_limit()

View File

@ -222,6 +222,25 @@ SELECT
ORDER BY 2 DESC, 1 ORDER BY 2 DESC, 1
LIMIT 5; LIMIT 5;
-- check if we can correctly push the limit when it is null
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey LIMIT null;
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET 1 LIMIT null;
SELECT count(*) FROM lineitem LIMIT null;
SELECT count(*) FROM lineitem OFFSET 0 LIMIT null;
-- check if we push the right limit when both offset and limit are given
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET 1 LIMIT 3;
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 3 ORDER BY l_orderkey OFFSET null LIMIT 1;
-- check if we can correctly push the limit when it is all
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 2 LIMIT all;
SELECT l_orderkey FROM lineitem WHERE l_orderkey < 2 OFFSET 2 LIMIT all;
SET client_min_messages TO NOTICE; SET client_min_messages TO NOTICE;
-- non constants should not push down -- non constants should not push down