PostgreSQL Source Code git master
Loading...
Searching...
No Matches
execPartition.h File Reference
Include dependency graph for execPartition.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  PartitionedRelPruningData
 
struct  PartitionPruningData
 
struct  PartitionPruneState
 

Typedefs

typedef struct PartitionDispatchDataPartitionDispatch
 
typedef struct PartitionTupleRouting PartitionTupleRouting
 
typedef struct PartitionedRelPruningData PartitionedRelPruningData
 
typedef struct PartitionPruningData PartitionPruningData
 
typedef struct PartitionPruneState PartitionPruneState
 

Functions

PartitionTupleRoutingExecSetupPartitionTupleRouting (EState *estate, Relation rel)
 
ResultRelInfoExecFindPartition (ModifyTableState *mtstate, ResultRelInfo *rootResultRelInfo, PartitionTupleRouting *proute, TupleTableSlot *slot, EState *estate)
 
void ExecCleanupTupleRouting (ModifyTableState *mtstate, PartitionTupleRouting *proute)
 
void ExecDoInitialPruning (EState *estate)
 
PartitionPruneStateExecInitPartitionExecPruning (PlanState *planstate, int n_total_subplans, int part_prune_index, Bitmapset *relids, Bitmapset **initially_valid_subplans)
 
BitmapsetExecFindMatchingSubPlans (PartitionPruneState *prunestate, bool initial_prune, Bitmapset **validsubplan_rtis)
 

Typedef Documentation

◆ PartitionDispatch

Definition at line 22 of file execPartition.h.

◆ PartitionedRelPruningData

◆ PartitionPruneState

◆ PartitionPruningData

◆ PartitionTupleRouting

Function Documentation

◆ ExecCleanupTupleRouting()

void ExecCleanupTupleRouting ( ModifyTableState mtstate,
PartitionTupleRouting proute 
)
extern

Definition at line 1412 of file execPartition.c.

1414{
1415 int i;
1416
1417 /*
1418 * Remember, proute->partition_dispatch_info[0] corresponds to the root
1419 * partitioned table, which we must not try to close, because it is the
1420 * main target table of the query that will be closed by callers such as
1421 * ExecEndPlan() or DoCopy(). Also, tupslot is NULL for the root
1422 * partitioned table.
1423 */
1424 for (i = 1; i < proute->num_dispatch; i++)
1425 {
1427
1429
1430 if (pd->tupslot)
1432 }
1433
1434 for (i = 0; i < proute->num_partitions; i++)
1435 {
1436 ResultRelInfo *resultRelInfo = proute->partitions[i];
1437
1438 /* Allow any FDWs to shut down */
1439 if (resultRelInfo->ri_FdwRoutine != NULL &&
1440 resultRelInfo->ri_FdwRoutine->EndForeignInsert != NULL)
1441 resultRelInfo->ri_FdwRoutine->EndForeignInsert(mtstate->ps.state,
1442 resultRelInfo);
1443
1444 /*
1445 * Close it if it's not one of the result relations borrowed from the
1446 * owning ModifyTableState; those will be closed by ExecEndPlan().
1447 */
1448 if (proute->is_borrowed_rel[i])
1449 continue;
1450
1451 ExecCloseIndices(resultRelInfo);
1452 table_close(resultRelInfo->ri_RelationDesc, NoLock);
1453 }
1454}
void ExecCloseIndices(ResultRelInfo *resultRelInfo)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
int i
Definition isn.c:77
#define NoLock
Definition lockdefs.h:34
static int fb(int x)
EndForeignInsert_function EndForeignInsert
Definition fdwapi.h:239
TupleTableSlot * tupslot
PartitionDispatch * partition_dispatch_info
ResultRelInfo ** partitions
EState * state
Definition execnodes.h:1179
Relation ri_RelationDesc
Definition execnodes.h:492
struct FdwRoutine * ri_FdwRoutine
Definition execnodes.h:545
void table_close(Relation relation, LOCKMODE lockmode)
Definition table.c:126

