mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Clean up side-effects of commits ab5fcf2b0
et al.
Before those commits, partitioning-related code in the executor could assume that ModifyTableState.resultRelInfo[] contains only leaf partitions. However, now a fully-pruned update results in a dummy ModifyTable that references the root partitioned table, and that breaks some stuff. In v11, this led to an assertion or core dump in the tuple routing code. Fix by disabling tuple routing, since we don't need that anyway. (I chose to do that in HEAD as well for safety, even though the problem doesn't manifest in HEAD as it stands.) In v10, this confused ExecInitModifyTable's decision about whether it needed to close the root table. But we can get rid of that altogether by being smarter about where to find the root table. Note that since the referenced commits haven't shipped yet, this isn't fixing any bug the field has seen. Amit Langote, per a report from me Discussion: https://postgr.es/m/20710.1554582479@sss.pgh.pa.us
This commit is contained in:
@ -1933,16 +1933,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
|||||||
|
|
||||||
estate->es_result_relation_info = saved_resultRelInfo;
|
estate->es_result_relation_info = saved_resultRelInfo;
|
||||||
|
|
||||||
/* The root table RT index is at the head of the partitioned_rels list */
|
/* Examine the root partition if we have one, else target table */
|
||||||
if (node->partitioned_rels)
|
if (mtstate->rootResultRelInfo)
|
||||||
{
|
rel = mtstate->rootResultRelInfo->ri_RelationDesc;
|
||||||
Index root_rti;
|
|
||||||
Oid root_oid;
|
|
||||||
|
|
||||||
root_rti = linitial_int(node->partitioned_rels);
|
|
||||||
root_oid = getrelid(root_rti, estate->es_range_table);
|
|
||||||
rel = heap_open(root_oid, NoLock); /* locked by InitPlan */
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
rel = mtstate->resultRelInfo->ri_RelationDesc;
|
rel = mtstate->resultRelInfo->ri_RelationDesc;
|
||||||
|
|
||||||
@ -2134,10 +2127,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
|||||||
mtstate->ps.ps_ExprContext = NULL;
|
mtstate->ps.ps_ExprContext = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the root partitioned rel if we opened it above. */
|
|
||||||
if (rel != mtstate->resultRelInfo->ri_RelationDesc)
|
|
||||||
heap_close(rel, NoLock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If needed, Initialize target list, projection and qual for ON CONFLICT
|
* If needed, Initialize target list, projection and qual for ON CONFLICT
|
||||||
* DO UPDATE.
|
* DO UPDATE.
|
||||||
|
@ -665,6 +665,15 @@ select tableoid::regclass::text as relname, parted_tab.* from parted_tab order b
|
|||||||
parted_tab_part3 | 3 | a
|
parted_tab_part3 | 3 | a
|
||||||
(3 rows)
|
(3 rows)
|
||||||
|
|
||||||
|
-- modifies partition key, but no rows will actually be updated
|
||||||
|
explain update parted_tab set a = 2 where false;
|
||||||
|
QUERY PLAN
|
||||||
|
--------------------------------------------------------
|
||||||
|
Update on parted_tab (cost=0.00..0.00 rows=0 width=0)
|
||||||
|
-> Result (cost=0.00..0.00 rows=0 width=0)
|
||||||
|
One-Time Filter: false
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
drop table parted_tab;
|
drop table parted_tab;
|
||||||
drop table some_tab cascade;
|
drop table some_tab cascade;
|
||||||
NOTICE: drop cascades to table some_tab_child
|
NOTICE: drop cascades to table some_tab_child
|
||||||
|
@ -168,6 +168,9 @@ from
|
|||||||
where parted_tab.a = ss.a;
|
where parted_tab.a = ss.a;
|
||||||
select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2;
|
select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2;
|
||||||
|
|
||||||
|
-- modifies partition key, but no rows will actually be updated
|
||||||
|
explain update parted_tab set a = 2 where false;
|
||||||
|
|
||||||
drop table parted_tab;
|
drop table parted_tab;
|
||||||
drop table some_tab cascade;
|
drop table some_tab cascade;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user