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
ea1b659710
commit
a3deecb1c9
@ -384,7 +384,7 @@ make_partitionedrel_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
||||
* because in later iterations of the loop for child partitions,
|
||||
* we want to translate from parent to child variables.
|
||||
*/
|
||||
if (parentrel != subpart)
|
||||
if (!bms_equal(parentrel->relids, subpart->relids))
|
||||
{
|
||||
int nappinfos;
|
||||
AppendRelInfo **appinfos = find_appinfos_by_relids(root,
|
||||
|
@ -2477,6 +2477,85 @@ deallocate ab_q2;
|
||||
deallocate ab_q3;
|
||||
deallocate ab_q4;
|
||||
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;
|
||||
-- Join
|
||||
create table tbl1(col1 int);
|
||||
|
@ -554,6 +554,12 @@ deallocate ab_q3;
|
||||
deallocate ab_q4;
|
||||
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;
|
||||
|
||||
-- Join
|
||||
|
Loading…
x
Reference in New Issue
Block a user