mirror of https://github.com/citusdata/citus.git
Merge branch 'main' into fix7091
commit
2e463d6c40
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue