mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Match RelOptInfos by relids not pointer equality.
Commit 1c2cb2744 added some code that tried to detect whether two RelOptInfos were the "same" rel by pointer comparison; but it turns out that inheritance_planner breaks that, through its shenanigans with copying some relations forward into new subproblems. Compare relid sets instead. Add a regression test case to exercise this area. Problem reported by Rushabh Lathia; diagnosis and fix by Amit Langote, modified a bit by me. Discussion: https://postgr.es/m/CAGPqQf3anJGj65bqAQ9edDr8gF7qig6_avRgwMT9MsZ19COUPw@mail.gmail.com
This commit is contained in:
parent
9b7c56d6cb
commit
11e22e486d
@ -384,7 +384,7 @@ make_partitionedrel_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
|||||||
* because in later iterations of the loop for child partitions,
|
* because in later iterations of the loop for child partitions,
|
||||||
* we want to translate from parent to child variables.
|
* we want to translate from parent to child variables.
|
||||||
*/
|
*/
|
||||||
if (parentrel != subpart)
|
if (!bms_equal(parentrel->relids, subpart->relids))
|
||||||
{
|
{
|
||||||
int nappinfos;
|
int nappinfos;
|
||||||
AppendRelInfo **appinfos = find_appinfos_by_relids(root,
|
AppendRelInfo **appinfos = find_appinfos_by_relids(root,
|
||||||
|
@ -2477,6 +2477,85 @@ deallocate ab_q2;
|
|||||||
deallocate ab_q3;
|
deallocate ab_q3;
|
||||||
deallocate ab_q4;
|
deallocate ab_q4;
|
||||||
deallocate ab_q5;
|
deallocate ab_q5;
|
||||||
|
-- UPDATE on a partition subtree has been seen to have problems.
|
||||||
|
insert into ab values (1,2);
|
||||||
|
explain (analyze, costs off, summary off, timing off)
|
||||||
|
update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a;
|
||||||
|
QUERY PLAN
|
||||||
|
-------------------------------------------------------------------------------------
|
||||||
|
Update on ab_a1 (actual rows=0 loops=1)
|
||||||
|
Update on ab_a1_b1
|
||||||
|
Update on ab_a1_b2
|
||||||
|
Update on ab_a1_b3
|
||||||
|
-> Nested Loop (actual rows=0 loops=1)
|
||||||
|
-> Append (actual rows=1 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b1 ab_a1_b1_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b2 ab_a1_b2_1 (actual rows=1 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
Heap Blocks: exact=1
|
||||||
|
-> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b3 ab_a1_b3_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=0 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Materialize (actual rows=0 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Nested Loop (actual rows=1 loops=1)
|
||||||
|
-> Append (actual rows=1 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b1 ab_a1_b1_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b2 ab_a1_b2_1 (actual rows=1 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
Heap Blocks: exact=1
|
||||||
|
-> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b3 ab_a1_b3_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Materialize (actual rows=1 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b2 (actual rows=1 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
Heap Blocks: exact=1
|
||||||
|
-> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Nested Loop (actual rows=0 loops=1)
|
||||||
|
-> Append (actual rows=1 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b1 ab_a1_b1_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b2 ab_a1_b2_1 (actual rows=1 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
Heap Blocks: exact=1
|
||||||
|
-> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b3 ab_a1_b3_1 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
-> Materialize (actual rows=0 loops=1)
|
||||||
|
-> Bitmap Heap Scan on ab_a1_b3 (actual rows=0 loops=1)
|
||||||
|
Recheck Cond: (a = 1)
|
||||||
|
-> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1)
|
||||||
|
Index Cond: (a = 1)
|
||||||
|
(65 rows)
|
||||||
|
|
||||||
|
table ab;
|
||||||
|
a | b
|
||||||
|
---+---
|
||||||
|
1 | 3
|
||||||
|
(1 row)
|
||||||
|
|
||||||
drop table ab, lprt_a;
|
drop table ab, lprt_a;
|
||||||
-- Join
|
-- Join
|
||||||
create table tbl1(col1 int);
|
create table tbl1(col1 int);
|
||||||
|
@ -554,6 +554,12 @@ deallocate ab_q3;
|
|||||||
deallocate ab_q4;
|
deallocate ab_q4;
|
||||||
deallocate ab_q5;
|
deallocate ab_q5;
|
||||||
|
|
||||||
|
-- UPDATE on a partition subtree has been seen to have problems.
|
||||||
|
insert into ab values (1,2);
|
||||||
|
explain (analyze, costs off, summary off, timing off)
|
||||||
|
update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a;
|
||||||
|
table ab;
|
||||||
|
|
||||||
drop table ab, lprt_a;
|
drop table ab, lprt_a;
|
||||||
|
|
||||||
-- Join
|
-- Join
|
||||||
|
Loading…
x
Reference in New Issue
Block a user