mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Re-allow INSERT .. ON CONFLICT DO NOTHING on partitioned tables.
Commit8355a011a0
was reverted inf05230752d
, but this attempt is hopefully better-considered: we now pass the correct value to ExecOpenIndices, which should avoid the crash that we hit before. Amit Langote, reviewed by Simon Riggs and by me. Some final editing by me. Discussion: http://postgr.es/m/7ff1e8ec-dc39-96b1-7f47-ff5965dceeac@lab.ntt.co.jp
This commit is contained in:
@ -63,7 +63,8 @@ static char *ExecBuildSlotPartitionKeyDescription(Relation rel,
|
||||
* RowExclusiveLock mode upon return from this function.
|
||||
*/
|
||||
void
|
||||
ExecSetupPartitionTupleRouting(Relation rel,
|
||||
ExecSetupPartitionTupleRouting(ModifyTableState *mtstate,
|
||||
Relation rel,
|
||||
Index resultRTindex,
|
||||
EState *estate,
|
||||
PartitionDispatch **pd,
|
||||
@ -133,13 +134,17 @@ ExecSetupPartitionTupleRouting(Relation rel,
|
||||
CheckValidResultRel(leaf_part_rri, CMD_INSERT);
|
||||
|
||||
/*
|
||||
* Open partition indices (remember we do not support ON CONFLICT in
|
||||
* case of partitioned tables, so we do not need support information
|
||||
* for speculative insertion)
|
||||
* Open partition indices. The user may have asked to check for
|
||||
* conflicts within this leaf partition and do "nothing" instead of
|
||||
* throwing an error. Be prepared in that case by initializing the
|
||||
* index information needed by ExecInsert() to perform speculative
|
||||
* insertions.
|
||||
*/
|
||||
if (leaf_part_rri->ri_RelationDesc->rd_rel->relhasindex &&
|
||||
leaf_part_rri->ri_IndexRelationDescs == NULL)
|
||||
ExecOpenIndices(leaf_part_rri, false);
|
||||
ExecOpenIndices(leaf_part_rri,
|
||||
mtstate != NULL &&
|
||||
mtstate->mt_onconflict != ONCONFLICT_NONE);
|
||||
|
||||
estate->es_leaf_result_relations =
|
||||
lappend(estate->es_leaf_result_relations, leaf_part_rri);
|
||||
|
@ -1953,7 +1953,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
int num_parted,
|
||||
num_partitions;
|
||||
|
||||
ExecSetupPartitionTupleRouting(rel,
|
||||
ExecSetupPartitionTupleRouting(mtstate,
|
||||
rel,
|
||||
node->nominalRelation,
|
||||
estate,
|
||||
&partition_dispatch_info,
|
||||
|
Reference in New Issue
Block a user