References FdwRoutine::EndForeignInsert, ExecCloseIndices(), ExecDropSingleTupleTableSlot(), fb(), i, PartitionTupleRouting::is_borrowed_rel, NoLock, PartitionTupleRouting::num_dispatch, PartitionTupleRouting::num_partitions, PartitionTupleRouting::partition_dispatch_info, PartitionTupleRouting::partitions, ModifyTableState::ps, PartitionDispatchData::reldesc, ResultRelInfo::ri_FdwRoutine, ResultRelInfo::ri_RelationDesc, PlanState::state, table_close(), and PartitionDispatchData::tupslot.

Referenced by CopyFrom(), ExecEndModifyTable(), and finish_edata().

◆ ExecDoInitialPruning()

void ExecDoInitialPruning ( EState estate)
extern

Definition at line 1995 of file execPartition.c.

1996{
1997 ListCell *lc;
1998
1999 foreach(lc, estate->es_part_prune_infos)
2000 {
2006
2007 /* Create and save the PartitionPruneState. */
2011 prunestate);
2012
2013 /*
2014 * Perform initial pruning steps, if any, and save the result
2015 * bitmapset or NULL as described in the header comment.
2016 */
2017 if (prunestate->do_initial_prune)
2020 else
2022
2027 }
2028}
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:901
Bitmapset * ExecFindMatchingSubPlans(PartitionPruneState *prunestate, bool initial_prune, Bitmapset **validsubplan_rtis)
static PartitionPruneState * CreatePartitionPruneState(EState *estate, PartitionPruneInfo *pruneinfo, Bitmapset **all_leafpart_rtis)
List * lappend(List *list, void *datum)
Definition list.c:339
#define lfirst_node(type, lc)
Definition pg_list.h:176
List * es_part_prune_infos
Definition execnodes.h:682
Bitmapset * es_unpruned_relids
Definition execnodes.h:685
List * es_part_prune_states
Definition execnodes.h:683
List * es_part_prune_results
Definition execnodes.h:684

References bms_add_members(), CreatePartitionPruneState(), EState::es_part_prune_infos, EState::es_part_prune_results, EState::es_part_prune_states, EState::es_unpruned_relids, ExecFindMatchingSubPlans(), fb(), lappend(), and lfirst_node.

Referenced by InitPlan().

◆ ExecFindMatchingSubPlans()

Bitmapset * ExecFindMatchingSubPlans ( PartitionPruneState prunestate,
bool  initial_prune,
Bitmapset **  validsubplan_rtis 
)
extern

Definition at line 2667 of file execPartition.c.

2670{
2671 Bitmapset *result = NULL;
2672 MemoryContext oldcontext;
2673 int i;
2674
2675 /*
2676 * Either we're here on the initial prune done during pruning
2677 * initialization, or we're at a point where PARAM_EXEC Params can be
2678 * evaluated *and* there are steps in which to do so.
2679 */
2680 Assert(initial_prune || prunestate->do_exec_prune);
2682
2683 /*
2684 * Switch to a temp context to avoid leaking memory in the executor's
2685 * query-lifespan memory context.
2686 */
2687 oldcontext = MemoryContextSwitchTo(prunestate->prune_context);
2688
2689 /*
2690 * For each hierarchy, do the pruning tests, and add nondeletable
2691 * subplans' indexes to "result".
2692 */
2693 for (i = 0; i < prunestate->num_partprunedata; i++)
2694 {
2695 PartitionPruningData *prunedata = prunestate->partprunedata[i];
2697
2698 /*
2699 * We pass the zeroth item, belonging to the root table of the
2700 * hierarchy, and find_matching_subplans_recurse() takes care of
2701 * recursing to other (lower-level) parents as needed.
2702 */
2703 pprune = &prunedata->partrelprunedata[0];
2705 &result, validsubplan_rtis);
2706
2707 /*
2708 * Expression eval may have used space in ExprContext too. Avoid
2709 * accessing exec_context during initial pruning, as it is not valid
2710 * at that stage.
2711 */
2712 if (!initial_prune && pprune->exec_pruning_steps)
2713 ResetExprContext(pprune->exec_context.exprcontext);
2714 }
2715
2716 /* Add in any subplans that partition pruning didn't account for */
2717 result = bms_add_members(result, prunestate->other_subplans);
2718
2719 MemoryContextSwitchTo(oldcontext);
2720
2721 /* Copy result out of the temp context before we reset it */
2722 result = bms_copy(result);
2725
2726 MemoryContextReset(prunestate->prune_context);
2727
2728 return result;
2729}
Bitmapset * bms_copy(const Bitmapset *a)
Definition bitmapset.c:122
#define Assert(condition)
Definition c.h:945
static void find_matching_subplans_recurse(PartitionPruningData *prunedata, PartitionedRelPruningData *pprune, bool initial_prune, Bitmapset **validsubplans, Bitmapset **validsubplan_rtis)
#define ResetExprContext(econtext)
Definition executor.h:654
void MemoryContextReset(MemoryContext context)
Definition mcxt.c:403
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124

References Assert, bms_add_members(), bms_copy(), fb(), find_matching_subplans_recurse(), i, MemoryContextReset(), MemoryContextSwitchTo(), and ResetExprContext.

Referenced by choose_next_subplan_for_leader(), choose_next_subplan_for_worker(), choose_next_subplan_locally(), ExecAppendAsyncBegin(), ExecDoInitialPruning(), and ExecMergeAppend().

◆ ExecFindPartition()

ResultRelInfo * ExecFindPartition ( ModifyTableState mtstate,
ResultRelInfo rootResultRelInfo,
PartitionTupleRouting proute,
TupleTableSlot slot,
EState estate 
)
extern

Definition at line 268 of file execPartition.c.

272{
275 bool isnull[PARTITION_MAX_KEYS];
276 Relation rel;
278 PartitionDesc partdesc;
280 TupleTableSlot *ecxt_scantuple_saved = ecxt->ecxt_scantuple;
281 TupleTableSlot *rootslot = slot;
285
286 /* use per-tuple context here to avoid leaking memory */
288
289 /*
290 * First check the root table's partition constraint, if any. No point in
291 * routing the tuple if it doesn't belong in the root table itself.
292 */
293 if (rootResultRelInfo->ri_RelationDesc->rd_rel->relispartition)
294 ExecPartitionCheck(rootResultRelInfo, slot, estate, true);
295
296 /* start with the root partitioned table */
297 dispatch = pd[0];
298 while (dispatch != NULL)
299 {
300 int partidx = -1;
301 bool is_leaf;
302
304
305 rel = dispatch->reldesc;
306 partdesc = dispatch->partdesc;
307
308 /*
309 * Extract partition key from tuple. Expression evaluation machinery
310 * that FormPartitionKeyDatum() invokes expects ecxt_scantuple to
311 * point to the correct tuple slot. The slot might have changed from
312 * what was used for the parent table if the table of the current
313 * partitioning level has different tuple descriptor from the parent.
314 * So update ecxt_scantuple accordingly.
315 */
316 ecxt->ecxt_scantuple = slot;
317 FormPartitionKeyDatum(dispatch, slot, estate, values, isnull);
318
319 /*
320 * If this partitioned table has no partitions or no partition for
321 * these values, error out.
322 */
323 if (partdesc->nparts == 0 ||
325 {
326 char *val_desc;
327
329 values, isnull, 64);
333 errmsg("no partition of relation \"%s\" found for row",
335 val_desc ?
336 errdetail("Partition key of the failing row contains %s.",
337 val_desc) : 0,
338 errtable(rel)));
339 }
340
341 is_leaf = partdesc->is_leaf[partidx];
342 if (is_leaf)
343 {
344 /*
345 * We've reached the leaf -- hurray, we're done. Look to see if
346 * we've already got a ResultRelInfo for this partition.
347 */
348 if (likely(dispatch->indexes[partidx] >= 0))
349 {
350 /* ResultRelInfo already built */
351 Assert(dispatch->indexes[partidx] < proute->num_partitions);
352 rri = proute->partitions[dispatch->indexes[partidx]];
353 }
354 else
355 {
356 /*
357 * If the partition is known in the owning ModifyTableState
358 * node, we can re-use that ResultRelInfo instead of creating
359 * a new one with ExecInitPartitionInfo().
360 */
362 partdesc->oids[partidx],
363 true, false);
364 if (rri)
365 {
366 ModifyTable *node = (ModifyTable *) mtstate->ps.plan;
367
368 /* Verify this ResultRelInfo allows INSERTs */
370 node ? node->onConflictAction : ONCONFLICT_NONE,
371 NIL);
372
373 /*
374 * Initialize information needed to insert this and
375 * subsequent tuples routed to this partition.
376 */
377 ExecInitRoutingInfo(mtstate, estate, proute, dispatch,
378 rri, partidx, true);
379 }
380 else
381 {
382 /* We need to create a new one. */
383 rri = ExecInitPartitionInfo(mtstate, estate, proute,
384 dispatch,
385 rootResultRelInfo, partidx);
386 }
387 }
388 Assert(rri != NULL);
389
390 /* Signal to terminate the loop */
391 dispatch = NULL;
392 }
393 else
394 {
395 /*
396 * Partition is a sub-partitioned table; get the PartitionDispatch
397 */
398 if (likely(dispatch->indexes[partidx] >= 0))
399 {
400 /* Already built. */
401 Assert(dispatch->indexes[partidx] < proute->num_dispatch);
402
403 rri = proute->nonleaf_partitions[dispatch->indexes[partidx]];
404
405 /*
406 * Move down to the next partition level and search again
407 * until we find a leaf partition that matches this tuple
408 */
409 dispatch = pd[dispatch->indexes[partidx]];
410 }
411 else
412 {
413 /* Not yet built. Do that now. */
415
416 /*
417 * Create the new PartitionDispatch. We pass the current one
418 * in as the parent PartitionDispatch
419 */
421 proute,
422 partdesc->oids[partidx],
424 mtstate->rootResultRelInfo);
425 Assert(dispatch->indexes[partidx] >= 0 &&
426 dispatch->indexes[partidx] < proute->num_dispatch);
427
428 rri = proute->nonleaf_partitions[dispatch->indexes[partidx]];
430 }
431
432 /*
433 * Convert the tuple to the new parent's layout, if different from
434 * the previous parent.
435 */
436 if (dispatch->tupslot)
437 {
438 AttrMap *map = dispatch->tupmap;
440
441 myslot = dispatch->tupslot;
442 slot = execute_attr_map_slot(map, slot, myslot);
443
444 if (tempslot != NULL)
446 }
447 }
448
449 /*
450 * If this partition is the default one, we must check its partition
451 * constraint now, which may have changed concurrently due to
452 * partitions being added to the parent.
453 *
454 * (We do this here, and do not rely on ExecInsert doing it, because
455 * we don't want to miss doing it for non-leaf partitions.)
456 */
457 if (partidx == partdesc->boundinfo->default_index)
458 {
459 /*
460 * The tuple must match the partition's layout for the constraint
461 * expression to be evaluated successfully. If the partition is
462 * sub-partitioned, that would already be the case due to the code
463 * above, but for a leaf partition the tuple still matches the
464 * parent's layout.
465 *
466 * Note that we have a map to convert from root to current
467 * partition, but not from immediate parent to current partition.
468 * So if we have to convert, do it from the root slot; if not, use
469 * the root slot as-is.
470 */
471 if (is_leaf)
472 {
474
475 if (map)
477 rri->ri_PartitionTupleSlot);
478 else
479 slot = rootslot;
480 }
481
482 ExecPartitionCheck(rri, slot, estate, true);
483 }
484 }
485
486 /* Release the tuple in the lowest parent's dedicated slot. */
487 if (myslot != NULL)
489 /* and restore ecxt's scantuple */
490 ecxt->ecxt_scantuple = ecxt_scantuple_saved;
492
493 return rri;
494}
static Datum values[MAXATTR]
Definition bootstrap.c:188
#define likely(x)
Definition c.h:431
#define OidIsValid(objectId)
Definition c.h:860
int errcode(int sqlerrcode)
Definition elog.c:874
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, OnConflictAction onConflictAction, List *mergeActions)
Definition execMain.c:1056
bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool emitError)
Definition execMain.c:1875
static PartitionDispatch ExecInitPartitionDispatchInfo(EState *estate, PartitionTupleRouting *proute, Oid partoid, PartitionDispatch parent_pd, int partidx, ResultRelInfo *rootResultRelInfo)
static ResultRelInfo * ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, PartitionTupleRouting *proute, PartitionDispatch dispatch, ResultRelInfo *rootResultRelInfo, int partidx)
static void ExecInitRoutingInfo(ModifyTableState *mtstate, EState *estate, PartitionTupleRouting *proute, PartitionDispatch dispatch, ResultRelInfo *partRelInfo, int partidx, bool is_borrowed_rel)
static char * ExecBuildSlotPartitionKeyDescription(Relation rel, const Datum *values, const bool *isnull, int maxfieldlen)
static void FormPartitionKeyDatum(PartitionDispatch pd, TupleTableSlot *slot, EState *estate, Datum *values, bool *isnull)
static int get_partition_for_tuple(PartitionDispatch pd, const Datum *values, const bool *isnull)
TupleConversionMap * ExecGetRootToChildMap(ResultRelInfo *resultRelInfo, EState *estate)
Definition execUtils.c:1331
#define GetPerTupleExprContext(estate)
Definition executor.h:660
#define GetPerTupleMemoryContext(estate)
Definition executor.h:665
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:123
ResultRelInfo * ExecLookupResultRelByOid(ModifyTableState *node, Oid resultoid, bool missing_ok, bool update_cache)
@ ONCONFLICT_NONE
Definition nodes.h:428
@ CMD_INSERT
Definition nodes.h:277
static char * errmsg
#define PARTITION_MAX_KEYS
#define NIL
Definition pg_list.h:68
uint64_t Datum
Definition postgres.h:70
#define RelationGetRelid(relation)
Definition rel.h:514
#define RelationGetRelationName(relation)
Definition rel.h:548
int errtable(Relation rel)
Definition relcache.c:6062
ResultRelInfo * rootResultRelInfo
Definition execnodes.h:1428
PartitionBoundInfo boundinfo
Definition partdesc.h:38
ResultRelInfo ** nonleaf_partitions
Plan * plan
Definition execnodes.h:1177
Form_pg_class rd_rel
Definition rel.h:111
AttrMap * attrMap
Definition tupconvert.h:28
TupleTableSlot * execute_attr_map_slot(AttrMap *attrMap, TupleTableSlot *in_slot, TupleTableSlot *out_slot)
Definition tupconvert.c:193
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition tuptable.h:476

References Assert, TupleConversionMap::attrMap, PartitionDescData::boundinfo, CHECK_FOR_INTERRUPTS, CheckValidResultRel(), CMD_INSERT, PartitionBoundInfoData::default_index, ereport, errcode(), errdetail(), errmsg, ERROR, errtable(), ExecBuildSlotPartitionKeyDescription(), ExecClearTuple(), ExecGetRootToChildMap(), ExecInitPartitionDispatchInfo(), ExecInitPartitionInfo(), ExecInitRoutingInfo(), ExecLookupResultRelByOid(), ExecPartitionCheck(), execute_attr_map_slot(), fb(), FormPartitionKeyDatum(), get_partition_for_tuple(), GetPerTupleExprContext, GetPerTupleMemoryContext, PartitionDescData::is_leaf, likely, MemoryContextSwitchTo(), NIL, PartitionTupleRouting::nonleaf_partitions, PartitionDescData::nparts, PartitionTupleRouting::num_dispatch, PartitionTupleRouting::num_partitions, OidIsValid, PartitionDescData::oids, ONCONFLICT_NONE, ModifyTable::onConflictAction, PartitionTupleRouting::partition_dispatch_info, PARTITION_MAX_KEYS, PartitionTupleRouting::partitions, PlanState::plan, ModifyTableState::ps, RelationData::rd_rel, RelationGetRelationName, RelationGetRelid, ResultRelInfo::ri_RelationDesc, ModifyTableState::rootResultRelInfo, and values.

