Avoid creating a RESULT RTE that's marked LATERAL.
Commit 7266d0997
added code to pull up simple constant function
results, converting the RTE_FUNCTION RTE to a dummy RTE_RESULT
RTE since it no longer need be scanned. But I forgot to clear
the LATERAL flag if the RTE has it set. If the function reduced
to a constant, it surely contains no lateral references so this
simplification is logically OK. It's needed because various other
places will Assert that RESULT RTEs aren't LATERAL.
Per bug #17097 from Yaoguang Chen. Back-patch to v13 where the
faulty code came in.
Discussion: https://postgr.es/m/17097-3372ef9f798fc94f@postgresql.org
This commit is contained in:
parent
55cccdfdf1
commit
9807b9aedc
|
@ -1802,10 +1802,13 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert the RTE to be RTE_RESULT type, signifying that we don't need to
|
* Convert the RTE to be RTE_RESULT type, signifying that we don't need to
|
||||||
* scan it anymore, and zero out RTE_FUNCTION-specific fields.
|
* scan it anymore, and zero out RTE_FUNCTION-specific fields. Also make
|
||||||
|
* sure the RTE is not marked LATERAL, since elsewhere we don't expect
|
||||||
|
* RTE_RESULTs to be LATERAL.
|
||||||
*/
|
*/
|
||||||
rte->rtekind = RTE_RESULT;
|
rte->rtekind = RTE_RESULT;
|
||||||
rte->functions = NIL;
|
rte->functions = NIL;
|
||||||
|
rte->lateral = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can reuse the RangeTblRef node.
|
* We can reuse the RangeTblRef node.
|
||||||
|
|
|
@ -3414,6 +3414,14 @@ select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
|
||||||
Index Cond: (unique1 = 1)
|
Index Cond: (unique1 = 1)
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
|
explain (costs off)
|
||||||
|
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
|
||||||
|
QUERY PLAN
|
||||||
|
--------------------------
|
||||||
|
Result
|
||||||
|
One-Time Filter: false
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
explain (costs off)
|
explain (costs off)
|
||||||
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
|
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
|
|
|
@ -1099,6 +1099,9 @@ select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
|
||||||
explain (costs off)
|
explain (costs off)
|
||||||
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
|
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
|
||||||
|
|
||||||
|
explain (costs off)
|
||||||
|
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
|
||||||
|
|
||||||
explain (costs off)
|
explain (costs off)
|
||||||
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
|
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue