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 PartitionDispatchData * PartitionDispatch
 
typedef struct PartitionTupleRouting PartitionTupleRouting
 
typedef struct PartitionedRelPruningData PartitionedRelPruningData
 
typedef struct PartitionPruningData PartitionPruningData
 
typedef struct PartitionPruneState PartitionPruneState
 

Functions

PartitionTupleRouting * ExecSetupPartitionTupleRouting (EState *estate, Relation rel)
 
ResultRelInfo * ExecFindPartition (ModifyTableState *mtstate, ResultRelInfo *rootResultRelInfo, PartitionTupleRouting *proute, TupleTableSlot *slot, EState *estate)
 
void ExecCleanupTupleRouting (ModifyTableState *mtstate, PartitionTupleRouting *proute)
 
void ExecDoInitialPruning (EState *estate)
 
PartitionPruneState * ExecInitPartitionExecPruning (PlanState *planstate, int n_total_subplans, int part_prune_index, Bitmapset *relids, Bitmapset **initially_valid_subplans)
 
Bitmapset * ExecFindMatchingSubPlans (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:243
TupleTableSlot * tupslot
PartitionDispatch * partition_dispatch_info
ResultRelInfo ** partitions
EState * state
Definition execnodes.h:1204
Relation ri_RelationDesc
Definition execnodes.h:514
struct FdwRoutine * ri_FdwRoutine
Definition execnodes.h:567
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:1036
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:707
Bitmapset * es_unpruned_relids
Definition execnodes.h:710
List * es_part_prune_states
Definition execnodes.h:708
List * es_part_prune_results
Definition execnodes.h:709

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{
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];
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 */
2725
2726 MemoryContextReset(prunestate->prune_context);
2727
2728 return result;
2729}
Bitmapset * bms_copy(const Bitmapset *a)
Definition bitmapset.c:123
#define Assert(condition)
Definition c.h:1002
uint32 result
static void find_matching_subplans_recurse(PartitionPruningData *prunedata, PartitionedRelPruningData *pprune, bool initial_prune, Bitmapset **validsubplans, Bitmapset **validsubplan_rtis)
#define ResetExprContext(econtext)
Definition executor.h:659
void MemoryContextReset(MemoryContext context)
Definition mcxt.c:406
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:138

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

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, node);
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:190
#define likely(x)
Definition c.h:496
#define OidIsValid(objectId)
Definition c.h:917
int errcode(int sqlerrcode)
Definition elog.c:875
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool emitError)
Definition execMain.c:1922
void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, OnConflictAction onConflictAction, List *mergeActions, ModifyTable *mtnode)
Definition execMain.c:1065
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:1352
#define GetPerTupleExprContext(estate)
Definition executor.h:665
#define GetPerTupleMemoryContext(estate)
Definition executor.h:670
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:125
ResultRelInfo * ExecLookupResultRelByOid(ModifyTableState *node, Oid resultoid, bool missing_ok, bool update_cache)
@ ONCONFLICT_NONE
Definition nodes.h:426
@ CMD_INSERT
Definition nodes.h:275
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:516
#define RelationGetRelationName(relation)
Definition rel.h:550
int errtable(Relation rel)
Definition relcache.c:6084
ResultRelInfo * rootResultRelInfo
Definition execnodes.h:1455
PartitionBoundInfo boundinfo
Definition partdesc.h:38
ResultRelInfo ** nonleaf_partitions
Plan * plan
Definition execnodes.h:1202
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:143
Bitmapset * bms_add_range(Bitmapset *a, int lower, int upper)
Definition bitmapset.c:1138
#define elog(elevel,...)
Definition elog.h:228
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:331
#define list_nth_node(type, list, n)
Definition pg_list.h:359

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:90
MemoryContext CurrentMemoryContext
Definition mcxt.c:161

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

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