Referenced by apply_handle_tuple_routing(), CopyFrom(), and ExecPrepareTupleRouting().

◆ ExecInitPartitionExecPruning()

PartitionPruneState * ExecInitPartitionExecPruning ( PlanState planstate,
int  n_total_subplans,
int  part_prune_index,
Bitmapset relids,
Bitmapset **  initially_valid_subplans 
)
extern

Definition at line 2051 of file execPartition.c.

2056{
2058 EState *estate = planstate->state;
2060
2061 /* Obtain the pruneinfo we need. */
2063 part_prune_index);
2064
2065 /* Its relids better match the plan node's or the planner messed up. */
2066 if (!bms_equal(relids, pruneinfo->relids))
2067 elog(ERROR, "wrong pruneinfo with relids=%s found at part_prune_index=%d contained in plan node with relids=%s",
2068 bmsToString(pruneinfo->relids), part_prune_index,
2069 bmsToString(relids));
2070
2071 /*
2072 * The PartitionPruneState would have been created by
2073 * ExecDoInitialPruning() and stored as the part_prune_index'th element of
2074 * EState.es_part_prune_states.
2075 */
2076 prunestate = list_nth(estate->es_part_prune_states, part_prune_index);
2078
2079 /* Use the result of initial pruning done by ExecDoInitialPruning(). */
2080 if (prunestate->do_initial_prune)
2082 estate->es_part_prune_results,
2083 part_prune_index);
2084 else
2085 {
2086 /* No pruning, so we'll need to initialize all subplans */
2089 n_total_subplans - 1);
2090 }
2091
2092 /*
2093 * The exec pruning state must also be initialized, if needed, before it
2094 * can be used for pruning during execution.
2095 *
2096 * This also re-sequences subplan indexes contained in prunestate to
2097 * account for any that were removed due to initial pruning; refer to the
2098 * condition in InitExecPartitionPruneContexts() that is used to determine
2099 * whether to do this. If no exec pruning needs to be done, we would thus
2100 * leave the maps to be in an invalid state, but that's ok since that data
2101 * won't be consulted again (cf initial Assert in
2102 * ExecFindMatchingSubPlans).
2103 */
2104 if (prunestate->do_exec_prune)
2108
2109 return prunestate;
2110}
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:142
Bitmapset * bms_add_range(Bitmapset *a, int lower, int upper)
Definition bitmapset.c:1003
#define elog(elevel,...)
Definition elog.h:226
static void InitExecPartitionPruneContexts(PartitionPruneState *prunestate, PlanState *parent_plan, Bitmapset *initially_valid_subplans, int n_total_subplans)
char * bmsToString(const Bitmapset *bms)
Definition outfuncs.c:828
static void * list_nth(const List *list, int n)
Definition pg_list.h:299
#define list_nth_node(type, list, n)
Definition pg_list.h:327

References Assert, bms_add_range(), bms_equal(), bmsToString(), elog, ERROR, EState::es_part_prune_infos, EState::es_part_prune_results, EState::es_part_prune_states, fb(), InitExecPartitionPruneContexts(), list_nth(), list_nth_node, and PlanState::state.

Referenced by ExecInitAppend(), and ExecInitMergeAppend().

◆ ExecSetupPartitionTupleRouting()

PartitionTupleRouting * ExecSetupPartitionTupleRouting ( EState estate,
Relation  rel 
)
extern

Definition at line 221 of file execPartition.c.

222{
223 PartitionTupleRouting *proute;
224
225 /*
226 * Here we attempt to expend as little effort as possible in setting up
227 * the PartitionTupleRouting. Each partition's ResultRelInfo is built on
228 * demand, only when we actually need to route a tuple to that partition.
229 * The reason for this is that a common case is for INSERT to insert a
230 * single tuple into a partitioned table and this must be fast.
231 */
233 proute->partition_root = rel;
235 /* Rest of members initialized by zeroing */
236
237 /*
238 * Initialize this table's PartitionDispatch object. Here we pass in the
239 * parent as NULL as we don't need to care about any parent of the target
240 * partitioned table.
241 */
243 NULL, 0, NULL);
244
245 return proute;
246}
#define palloc0_object(type)
Definition fe_memutils.h:75
MemoryContext CurrentMemoryContext
Definition mcxt.c:160

References CurrentMemoryContext, ExecInitPartitionDispatchInfo(), fb(), PartitionTupleRouting::memcxt, palloc0_object, PartitionTupleRouting::partition_root, and RelationGetRelid.

Referenced by apply_handle_tuple_routing(), CopyFrom(), ExecCrossPartitionUpdate(), ExecInitMerge(), and ExecInitModifyTable().