mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Use ResultRelInfo ** rather than ResultRelInfo * for tuple routing.
The previous convention doesn't lend itself to creating ResultRelInfos lazily, as we already do in ExecGetTriggerResultRel. This patch doesn't make anything lazier than before, but the pending patch for UPDATE tuple routing proposes to do so (and there might be other opportunities as well). Amit Khandekar with some adjustments by me. Discussion: http://postgr.es/m/CA+TgmoYPVP9Lyf6vUFA5DwxS4c--x6LOj2y36BsJaYtp62eXPQ@mail.gmail.com
This commit is contained in:
@ -303,7 +303,7 @@ ExecInsert(ModifyTableState *mtstate,
|
||||
* the selected partition.
|
||||
*/
|
||||
saved_resultRelInfo = resultRelInfo;
|
||||
resultRelInfo = mtstate->mt_partitions + leaf_part_index;
|
||||
resultRelInfo = mtstate->mt_partitions[leaf_part_index];
|
||||
|
||||
/* We do not yet have a way to insert into a foreign partition */
|
||||
if (resultRelInfo->ri_FdwRoutine)
|
||||
@ -1498,25 +1498,11 @@ ExecSetupTransitionCaptureState(ModifyTableState *mtstate, EState *estate)
|
||||
if (mtstate->mt_transition_capture != NULL ||
|
||||
mtstate->mt_oc_transition_capture != NULL)
|
||||
{
|
||||
ResultRelInfo *resultRelInfos;
|
||||
int numResultRelInfos;
|
||||
|
||||
/* Find the set of partitions so that we can find their TupleDescs. */
|
||||
if (mtstate->mt_partition_dispatch_info != NULL)
|
||||
{
|
||||
/*
|
||||
* For INSERT via partitioned table, so we need TupleDescs based
|
||||
* on the partition routing table.
|
||||
*/
|
||||
resultRelInfos = mtstate->mt_partitions;
|
||||
numResultRelInfos = mtstate->mt_num_partitions;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise we need the ResultRelInfo for each subplan. */
|
||||
resultRelInfos = mtstate->resultRelInfo;
|
||||
numResultRelInfos = mtstate->mt_nplans;
|
||||
}
|
||||
numResultRelInfos = (mtstate->mt_partition_tuple_slot != NULL ?
|
||||
mtstate->mt_num_partitions :
|
||||
mtstate->mt_nplans);
|
||||
|
||||
/*
|
||||
* Build array of conversion maps from each child's TupleDesc to the
|
||||
@ -1526,12 +1512,36 @@ ExecSetupTransitionCaptureState(ModifyTableState *mtstate, EState *estate)
|
||||
*/
|
||||
mtstate->mt_transition_tupconv_maps = (TupleConversionMap **)
|
||||
palloc0(sizeof(TupleConversionMap *) * numResultRelInfos);
|
||||
for (i = 0; i < numResultRelInfos; ++i)
|
||||
|
||||
/* Choose the right set of partitions */
|
||||
if (mtstate->mt_partition_dispatch_info != NULL)
|
||||
{
|
||||
mtstate->mt_transition_tupconv_maps[i] =
|
||||
convert_tuples_by_name(RelationGetDescr(resultRelInfos[i].ri_RelationDesc),
|
||||
RelationGetDescr(targetRelInfo->ri_RelationDesc),
|
||||
gettext_noop("could not convert row type"));
|
||||
/*
|
||||
* For tuple routing among partitions, we need TupleDescs based
|
||||
* on the partition routing table.
|
||||
*/
|
||||
ResultRelInfo **resultRelInfos = mtstate->mt_partitions;
|
||||
|
||||
for (i = 0; i < numResultRelInfos; ++i)
|
||||
{
|
||||
mtstate->mt_transition_tupconv_maps[i] =
|
||||
convert_tuples_by_name(RelationGetDescr(resultRelInfos[i]->ri_RelationDesc),
|
||||
RelationGetDescr(targetRelInfo->ri_RelationDesc),
|
||||
gettext_noop("could not convert row type"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise we need the ResultRelInfo for each subplan. */
|
||||
ResultRelInfo *resultRelInfos = mtstate->resultRelInfo;
|
||||
|
||||
for (i = 0; i < numResultRelInfos; ++i)
|
||||
{
|
||||
mtstate->mt_transition_tupconv_maps[i] =
|
||||
convert_tuples_by_name(RelationGetDescr(resultRelInfos[i].ri_RelationDesc),
|
||||
RelationGetDescr(targetRelInfo->ri_RelationDesc),
|
||||
gettext_noop("could not convert row type"));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1935,7 +1945,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||
{
|
||||
PartitionDispatch *partition_dispatch_info;
|
||||
ResultRelInfo *partitions;
|
||||
ResultRelInfo **partitions;
|
||||
TupleConversionMap **partition_tupconv_maps;
|
||||
TupleTableSlot *partition_tuple_slot;
|
||||
int num_parted,
|
||||
@ -2014,14 +2024,16 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
mtstate->mt_nplans == 1);
|
||||
wcoList = linitial(node->withCheckOptionLists);
|
||||
plan = mtstate->mt_plans[0];
|
||||
resultRelInfo = mtstate->mt_partitions;
|
||||
for (i = 0; i < mtstate->mt_num_partitions; i++)
|
||||
{
|
||||
Relation partrel = resultRelInfo->ri_RelationDesc;
|
||||
Relation partrel;
|
||||
List *mapped_wcoList;
|
||||
List *wcoExprs = NIL;
|
||||
ListCell *ll;
|
||||
|
||||
resultRelInfo = mtstate->mt_partitions[i];
|
||||
partrel = resultRelInfo->ri_RelationDesc;
|
||||
|
||||
/* varno = node->nominalRelation */
|
||||
mapped_wcoList = map_partition_varattnos(wcoList,
|
||||
node->nominalRelation,
|
||||
@ -2037,7 +2049,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
|
||||
resultRelInfo->ri_WithCheckOptions = mapped_wcoList;
|
||||
resultRelInfo->ri_WithCheckOptionExprs = wcoExprs;
|
||||
resultRelInfo++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2088,13 +2099,15 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
* will suffice. This only occurs for the INSERT case; UPDATE/DELETE
|
||||
* are handled above.
|
||||
*/
|
||||
resultRelInfo = mtstate->mt_partitions;
|
||||
returningList = linitial(node->returningLists);
|
||||
for (i = 0; i < mtstate->mt_num_partitions; i++)
|
||||
{
|
||||
Relation partrel = resultRelInfo->ri_RelationDesc;
|
||||
Relation partrel;
|
||||
List *rlist;
|
||||
|
||||
resultRelInfo = mtstate->mt_partitions[i];
|
||||
partrel = resultRelInfo->ri_RelationDesc;
|
||||
|
||||
/* varno = node->nominalRelation */
|
||||
rlist = map_partition_varattnos(returningList,
|
||||
node->nominalRelation,
|
||||
@ -2102,7 +2115,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
resultRelInfo->ri_projectReturning =
|
||||
ExecBuildProjectionInfo(rlist, econtext, slot, &mtstate->ps,
|
||||
resultRelInfo->ri_RelationDesc->rd_att);
|
||||
resultRelInfo++;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2376,7 +2388,7 @@ ExecEndModifyTable(ModifyTableState *node)
|
||||
}
|
||||
for (i = 0; i < node->mt_num_partitions; i++)
|
||||
{
|
||||
ResultRelInfo *resultRelInfo = node->mt_partitions + i;
|
||||
ResultRelInfo *resultRelInfo = node->mt_partitions[i];
|
||||
|
||||
ExecCloseIndices(resultRelInfo);
|
||||
heap_close(resultRelInfo->ri_RelationDesc, NoLock);
|
||||
|
Reference in New Issue
Block a user