diff --git a/src/backend/executor/nodeDML.c b/src/backend/executor/nodeDML.c
index af912775e12..9e5e89ca06a 100644
--- a/src/backend/executor/nodeDML.c
+++ b/src/backend/executor/nodeDML.c
@@ -45,158 +45,168 @@ ExecDMLExplainEnd(PlanState *planstate, struct StringInfoData *buf)
TupleTableSlot*
ExecDML(DMLState *node)
{
-
- PlanState *outerNode = outerPlanState(node);
- DML *plannode = (DML *) node->ps.plan;
-
- Assert(outerNode != NULL);
-
- TupleTableSlot *slot = ExecProcNode(outerNode);
-
- if (TupIsNull(slot))
+ for (;;)
{
- return NULL;
- }
+ PlanState *outerNode = outerPlanState(node);
+ DML *plannode = (DML *) node->ps.plan;
- bool isnull = false;
- int action = DatumGetUInt32(slot_getattr(slot, plannode->actionColIdx, &isnull));
- Assert(!isnull);
+ Assert(outerNode != NULL);
- bool isUpdate = false;
- if (node->ps.state->es_plannedstmt->commandType == CMD_UPDATE)
- {
- isUpdate = true;
- }
-
- Assert(action == DML_INSERT || action == DML_DELETE);
+ TupleTableSlot *slot = ExecProcNode(outerNode);
+ TupleTableSlot *resultSlot = NULL;
+ if (TupIsNull(slot))
+ {
+ return NULL;
+ }
- /*
- * Reset per-tuple memory context to free any expression evaluation
- * storage allocated in the previous tuple cycle.
- */
- ExprContext *econtext = node->ps.ps_ExprContext;
- ResetExprContext(econtext);
+ bool isnull = false;
+ int action = DatumGetUInt32(slot_getattr(slot, plannode->actionColIdx, &isnull));
+ Assert(!isnull);
- /* Prepare cleaned-up tuple by projecting it and filtering junk columns */
- econtext->ecxt_outertuple = slot;
- TupleTableSlot *projectedSlot = ExecProject(node->ps.ps_ProjInfo, NULL);
+ bool isUpdate = false;
+ if (node->ps.state->es_plannedstmt->commandType == CMD_UPDATE)
+ {
+ isUpdate = true;
+ }
- /* remove 'junk' columns from tuple */
- node->cleanedUpSlot = ExecFilterJunk(node->junkfilter, projectedSlot);
+ Assert(action == DML_INSERT || action == DML_DELETE);
- /*
- * If we are modifying a leaf partition we have to ensure that partition
- * selection operation will consider leaf partition's attributes as
- * coherent with root partition's attribute numbers, because partition
- * selection is performed using root's attribute numbers (all partition
- * rules are based on the parent relation's tuple descriptor). In case
- * when child partition has different attribute numbers from root's due to
- * dropped columns, the partition selection may go wrong without extra
- * validation.
- */
- if (node->ps.state->es_result_partitions)
- {
- ResultRelInfo *relInfo = node->ps.state->es_result_relations;
/*
- * The DML is done on a leaf partition. In order to reuse the map,
- * it will be allocated at es_result_relations.
- */
- if (RelationGetRelid(relInfo->ri_RelationDesc) !=
- node->ps.state->es_result_partitions->part->parrelid &&
- action != DML_DELETE)
- makePartitionCheckMap(node->ps.state, relInfo);
+ * Reset per-tuple memory context to free any expression evaluation
+ * storage allocated in the previous tuple cycle.
+ */
+ ExprContext *econtext = node->ps.ps_ExprContext;
+ ResetExprContext(econtext);
- /*
- * DML node always performs partition selection, and if we want to
- * reuse the map built in makePartitionCheckMap, we are allowed to
- * reassign es_result_relation_info, because ExecInsert, ExecDelete
- * changes it with target partition anyway. Moreover, without
- * inheritance plan (ORCA never builds such plans) the
- * es_result_relations will contain the only relation.
- */
- node->ps.state->es_result_relation_info = relInfo;
- }
+ /* Prepare cleaned-up tuple by projecting it and filtering junk columns */
+ econtext->ecxt_outertuple = slot;
+ TupleTableSlot *projectedSlot = ExecProject(node->ps.ps_ProjInfo, NULL);
- if (DML_INSERT == action)
- {
- /* Respect any given tuple Oid when updating a tuple. */
- if (isUpdate && plannode->tupleoidColIdx != 0)
+ /* remove 'junk' columns from tuple */
+ node->cleanedUpSlot = ExecFilterJunk(node->junkfilter, projectedSlot);
+
+ /*
+ * If we are modifying a leaf partition we have to ensure that partition
+ * selection operation will consider leaf partition's attributes as
+ * coherent with root partition's attribute numbers, because partition
+ * selection is performed using root's attribute numbers (all partition
+ * rules are based on the parent relation's tuple descriptor). In case
+ * when child partition has different attribute numbers from root's due to
+ * dropped columns, the partition selection may go wrong without extra
+ * validation.
+ */
+ if (node->ps.state->es_result_partitions)
{
- Oid oid;
- HeapTuple htuple;
-
- isnull = false;
- oid = slot_getattr(slot, plannode->tupleoidColIdx, &isnull);
- htuple = ExecFetchSlotHeapTuple(node->cleanedUpSlot);
- Assert(htuple == node->cleanedUpSlot->PRIVATE_tts_heaptuple);
- HeapTupleSetOid(htuple, oid);
+ ResultRelInfo *relInfo = node->ps.state->es_result_relations;
+
+ /*
+ * The DML is done on a leaf partition. In order to reuse the map,
+ * it will be allocated at es_result_relations.
+ */
+ if (RelationGetRelid(relInfo->ri_RelationDesc) !=
+ node->ps.state->es_result_partitions->part->parrelid &&
+ action != DML_DELETE)
+ makePartitionCheckMap(node->ps.state, relInfo);
+
+ /*
+ * DML node always performs partition selection, and if we want to
+ * reuse the map built in makePartitionCheckMap, we are allowed to
+ * reassign es_result_relation_info, because ExecInsert, ExecDelete
+ * changes it with target partition anyway. Moreover, without
+ * inheritance plan (ORCA never builds such plans) the
+ * es_result_relations will contain the only relation.
+ */
+ node->ps.state->es_result_relation_info = relInfo;
}
- /*
- * The plan origin is required since ExecInsert performs different
- * actions depending on the type of plan (constraint enforcement and
- * triggers.)
- */
- ExecInsert(node->cleanedUpSlot,
- NULL,
- node->ps.state,
- node->canSetTag,
- PLANGEN_OPTIMIZER /* Plan origin */,
- isUpdate,
- InvalidOid);
- }
- else /* DML_DELETE */
- {
- int32 segid = GpIdentity.segindex;
- Datum ctid = slot_getattr(slot, plannode->ctidColIdx, &isnull);
- Oid tableoid = InvalidOid;
+ if (DML_INSERT == action)
+ {
+ /* Respect any given tuple Oid when updating a tuple. */
+ if (isUpdate && plannode->tupleoidColIdx != 0)
+ {
+ Oid oid;
+ HeapTuple htuple;
+
+ isnull = false;
+ oid = slot_getattr(slot, plannode->tupleoidColIdx, &isnull);
+ htuple = ExecFetchSlotHeapTuple(node->cleanedUpSlot);
+ Assert(htuple == node->cleanedUpSlot->PRIVATE_tts_heaptuple);
+ HeapTupleSetOid(htuple, oid);
+ }
+
+ /*
+ * The plan origin is required since ExecInsert performs different
+ * actions depending on the type of plan (constraint enforcement and
+ * triggers.)
+ */
+ resultSlot = ExecInsert(node->cleanedUpSlot,
+ NULL,
+ node->ps.state,
+ node->canSetTag,
+ PLANGEN_OPTIMIZER /* Plan origin */,
+ isUpdate,
+ InvalidOid);
+ }
+ else /* DML_DELETE */
+ {
+ int32 segid = GpIdentity.segindex;
+ Datum ctid = slot_getattr(slot, plannode->ctidColIdx, &isnull);
+ Oid tableoid = InvalidOid;
- Assert(!isnull);
+ Assert(!isnull);
- if (AttributeNumberIsValid(plannode->tableoidColIdx))
- {
- Datum dtableoid = slot_getattr(slot, plannode->tableoidColIdx, &isnull);
- tableoid = isnull ? InvalidOid : DatumGetObjectId(dtableoid);
+ if (AttributeNumberIsValid(plannode->tableoidColIdx))
+ {
+ Datum dtableoid = slot_getattr(slot, plannode->tableoidColIdx, &isnull);
+ tableoid = isnull ? InvalidOid : DatumGetObjectId(dtableoid);
+ }
+
+ /*
+ * If tableoid is valid, it means that we are executing UPDATE/DELETE
+ * on partitioned table (root partition). In order to avoid partition
+ * pruning in ExecDelete one can use tableoid to build target
+ * ResultRelInfo for the leaf partition.
+ */
+ if (OidIsValid(tableoid) && node->ps.state->es_result_partitions)
+ node->ps.state->es_result_relation_info =
+ targetid_get_partition(tableoid, node->ps.state, true);
+
+ ItemPointer tupleid = (ItemPointer) DatumGetPointer(ctid);
+ ItemPointerData tuple_ctid = *tupleid;
+ tupleid = &tuple_ctid;
+
+ if (AttributeNumberIsValid(node->segid_attno))
+ {
+ segid = DatumGetInt32(slot_getattr(slot, node->segid_attno, &isnull));
+ Assert(!isnull);
+ }
+
+ /* Correct tuple count by ignoring deletes when splitting tuples. */
+ resultSlot = ExecDelete(tupleid,
+ segid,
+ NULL, /* GPDB_91_MERGE_FIXME: oldTuple? */
+ node->cleanedUpSlot,
+ NULL /* DestReceiver */,
+ node->ps.state,
+ isUpdate ? false : node->canSetTag, /* if "isUpdate",
+ ExecInsert() will be run after
+ ExecDelete() so canSetTag should be set
+ properly in ExecInsert(). */
+ PLANGEN_OPTIMIZER /* Plan origin */,
+ isUpdate);
}
/*
- * If tableoid is valid, it means that we are executing UPDATE/DELETE
- * on partitioned table (root partition). In order to avoid partition
- * pruning in ExecDelete one can use tableoid to build target
- * ResultRelInfo for the leaf partition.
+ * If we got a RETURNING result, return it to caller. We'll continue
+ * the work on next call.
*/
- if (OidIsValid(tableoid) && node->ps.state->es_result_partitions)
- node->ps.state->es_result_relation_info =
- targetid_get_partition(tableoid, node->ps.state, true);
-
- ItemPointer tupleid = (ItemPointer) DatumGetPointer(ctid);
- ItemPointerData tuple_ctid = *tupleid;
- tupleid = &tuple_ctid;
-
- if (AttributeNumberIsValid(node->segid_attno))
+ if (!TupIsNull(resultSlot))
{
- segid = DatumGetInt32(slot_getattr(slot, node->segid_attno, &isnull));
- Assert(!isnull);
+ return resultSlot;
}
-
- /* Correct tuple count by ignoring deletes when splitting tuples. */
- ExecDelete(tupleid,
- segid,
- NULL, /* GPDB_91_MERGE_FIXME: oldTuple? */
- node->cleanedUpSlot,
- NULL /* DestReceiver */,
- node->ps.state,
- isUpdate ? false : node->canSetTag, /* if "isUpdate",
- ExecInsert() will be run after
- ExecDelete() so canSetTag should be set
- properly in ExecInsert(). */
- PLANGEN_OPTIMIZER /* Plan origin */,
- isUpdate);
}
-
- return slot;
}
/**
@@ -275,6 +285,30 @@ ExecInitDML(DML *node, EState *estate, int eflags)
dmlstate->ps.state->es_result_relation_info->ri_RelationDesc->rd_att->tdhasoid,
dmlstate->cleanedUpSlot);
+ /*
+ * Initialize RETURNING projections if needed.
+ */
+ if (node->returningList)
+ {
+ TupleTableSlot *slot;
+
+ /* Initialize result tuple slot and assign its rowtype */
+ TupleDesc tupDesc = ExecTypeFromTL(node->returningList, false);
+
+ /* Set up a slot for the output of the RETURNING projection(s) */
+ ExecAssignResultType(&dmlstate->ps, tupDesc);
+ slot = dmlstate->ps.ps_ResultTupleSlot;
+
+ List *rliststate = (List *) ExecInitExpr((Expr *) node->returningList, &dmlstate->ps);
+ resultRelInfo->ri_projectReturning =
+ ExecBuildProjectionInfo(rliststate, dmlstate->ps.ps_ExprContext, slot,
+ resultRelInfo->ri_RelationDesc->rd_att);
+
+ // ExecDelete() needs this for some reason
+ if (estate->es_trig_tuple_slot == NULL)
+ estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate);
+ }
+
/*
* The comment below is related to ExecInsert(). The code works correctly,
* because insert operations always translate full set of attrs to
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index a4d141e50a5..5edee280889 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -4171,7 +4171,8 @@ CTranslatorDXLToPlStmt::TranslateDXLDml(
m_dxl_to_plstmt_context->AddRTE(rte);
CDXLNode *project_list_dxlnode = (*dml_dxlnode)[0];
- CDXLNode *child_dxlnode = (*dml_dxlnode)[1];
+ CDXLNode *project_list_output_dxlnode = (*dml_dxlnode)[1];
+ CDXLNode *child_dxlnode = (*dml_dxlnode)[2];
CDXLTranslateContext child_context(m_mp, false,
output_context->GetColIdToParamIdMap());
@@ -4189,6 +4190,10 @@ CTranslatorDXLToPlStmt::TranslateDXLDml(
NULL, // translate context for the base table
child_contexts, output_context);
+ dml->returningList =
+ TranslateDXLProjList(project_list_output_dxlnode, &base_table_context,
+ child_contexts, output_context);
+
// Create target list with nulls if rel has dropped cols. DELETE may have
// empty target list if there no after trigger present. Skip creating in
// such case.
diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
index 2ab9d6c9132..f6b7db8b842 100644
--- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
@@ -492,11 +492,6 @@ CTranslatorQueryToDXL::TranslateSelectQueryToDXL()
// We therefore need to check permissions before we go into optimization for all RTEs, including the ones not explicitly referred in the query, e.g. views.
CTranslatorUtils::CheckRTEPermissions(m_query->rtable);
- // RETURNING is not supported yet.
- if (m_query->returningList)
- GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,
- GPOS_WSZ_LIT("RETURNING clause"));
-
CDXLNode *child_dxlnode = NULL;
IntToUlongMap *sort_group_attno_to_colid_mapping =
GPOS_NEW(m_mp) IntToUlongMap(m_mp);
@@ -817,7 +812,32 @@ CTranslatorQueryToDXL::TranslateInsertQueryToDXL()
query_dxlnode = project_dxlnode;
}
- return GPOS_NEW(m_mp) CDXLNode(m_mp, insert_dxlnode, query_dxlnode);
+ CDXLNode *log_insert_dxlnode =
+ GPOS_NEW(m_mp) CDXLNode(m_mp, insert_dxlnode, query_dxlnode);
+
+ CRefCount::SafeRelease(m_dxl_query_output_cols);
+ if (NULL != m_query->returningList)
+ {
+ IntToUlongMap *output_attno_to_colid_mapping =
+ GPOS_NEW(m_mp) IntToUlongMap(m_mp);
+
+ log_insert_dxlnode = ProcessReturningList(
+ log_insert_dxlnode, table_descr, output_attno_to_colid_mapping);
+
+ // this array is filled earlier with target list and was used to get colids by their indices earlier
+ // now fill it with what will truly be returned
+ m_dxl_query_output_cols = CreateDXLOutputCols(
+ m_query->returningList, output_attno_to_colid_mapping);
+
+ output_attno_to_colid_mapping->Release();
+ }
+ else
+ {
+ // we can safely set it to empty array here as we aren't outputting in this path
+ m_dxl_query_output_cols = GPOS_NEW(m_mp) CDXLNodeArray(m_mp);
+ }
+
+ return log_insert_dxlnode;
}
//---------------------------------------------------------------------------
@@ -1137,6 +1157,53 @@ CTranslatorQueryToDXL::GetSystemColId(INT attribute_number)
return res;
}
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorQueryToDXL::ProcessReturningList
+//
+// @doc: Wrap dxl node in logical project with return columns from returningList
+//
+//---------------------------------------------------------------------------
+CDXLNode *
+CTranslatorQueryToDXL::ProcessReturningList(
+ CDXLNode *dml_dxlnode, CDXLTableDescr *table_descr,
+ IntToUlongMap *output_attno_to_colid_mapping)
+{
+ GPOS_ASSERT(m_query->returningList != NULL);
+
+ CMappingVarColId *var_to_colid_map = GPOS_NEW(m_mp) CMappingVarColId(m_mp);
+ var_to_colid_map->LoadTblColumns(m_query_level, m_query->resultRelation,
+ table_descr);
+
+ CDXLNode *returning_proj_list_dxlnode =
+ GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp));
+
+ ListCell *lc = NULL;
+ ForEach(lc, m_query->returningList)
+ {
+ TargetEntry *target_entry = (TargetEntry *) lfirst(lc);
+
+ CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject(
+ target_entry->expr, target_entry->resname, var_to_colid_map, true);
+
+ ULONG colid =
+ CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id();
+ StoreAttnoColIdMapping(output_attno_to_colid_mapping,
+ target_entry->resno, colid);
+
+ returning_proj_list_dxlnode->AddChild(project_elem_dxlnode);
+ }
+
+ CDXLNode *project_dxlnode =
+ GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp));
+ project_dxlnode->AddChild(returning_proj_list_dxlnode);
+ project_dxlnode->AddChild(dml_dxlnode);
+
+ GPOS_DELETE(var_to_colid_map);
+
+ return project_dxlnode;
+}
+
//---------------------------------------------------------------------------
// @function:
// CTranslatorQueryToDXL::TranslateDeleteQueryToDXL
@@ -1214,7 +1281,32 @@ CTranslatorQueryToDXL::TranslateDeleteQueryToDXL()
CDXLLogicalDelete(m_mp, table_descr, ctid_colid, segid_colid,
delete_colid_array, tableoid_colid);
- return GPOS_NEW(m_mp) CDXLNode(m_mp, delete_dxlop, query_dxlnode);
+ CDXLNode *log_delete_dxlnode =
+ GPOS_NEW(m_mp) CDXLNode(m_mp, delete_dxlop, query_dxlnode);
+
+ CRefCount::SafeRelease(m_dxl_query_output_cols);
+ if (NULL != m_query->returningList)
+ {
+ IntToUlongMap *output_attno_to_colid_mapping =
+ GPOS_NEW(m_mp) IntToUlongMap(m_mp);
+
+ log_delete_dxlnode = ProcessReturningList(
+ log_delete_dxlnode, table_descr, output_attno_to_colid_mapping);
+
+ // this array is filled earlier with target list and was used to get colids by their indices earlier
+ // now fill it with what will truly be returned
+ m_dxl_query_output_cols = CreateDXLOutputCols(
+ m_query->returningList, output_attno_to_colid_mapping);
+
+ output_attno_to_colid_mapping->Release();
+ }
+ else
+ {
+ // we can safely set it to empty array here as we aren't outputting in this path
+ m_dxl_query_output_cols = GPOS_NEW(m_mp) CDXLNodeArray(m_mp);
+ }
+
+ return log_delete_dxlnode;
}
//---------------------------------------------------------------------------
@@ -1328,7 +1420,32 @@ CTranslatorQueryToDXL::TranslateUpdateQueryToDXL()
m_mp, table_descr, ctid_colid, segmentid_colid, delete_colid_array,
insert_colid_array, has_oids, tuple_oid_colid, tableoid_colid);
- return GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopupdate, query_dxlnode);
+ CDXLNode *log_update_dxlnode =
+ GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopupdate, query_dxlnode);
+
+ CRefCount::SafeRelease(m_dxl_query_output_cols);
+ if (NULL != m_query->returningList)
+ {
+ IntToUlongMap *output_attno_to_colid_mapping =
+ GPOS_NEW(m_mp) IntToUlongMap(m_mp);
+
+ log_update_dxlnode = ProcessReturningList(
+ log_update_dxlnode, table_descr, output_attno_to_colid_mapping);
+
+ // this array is filled earlier with target list and was used to get colids by their indices earlier
+ // now fill it with what will truly be returned
+ m_dxl_query_output_cols = CreateDXLOutputCols(
+ m_query->returningList, output_attno_to_colid_mapping);
+
+ output_attno_to_colid_mapping->Release();
+ }
+ else
+ {
+ // we can safely set it to empty array here as we aren't outputting in this path
+ m_dxl_query_output_cols = GPOS_NEW(m_mp) CDXLNodeArray(m_mp);
+ }
+
+ return log_update_dxlnode;
}
//---------------------------------------------------------------------------
@@ -3891,9 +4008,24 @@ CTranslatorQueryToDXL::TranslateDerivedTablesToDXL(const RangeTblEntry *rte,
//---------------------------------------------------------------------------
CDXLNode *
CTranslatorQueryToDXL::TranslateExprToDXL(Expr *expr)
+{
+ return TranslateExprToDXL(expr, m_var_to_colid_map);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorQueryToDXL::TranslateExprToDXL
+//
+// @doc:
+// Translate the Expr into a CDXLScalar node with specified mapping
+//
+//---------------------------------------------------------------------------
+CDXLNode *
+CTranslatorQueryToDXL::TranslateExprToDXL(Expr *expr,
+ CMappingVarColId *var_to_colid_map)
{
CDXLNode *scalar_dxlnode =
- m_scalar_translator->TranslateScalarToDXL(expr, m_var_to_colid_map);
+ m_scalar_translator->TranslateScalarToDXL(expr, var_to_colid_map);
GPOS_ASSERT(NULL != scalar_dxlnode);
return scalar_dxlnode;
@@ -4445,11 +4577,29 @@ CDXLNode *
CTranslatorQueryToDXL::TranslateExprToDXLProject(Expr *expr,
const CHAR *alias_name,
BOOL insist_new_colids)
+{
+ return TranslateExprToDXLProject(expr, alias_name, m_var_to_colid_map,
+ insist_new_colids);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorQueryToDXL::TranslateExprToDXLProject
+//
+// @doc:
+// Create a DXL project element node from the target list entry or var.
+// The function allocates memory in the translator memory pool, and the caller
+// is responsible for freeing it.
+//---------------------------------------------------------------------------
+CDXLNode *
+CTranslatorQueryToDXL::TranslateExprToDXLProject(
+ Expr *expr, const CHAR *alias_name, CMappingVarColId *var_to_colid_map,
+ BOOL insist_new_colids)
{
GPOS_ASSERT(NULL != expr);
// construct a scalar operator
- CDXLNode *child_dxlnode = TranslateExprToDXL(expr);
+ CDXLNode *child_dxlnode = TranslateExprToDXL(expr, var_to_colid_map);
// get the id and alias for the proj elem
ULONG project_elem_id;
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-1.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-1.mdp
index 895a727124b..2c93342cdec 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-1.mdp
@@ -207,10 +207,7 @@
-
-
-
-
+
@@ -244,9 +241,9 @@
-
+
-
+
@@ -257,17 +254,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -281,8 +277,8 @@
-
-
+
+
@@ -298,7 +294,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-2.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-2.mdp
index 5351f29b4b9..99e1c631302 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-2.mdp
@@ -198,10 +198,7 @@
-
-
-
-
+
@@ -251,9 +248,9 @@
-
+
-
+
@@ -264,17 +261,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -288,8 +284,8 @@
-
-
+
+
@@ -305,7 +301,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
index a55f26ecba3..1177294d102 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
@@ -228,10 +228,7 @@
-
-
-
-
+
@@ -281,9 +278,9 @@
-
+
-
+
@@ -294,17 +291,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -318,8 +314,8 @@
-
-
+
+
@@ -335,7 +331,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
index 5938db36103..b39ddd0a794 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
@@ -245,10 +245,7 @@
-
-
-
-
+
@@ -335,9 +332,9 @@
-
+
-
+
@@ -348,17 +345,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -372,8 +368,8 @@
-
-
+
+
@@ -389,7 +385,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
index 0d6333fc74a..ae680318e8d 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
@@ -214,10 +214,7 @@
-
-
-
-
+
@@ -251,9 +248,9 @@
-
+
-
+
@@ -264,17 +261,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -288,8 +284,8 @@
-
-
+
+
@@ -305,7 +301,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/ParallelAppend-Insert.mdp b/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/ParallelAppend-Insert.mdp
index 4188e14d693..d863cf514af 100644
--- a/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/ParallelAppend-Insert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/ParallelAppend-Insert.mdp
@@ -142,9 +142,7 @@ INSERT INTO t VALUES (11),(12),(13);
-
-
-
+
@@ -191,9 +189,9 @@ INSERT INTO t VALUES (11),(12),(13);
-
+
-
+
@@ -201,16 +199,17 @@ INSERT INTO t VALUES (11),(12),(13);
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -221,7 +220,7 @@ INSERT INTO t VALUES (11),(12),(13);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-Random.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-Random.mdp
index 666ba7572a7..c216ef251a2 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-Random.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-Random.mdp
@@ -213,8 +213,8 @@
-
-
+
+
@@ -236,7 +236,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-With-Global-Local-Agg.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-With-Global-Local-Agg.mdp
index f4ba3410636..e08c76f066d 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-With-Global-Local-Agg.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-With-Global-Local-Agg.mdp
@@ -717,7 +717,7 @@
-
+
@@ -733,7 +733,7 @@
-
+
@@ -757,9 +757,9 @@
-
+
-
+
@@ -773,8 +773,8 @@
-
-
+
+
@@ -785,10 +785,10 @@
-
-
+
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-random-distr.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-random-distr.mdp
index c3627cb5eff..0c705382330 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-random-distr.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-random-distr.mdp
@@ -178,9 +178,9 @@
-
-
-
+
+
+
@@ -208,8 +208,8 @@
-
-
+
+
@@ -228,7 +228,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-random-distributed-from-replicated-distributed-table.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-random-distributed-from-replicated-distributed-table.mdp
index e7c38c75439..46fde64d448 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-random-distributed-from-replicated-distributed-table.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-random-distributed-from-replicated-distributed-table.mdp
@@ -243,8 +243,8 @@
-
-
+
+
@@ -266,8 +266,8 @@
-
-
+
+
@@ -283,7 +283,7 @@
-
+
@@ -316,7 +316,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-with-Limit.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-with-Limit.mdp
index 0116aba258b..2a65c92b9f3 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-with-Limit.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-with-Limit.mdp
@@ -656,8 +656,8 @@
-
-
+
+
@@ -679,7 +679,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-with-hashed-distributed-external-table.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-with-hashed-distributed-external-table.mdp
index 4f8f55ada90..b538b88110c 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-with-hashed-distributed-external-table.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-with-hashed-distributed-external-table.mdp
@@ -247,9 +247,9 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_gpfdist_ext DISTRIBUTED BY (a);
-
-
-
+
+
+
@@ -277,7 +277,7 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_gpfdist_ext DISTRIBUTED BY (a);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS-with-randomly-distributed-external-table.mdp b/src/backend/gporca/data/dxl/minidump/CTAS-with-randomly-distributed-external-table.mdp
index e2ee4a44941..a13d7c7787b 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS-with-randomly-distributed-external-table.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS-with-randomly-distributed-external-table.mdp
@@ -234,9 +234,9 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
-
-
-
+
+
+
@@ -264,8 +264,8 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
-
-
+
+
@@ -284,7 +284,7 @@ EXPLAIN CREATE TABLE Test AS SELECT * FROM test_ext DISTRIBUTED RANDOMLY;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS.mdp b/src/backend/gporca/data/dxl/minidump/CTAS.mdp
index 6874e81ba08..72a05ac9370 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS.mdp
@@ -223,8 +223,8 @@
-
-
+
+
@@ -246,7 +246,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/CTAS_OrderedAgg_multiple_cols.mdp b/src/backend/gporca/data/dxl/minidump/CTAS_OrderedAgg_multiple_cols.mdp
index f9190d93b5b..684c7e45e69 100644
--- a/src/backend/gporca/data/dxl/minidump/CTAS_OrderedAgg_multiple_cols.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTAS_OrderedAgg_multiple_cols.mdp
@@ -1815,9 +1815,9 @@ EXPLAIN CREATE TABLE test AS
-
-
-
+
+
+
@@ -1845,7 +1845,7 @@ EXPLAIN CREATE TABLE test AS
-
+
@@ -1913,16 +1913,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
@@ -1930,16 +1930,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
+
-
+
@@ -1953,13 +1953,13 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
+
@@ -1968,23 +1968,23 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2024,16 +2024,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
@@ -2041,16 +2041,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
+
-
+
@@ -2064,13 +2064,13 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
+
@@ -2079,15 +2079,15 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
+
@@ -2095,23 +2095,23 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2152,16 +2152,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
@@ -2169,16 +2169,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
+
-
+
@@ -2192,13 +2192,13 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
+
@@ -2207,15 +2207,15 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
+
@@ -2223,23 +2223,23 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2360,8 +2360,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2375,8 +2375,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2390,8 +2390,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2408,11 +2408,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2423,11 +2423,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2442,18 +2442,18 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
-
+
@@ -2461,8 +2461,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2471,8 +2471,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2481,9 +2481,9 @@ EXPLAIN CREATE TABLE test AS
-
-
-
+
+
+
@@ -2494,8 +2494,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2506,10 +2506,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -2523,8 +2523,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2535,10 +2535,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -2547,16 +2547,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
@@ -2605,8 +2605,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2620,8 +2620,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2635,8 +2635,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2653,11 +2653,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2668,11 +2668,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2687,18 +2687,18 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
-
+
@@ -2706,8 +2706,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2716,8 +2716,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2726,8 +2726,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2737,9 +2737,9 @@ EXPLAIN CREATE TABLE test AS
-
-
-
+
+
+
@@ -2751,10 +2751,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -2768,8 +2768,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2780,10 +2780,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -2792,16 +2792,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
@@ -2852,8 +2852,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2867,8 +2867,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2882,8 +2882,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2900,11 +2900,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2915,11 +2915,11 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
@@ -2934,18 +2934,18 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
-
-
+
+
-
+
@@ -2953,8 +2953,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2963,8 +2963,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2973,8 +2973,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -2984,9 +2984,9 @@ EXPLAIN CREATE TABLE test AS
-
-
-
+
+
+
@@ -2998,10 +2998,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -3015,8 +3015,8 @@ EXPLAIN CREATE TABLE test AS
-
-
+
+
@@ -3027,10 +3027,10 @@ EXPLAIN CREATE TABLE test AS
-
+
-
+
@@ -3039,16 +3039,16 @@ EXPLAIN CREATE TABLE test AS
-
+
-
-
+
+
-
-
+
+
diff --git a/src/backend/gporca/data/dxl/minidump/ConvertHashToRandomInsert.mdp b/src/backend/gporca/data/dxl/minidump/ConvertHashToRandomInsert.mdp
index 78ced4cef6b..937838fad2f 100644
--- a/src/backend/gporca/data/dxl/minidump/ConvertHashToRandomInsert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ConvertHashToRandomInsert.mdp
@@ -597,10 +597,7 @@ explain analyze insert into t1 select t2.a,t3.b from t2, t3 where t2.a = t3.a;
-
-
-
-
+
@@ -643,9 +640,9 @@ explain analyze insert into t1 select t2.a,t3.b from t2, t3 where t2.a = t3.a;
-
+
-
+
@@ -656,13 +653,13 @@ explain analyze insert into t1 select t2.a,t3.b from t2, t3 where t2.a = t3.a;
+
-
-
-
-
-
+
+
+
+
@@ -676,7 +673,7 @@ explain analyze insert into t1 select t2.a,t3.b from t2, t3 where t2.a = t3.a;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-ComputeScalar-With-Outerref.mdp b/src/backend/gporca/data/dxl/minidump/DML-ComputeScalar-With-Outerref.mdp
index e5f46bc368f..5bf78649070 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-ComputeScalar-With-Outerref.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-ComputeScalar-With-Outerref.mdp
@@ -236,9 +236,7 @@
-
-
-
+
@@ -319,9 +317,9 @@
-
+
-
+
@@ -329,16 +327,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -349,7 +348,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-Filter-With-OuterRef.mdp b/src/backend/gporca/data/dxl/minidump/DML-Filter-With-OuterRef.mdp
index b97a2962c5b..cd31a05c96f 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-Filter-With-OuterRef.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-Filter-With-OuterRef.mdp
@@ -261,9 +261,7 @@
-
-
-
+
@@ -340,9 +338,9 @@
-
+
-
+
@@ -350,16 +348,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -370,7 +369,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-Replicated-Input.mdp b/src/backend/gporca/data/dxl/minidump/DML-Replicated-Input.mdp
index f58330c7da2..b18edc33092 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-Replicated-Input.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-Replicated-Input.mdp
@@ -269,11 +269,7 @@ WHERE sach_vsnr = 465132477;
-
-
-
-
-
+
@@ -339,9 +335,9 @@ WHERE sach_vsnr = 465132477;
-
+
-
+
@@ -359,18 +355,17 @@ WHERE sach_vsnr = 465132477;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -387,8 +382,8 @@ WHERE sach_vsnr = 465132477;
-
-
+
+
@@ -410,11 +405,11 @@ WHERE sach_vsnr = 465132477;
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-OuterRef.mdp b/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-OuterRef.mdp
index 175859c95d8..9c9e58af60c 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-OuterRef.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-OuterRef.mdp
@@ -291,9 +291,7 @@
-
-
-
+
@@ -387,9 +385,9 @@
-
+
-
+
@@ -397,16 +395,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -417,7 +416,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-Universal-Child.mdp b/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-Universal-Child.mdp
index 88c86a953c7..b55848c81ea 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-Universal-Child.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-UnionAll-With-Universal-Child.mdp
@@ -209,9 +209,7 @@
-
-
-
+
@@ -270,9 +268,9 @@
-
+
-
+
@@ -280,16 +278,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -300,8 +299,8 @@
-
-
+
+
@@ -319,7 +318,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-Volatile-Function.mdp b/src/backend/gporca/data/dxl/minidump/DML-Volatile-Function.mdp
index 451d9ea50f7..061b8f50c33 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-Volatile-Function.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-Volatile-Function.mdp
@@ -201,9 +201,7 @@
-
-
-
+
@@ -249,9 +247,9 @@
-
+
-
+
@@ -259,16 +257,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -279,8 +278,8 @@
-
-
+
+
@@ -298,7 +297,7 @@
-
+
@@ -330,7 +329,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-With-CorrelatedNLJ-With-Universal-Child.mdp b/src/backend/gporca/data/dxl/minidump/DML-With-CorrelatedNLJ-With-Universal-Child.mdp
index 03308c92d0f..8fc93cc9b61 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-With-CorrelatedNLJ-With-Universal-Child.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-With-CorrelatedNLJ-With-Universal-Child.mdp
@@ -230,9 +230,7 @@
-
-
-
+
@@ -283,9 +281,9 @@
-
+
-
+
@@ -297,16 +295,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -317,8 +316,8 @@
-
-
+
+
@@ -336,7 +335,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-With-HJ-And-UniversalChild.mdp b/src/backend/gporca/data/dxl/minidump/DML-With-HJ-And-UniversalChild.mdp
index a23420b746a..fdca0252cb1 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-With-HJ-And-UniversalChild.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-With-HJ-And-UniversalChild.mdp
@@ -712,22 +712,23 @@
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -741,7 +742,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-With-Join-With-Universal-Child.mdp b/src/backend/gporca/data/dxl/minidump/DML-With-Join-With-Universal-Child.mdp
index 2f45634dd61..dc05a2c9936 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-With-Join-With-Universal-Child.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-With-Join-With-Universal-Child.mdp
@@ -185,9 +185,7 @@
-
-
-
+
@@ -238,9 +236,9 @@
-
+
-
+
@@ -248,16 +246,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -268,8 +267,8 @@
-
-
+
+
@@ -287,7 +286,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-With-MasterOnlyTable-1.mdp b/src/backend/gporca/data/dxl/minidump/DML-With-MasterOnlyTable-1.mdp
index f6bd17792d6..f41decb7214 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-With-MasterOnlyTable-1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-With-MasterOnlyTable-1.mdp
@@ -367,22 +367,23 @@
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -396,7 +397,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DML-With-WindowFunc-OuterRef.mdp b/src/backend/gporca/data/dxl/minidump/DML-With-WindowFunc-OuterRef.mdp
index ba724194cfe..1874ab56910 100644
--- a/src/backend/gporca/data/dxl/minidump/DML-With-WindowFunc-OuterRef.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DML-With-WindowFunc-OuterRef.mdp
@@ -367,7 +367,7 @@
-
+
@@ -383,7 +383,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DMLCollapseProject.mdp b/src/backend/gporca/data/dxl/minidump/DMLCollapseProject.mdp
index e93368fca82..c59b3528f0b 100644
--- a/src/backend/gporca/data/dxl/minidump/DMLCollapseProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DMLCollapseProject.mdp
@@ -292,12 +292,7 @@
-
-
-
-
-
-
+
@@ -364,9 +359,9 @@
-
+
-
+
@@ -383,19 +378,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -415,8 +408,8 @@
-
-
+
+
@@ -443,13 +436,13 @@
-
+
-
+
@@ -486,7 +479,7 @@
-
+
@@ -496,7 +489,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/Delete-With-Limit-In-Subquery.mdp b/src/backend/gporca/data/dxl/minidump/Delete-With-Limit-In-Subquery.mdp
index 492c795ed79..e15d0da28d8 100644
--- a/src/backend/gporca/data/dxl/minidump/Delete-With-Limit-In-Subquery.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Delete-With-Limit-In-Subquery.mdp
@@ -722,22 +722,23 @@
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -751,7 +752,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteMismatchedDistribution.mdp b/src/backend/gporca/data/dxl/minidump/DeleteMismatchedDistribution.mdp
index a74761faa6f..572352f0c1d 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteMismatchedDistribution.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteMismatchedDistribution.mdp
@@ -338,24 +338,23 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -369,7 +368,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteRandomDistr.mdp b/src/backend/gporca/data/dxl/minidump/DeleteRandomDistr.mdp
index 9088e3cddc9..bf2f6588286 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteRandomDistr.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteRandomDistr.mdp
@@ -203,23 +203,22 @@
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -233,7 +232,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTable.mdp b/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTable.mdp
index ee4f5e12aa3..a33ff5ed8a3 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTable.mdp
@@ -196,22 +196,22 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -225,7 +225,7 @@
-
+
@@ -244,7 +244,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTableJoin.mdp b/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTableJoin.mdp
index 837de8f2ed9..df4768f92b2 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTableJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteRandomlyDistributedTableJoin.mdp
@@ -278,22 +278,22 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -307,7 +307,7 @@
-
+
@@ -385,7 +385,7 @@
-
+
@@ -409,7 +409,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteWithAfterTriggerDroppedCol.mdp b/src/backend/gporca/data/dxl/minidump/DeleteWithAfterTriggerDroppedCol.mdp
index a23b1c762fa..c0588675dcc 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteWithAfterTriggerDroppedCol.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteWithAfterTriggerDroppedCol.mdp
@@ -251,7 +251,7 @@ drop function func_trigger();
-
+
@@ -261,16 +261,45 @@ drop function func_trigger();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -287,7 +316,7 @@ drop function func_trigger();
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DeleteWithTriggers.mdp b/src/backend/gporca/data/dxl/minidump/DeleteWithTriggers.mdp
index f66a21ca163..74e45f64204 100644
--- a/src/backend/gporca/data/dxl/minidump/DeleteWithTriggers.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DeleteWithTriggers.mdp
@@ -233,7 +233,7 @@
-
+
@@ -249,18 +249,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -283,8 +316,8 @@
-
-
+
+
@@ -307,7 +340,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
index 40e250f63b0..88df3def696 100644
--- a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
@@ -265,10 +265,7 @@ Physical plan:
-
-
-
-
+
@@ -355,9 +352,9 @@ Physical plan:
-
+
-
+
@@ -368,17 +365,16 @@ Physical plan:
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -392,7 +388,7 @@ Physical plan:
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-2.mdp b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-2.mdp
index 8716829754b..b080717afe0 100644
--- a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-2.mdp
@@ -168,9 +168,7 @@
-
-
-
+
@@ -221,9 +219,9 @@
-
+
-
+
@@ -231,16 +229,16 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -251,7 +249,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExcept.mdp b/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExcept.mdp
index 4333cbeab6b..26d8f6f5f14 100644
--- a/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExcept.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExcept.mdp
@@ -203,9 +203,7 @@ ON (a.col = b.col);
-
-
-
+
@@ -296,9 +294,9 @@ ON (a.col = b.col);
-
+
-
+
@@ -306,16 +304,17 @@ ON (a.col = b.col);
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -326,7 +325,7 @@ ON (a.col = b.col);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExceptAll.mdp b/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExceptAll.mdp
index 001f5f60c2b..b2e19f1258c 100644
--- a/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExceptAll.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InnerJoinOverJoinExceptAll.mdp
@@ -241,9 +241,7 @@ ON (a.col = b.col);
-
-
-
+
@@ -334,9 +332,9 @@ ON (a.col = b.col);
-
+
-
+
@@ -344,16 +342,17 @@ ON (a.col = b.col);
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -364,7 +363,7 @@ ON (a.col = b.col);
-
+
@@ -430,8 +429,8 @@ ON (a.col = b.col);
-
-
+
+
@@ -440,7 +439,7 @@ ON (a.col = b.col);
-
+
@@ -539,7 +538,7 @@ ON (a.col = b.col);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/Insert-Parquet-Partitioned-SortDisabled.mdp b/src/backend/gporca/data/dxl/minidump/Insert-Parquet-Partitioned-SortDisabled.mdp
index 65333b2ddf4..48a9b17992c 100644
--- a/src/backend/gporca/data/dxl/minidump/Insert-Parquet-Partitioned-SortDisabled.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Insert-Parquet-Partitioned-SortDisabled.mdp
@@ -196,10 +196,7 @@
-
-
-
-
+
@@ -229,9 +226,9 @@
-
+
-
+
@@ -242,13 +239,13 @@
+
-
-
-
-
-
+
+
+
+
@@ -262,7 +259,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/Insert-Parquet.mdp b/src/backend/gporca/data/dxl/minidump/Insert-Parquet.mdp
index 54d2ff386f7..b6626ddd74f 100644
--- a/src/backend/gporca/data/dxl/minidump/Insert-Parquet.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Insert-Parquet.mdp
@@ -177,10 +177,7 @@
-
-
-
-
+
@@ -210,9 +207,9 @@
-
+
-
+
@@ -223,13 +220,13 @@
+
-
-
-
-
-
+
+
+
+
@@ -243,7 +240,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/Insert-With-HJ-CTE-Agg.mdp b/src/backend/gporca/data/dxl/minidump/Insert-With-HJ-CTE-Agg.mdp
index 50b7b3aab77..e25f276fbf8 100644
--- a/src/backend/gporca/data/dxl/minidump/Insert-With-HJ-CTE-Agg.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Insert-With-HJ-CTE-Agg.mdp
@@ -382,13 +382,7 @@
-
-
-
-
-
-
-
+
@@ -509,9 +503,9 @@
-
+
-
+
@@ -531,20 +525,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -559,7 +550,7 @@
-
+
@@ -573,7 +564,7 @@
-
+
@@ -663,7 +654,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/Insert.mdp b/src/backend/gporca/data/dxl/minidump/Insert.mdp
index 211fba788f2..dda48c12c0a 100644
--- a/src/backend/gporca/data/dxl/minidump/Insert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Insert.mdp
@@ -179,7 +179,7 @@
-
+
@@ -192,17 +192,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -216,7 +216,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertAssertSort.mdp b/src/backend/gporca/data/dxl/minidump/InsertAssertSort.mdp
index 6438cab92a2..858ffd879a1 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertAssertSort.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertAssertSort.mdp
@@ -303,11 +303,7 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
-
-
-
-
+
@@ -366,9 +362,9 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
+
-
+
@@ -394,18 +390,15 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -434,8 +427,8 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
-
+
+
@@ -477,8 +470,8 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
-
+
+
@@ -497,20 +490,20 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
+
-
+
-
+
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertCheckConstraint.mdp b/src/backend/gporca/data/dxl/minidump/InsertCheckConstraint.mdp
index 3eb2c73da64..9a5620e0ace 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertCheckConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertCheckConstraint.mdp
@@ -280,7 +280,7 @@
-
+
@@ -303,19 +303,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -335,8 +333,8 @@
-
-
+
+
@@ -363,8 +361,8 @@
-
-
+
+
@@ -404,8 +402,8 @@
-
-
+
+
@@ -422,7 +420,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertConstTuple.mdp b/src/backend/gporca/data/dxl/minidump/InsertConstTuple.mdp
index 02eccbdd745..4860d722ba9 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertConstTuple.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertConstTuple.mdp
@@ -193,7 +193,7 @@
-
+
@@ -210,17 +210,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -234,7 +234,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertConstTupleRandomDistribution.mdp b/src/backend/gporca/data/dxl/minidump/InsertConstTupleRandomDistribution.mdp
index 074a0d2b931..ce3dc64d012 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertConstTupleRandomDistribution.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertConstTupleRandomDistribution.mdp
@@ -169,10 +169,7 @@
-
-
-
-
+
@@ -209,9 +206,9 @@
-
+
-
+
@@ -222,17 +219,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -246,8 +242,8 @@
-
-
+
+
@@ -263,7 +259,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunction.mdp b/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunction.mdp
index f54701dab0e..9da8e7f8c8b 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunction.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunction.mdp
@@ -187,10 +187,7 @@
-
-
-
-
+
@@ -231,9 +228,9 @@
-
+
-
+
@@ -244,17 +241,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -268,8 +265,8 @@
-
-
+
+
@@ -290,8 +287,8 @@
-
-
+
+
@@ -308,12 +305,12 @@
-
+
-
-
+
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunctionMOTable.mdp b/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunctionMOTable.mdp
index bc3a09680aa..ae1b2cb82c2 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunctionMOTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertConstTupleVolatileFunctionMOTable.mdp
@@ -177,10 +177,7 @@
-
-
-
-
+
@@ -221,9 +218,9 @@
-
+
-
+
@@ -234,17 +231,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -258,8 +254,8 @@
-
-
+
+
@@ -276,15 +272,15 @@
-
+
-
-
+
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertDirectedDispatchNullValue.mdp b/src/backend/gporca/data/dxl/minidump/InsertDirectedDispatchNullValue.mdp
index 7a1a0cbe40d..0e48a3cd3f0 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertDirectedDispatchNullValue.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertDirectedDispatchNullValue.mdp
@@ -163,10 +163,7 @@
-
-
-
-
+
@@ -211,9 +208,9 @@
-
+
-
+
@@ -231,18 +228,17 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -259,8 +255,8 @@
-
-
+
+
@@ -284,8 +280,8 @@
-
-
+
+
@@ -302,7 +298,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertIntoNonNullAfterDroppingColumn.mdp b/src/backend/gporca/data/dxl/minidump/InsertIntoNonNullAfterDroppingColumn.mdp
index c93baedbec0..5fca8b555c7 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertIntoNonNullAfterDroppingColumn.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertIntoNonNullAfterDroppingColumn.mdp
@@ -148,9 +148,7 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
-
-
-
+
@@ -182,14 +180,14 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
-
-
+
+
-
+
-
+
@@ -197,16 +195,17 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -217,8 +216,8 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
-
-
+
+
@@ -236,8 +235,8 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
-
-
+
+
@@ -254,11 +253,11 @@ EXPLAIN INSERT INTO ColumnMapping VALUES (NULL);
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertIntoReturning.mdp b/src/backend/gporca/data/dxl/minidump/InsertIntoReturning.mdp
new file mode 100644
index 00000000000..c608aa9f667
--- /dev/null
+++ b/src/backend/gporca/data/dxl/minidump/InsertIntoReturning.mdp
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTable.mdp b/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTable.mdp
index e58d8f00d99..027b809f206 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTable.mdp
@@ -197,10 +197,7 @@
-
-
-
-
+
@@ -234,9 +231,9 @@
-
+
-
+
@@ -247,17 +244,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -271,7 +267,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTableConstTuple.mdp b/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTableConstTuple.mdp
index 1abde1583fe..57803cc1930 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTableConstTuple.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertMasterOnlyTableConstTuple.mdp
@@ -135,10 +135,7 @@
-
-
-
-
+
@@ -175,9 +172,9 @@
-
+
-
+
@@ -188,17 +185,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -212,7 +208,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution-2.mdp b/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution-2.mdp
index f0e4d88e985..38bb486883c 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution-2.mdp
@@ -225,11 +225,7 @@ explain insert into pt2 select * from r;
-
-
-
-
-
+
@@ -265,9 +261,9 @@ explain insert into pt2 select * from r;
-
+
-
+
@@ -281,18 +277,17 @@ explain insert into pt2 select * from r;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -309,7 +304,7 @@ explain insert into pt2 select * from r;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution.mdp b/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution.mdp
index 55640021b8e..5e705da671e 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertMismatchedDistrubution.mdp
@@ -225,11 +225,7 @@ explain insert into pt2 select * from r;
-
-
-
-
-
+
@@ -265,9 +261,9 @@ explain insert into pt2 select * from r;
-
+
-
+
@@ -281,18 +277,17 @@ explain insert into pt2 select * from r;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -309,7 +304,7 @@ explain insert into pt2 select * from r;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertNULLNotNULLConstraint.mdp b/src/backend/gporca/data/dxl/minidump/InsertNULLNotNULLConstraint.mdp
index 6faec57794f..2c20dddb01b 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertNULLNotNULLConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertNULLNotNULLConstraint.mdp
@@ -132,9 +132,7 @@
-
-
-
+
@@ -167,9 +165,9 @@
-
+
-
+
@@ -181,16 +179,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -201,8 +200,8 @@
-
-
+
+
@@ -220,8 +219,8 @@
-
-
+
+
@@ -238,7 +237,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertNoEnforceConstraints.mdp b/src/backend/gporca/data/dxl/minidump/InsertNoEnforceConstraints.mdp
index b590a8ef8ab..8d58e953404 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertNoEnforceConstraints.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertNoEnforceConstraints.mdp
@@ -167,10 +167,7 @@ insert into constraints_tab values (NULL, -1);
-
-
-
-
+
@@ -207,9 +204,9 @@ insert into constraints_tab values (NULL, -1);
-
+
-
+
@@ -220,17 +217,17 @@ insert into constraints_tab values (NULL, -1);
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -244,7 +241,7 @@ insert into constraints_tab values (NULL, -1);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertNonSingleton.mdp b/src/backend/gporca/data/dxl/minidump/InsertNonSingleton.mdp
index 481a4ca4cfb..79b5eca2c6e 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertNonSingleton.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertNonSingleton.mdp
@@ -241,9 +241,7 @@ EXPLAIN INSERT INTO snackbox SELECT a FROM (SELECT c FROM hottoast LIMIT 3) hott
-
-
-
+
@@ -302,9 +300,9 @@ EXPLAIN INSERT INTO snackbox SELECT a FROM (SELECT c FROM hottoast LIMIT 3) hott
-
+
-
+
@@ -312,16 +310,16 @@ EXPLAIN INSERT INTO snackbox SELECT a FROM (SELECT c FROM hottoast LIMIT 3) hott
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -332,7 +330,7 @@ EXPLAIN INSERT INTO snackbox SELECT a FROM (SELECT c FROM hottoast LIMIT 3) hott
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertNotNullCols.mdp b/src/backend/gporca/data/dxl/minidump/InsertNotNullCols.mdp
index 9db6d8158f3..0cec6f1bf64 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertNotNullCols.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertNotNullCols.mdp
@@ -213,7 +213,7 @@
-
+
@@ -226,17 +226,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -250,8 +250,8 @@
-
-
+
+
@@ -268,7 +268,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertPrimaryKeyFromMOTable.mdp b/src/backend/gporca/data/dxl/minidump/InsertPrimaryKeyFromMOTable.mdp
index 3e7d464bd5f..1e4f2dd82d2 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertPrimaryKeyFromMOTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertPrimaryKeyFromMOTable.mdp
@@ -199,10 +199,7 @@
-
-
-
-
+
@@ -236,9 +233,9 @@
-
+
-
+
@@ -249,17 +246,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -273,8 +270,8 @@
-
-
+
+
@@ -295,8 +292,8 @@
-
-
+
+
@@ -313,7 +310,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertProjectSort.mdp b/src/backend/gporca/data/dxl/minidump/InsertProjectSort.mdp
index 0cbd0de11f4..60c0f890c54 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertProjectSort.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertProjectSort.mdp
@@ -231,11 +231,7 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
-
-
-
-
+
@@ -294,9 +290,9 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
+
-
+
@@ -322,18 +318,15 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -351,18 +344,18 @@ explain insert into tbl_cds_buysell_orders_new (a,b,c)
-
+
-
+
-
+
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertRandomDistr.mdp b/src/backend/gporca/data/dxl/minidump/InsertRandomDistr.mdp
index ca9af67a82b..06180d8b079 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertRandomDistr.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertRandomDistr.mdp
@@ -195,10 +195,7 @@
-
-
-
-
+
@@ -232,9 +229,9 @@
-
+
-
+
@@ -245,17 +242,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -269,7 +265,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertReplicatedIntoSerialHashDistributedTable.mdp b/src/backend/gporca/data/dxl/minidump/InsertReplicatedIntoSerialHashDistributedTable.mdp
index cc9fe36e829..b0ba6053f56 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertReplicatedIntoSerialHashDistributedTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertReplicatedIntoSerialHashDistributedTable.mdp
@@ -272,11 +272,7 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
-
-
-
-
+
@@ -320,9 +316,9 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
+
-
+
@@ -336,18 +332,17 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -364,7 +359,7 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
+
@@ -415,7 +410,7 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
+
@@ -441,7 +436,7 @@ EXPLAIN (COSTS OFF) INSERT INTO distributed_table (val1, val2) SELECT val1, val2
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertSort.mdp b/src/backend/gporca/data/dxl/minidump/InsertSort.mdp
index cb9f4d01875..efedeaed8e1 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertSort.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertSort.mdp
@@ -317,9 +317,7 @@ explain insert into nim1 select * from nim order by 1;
-
-
-
+
@@ -358,9 +356,9 @@ explain insert into nim1 select * from nim order by 1;
-
+
-
+
@@ -368,16 +366,17 @@ explain insert into nim1 select * from nim order by 1;
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -388,7 +387,7 @@ explain insert into nim1 select * from nim order by 1;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertSortDistributed2MasterOnly.mdp b/src/backend/gporca/data/dxl/minidump/InsertSortDistributed2MasterOnly.mdp
index 1ba400e0ff1..c8b38a613cd 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertSortDistributed2MasterOnly.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertSortDistributed2MasterOnly.mdp
@@ -238,11 +238,7 @@ explain insert into masteronly select * from distributedtable order by 1;
-
-
-
-
-
+
@@ -285,9 +281,9 @@ explain insert into masteronly select * from distributedtable order by 1;
-
+
-
+
@@ -301,18 +297,16 @@ explain insert into masteronly select * from distributedtable order by 1;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -329,8 +323,8 @@ explain insert into masteronly select * from distributedtable order by 1;
-
-
+
+
@@ -349,7 +343,7 @@ explain insert into masteronly select * from distributedtable order by 1;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertWithDroppedCol.mdp b/src/backend/gporca/data/dxl/minidump/InsertWithDroppedCol.mdp
index 3f9dc830eef..5633b166161 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertWithDroppedCol.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertWithDroppedCol.mdp
@@ -201,10 +201,7 @@
-
-
-
-
+
@@ -241,9 +238,9 @@
-
+
-
+
@@ -258,17 +255,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -282,8 +279,8 @@
-
-
+
+
@@ -304,8 +301,8 @@
-
-
+
+
@@ -324,7 +321,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/InsertWithTriggers.mdp b/src/backend/gporca/data/dxl/minidump/InsertWithTriggers.mdp
index edf02856150..397f1460b0c 100644
--- a/src/backend/gporca/data/dxl/minidump/InsertWithTriggers.mdp
+++ b/src/backend/gporca/data/dxl/minidump/InsertWithTriggers.mdp
@@ -266,7 +266,7 @@
-
+
@@ -286,18 +286,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -314,8 +347,8 @@
-
-
+
+
@@ -332,7 +365,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/LeftJoinNullsNotColocated.mdp b/src/backend/gporca/data/dxl/minidump/LeftJoinNullsNotColocated.mdp
index 199aedd223b..f415a12ea23 100644
--- a/src/backend/gporca/data/dxl/minidump/LeftJoinNullsNotColocated.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LeftJoinNullsNotColocated.mdp
@@ -427,9 +427,9 @@ on id2 = id3 distributed by (id1);
-
-
-
+
+
+
@@ -457,7 +457,7 @@ on id2 = id3 distributed by (id1);
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/MultipleUpdateWithJoinOnDistCol.mdp b/src/backend/gporca/data/dxl/minidump/MultipleUpdateWithJoinOnDistCol.mdp
index 0f11dcd8f79..4c054012ae6 100644
--- a/src/backend/gporca/data/dxl/minidump/MultipleUpdateWithJoinOnDistCol.mdp
+++ b/src/backend/gporca/data/dxl/minidump/MultipleUpdateWithJoinOnDistCol.mdp
@@ -240,10 +240,7 @@
-
-
-
-
+
@@ -302,7 +299,7 @@
-
+
@@ -315,17 +312,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -345,8 +342,8 @@
-
-
+
+
@@ -356,7 +353,7 @@
-
+
@@ -373,7 +370,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/PartitionedDelete.mdp b/src/backend/gporca/data/dxl/minidump/PartitionedDelete.mdp
index 3f13c3d85e8..8f45c03a1fd 100644
--- a/src/backend/gporca/data/dxl/minidump/PartitionedDelete.mdp
+++ b/src/backend/gporca/data/dxl/minidump/PartitionedDelete.mdp
@@ -234,23 +234,23 @@
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -267,7 +267,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/PartitionedInsert.mdp b/src/backend/gporca/data/dxl/minidump/PartitionedInsert.mdp
index 91fcdf7b7c0..aa834c52b76 100644
--- a/src/backend/gporca/data/dxl/minidump/PartitionedInsert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/PartitionedInsert.mdp
@@ -173,10 +173,7 @@
-
-
-
-
+
@@ -213,9 +210,9 @@
-
+
-
+
@@ -230,17 +227,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -254,7 +251,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/PartitionedUpdate.mdp b/src/backend/gporca/data/dxl/minidump/PartitionedUpdate.mdp
index 7145fa86cf8..7a071f4a670 100644
--- a/src/backend/gporca/data/dxl/minidump/PartitionedUpdate.mdp
+++ b/src/backend/gporca/data/dxl/minidump/PartitionedUpdate.mdp
@@ -197,9 +197,7 @@
-
-
-
+
@@ -246,7 +244,7 @@
-
+
@@ -259,17 +257,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -292,8 +290,8 @@
-
-
+
+
@@ -303,7 +301,7 @@
-
+
@@ -323,7 +321,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/ProjectSetFunction.mdp b/src/backend/gporca/data/dxl/minidump/ProjectSetFunction.mdp
index 0a5a6e00e64..0aba6020778 100644
--- a/src/backend/gporca/data/dxl/minidump/ProjectSetFunction.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ProjectSetFunction.mdp
@@ -187,10 +187,7 @@
-
-
-
-
+
@@ -230,9 +227,9 @@
-
+
-
+
@@ -243,17 +240,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -267,8 +263,8 @@
-
-
+
+
@@ -284,7 +280,7 @@
-
+
@@ -313,7 +309,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/ReplicatedTable-CTAS.mdp b/src/backend/gporca/data/dxl/minidump/ReplicatedTable-CTAS.mdp
index 59adc41397e..3f9f01c0bd8 100644
--- a/src/backend/gporca/data/dxl/minidump/ReplicatedTable-CTAS.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ReplicatedTable-CTAS.mdp
@@ -99,8 +99,8 @@
-
-
+
+
@@ -122,8 +122,8 @@
-
-
+
+
@@ -133,7 +133,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/ReplicatedTableInsert.mdp b/src/backend/gporca/data/dxl/minidump/ReplicatedTableInsert.mdp
index ee89f9aa9d6..a8371f9420f 100644
--- a/src/backend/gporca/data/dxl/minidump/ReplicatedTableInsert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ReplicatedTableInsert.mdp
@@ -149,10 +149,7 @@
-
-
-
-
+
@@ -178,9 +175,9 @@
-
+
-
+
@@ -191,17 +188,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -209,7 +205,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/ReplicatedTableSequenceInsert.mdp b/src/backend/gporca/data/dxl/minidump/ReplicatedTableSequenceInsert.mdp
index fb060daa0a0..7e5f66d6754 100644
--- a/src/backend/gporca/data/dxl/minidump/ReplicatedTableSequenceInsert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ReplicatedTableSequenceInsert.mdp
@@ -253,10 +253,7 @@
-
-
-
-
+
@@ -300,9 +297,9 @@
-
+
-
+
@@ -313,17 +310,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -337,7 +333,7 @@
-
+
@@ -377,8 +373,8 @@
-
-
+
+
diff --git a/src/backend/gporca/data/dxl/minidump/ReplicatedTableWithAggNoMotion.mdp b/src/backend/gporca/data/dxl/minidump/ReplicatedTableWithAggNoMotion.mdp
index 82100f6e8dd..e9db52b37f9 100644
--- a/src/backend/gporca/data/dxl/minidump/ReplicatedTableWithAggNoMotion.mdp
+++ b/src/backend/gporca/data/dxl/minidump/ReplicatedTableWithAggNoMotion.mdp
@@ -225,9 +225,7 @@
-
-
-
+
@@ -283,9 +281,9 @@
-
+
-
+
@@ -293,16 +291,16 @@
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -311,11 +309,11 @@
-
+
-
+
@@ -328,7 +326,7 @@
-
+
@@ -349,7 +347,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/SelfUpdate.mdp b/src/backend/gporca/data/dxl/minidump/SelfUpdate.mdp
index 0963c0ad77a..1fde3e76e47 100644
--- a/src/backend/gporca/data/dxl/minidump/SelfUpdate.mdp
+++ b/src/backend/gporca/data/dxl/minidump/SelfUpdate.mdp
@@ -178,9 +178,7 @@ update t1 set b = c;
-
-
-
+
@@ -216,7 +214,7 @@ update t1 set b = c;
-
+
@@ -232,18 +230,16 @@ update t1 set b = c;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -266,8 +262,8 @@ update t1 set b = c;
-
-
+
+
@@ -279,7 +275,7 @@ update t1 set b = c;
-
+
@@ -299,7 +295,7 @@ update t1 set b = c;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/SqlFuncDmlScalar.mdp b/src/backend/gporca/data/dxl/minidump/SqlFuncDmlScalar.mdp
index 05a6491b44d..c37b7c5771a 100644
--- a/src/backend/gporca/data/dxl/minidump/SqlFuncDmlScalar.mdp
+++ b/src/backend/gporca/data/dxl/minidump/SqlFuncDmlScalar.mdp
@@ -245,9 +245,7 @@ LIMIT 999
-
-
-
+
@@ -295,9 +293,9 @@ LIMIT 999
-
+
-
+
@@ -305,16 +303,17 @@ LIMIT 999
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -325,8 +324,8 @@ LIMIT 999
-
-
+
+
@@ -344,7 +343,7 @@ LIMIT 999
-
+
@@ -376,7 +375,7 @@ LIMIT 999
-
+
@@ -393,7 +392,7 @@ LIMIT 999
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/SqlFuncDmlTvf.mdp b/src/backend/gporca/data/dxl/minidump/SqlFuncDmlTvf.mdp
index f16b9caf403..5f2f706ba7c 100644
--- a/src/backend/gporca/data/dxl/minidump/SqlFuncDmlTvf.mdp
+++ b/src/backend/gporca/data/dxl/minidump/SqlFuncDmlTvf.mdp
@@ -254,10 +254,7 @@ LIMIT 999
-
-
-
-
+
@@ -306,9 +303,9 @@ LIMIT 999
-
+
-
+
@@ -319,17 +316,17 @@ LIMIT 999
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -343,8 +340,8 @@ LIMIT 999
-
-
+
+
@@ -365,7 +362,7 @@ LIMIT 999
-
+
@@ -423,7 +420,7 @@ LIMIT 999
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedAgg.mdp b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedAgg.mdp
index c980fe934c6..57bda6f2b84 100644
--- a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedAgg.mdp
+++ b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedAgg.mdp
@@ -219,9 +219,7 @@
-
-
-
+
@@ -268,9 +266,9 @@
-
+
-
+
@@ -278,16 +276,16 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -298,7 +296,7 @@
-
+
@@ -322,9 +320,9 @@
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedFilter.mdp b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedFilter.mdp
index dc6547e0747..9a6e3b437be 100644
--- a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedFilter.mdp
+++ b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedFilter.mdp
@@ -206,10 +206,7 @@
-
-
-
-
+
@@ -251,9 +248,9 @@
-
+
-
+
@@ -264,17 +261,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -288,7 +284,7 @@
-
+
@@ -325,7 +321,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedLimit.mdp b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedLimit.mdp
index 641a75cd569..48ccdf510cd 100644
--- a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedLimit.mdp
+++ b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedLimit.mdp
@@ -215,9 +215,7 @@
-
-
-
+
@@ -256,9 +254,9 @@
-
+
-
+
@@ -266,16 +264,16 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -286,7 +284,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedWindowAgg.mdp b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedWindowAgg.mdp
index 102dfc08a51..bb3e71b5ca3 100644
--- a/src/backend/gporca/data/dxl/minidump/TaintedReplicatedWindowAgg.mdp
+++ b/src/backend/gporca/data/dxl/minidump/TaintedReplicatedWindowAgg.mdp
@@ -220,9 +220,7 @@
-
-
-
+
@@ -271,9 +269,9 @@
-
+
-
+
@@ -281,16 +279,16 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -301,7 +299,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateCardinalityAssert.mdp b/src/backend/gporca/data/dxl/minidump/UpdateCardinalityAssert.mdp
index 7cf544591e2..c1bf86ccaf2 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateCardinalityAssert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateCardinalityAssert.mdp
@@ -218,9 +218,7 @@
-
-
-
+
@@ -275,7 +273,7 @@
-
+
@@ -288,17 +286,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -318,8 +316,8 @@
-
-
+
+
@@ -329,7 +327,7 @@
-
+
@@ -346,7 +344,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateCheckConstraint.mdp b/src/backend/gporca/data/dxl/minidump/UpdateCheckConstraint.mdp
index 041b6755ca1..5c4d29910f5 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateCheckConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateCheckConstraint.mdp
@@ -294,7 +294,7 @@
-
+
@@ -313,19 +313,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -351,8 +349,8 @@
-
-
+
+
@@ -398,8 +396,8 @@
-
-
+
+
@@ -411,7 +409,7 @@
-
+
@@ -437,7 +435,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateDistKeyMismatchedDistribution.mdp b/src/backend/gporca/data/dxl/minidump/UpdateDistKeyMismatchedDistribution.mdp
index 4d184875433..da3cbc1053d 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateDistKeyMismatchedDistribution.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateDistKeyMismatchedDistribution.mdp
@@ -234,9 +234,7 @@
-
-
-
+
@@ -302,7 +300,7 @@
-
+
@@ -318,18 +316,17 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -352,8 +349,8 @@
-
-
+
+
@@ -363,7 +360,7 @@
-
+
@@ -383,7 +380,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateDistKeyWithNestedJoin.mdp b/src/backend/gporca/data/dxl/minidump/UpdateDistKeyWithNestedJoin.mdp
index ec10764b0c1..8077f6f5b4b 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateDistKeyWithNestedJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateDistKeyWithNestedJoin.mdp
@@ -602,9 +602,7 @@ WHERE t1.id1 = t2.id1;
-
-
-
+
@@ -680,7 +678,7 @@ WHERE t1.id1 = t2.id1;
-
+
@@ -693,17 +691,17 @@ WHERE t1.id1 = t2.id1;
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -723,8 +721,8 @@ WHERE t1.id1 = t2.id1;
-
-
+
+
@@ -734,7 +732,7 @@ WHERE t1.id1 = t2.id1;
-
+
@@ -751,7 +749,7 @@ WHERE t1.id1 = t2.id1;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateDistrKey.mdp b/src/backend/gporca/data/dxl/minidump/UpdateDistrKey.mdp
index 29e2934bb0b..2fecea8d429 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateDistrKey.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateDistrKey.mdp
@@ -213,9 +213,7 @@
-
-
-
+
@@ -270,7 +268,7 @@
-
+
@@ -283,17 +281,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -313,8 +311,8 @@
-
-
+
+
@@ -324,7 +322,7 @@
-
+
@@ -341,7 +339,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateDroppedCols.mdp b/src/backend/gporca/data/dxl/minidump/UpdateDroppedCols.mdp
index 0cd32110ec5..9fca3ed851a 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateDroppedCols.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateDroppedCols.mdp
@@ -198,9 +198,7 @@
-
-
-
+
@@ -247,7 +245,7 @@
-
+
@@ -260,17 +258,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -290,8 +288,8 @@
-
-
+
+
@@ -301,7 +299,7 @@
-
+
@@ -318,7 +316,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateNoCardinalityAssert.mdp b/src/backend/gporca/data/dxl/minidump/UpdateNoCardinalityAssert.mdp
index 3ddde8504a7..970f1ccedf3 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateNoCardinalityAssert.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateNoCardinalityAssert.mdp
@@ -391,7 +391,7 @@
-
+
@@ -404,17 +404,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -434,8 +434,8 @@
-
-
+
+
@@ -445,7 +445,7 @@
-
+
@@ -462,7 +462,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateNoDistKeyMismatchedDistribution.mdp b/src/backend/gporca/data/dxl/minidump/UpdateNoDistKeyMismatchedDistribution.mdp
index bfdf9ff7b13..9067cbec578 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateNoDistKeyMismatchedDistribution.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateNoDistKeyMismatchedDistribution.mdp
@@ -235,9 +235,7 @@
-
-
-
+
@@ -303,7 +301,7 @@
-
+
@@ -319,18 +317,17 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -353,13 +350,13 @@
-
-
+
+
-
+
@@ -379,7 +376,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateNoEnforceConstraints.mdp b/src/backend/gporca/data/dxl/minidump/UpdateNoEnforceConstraints.mdp
index 0d242a72a44..d8e04f1c20c 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateNoEnforceConstraints.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateNoEnforceConstraints.mdp
@@ -190,10 +190,7 @@ update constraints_tab SET notnullcol = NULL, positivecol =-1;
-
-
-
-
+
@@ -239,7 +236,7 @@ update constraints_tab SET notnullcol = NULL, positivecol =-1;
-
+
@@ -255,21 +252,20 @@ update constraints_tab SET notnullcol = NULL, positivecol =-1;
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -289,7 +285,7 @@ update constraints_tab SET notnullcol = NULL, positivecol =-1;
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateNotNullCols.mdp b/src/backend/gporca/data/dxl/minidump/UpdateNotNullCols.mdp
index 7ea50dcfbd0..e89f3755449 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateNotNullCols.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateNotNullCols.mdp
@@ -328,7 +328,7 @@
-
+
@@ -341,17 +341,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -371,8 +371,8 @@
-
-
+
+
@@ -399,8 +399,8 @@
-
-
+
+
@@ -412,7 +412,7 @@
-
+
@@ -432,7 +432,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdatePartTable.mdp b/src/backend/gporca/data/dxl/minidump/UpdatePartTable.mdp
index e72cdbcc22e..2bd9c8d8713 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdatePartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdatePartTable.mdp
@@ -198,9 +198,7 @@
-
-
-
+
@@ -247,7 +245,7 @@
-
+
@@ -260,17 +258,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -290,8 +288,8 @@
-
-
+
+
@@ -301,7 +299,7 @@
-
+
@@ -318,7 +316,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateRandomDistr.mdp b/src/backend/gporca/data/dxl/minidump/UpdateRandomDistr.mdp
index 93573ac1a0b..40783320f4c 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateRandomDistr.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateRandomDistr.mdp
@@ -196,7 +196,7 @@
-
+
@@ -209,20 +209,19 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
@@ -239,7 +238,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint-2.mdp b/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint-2.mdp
index 90961adb3ce..55f7a1224f4 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint-2.mdp
@@ -699,9 +699,7 @@
-
-
-
+
@@ -765,7 +763,7 @@
-
+
@@ -778,17 +776,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -808,8 +806,8 @@
-
-
+
+
@@ -821,7 +819,7 @@
-
+
@@ -838,7 +836,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint.mdp b/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint.mdp
index 175573296fa..34d16a04b19 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateUniqueConstraint.mdp
@@ -196,7 +196,7 @@
-
+
@@ -209,17 +209,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -239,13 +239,13 @@
-
-
+
+
-
+
@@ -266,8 +266,8 @@
-
-
+
+
@@ -277,7 +277,7 @@
-
+
@@ -294,7 +294,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateVolatileFunction.mdp b/src/backend/gporca/data/dxl/minidump/UpdateVolatileFunction.mdp
index 4f6fb7b916d..1b5a8f85b1f 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateVolatileFunction.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateVolatileFunction.mdp
@@ -411,7 +411,7 @@
-
+
@@ -424,17 +424,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -454,8 +454,8 @@
-
-
+
+
@@ -465,7 +465,7 @@
-
+
@@ -482,7 +482,7 @@
-
+
@@ -498,8 +498,8 @@
-
-
+
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateWindowGatherMerge.mdp b/src/backend/gporca/data/dxl/minidump/UpdateWindowGatherMerge.mdp
index 07c38bc704f..36446972621 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateWindowGatherMerge.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateWindowGatherMerge.mdp
@@ -629,9 +629,7 @@
-
-
-
+
@@ -709,7 +707,7 @@
-
+
@@ -722,17 +720,16 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -752,13 +749,13 @@
-
-
+
+
-
+
@@ -775,7 +772,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateWithHashJoin.mdp b/src/backend/gporca/data/dxl/minidump/UpdateWithHashJoin.mdp
index 417eb593cfe..a832bae08d8 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateWithHashJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateWithHashJoin.mdp
@@ -240,9 +240,7 @@
-
-
-
+
@@ -301,7 +299,7 @@
-
+
@@ -314,20 +312,20 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -344,7 +342,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateWithOids.mdp b/src/backend/gporca/data/dxl/minidump/UpdateWithOids.mdp
index af84dfbf3e1..2f8657c6ba2 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateWithOids.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateWithOids.mdp
@@ -157,9 +157,7 @@
-
-
-
+
@@ -208,7 +206,7 @@
-
+
@@ -221,18 +219,18 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -255,8 +253,8 @@
-
-
+
+
@@ -266,7 +264,7 @@
-
+
@@ -286,7 +284,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateWithTriggers.mdp b/src/backend/gporca/data/dxl/minidump/UpdateWithTriggers.mdp
index 960b87e19dd..b5e0e5f4186 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateWithTriggers.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateWithTriggers.mdp
@@ -204,7 +204,7 @@
-
+
@@ -220,21 +220,20 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -254,7 +253,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdateZeroRows.mdp b/src/backend/gporca/data/dxl/minidump/UpdateZeroRows.mdp
index 92d789f6be5..8f43a04e93c 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdateZeroRows.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdateZeroRows.mdp
@@ -359,9 +359,7 @@
-
-
-
+
@@ -410,7 +408,7 @@
-
+
@@ -426,18 +424,17 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -460,8 +457,8 @@
-
-
+
+
@@ -491,8 +488,8 @@
-
-
+
+
@@ -530,7 +527,7 @@
-
+
@@ -553,7 +550,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdatingDistributionColumn.mdp b/src/backend/gporca/data/dxl/minidump/UpdatingDistributionColumn.mdp
index 792fe6c8df5..1c5c5665bda 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdatingDistributionColumn.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdatingDistributionColumn.mdp
@@ -209,9 +209,7 @@
-
-
-
+
@@ -270,7 +268,7 @@
-
+
@@ -283,17 +281,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -313,8 +311,8 @@
-
-
+
+
@@ -324,7 +322,7 @@
-
+
@@ -341,7 +339,7 @@
-
+
@@ -358,7 +356,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdatingMultipleColumn.mdp b/src/backend/gporca/data/dxl/minidump/UpdatingMultipleColumn.mdp
index 37eed30bae6..82803673c1a 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdatingMultipleColumn.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdatingMultipleColumn.mdp
@@ -547,10 +547,7 @@
-
-
-
-
+
@@ -584,7 +581,7 @@
-
+
@@ -597,17 +594,17 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -627,8 +624,8 @@
-
-
+
+
@@ -638,7 +635,7 @@
-
+
@@ -655,7 +652,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdatingNonDistColSameTable.mdp b/src/backend/gporca/data/dxl/minidump/UpdatingNonDistColSameTable.mdp
index 619b8084c2e..23d2360b9bf 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdatingNonDistColSameTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdatingNonDistColSameTable.mdp
@@ -196,9 +196,7 @@
-
-
-
+
@@ -234,7 +232,7 @@
-
+
@@ -250,21 +248,20 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -284,7 +281,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/UpdatingNonDistributionColumnFunc.mdp b/src/backend/gporca/data/dxl/minidump/UpdatingNonDistributionColumnFunc.mdp
index e8a54884509..37ae68c0cc1 100644
--- a/src/backend/gporca/data/dxl/minidump/UpdatingNonDistributionColumnFunc.mdp
+++ b/src/backend/gporca/data/dxl/minidump/UpdatingNonDistributionColumnFunc.mdp
@@ -188,9 +188,7 @@
-
-
-
+
@@ -239,7 +237,7 @@
-
+
@@ -252,20 +250,20 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
@@ -282,7 +280,7 @@
-
+
@@ -299,7 +297,7 @@
-
+
diff --git a/src/backend/gporca/data/dxl/minidump/VolatileFunctionsBelowScalarAgg.mdp b/src/backend/gporca/data/dxl/minidump/VolatileFunctionsBelowScalarAgg.mdp
index af98fb56b77..9744c41c867 100644
--- a/src/backend/gporca/data/dxl/minidump/VolatileFunctionsBelowScalarAgg.mdp
+++ b/src/backend/gporca/data/dxl/minidump/VolatileFunctionsBelowScalarAgg.mdp
@@ -192,9 +192,7 @@
-
-
-
+
@@ -251,9 +249,9 @@
-
+
-
+
@@ -261,16 +259,17 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -281,7 +280,7 @@
-
+
@@ -323,9 +322,9 @@
-
+
-
+
diff --git a/src/backend/gporca/data/dxl/parse_tests/q57-DMLDelete.xml b/src/backend/gporca/data/dxl/parse_tests/q57-DMLDelete.xml
index 9a624f700e4..9385607ee4e 100644
--- a/src/backend/gporca/data/dxl/parse_tests/q57-DMLDelete.xml
+++ b/src/backend/gporca/data/dxl/parse_tests/q57-DMLDelete.xml
@@ -14,6 +14,7 @@
+
diff --git a/src/backend/gporca/data/dxl/parse_tests/q58-DMLInsert.xml b/src/backend/gporca/data/dxl/parse_tests/q58-DMLInsert.xml
index 2890911b240..7a3008c5559 100644
--- a/src/backend/gporca/data/dxl/parse_tests/q58-DMLInsert.xml
+++ b/src/backend/gporca/data/dxl/parse_tests/q58-DMLInsert.xml
@@ -39,6 +39,7 @@
+
diff --git a/src/backend/gporca/data/dxl/parse_tests/q60-DMLUpdate.xml b/src/backend/gporca/data/dxl/parse_tests/q60-DMLUpdate.xml
index 33806a121b3..048638ba825 100644
--- a/src/backend/gporca/data/dxl/parse_tests/q60-DMLUpdate.xml
+++ b/src/backend/gporca/data/dxl/parse_tests/q60-DMLUpdate.xml
@@ -17,6 +17,7 @@
+
diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDML.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDML.h
index d71931f2b45..5637a1b9b68 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDML.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDML.h
@@ -52,6 +52,9 @@ class CLogicalDML : public CLogical
// source columns
CColRefArray *m_pdrgpcrSource;
+ // returning columns
+ CColRefArray *m_pdrgpcrOutput;
+
// set of modified columns from the target table
CBitSet *m_pbsModified;
@@ -81,9 +84,9 @@ class CLogicalDML : public CLogical
// ctor
CLogicalDML(CMemoryPool *mp, EDMLOperator edmlop,
CTableDescriptor *ptabdesc, CColRefArray *colref_array,
- CBitSet *pbsModified, CColRef *pcrAction, CColRef *pcrCtid,
- CColRef *pcrSegmentId, CColRef *pcrTupleOid,
- CColRef *pcrTableOid);
+ CColRefArray *pdrgpcrOutput, CBitSet *pbsModified,
+ CColRef *pcrAction, CColRef *pcrCtid, CColRef *pcrSegmentId,
+ CColRef *pcrTupleOid, CColRef *pcrTableOid);
// dtor
virtual ~CLogicalDML();
@@ -116,6 +119,14 @@ class CLogicalDML : public CLogical
return m_pdrgpcrSource;
}
+ // output columns
+ CColRefArray *
+ PdrgpcrOutput() const
+ {
+ return m_pdrgpcrOutput;
+ }
+
+
// modified columns set
CBitSet *
PbsModified() const
diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDelete.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDelete.h
index fd05c4c2593..c56cd16ee85 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDelete.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalDelete.h
@@ -37,6 +37,9 @@ class CLogicalDelete : public CLogical
// columns to delete
CColRefArray *m_pdrgpcr;
+ // returning columns
+ CColRefArray *m_pdrgpcrOutput;
+
// ctid column
CColRef *m_pcrCtid;
@@ -58,6 +61,12 @@ class CLogicalDelete : public CLogical
CColRefArray *colref_array, CColRef *pcrCtid,
CColRef *pcrSegmentId, CColRef *pcrTableOid);
+ // ctor
+ CLogicalDelete(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *colref_array, CColRefArray *pdrgpcrOutput,
+ CColRef *pcrCtid, CColRef *pcrSegmentId,
+ CColRef *pcrTableOid);
+
// dtor
virtual ~CLogicalDelete();
@@ -82,6 +91,13 @@ class CLogicalDelete : public CLogical
return m_pdrgpcr;
}
+ // output columns
+ CColRefArray *
+ PdrgpcrOutput() const
+ {
+ return m_pdrgpcrOutput;
+ }
+
// ctid column
CColRef *
PcrCtid() const
diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalInsert.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalInsert.h
index e5425066ba6..3936d59d355 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalInsert.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalInsert.h
@@ -37,6 +37,9 @@ class CLogicalInsert : public CLogical
// source columns
CColRefArray *m_pdrgpcrSource;
+ // returning columns
+ CColRefArray *m_pdrgpcrOutput;
+
// private copy ctor
CLogicalInsert(const CLogicalInsert &);
@@ -48,6 +51,10 @@ class CLogicalInsert : public CLogical
CLogicalInsert(CMemoryPool *mp, CTableDescriptor *ptabdesc,
CColRefArray *colref_array);
+ // ctor
+ CLogicalInsert(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *colref_array, CColRefArray *pdrgpcrOutput);
+
// dtor
virtual ~CLogicalInsert();
@@ -72,6 +79,13 @@ class CLogicalInsert : public CLogical
return m_pdrgpcrSource;
}
+ // output columns
+ CColRefArray *
+ PdrgpcrOutput() const
+ {
+ return m_pdrgpcrOutput;
+ }
+
// return table's descriptor
CTableDescriptor *
Ptabdesc() const
diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalUpdate.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalUpdate.h
index e9e7c4274b6..931ae15e8ee 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalUpdate.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CLogicalUpdate.h
@@ -40,6 +40,9 @@ class CLogicalUpdate : public CLogical
// columns to insert
CColRefArray *m_pdrgpcrInsert;
+ // returning columns
+ CColRefArray *m_pdrgpcrOutput;
+
// ctid column
CColRef *m_pcrCtid;
@@ -65,6 +68,13 @@ class CLogicalUpdate : public CLogical
CColRef *pcrCtid, CColRef *pcrSegmentId,
CColRef *pcrTupleOid, CColRef *pcrTableOid);
+ // ctor
+ CLogicalUpdate(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *pdrgpcrDelete, CColRefArray *pdrgpcrInsert,
+ CColRefArray *pdrgpcrOutput, CColRef *pcrCtid,
+ CColRef *pcrSegmentId, CColRef *pcrTupleOid,
+ CColRef *pcrTableOid);
+
// dtor
virtual ~CLogicalUpdate();
@@ -96,6 +106,13 @@ class CLogicalUpdate : public CLogical
return m_pdrgpcrInsert;
}
+ // output columns
+ CColRefArray *
+ PdrgpcrOutput() const
+ {
+ return m_pdrgpcrOutput;
+ }
+
// ctid column
CColRef *
PcrCtid() const
diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CPhysicalDML.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CPhysicalDML.h
index c694a9bb5e0..a85646a886f 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/operators/CPhysicalDML.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CPhysicalDML.h
@@ -42,6 +42,9 @@ class CPhysicalDML : public CPhysical
// array of source columns
CColRefArray *m_pdrgpcrSource;
+ // returning columns
+ CColRefArray *m_pdrgpcrOutput;
+
// set of modified columns from the target table
CBitSet *m_pbsModified;
@@ -67,9 +70,18 @@ class CPhysicalDML : public CPhysical
// required order spec
COrderSpec *m_pos;
+ // output distribution
+ CDistributionSpec *m_pdsOutput;
+
// required columns by local members
CColRefSet *m_pcrsRequiredLocal;
+ // in case of CTAS dml node will output source columns
+ const BOOL m_isCTAS;
+
+ // is there any triggers for this kind of dml operation
+ const BOOL m_hasTriggers;
+
// compute required order spec
COrderSpec *PosComputeRequired(CMemoryPool *mp, CTableDescriptor *ptabdesc);
@@ -83,9 +95,9 @@ class CPhysicalDML : public CPhysical
// ctor
CPhysicalDML(CMemoryPool *mp, CLogicalDML::EDMLOperator edmlop,
CTableDescriptor *ptabdesc, CColRefArray *pdrgpcrSource,
- CBitSet *pbsModified, CColRef *pcrAction, CColRef *pcrCtid,
- CColRef *pcrSegmentId, CColRef *pcrTupleOid,
- CColRef *prcTableOid);
+ CColRefArray *pdrgpcrOutput, CBitSet *pbsModified,
+ CColRef *pcrAction, CColRef *pcrCtid, CColRef *pcrSegmentId,
+ CColRef *pcrTupleOid, CColRef *prcTableOid);
// dtor
virtual ~CPhysicalDML();
@@ -160,6 +172,13 @@ class CPhysicalDML : public CPhysical
return m_pdrgpcrSource;
}
+ // output columns
+ virtual CColRefArray *
+ PdrgpcrOutput() const
+ {
+ return m_pdrgpcrOutput;
+ }
+
// match function
virtual BOOL Matches(COperator *pop) const;
@@ -173,6 +192,13 @@ class CPhysicalDML : public CPhysical
return false;
}
+ // does dml node has corresponding triggers
+ virtual BOOL
+ HasTriggers() const
+ {
+ return m_hasTriggers;
+ }
+
//-------------------------------------------------------------------------------------
// Required Plan Properties
//-------------------------------------------------------------------------------------
diff --git a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
index 63ab6878696..5800c237b1b 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
@@ -127,11 +127,11 @@ class CXformUtils
ULONG ulOriginOpId, CName *pname, CColRefArray *pdrgpcrOutput);
typedef CExpression *(PRewrittenIndexPath)(CMemoryPool *mp,
- CExpression *pexprIndexCond,
- CExpression *pexprResidualCond,
- const IMDIndex *pmdindex,
- CTableDescriptor *ptabdesc,
- COperator *popLogical);
+ CExpression *pexprIndexCond,
+ CExpression *pexprResidualCond,
+ const IMDIndex *pmdindex,
+ CTableDescriptor *ptabdesc,
+ COperator *popLogical);
// private copy ctor
CXformUtils(const CXformUtils &);
@@ -423,14 +423,19 @@ class CXformUtils
static CExpression *PexprLogicalDMLOverProject(
CMemoryPool *mp, CExpression *pexprChild,
CLogicalDML::EDMLOperator edmlop, CTableDescriptor *ptabdesc,
- CColRefArray *colref_array, CColRef *pcrCtid, CColRef *pcrSegmentId,
- CColRef *pcrTableOid);
+ CColRefArray *colref_array, CColRefArray *pdrgpcrOutput,
+ CColRef *pcrCtid, CColRef *pcrSegmentId, CColRef *pcrTableOid);
// check whether there are any BEFORE or AFTER triggers on the
// given table that match the given DML operation
static BOOL FTriggersExist(CLogicalDML::EDMLOperator edmlop,
CTableDescriptor *ptabdesc, BOOL fBefore);
+ // check whether there are any triggers on the
+ // given table that match the given DML operation
+ static BOOL FTriggersExist(CLogicalDML::EDMLOperator edmlop,
+ CTableDescriptor *ptabdesc);
+
// does the given trigger type match the given logical DML type
static BOOL FTriggerApplies(CLogicalDML::EDMLOperator edmlop,
const IMDTrigger *pmdtrigger);
diff --git a/src/backend/gporca/libgpopt/src/operators/CLogicalDML.cpp b/src/backend/gporca/libgpopt/src/operators/CLogicalDML.cpp
index 272e2dd6ee7..c44cae55146 100644
--- a/src/backend/gporca/libgpopt/src/operators/CLogicalDML.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CLogicalDML.cpp
@@ -37,6 +37,7 @@ CLogicalDML::CLogicalDML(CMemoryPool *mp)
: CLogical(mp),
m_ptabdesc(NULL),
m_pdrgpcrSource(NULL),
+ m_pdrgpcrOutput(NULL),
m_pbsModified(NULL),
m_pcrAction(NULL),
m_pcrTableOid(NULL),
@@ -57,7 +58,8 @@ CLogicalDML::CLogicalDML(CMemoryPool *mp)
//---------------------------------------------------------------------------
CLogicalDML::CLogicalDML(CMemoryPool *mp, EDMLOperator edmlop,
CTableDescriptor *ptabdesc,
- CColRefArray *pdrgpcrSource, CBitSet *pbsModified,
+ CColRefArray *pdrgpcrSource,
+ CColRefArray *pdrgpcrOutput, CBitSet *pbsModified,
CColRef *pcrAction, CColRef *pcrCtid,
CColRef *pcrSegmentId, CColRef *pcrTupleOid,
CColRef *pcrTableOid)
@@ -65,6 +67,7 @@ CLogicalDML::CLogicalDML(CMemoryPool *mp, EDMLOperator edmlop,
m_edmlop(edmlop),
m_ptabdesc(ptabdesc),
m_pdrgpcrSource(pdrgpcrSource),
+ m_pdrgpcrOutput(pdrgpcrOutput),
m_pbsModified(pbsModified),
m_pcrAction(pcrAction),
m_pcrTableOid(pcrTableOid),
@@ -81,6 +84,7 @@ CLogicalDML::CLogicalDML(CMemoryPool *mp, EDMLOperator edmlop,
NULL != pcrCtid && NULL != pcrSegmentId);
m_pcrsLocalUsed->Include(m_pdrgpcrSource);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
m_pcrsLocalUsed->Include(m_pcrAction);
if (NULL != m_pcrTableOid)
{
@@ -116,6 +120,7 @@ CLogicalDML::~CLogicalDML()
{
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcrSource);
+ CRefCount::SafeRelease(m_pdrgpcrOutput);
CRefCount::SafeRelease(m_pbsModified);
}
@@ -143,7 +148,8 @@ CLogicalDML::Matches(COperator *pop) const
m_pcrSegmentId == popDML->PcrSegmentId() &&
m_pcrTupleOid == popDML->PcrTupleOid() &&
m_ptabdesc->MDId()->Equals(popDML->Ptabdesc()->MDId()) &&
- m_pdrgpcrSource->Equals(popDML->PdrgpcrSource());
+ m_pdrgpcrSource->Equals(popDML->PdrgpcrSource()) &&
+ m_pdrgpcrOutput->Equals(popDML->PdrgpcrOutput());
}
//---------------------------------------------------------------------------
@@ -162,6 +168,8 @@ CLogicalDML::HashValue() const
ulHash = gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrAction));
ulHash =
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrSource));
+ ulHash =
+ gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
ulHash = gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrTableOid));
if (EdmlDelete == m_edmlop || EdmlUpdate == m_edmlop)
@@ -189,6 +197,18 @@ CLogicalDML::PopCopyWithRemappedColumns(CMemoryPool *mp,
{
CColRefArray *colref_array =
CUtils::PdrgpcrRemap(mp, m_pdrgpcrSource, colref_mapping, must_exist);
+
+ CColRefArray *pdrgpcrOutput = NULL;
+ if (must_exist)
+ {
+ pdrgpcrOutput =
+ CUtils::PdrgpcrRemapAndCreate(mp, m_pdrgpcrOutput, colref_mapping);
+ }
+ else
+ {
+ pdrgpcrOutput = CUtils::PdrgpcrRemap(mp, m_pdrgpcrOutput,
+ colref_mapping, must_exist);
+ }
CColRef *pcrAction =
CUtils::PcrRemap(m_pcrAction, colref_mapping, must_exist);
@@ -225,9 +245,9 @@ CLogicalDML::PopCopyWithRemappedColumns(CMemoryPool *mp,
m_ptabdesc->AddRef();
- return GPOS_NEW(mp)
- CLogicalDML(mp, m_edmlop, m_ptabdesc, colref_array, m_pbsModified,
- pcrAction, pcrCtid, pcrSegmentId, pcrTupleOid, pcrTableOid);
+ return GPOS_NEW(mp) CLogicalDML(
+ mp, m_edmlop, m_ptabdesc, colref_array, pdrgpcrOutput, m_pbsModified,
+ pcrAction, pcrCtid, pcrSegmentId, pcrTupleOid, pcrTableOid);
}
//---------------------------------------------------------------------------
@@ -245,6 +265,7 @@ CLogicalDML::DeriveOutputColumns(CMemoryPool *mp,
{
CColRefSet *pcrsOutput = GPOS_NEW(mp) CColRefSet(mp);
pcrsOutput->Include(m_pdrgpcrSource);
+ pcrsOutput->Include(m_pdrgpcrOutput);
if (NULL != m_pcrCtid)
{
GPOS_ASSERT(NULL != m_pcrSegmentId);
@@ -276,6 +297,7 @@ CLogicalDML::DerivePropertyConstraint(CMemoryPool *mp,
{
CColRefSet *pcrsOutput = GPOS_NEW(mp) CColRefSet(mp);
pcrsOutput->Include(m_pdrgpcrSource);
+ pcrsOutput->Include(m_pdrgpcrOutput);
CPropConstraint *ppc = PpcDeriveConstraintRestrict(mp, exprhdl, pcrsOutput);
pcrsOutput->Release();
@@ -291,10 +313,13 @@ CLogicalDML::DerivePropertyConstraint(CMemoryPool *mp,
//
//---------------------------------------------------------------------------
CKeyCollection *
-CLogicalDML::DeriveKeyCollection(CMemoryPool *, // mp
- CExpressionHandle &exprhdl) const
+CLogicalDML::DeriveKeyCollection(CMemoryPool *mp,
+ CExpressionHandle & // exprhdl
+) const
{
- return PkcDeriveKeysPassThru(exprhdl, 0 /* ulChild */);
+ const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
+
+ return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -386,6 +411,38 @@ CLogicalDML::OsPrint(IOstream &os) const
m_pcrSegmentId->OsPrint(os);
}
+ os << ", Output Columns: [";
+ CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
+ os << "] Key sets: {";
+
+ const ULONG ulColumns = m_pdrgpcrOutput->Size();
+ const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
+ for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
+ {
+ CBitSet *pbs = (*pdrgpbsKeys)[ul];
+ if (0 < ul)
+ {
+ os << ", ";
+ }
+ os << "[";
+ ULONG ulPrintedKeys = 0;
+ for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
+ {
+ if (pbs->Get(ulKey))
+ {
+ if (0 < ulPrintedKeys)
+ {
+ os << ",";
+ }
+ os << ulKey;
+ ulPrintedKeys++;
+ }
+ }
+ os << "]";
+ }
+ os << "}";
+
+
return os;
}
diff --git a/src/backend/gporca/libgpopt/src/operators/CLogicalDelete.cpp b/src/backend/gporca/libgpopt/src/operators/CLogicalDelete.cpp
index e1bba3875ab..75d69a6810a 100644
--- a/src/backend/gporca/libgpopt/src/operators/CLogicalDelete.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CLogicalDelete.cpp
@@ -33,6 +33,7 @@ CLogicalDelete::CLogicalDelete(CMemoryPool *mp)
: CLogical(mp),
m_ptabdesc(NULL),
m_pdrgpcr(NULL),
+ m_pdrgpcrOutput(NULL),
m_pcrCtid(NULL),
m_pcrSegmentId(NULL),
m_pcrTableOid(NULL)
@@ -54,6 +55,45 @@ CLogicalDelete::CLogicalDelete(CMemoryPool *mp, CTableDescriptor *ptabdesc,
: CLogical(mp),
m_ptabdesc(ptabdesc),
m_pdrgpcr(colref_array),
+ m_pdrgpcrOutput(NULL),
+ m_pcrCtid(pcrCtid),
+ m_pcrSegmentId(pcrSegmentId),
+ m_pcrTableOid(pcrTableOid)
+{
+ GPOS_ASSERT(NULL != ptabdesc);
+ GPOS_ASSERT(NULL != colref_array);
+ GPOS_ASSERT(NULL != pcrCtid);
+ GPOS_ASSERT(NULL != pcrSegmentId);
+
+ m_pdrgpcrOutput =
+ PdrgpcrCreateMapping(mp, ptabdesc->Pdrgpcoldesc(), UlOpId());
+
+ m_pcrsLocalUsed->Include(m_pdrgpcr);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
+ m_pcrsLocalUsed->Include(m_pcrCtid);
+ m_pcrsLocalUsed->Include(m_pcrSegmentId);
+ if (NULL != m_pcrTableOid)
+ {
+ m_pcrsLocalUsed->Include(m_pcrTableOid);
+ }
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CLogicalDelete::CLogicalDelete
+//
+// @doc:
+// Ctor
+//
+//---------------------------------------------------------------------------
+CLogicalDelete::CLogicalDelete(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *colref_array,
+ CColRefArray *pdrgpcrOutput, CColRef *pcrCtid,
+ CColRef *pcrSegmentId, CColRef *pcrTableOid)
+ : CLogical(mp),
+ m_ptabdesc(ptabdesc),
+ m_pdrgpcr(colref_array),
+ m_pdrgpcrOutput(pdrgpcrOutput),
m_pcrCtid(pcrCtid),
m_pcrSegmentId(pcrSegmentId),
m_pcrTableOid(pcrTableOid)
@@ -64,6 +104,7 @@ CLogicalDelete::CLogicalDelete(CMemoryPool *mp, CTableDescriptor *ptabdesc,
GPOS_ASSERT(NULL != pcrSegmentId);
m_pcrsLocalUsed->Include(m_pdrgpcr);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
m_pcrsLocalUsed->Include(m_pcrCtid);
m_pcrsLocalUsed->Include(m_pcrSegmentId);
if (NULL != m_pcrTableOid)
@@ -84,6 +125,7 @@ CLogicalDelete::~CLogicalDelete()
{
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcr);
+ CRefCount::SafeRelease(m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -108,10 +150,11 @@ CLogicalDelete::Matches(COperator *pop) const
m_pcrSegmentId == popDelete->PcrSegmentId() &&
m_pcrTableOid == popDelete->PcrTableOid() &&
m_ptabdesc->MDId()->Equals(popDelete->Ptabdesc()->MDId()) &&
- m_pdrgpcr->Equals(popDelete->Pdrgpcr());
+ m_pdrgpcr->Equals(popDelete->Pdrgpcr()) &&
+ m_pdrgpcrOutput->Equals(popDelete->PdrgpcrOutput());
}
-
//---------------------------------------------------------------------------
+
// @function:
// CLogicalDelete::HashValue
//
@@ -125,6 +168,8 @@ CLogicalDelete::HashValue() const
ULONG ulHash = gpos::CombineHashes(COperator::HashValue(),
m_ptabdesc->MDId()->HashValue());
ulHash = gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcr));
+ ulHash =
+ gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
ulHash = gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrCtid));
ulHash =
gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrSegmentId));
@@ -148,6 +193,19 @@ CLogicalDelete::PopCopyWithRemappedColumns(CMemoryPool *mp,
{
CColRefArray *colref_array =
CUtils::PdrgpcrRemap(mp, m_pdrgpcr, colref_mapping, must_exist);
+
+ CColRefArray *pdrgpcrOutput = NULL;
+ if (must_exist)
+ {
+ pdrgpcrOutput =
+ CUtils::PdrgpcrRemapAndCreate(mp, m_pdrgpcrOutput, colref_mapping);
+ }
+ else
+ {
+ pdrgpcrOutput = CUtils::PdrgpcrRemap(mp, m_pdrgpcrOutput,
+ colref_mapping, must_exist);
+ }
+
CColRef *pcrCtid = CUtils::PcrRemap(m_pcrCtid, colref_mapping, must_exist);
CColRef *pcrSegmentId =
CUtils::PcrRemap(m_pcrSegmentId, colref_mapping, must_exist);
@@ -159,8 +217,9 @@ CLogicalDelete::PopCopyWithRemappedColumns(CMemoryPool *mp,
CUtils::PcrRemap(m_pcrTableOid, colref_mapping, must_exist);
}
- return GPOS_NEW(mp) CLogicalDelete(mp, m_ptabdesc, colref_array, pcrCtid,
- pcrSegmentId, pcrTableOid);
+ return GPOS_NEW(mp)
+ CLogicalDelete(mp, m_ptabdesc, colref_array, pdrgpcrOutput, pcrCtid,
+ pcrSegmentId, pcrTableOid);
}
//---------------------------------------------------------------------------
@@ -178,6 +237,8 @@ CLogicalDelete::DeriveOutputColumns(CMemoryPool *mp,
{
CColRefSet *pcrsOutput = GPOS_NEW(mp) CColRefSet(mp);
pcrsOutput->Include(m_pdrgpcr);
+ pcrsOutput->Include(m_pdrgpcrOutput);
+
return pcrsOutput;
}
@@ -190,10 +251,13 @@ CLogicalDelete::DeriveOutputColumns(CMemoryPool *mp,
//
//---------------------------------------------------------------------------
CKeyCollection *
-CLogicalDelete::DeriveKeyCollection(CMemoryPool *, // mp
- CExpressionHandle &exprhdl) const
+CLogicalDelete::DeriveKeyCollection(CMemoryPool *mp,
+ CExpressionHandle & // exprhdl
+) const
{
- return PkcDeriveKeysPassThru(exprhdl, 0 /* ulChild */);
+ const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
+
+ return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -276,6 +340,37 @@ CLogicalDelete::OsPrint(IOstream &os) const
os << ", ";
}
+ os << "Output Columns: [";
+ CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
+ os << "] Key sets: {";
+
+ const ULONG ulColumns = m_pdrgpcrOutput->Size();
+ const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
+ for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
+ {
+ CBitSet *pbs = (*pdrgpbsKeys)[ul];
+ if (0 < ul)
+ {
+ os << ", ";
+ }
+ os << "[";
+ ULONG ulPrintedKeys = 0;
+ for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
+ {
+ if (pbs->Get(ulKey))
+ {
+ if (0 < ulPrintedKeys)
+ {
+ os << ",";
+ }
+ os << ulKey;
+ ulPrintedKeys++;
+ }
+ }
+ os << "]";
+ }
+ os << "}";
+
return os;
}
diff --git a/src/backend/gporca/libgpopt/src/operators/CLogicalInsert.cpp b/src/backend/gporca/libgpopt/src/operators/CLogicalInsert.cpp
index af6f23e15ce..44bdeb65627 100644
--- a/src/backend/gporca/libgpopt/src/operators/CLogicalInsert.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CLogicalInsert.cpp
@@ -30,7 +30,11 @@ using namespace gpopt;
//
//---------------------------------------------------------------------------
CLogicalInsert::CLogicalInsert(CMemoryPool *mp)
- : CLogical(mp), m_ptabdesc(NULL), m_pdrgpcrSource(NULL)
+ : CLogical(mp),
+ m_ptabdesc(NULL),
+ m_pdrgpcrSource(NULL),
+ m_pdrgpcrOutput(NULL)
+
{
m_fPattern = true;
}
@@ -45,13 +49,45 @@ CLogicalInsert::CLogicalInsert(CMemoryPool *mp)
//---------------------------------------------------------------------------
CLogicalInsert::CLogicalInsert(CMemoryPool *mp, CTableDescriptor *ptabdesc,
CColRefArray *pdrgpcrSource)
- : CLogical(mp), m_ptabdesc(ptabdesc), m_pdrgpcrSource(pdrgpcrSource)
+ : CLogical(mp),
+ m_ptabdesc(ptabdesc),
+ m_pdrgpcrSource(pdrgpcrSource),
+ m_pdrgpcrOutput(NULL)
{
GPOS_ASSERT(NULL != ptabdesc);
GPOS_ASSERT(NULL != pdrgpcrSource);
+ m_pdrgpcrOutput =
+ PdrgpcrCreateMapping(mp, ptabdesc->Pdrgpcoldesc(), UlOpId());
+
m_pcrsLocalUsed->Include(m_pdrgpcrSource);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
+}
+
+
+//---------------------------------------------------------------------------
+// @function:
+// CLogicalInsert::CLogicalInsert
+//
+// @doc:
+// Ctor
+//
+//---------------------------------------------------------------------------
+CLogicalInsert::CLogicalInsert(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *pdrgpcrSource,
+ CColRefArray *pdrgpcrOutput)
+ : CLogical(mp),
+ m_ptabdesc(ptabdesc),
+ m_pdrgpcrSource(pdrgpcrSource),
+ m_pdrgpcrOutput(pdrgpcrOutput)
+
+{
+ GPOS_ASSERT(NULL != ptabdesc);
+ GPOS_ASSERT(NULL != pdrgpcrSource);
+
+ m_pcrsLocalUsed->Include(m_pdrgpcrSource);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -66,6 +102,7 @@ CLogicalInsert::~CLogicalInsert()
{
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcrSource);
+ CRefCount::SafeRelease(m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -87,7 +124,8 @@ CLogicalInsert::Matches(COperator *pop) const
CLogicalInsert *popInsert = CLogicalInsert::PopConvert(pop);
return m_ptabdesc->MDId()->Equals(popInsert->Ptabdesc()->MDId()) &&
- m_pdrgpcrSource->Equals(popInsert->PdrgpcrSource());
+ m_pdrgpcrSource->Equals(popInsert->PdrgpcrSource()) &&
+ m_pdrgpcrOutput->Equals(popInsert->PdrgpcrOutput());
}
//---------------------------------------------------------------------------
@@ -106,6 +144,9 @@ CLogicalInsert::HashValue() const
ulHash =
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrSource));
+ ulHash =
+ gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
+
return ulHash;
}
@@ -124,9 +165,22 @@ CLogicalInsert::PopCopyWithRemappedColumns(CMemoryPool *mp,
{
CColRefArray *colref_array =
CUtils::PdrgpcrRemap(mp, m_pdrgpcrSource, colref_mapping, must_exist);
+
+ CColRefArray *pdrgpcrOutput = NULL;
+ if (must_exist)
+ {
+ pdrgpcrOutput =
+ CUtils::PdrgpcrRemapAndCreate(mp, m_pdrgpcrOutput, colref_mapping);
+ }
+ else
+ {
+ pdrgpcrOutput = CUtils::PdrgpcrRemap(mp, m_pdrgpcrOutput,
+ colref_mapping, must_exist);
+ }
m_ptabdesc->AddRef();
- return GPOS_NEW(mp) CLogicalInsert(mp, m_ptabdesc, colref_array);
+ return GPOS_NEW(mp)
+ CLogicalInsert(mp, m_ptabdesc, colref_array, pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -144,6 +198,8 @@ CLogicalInsert::DeriveOutputColumns(CMemoryPool *mp,
{
CColRefSet *pcrsOutput = GPOS_NEW(mp) CColRefSet(mp);
pcrsOutput->Include(m_pdrgpcrSource);
+ pcrsOutput->Include(m_pdrgpcrOutput);
+
return pcrsOutput;
}
@@ -156,10 +212,13 @@ CLogicalInsert::DeriveOutputColumns(CMemoryPool *mp,
//
//---------------------------------------------------------------------------
CKeyCollection *
-CLogicalInsert::DeriveKeyCollection(CMemoryPool *, // mp
- CExpressionHandle &exprhdl) const
+CLogicalInsert::DeriveKeyCollection(CMemoryPool *mp,
+ CExpressionHandle & // exprhdl
+) const
{
- return PkcDeriveKeysPassThru(exprhdl, 0 /* ulChild */);
+ const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
+
+ return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -232,6 +291,36 @@ CLogicalInsert::OsPrint(IOstream &os) const
os << "), Source Columns: [";
CUtils::OsPrintDrgPcr(os, m_pdrgpcrSource);
os << "]";
+ os << ", Output Columns: [";
+ CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
+ os << "] Key sets: {";
+
+ const ULONG ulColumns = m_pdrgpcrOutput->Size();
+ const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
+ for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
+ {
+ CBitSet *pbs = (*pdrgpbsKeys)[ul];
+ if (0 < ul)
+ {
+ os << ", ";
+ }
+ os << "[";
+ ULONG ulPrintedKeys = 0;
+ for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
+ {
+ if (pbs->Get(ulKey))
+ {
+ if (0 < ulPrintedKeys)
+ {
+ os << ",";
+ }
+ os << ulKey;
+ ulPrintedKeys++;
+ }
+ }
+ os << "]";
+ }
+ os << "}";
return os;
}
diff --git a/src/backend/gporca/libgpopt/src/operators/CLogicalUpdate.cpp b/src/backend/gporca/libgpopt/src/operators/CLogicalUpdate.cpp
index 954db0c6829..e2d06fe1f33 100644
--- a/src/backend/gporca/libgpopt/src/operators/CLogicalUpdate.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CLogicalUpdate.cpp
@@ -34,6 +34,7 @@ CLogicalUpdate::CLogicalUpdate(CMemoryPool *mp)
m_ptabdesc(NULL),
m_pdrgpcrDelete(NULL),
m_pdrgpcrInsert(NULL),
+ m_pdrgpcrOutput(NULL),
m_pcrCtid(NULL),
m_pcrSegmentId(NULL),
m_pcrTupleOid(NULL),
@@ -59,6 +60,7 @@ CLogicalUpdate::CLogicalUpdate(CMemoryPool *mp, CTableDescriptor *ptabdesc,
m_ptabdesc(ptabdesc),
m_pdrgpcrDelete(pdrgpcrDelete),
m_pdrgpcrInsert(pdrgpcrInsert),
+ m_pdrgpcrOutput(NULL),
m_pcrCtid(pcrCtid),
m_pcrSegmentId(pcrSegmentId),
m_pcrTupleOid(pcrTupleOid),
@@ -71,8 +73,12 @@ CLogicalUpdate::CLogicalUpdate(CMemoryPool *mp, CTableDescriptor *ptabdesc,
GPOS_ASSERT(NULL != pcrCtid);
GPOS_ASSERT(NULL != pcrSegmentId);
+ m_pdrgpcrOutput =
+ PdrgpcrCreateMapping(mp, ptabdesc->Pdrgpcoldesc(), UlOpId());
+
m_pcrsLocalUsed->Include(m_pdrgpcrDelete);
m_pcrsLocalUsed->Include(m_pdrgpcrInsert);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
m_pcrsLocalUsed->Include(m_pcrCtid);
m_pcrsLocalUsed->Include(m_pcrSegmentId);
@@ -87,6 +93,55 @@ CLogicalUpdate::CLogicalUpdate(CMemoryPool *mp, CTableDescriptor *ptabdesc,
}
}
+//---------------------------------------------------------------------------
+// @function:
+// CLogicalUpdate::CLogicalUpdate
+//
+// @doc:
+// Ctor
+//
+//---------------------------------------------------------------------------
+CLogicalUpdate::CLogicalUpdate(CMemoryPool *mp, CTableDescriptor *ptabdesc,
+ CColRefArray *pdrgpcrDelete,
+ CColRefArray *pdrgpcrInsert,
+ CColRefArray *pdrgpcrOutput, CColRef *pcrCtid,
+ CColRef *pcrSegmentId, CColRef *pcrTupleOid,
+ CColRef *pcrTableOid)
+ : CLogical(mp),
+ m_ptabdesc(ptabdesc),
+ m_pdrgpcrDelete(pdrgpcrDelete),
+ m_pdrgpcrInsert(pdrgpcrInsert),
+ m_pdrgpcrOutput(pdrgpcrOutput),
+ m_pcrCtid(pcrCtid),
+ m_pcrSegmentId(pcrSegmentId),
+ m_pcrTupleOid(pcrTupleOid),
+ m_pcrTableOid(pcrTableOid)
+{
+ GPOS_ASSERT(NULL != ptabdesc);
+ GPOS_ASSERT(NULL != pdrgpcrDelete);
+ GPOS_ASSERT(NULL != pdrgpcrInsert);
+ GPOS_ASSERT(pdrgpcrDelete->Size() == pdrgpcrInsert->Size());
+ GPOS_ASSERT(NULL != pcrCtid);
+ GPOS_ASSERT(NULL != pcrSegmentId);
+
+ m_pcrsLocalUsed->Include(m_pdrgpcrDelete);
+ m_pcrsLocalUsed->Include(m_pdrgpcrInsert);
+ m_pcrsLocalUsed->Include(m_pdrgpcrOutput);
+ m_pcrsLocalUsed->Include(m_pcrCtid);
+ m_pcrsLocalUsed->Include(m_pcrSegmentId);
+
+ if (NULL != m_pcrTupleOid)
+ {
+ m_pcrsLocalUsed->Include(m_pcrTupleOid);
+ }
+
+ if (NULL != m_pcrTableOid)
+ {
+ m_pcrsLocalUsed->Include(m_pcrTableOid);
+ }
+}
+
+
//---------------------------------------------------------------------------
// @function:
// CLogicalUpdate::~CLogicalUpdate
@@ -100,6 +155,7 @@ CLogicalUpdate::~CLogicalUpdate()
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcrDelete);
CRefCount::SafeRelease(m_pdrgpcrInsert);
+ CRefCount::SafeRelease(m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -126,7 +182,8 @@ CLogicalUpdate::Matches(COperator *pop) const
m_pcrTableOid == popUpdate->PcrTableOid() &&
m_ptabdesc->MDId()->Equals(popUpdate->Ptabdesc()->MDId()) &&
m_pdrgpcrDelete->Equals(popUpdate->PdrgpcrDelete()) &&
- m_pdrgpcrInsert->Equals(popUpdate->PdrgpcrInsert());
+ m_pdrgpcrInsert->Equals(popUpdate->PdrgpcrInsert()) &&
+ m_pdrgpcrOutput->Equals(popUpdate->PdrgpcrOutput());
}
//---------------------------------------------------------------------------
@@ -146,6 +203,8 @@ CLogicalUpdate::HashValue() const
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrDelete));
ulHash =
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrInsert));
+ ulHash =
+ gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
ulHash = gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrCtid));
ulHash =
gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrSegmentId));
@@ -171,6 +230,19 @@ CLogicalUpdate::PopCopyWithRemappedColumns(CMemoryPool *mp,
CUtils::PdrgpcrRemap(mp, m_pdrgpcrDelete, colref_mapping, must_exist);
CColRefArray *pdrgpcrInsert =
CUtils::PdrgpcrRemap(mp, m_pdrgpcrInsert, colref_mapping, must_exist);
+
+ CColRefArray *pdrgpcrOutput = NULL;
+ if (must_exist)
+ {
+ pdrgpcrOutput =
+ CUtils::PdrgpcrRemapAndCreate(mp, m_pdrgpcrOutput, colref_mapping);
+ }
+ else
+ {
+ pdrgpcrOutput = CUtils::PdrgpcrRemap(mp, m_pdrgpcrOutput,
+ colref_mapping, must_exist);
+ }
+
CColRef *pcrCtid = CUtils::PcrRemap(m_pcrCtid, colref_mapping, must_exist);
CColRef *pcrSegmentId =
CUtils::PcrRemap(m_pcrSegmentId, colref_mapping, must_exist);
@@ -189,9 +261,9 @@ CLogicalUpdate::PopCopyWithRemappedColumns(CMemoryPool *mp,
pcrTableOid =
CUtils::PcrRemap(m_pcrTableOid, colref_mapping, must_exist);
}
- return GPOS_NEW(mp)
- CLogicalUpdate(mp, m_ptabdesc, pdrgpcrDelete, pdrgpcrInsert, pcrCtid,
- pcrSegmentId, pcrTupleOid, pcrTableOid);
+ return GPOS_NEW(mp) CLogicalUpdate(mp, m_ptabdesc, pdrgpcrDelete,
+ pdrgpcrInsert, pdrgpcrOutput, pcrCtid,
+ pcrSegmentId, pcrTupleOid, pcrTableOid);
}
//---------------------------------------------------------------------------
@@ -209,6 +281,7 @@ CLogicalUpdate::DeriveOutputColumns(CMemoryPool *mp,
{
CColRefSet *pcrsOutput = GPOS_NEW(mp) CColRefSet(mp);
pcrsOutput->Include(m_pdrgpcrInsert);
+ pcrsOutput->Include(m_pdrgpcrOutput);
pcrsOutput->Include(m_pcrCtid);
pcrsOutput->Include(m_pcrSegmentId);
@@ -232,10 +305,13 @@ CLogicalUpdate::DeriveOutputColumns(CMemoryPool *mp,
//
//---------------------------------------------------------------------------
CKeyCollection *
-CLogicalUpdate::DeriveKeyCollection(CMemoryPool *, // mp
- CExpressionHandle &exprhdl) const
+CLogicalUpdate::DeriveKeyCollection(CMemoryPool *mp,
+ CExpressionHandle & // exprhdl
+) const
{
- return PkcDeriveKeysPassThru(exprhdl, 0 /* ulChild */);
+ const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
+
+ return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
@@ -320,6 +396,37 @@ CLogicalUpdate::OsPrint(IOstream &os) const
os << ", ";
}
+ os << "Output Columns: [";
+ CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
+ os << "] Key sets: {";
+
+ const ULONG ulColumns = m_pdrgpcrOutput->Size();
+ const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
+ for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
+ {
+ CBitSet *pbs = (*pdrgpbsKeys)[ul];
+ if (0 < ul)
+ {
+ os << ", ";
+ }
+ os << "[";
+ ULONG ulPrintedKeys = 0;
+ for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
+ {
+ if (pbs->Get(ulKey))
+ {
+ if (0 < ulPrintedKeys)
+ {
+ os << ",";
+ }
+ os << ulKey;
+ ulPrintedKeys++;
+ }
+ }
+ os << "]";
+ }
+ os << "}";
+
return os;
}
diff --git a/src/backend/gporca/libgpopt/src/operators/CPhysicalDML.cpp b/src/backend/gporca/libgpopt/src/operators/CPhysicalDML.cpp
index 66ec3265658..362b7d59705 100644
--- a/src/backend/gporca/libgpopt/src/operators/CPhysicalDML.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CPhysicalDML.cpp
@@ -37,7 +37,8 @@ using namespace gpopt;
//---------------------------------------------------------------------------
CPhysicalDML::CPhysicalDML(CMemoryPool *mp, CLogicalDML::EDMLOperator edmlop,
CTableDescriptor *ptabdesc,
- CColRefArray *pdrgpcrSource, CBitSet *pbsModified,
+ CColRefArray *pdrgpcrSource,
+ CColRefArray *pdrgpcrOutput, CBitSet *pbsModified,
CColRef *pcrAction, CColRef *pcrCtid,
CColRef *pcrSegmentId, CColRef *pcrTupleOid,
CColRef *pcrTableOid)
@@ -45,6 +46,7 @@ CPhysicalDML::CPhysicalDML(CMemoryPool *mp, CLogicalDML::EDMLOperator edmlop,
m_edmlop(edmlop),
m_ptabdesc(ptabdesc),
m_pdrgpcrSource(pdrgpcrSource),
+ m_pdrgpcrOutput(pdrgpcrOutput),
m_pbsModified(pbsModified),
m_pcrAction(pcrAction),
m_pcrTableOid(pcrTableOid),
@@ -53,11 +55,14 @@ CPhysicalDML::CPhysicalDML(CMemoryPool *mp, CLogicalDML::EDMLOperator edmlop,
m_pcrTupleOid(pcrTupleOid),
m_pds(NULL),
m_pos(NULL),
- m_pcrsRequiredLocal(NULL)
+ m_pcrsRequiredLocal(NULL),
+ m_isCTAS(IMDId::EmdidGPDBCtas == ptabdesc->MDId()->MdidType()),
+ m_hasTriggers(CXformUtils::FTriggersExist(edmlop, ptabdesc))
{
GPOS_ASSERT(CLogicalDML::EdmlSentinel != edmlop);
GPOS_ASSERT(NULL != ptabdesc);
GPOS_ASSERT(NULL != pdrgpcrSource);
+ GPOS_ASSERT(NULL != pdrgpcrOutput);
GPOS_ASSERT(NULL != pbsModified);
GPOS_ASSERT(NULL != pcrAction);
GPOS_ASSERT_IMP(
@@ -67,6 +72,17 @@ CPhysicalDML::CPhysicalDML(CMemoryPool *mp, CLogicalDML::EDMLOperator edmlop,
m_pds =
CPhysical::PdsCompute(m_mp, m_ptabdesc, pdrgpcrSource, pcrSegmentId);
+ if (ptabdesc->ConvertHashToRandom())
+ {
+ // Treating a hash distributed table as random during planning
+ m_pdsOutput = GPOS_NEW(m_mp) CDistributionSpecRandom();
+ }
+ else
+ {
+ m_pdsOutput = CPhysical::PdsCompute(m_mp, ptabdesc, pdrgpcrOutput,
+ NULL /* gp_segment_id */);
+ }
+
if (CDistributionSpec::EdtHashed == m_pds->Edt() &&
ptabdesc->ConvertHashToRandom())
{
@@ -150,9 +166,11 @@ CPhysicalDML::~CPhysicalDML()
{
m_ptabdesc->Release();
m_pdrgpcrSource->Release();
+ m_pdrgpcrOutput->Release();
m_pbsModified->Release();
m_pds->Release();
m_pos->Release();
+ m_pdsOutput->Release();
m_pcrsRequiredLocal->Release();
}
@@ -251,7 +269,11 @@ CPhysicalDML::PcrsRequired(CMemoryPool *mp,
"Required properties can only be computed on the relational child");
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp, *m_pcrsRequiredLocal);
- pcrs->Union(pcrsRequired);
+
+ if (m_isCTAS || m_hasTriggers)
+ {
+ pcrs->Union(pcrsRequired);
+ }
return pcrs;
}
@@ -379,7 +401,25 @@ CPhysicalDML::FProvidesReqdCols(CExpressionHandle &exprhdl,
ULONG // ulOptReq
) const
{
- return FUnaryProvidesReqdCols(exprhdl, pcrsRequired);
+ if (m_isCTAS)
+ {
+ return FUnaryProvidesReqdCols(exprhdl, pcrsRequired);
+ }
+
+ GPOS_ASSERT(NULL != pcrsRequired);
+
+ CColRefSet *pcrs = GPOS_NEW(m_mp) CColRefSet(m_mp);
+ pcrs->Include(m_pdrgpcrOutput);
+
+ if (m_hasTriggers)
+ {
+ pcrs->Include(m_pdrgpcrSource);
+ }
+
+ BOOL result = pcrs->ContainsAll(pcrsRequired);
+ pcrs->Release();
+
+ return result;
}
//---------------------------------------------------------------------------
@@ -394,7 +434,13 @@ CDistributionSpec *
CPhysicalDML::PdsDerive(CMemoryPool *, //mp,
CExpressionHandle &exprhdl) const
{
- return PdsDerivePassThruOuter(exprhdl);
+ if (m_isCTAS)
+ {
+ return PdsDerivePassThruOuter(exprhdl);
+ }
+
+ m_pdsOutput->AddRef();
+ return m_pdsOutput;
}
//---------------------------------------------------------------------------
@@ -428,6 +474,8 @@ CPhysicalDML::HashValue() const
ulHash = gpos::CombineHashes(ulHash, gpos::HashPtr(m_pcrTableOid));
ulHash =
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrSource));
+ ulHash =
+ gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
if (CLogicalDML::EdmlDelete == m_edmlop ||
CLogicalDML::EdmlUpdate == m_edmlop)
@@ -461,7 +509,8 @@ CPhysicalDML::Matches(COperator *pop) const
m_pcrSegmentId == popDML->PcrSegmentId() &&
m_pcrTupleOid == popDML->PcrTupleOid() &&
m_ptabdesc->MDId()->Equals(popDML->Ptabdesc()->MDId()) &&
- m_pdrgpcrSource->Equals(popDML->PdrgpcrSource());
+ m_pdrgpcrSource->Equals(popDML->PdrgpcrSource()) &&
+ m_pdrgpcrOutput->Equals(popDML->PdrgpcrOutput());
}
return false;
@@ -623,6 +672,37 @@ CPhysicalDML::OsPrint(IOstream &os) const
m_pcrSegmentId->OsPrint(os);
}
+ os << ", Output Columns: [";
+ CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
+ os << "] Key sets: {";
+
+ const ULONG ulColumns = m_pdrgpcrOutput->Size();
+ const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
+ for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
+ {
+ CBitSet *pbs = (*pdrgpbsKeys)[ul];
+ if (0 < ul)
+ {
+ os << ", ";
+ }
+ os << "[";
+ ULONG ulPrintedKeys = 0;
+ for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
+ {
+ if (pbs->Get(ulKey))
+ {
+ if (0 < ulPrintedKeys)
+ {
+ os << ",";
+ }
+ os << ulKey;
+ ulPrintedKeys++;
+ }
+ }
+ os << "]";
+ }
+ os << "}";
+
return os;
}
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp
index fda9cff4285..9a42d0476f6 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp
@@ -1398,9 +1398,15 @@ CTranslatorDXLToExpr::PexprLogicalInsert(const CDXLNode *dxlnode)
CColRefArray *colref_array =
CTranslatorDXLToExprUtils::Pdrgpcr(m_mp, m_phmulcr, pdrgpulSourceCols);
- return GPOS_NEW(m_mp) CExpression(
- m_mp, GPOS_NEW(m_mp) CLogicalInsert(m_mp, ptabdesc, colref_array),
- pexprChild);
+ CLogicalInsert *pexprLogInsert =
+ GPOS_NEW(m_mp) CLogicalInsert(m_mp, ptabdesc, colref_array);
+
+ // add mapping between the DXL ColId and CColRef to m_phmulcr
+ ConstructDXLColId2ColRefMapping(
+ pdxlopInsert->GetDXLTableDescr()->GetColumnDescr(),
+ pexprLogInsert->PdrgpcrOutput());
+
+ return GPOS_NEW(m_mp) CExpression(m_mp, pexprLogInsert, pexprChild);
}
//---------------------------------------------------------------------------
@@ -1447,11 +1453,16 @@ CTranslatorDXLToExpr::PexprLogicalDelete(const CDXLNode *dxlnode)
CColRefArray *colref_array =
CTranslatorDXLToExprUtils::Pdrgpcr(m_mp, m_phmulcr, pdrgpulCols);
- return GPOS_NEW(m_mp) CExpression(
- m_mp,
+ CLogicalDelete *pexprLogDelete =
GPOS_NEW(m_mp) CLogicalDelete(m_mp, ptabdesc, colref_array, pcrCtid,
- pcrSegmentId, pcrTableOid),
- pexprChild);
+ pcrSegmentId, pcrTableOid);
+
+ // add mapping between the DXL ColId and CColRef to m_phmulcr
+ ConstructDXLColId2ColRefMapping(
+ pdxlopDelete->GetDXLTableDescr()->GetColumnDescr(),
+ pexprLogDelete->PdrgpcrOutput());
+
+ return GPOS_NEW(m_mp) CExpression(m_mp, pexprLogDelete, pexprChild);
}
//---------------------------------------------------------------------------
@@ -1509,12 +1520,16 @@ CTranslatorDXLToExpr::PexprLogicalUpdate(const CDXLNode *dxlnode)
pcrTupleOid = LookupColRef(m_phmulcr, tuple_oid);
}
- return GPOS_NEW(m_mp) CExpression(
- m_mp,
- GPOS_NEW(m_mp)
- CLogicalUpdate(m_mp, ptabdesc, pdrgpcrDelete, pdrgpcrInsert,
- pcrCtid, pcrSegmentId, pcrTupleOid, pcrTableOid),
- pexprChild);
+ CLogicalUpdate *pexprLogUpdate = GPOS_NEW(m_mp)
+ CLogicalUpdate(m_mp, ptabdesc, pdrgpcrDelete, pdrgpcrInsert, pcrCtid,
+ pcrSegmentId, pcrTupleOid, pcrTableOid);
+
+ // add mapping between the DXL ColId and CColRef to m_phmulcr
+ ConstructDXLColId2ColRefMapping(
+ pdxlopUpdate->GetDXLTableDescr()->GetColumnDescr(),
+ pexprLogUpdate->PdrgpcrOutput());
+
+ return GPOS_NEW(m_mp) CExpression(m_mp, pexprLogUpdate, pexprChild);
}
//---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index 907d34ae332..07e892099f8 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -22,6 +22,7 @@
#include "gpos/common/CHashMap.h"
#include "gpopt/base/CCastUtils.h"
+#include "gpopt/base/CColRef.h"
#include "gpopt/base/CColRefSetIter.h"
#include "gpopt/base/CConstraintInterval.h"
#include "gpopt/base/CUtils.h"
@@ -32,6 +33,7 @@
#include "gpopt/operators/CPhysicalIndexOnlyScan.h"
#include "gpopt/operators/CPhysicalMotionRandom.h"
#include "gpopt/operators/CPredicateUtils.h"
+#include "gpopt/search/CScheduler.h"
#include "gpopt/translate/CTranslatorDXLToExpr.h"
#include "gpopt/translate/CTranslatorExprToDXLUtils.h"
#include "naucrates/base/CDatumBoolGPDB.h"
@@ -5806,6 +5808,7 @@ CTranslatorExprToDXL::PdxlnDML(CExpression *pexpr,
CExpression *pexprChild = (*pexpr)[0];
CTableDescriptor *ptabdesc = popDML->Ptabdesc();
CColRefArray *pdrgpcrSource = popDML->PdrgpcrSource();
+ CColRefArray *pdrgpcrOutput = popDML->PdrgpcrOutput();
CColRef *pcrAction = popDML->PcrAction();
GPOS_ASSERT(NULL != pcrAction);
@@ -5839,8 +5842,8 @@ CTranslatorExprToDXL::PdxlnDML(CExpression *pexpr,
pexprChild, pdrgpcrSource, pdrgpdsBaseTables, pulNonGatherMotions,
pfDML, false /*fRemap*/, false /*fRoot*/);
- CDXLTableDescr *table_descr = MakeDXLTableDescr(
- ptabdesc, NULL /*pdrgpcrOutput*/, NULL /*requiredProperties*/);
+ CDXLTableDescr *table_descr =
+ MakeDXLTableDescr(ptabdesc, pdrgpcrOutput, pexpr->Prpp());
ULongPtrArray *pdrgpul = CUtils::Pdrgpul(m_mp, pdrgpcrSource);
CDXLDirectDispatchInfo *dxl_direct_dispatch_info =
@@ -5850,15 +5853,56 @@ CTranslatorExprToDXL::PdxlnDML(CExpression *pexpr,
ctid_colid, segid_colid, preserve_oids, tuple_oid,
tableoid_colid, dxl_direct_dispatch_info);
+ // if dml node has triggers we should also output source columns
+ if (popDML->HasTriggers())
+ {
+ pdrgpcrOutput->AppendArray(pdrgpcrSource);
+ }
+
// project list
- CColRefSet *pcrsOutput = pexpr->Prpp()->PcrsRequired();
- CDXLNode *pdxlnPrL = PdxlnProjList(pcrsOutput, pdrgpcrSource);
+ CDXLNode *pdxlnPrL = PdxlnProjList(NULL, pdrgpcrSource);
+
+ // configure output project list if output was required
+ CDXLNode *pdxlnPrLOutput;
+ if (pexpr->Prpp()->PcrsRequired()->Size() > 0)
+ {
+ ULongPtrArray *indexes = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
+
+ for (ULONG outputColIndex = 0;outputColIndex < pdrgpcrOutput->Size();outputColIndex++)
+ {
+ CColRef *colref = (*pdrgpcrOutput)[outputColIndex];
+ if (colref->GetUsage() != CColRef::EUnused)
+ {
+ indexes->Append(GPOS_NEW(m_mp) ULONG(outputColIndex));
+ }
+ }
+
+ if (pdrgpcrOutput->Size() == indexes->Size())
+ {
+ pdxlnPrLOutput = PdxlnProjList(NULL, pdrgpcrOutput);
+ }
+ else
+ {
+ CColRefArray *reducedOutput =
+ pdrgpcrOutput->CreateReducedArray(indexes);
+ pdxlnPrLOutput = PdxlnProjList(NULL, reducedOutput);
+ reducedOutput->Release();
+ }
+
+ indexes->Release();
+ }
+ else
+ {
+ pdxlnPrLOutput = GPOS_NEW(m_mp)
+ CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp));
+ }
CDXLNode *pdxlnDML = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopDML);
CDXLPhysicalProperties *dxl_properties = GetProperties(pexpr);
pdxlnDML->SetProperties(dxl_properties);
pdxlnDML->AddChild(pdxlnPrL);
+ pdxlnDML->AddChild(pdxlnPrLOutput);
pdxlnDML->AddChild(child_dxlnode);
#ifdef GPOS_DEBUG
@@ -7758,7 +7802,7 @@ CDXLNode *
CTranslatorExprToDXL::PdxlnProjList(const CColRefSet *pcrsOutput,
CColRefArray *colref_array)
{
- GPOS_ASSERT(NULL != pcrsOutput);
+ GPOS_ASSERT_IMP(NULL == pcrsOutput, colref_array != NULL);
CDXLScalarProjList *pdxlopPrL = GPOS_NEW(m_mp) CDXLScalarProjList(m_mp);
CDXLNode *pdxlnPrL = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopPrL);
@@ -7777,18 +7821,21 @@ CTranslatorExprToDXL::PdxlnProjList(const CColRefSet *pcrsOutput,
pcrs->Include(colref);
}
- // add the remaining required columns
- CColRefSetIter crsi(*pcrsOutput);
- while (crsi.Advance())
+ if (pcrsOutput != NULL)
{
- CColRef *colref = crsi.Pcr();
-
- if (!pcrs->FMember(colref))
+ // add the remaining required columns
+ CColRefSetIter crsi(*pcrsOutput);
+ while (crsi.Advance())
{
- CDXLNode *pdxlnPrEl = CTranslatorExprToDXLUtils::PdxlnProjElem(
- m_mp, m_phmcrdxln, colref);
- pdxlnPrL->AddChild(pdxlnPrEl);
- pcrs->Include(colref);
+ CColRef *colref = crsi.Pcr();
+
+ if (!pcrs->FMember(colref))
+ {
+ CDXLNode *pdxlnPrEl = CTranslatorExprToDXLUtils::PdxlnProjElem(
+ m_mp, m_phmcrdxln, colref);
+ pdxlnPrL->AddChild(pdxlnPrEl);
+ pcrs->Include(colref);
+ }
}
}
pcrs->Release();
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformDelete2DML.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformDelete2DML.cpp
index 57f9029d156..25fdf238258 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformDelete2DML.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformDelete2DML.cpp
@@ -80,6 +80,9 @@ CXformDelete2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
CColRefArray *colref_array = popDelete->Pdrgpcr();
colref_array->AddRef();
+ CColRefArray *pdrgpcrOutput = popDelete->PdrgpcrOutput();
+ pdrgpcrOutput->AddRef();
+
CColRef *pcrCtid = popDelete->PcrCtid();
CColRef *pcrSegmentId = popDelete->PcrSegmentId();
@@ -93,7 +96,7 @@ CXformDelete2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
// create logical DML
CExpression *pexprAlt = CXformUtils::PexprLogicalDMLOverProject(
mp, pexprChild, CLogicalDML::EdmlDelete, ptabdesc, colref_array,
- pcrCtid, pcrSegmentId, pcrTableOid);
+ pdrgpcrOutput, pcrCtid, pcrSegmentId, pcrTableOid);
// add alternative to transformation result
pxfres->Add(pexprAlt);
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformImplementDML.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformImplementDML.cpp
index a02e3b1fb93..1755b3ec117 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformImplementDML.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformImplementDML.cpp
@@ -82,6 +82,8 @@ CXformImplementDML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
CColRefArray *pdrgpcrSource = popDML->PdrgpcrSource();
pdrgpcrSource->AddRef();
+ CColRefArray *pdrgpcrOutput = popDML->PdrgpcrOutput();
+ pdrgpcrOutput->AddRef();
CBitSet *pbsModified = popDML->PbsModified();
pbsModified->AddRef();
@@ -98,7 +100,7 @@ CXformImplementDML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
// create physical DML
CExpression *pexprAlt = GPOS_NEW(mp) CExpression(
mp,
- GPOS_NEW(mp) CPhysicalDML(mp, edmlop, ptabdesc, pdrgpcrSource,
+ GPOS_NEW(mp) CPhysicalDML(mp, edmlop, ptabdesc, pdrgpcrSource, pdrgpcrOutput,
pbsModified, pcrAction, pcrCtid, pcrSegmentId,
pcrTupleOid, pcrTableOid),
pexprChild);
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformInsert2DML.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformInsert2DML.cpp
index c39a4eddda3..9451fa6c151 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformInsert2DML.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformInsert2DML.cpp
@@ -80,6 +80,9 @@ CXformInsert2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
CColRefArray *pdrgpcrSource = popInsert->PdrgpcrSource();
pdrgpcrSource->AddRef();
+ CColRefArray *pdrgpcrOutput = popInsert->PdrgpcrOutput();
+ pdrgpcrOutput->AddRef();
+
// child of insert operator
CExpression *pexprChild = (*pexpr)[0];
pexprChild->AddRef();
@@ -87,6 +90,7 @@ CXformInsert2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
// create logical DML
CExpression *pexprAlt = CXformUtils::PexprLogicalDMLOverProject(
mp, pexprChild, CLogicalDML::EdmlInsert, ptabdesc, pdrgpcrSource,
+ pdrgpcrOutput,
NULL, //pcrCtid
NULL, //pcrSegmentId
NULL //pcrTable
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformUpdate2DML.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformUpdate2DML.cpp
index 9bfbd823adf..2cc9ea2bc5f 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformUpdate2DML.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformUpdate2DML.cpp
@@ -84,6 +84,7 @@ CXformUpdate2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
CTableDescriptor *ptabdesc = popUpdate->Ptabdesc();
CColRefArray *pdrgpcrDelete = popUpdate->PdrgpcrDelete();
CColRefArray *pdrgpcrInsert = popUpdate->PdrgpcrInsert();
+ CColRefArray *pdrgpcrOutput = popUpdate->PdrgpcrOutput();
CColRef *pcrCtid = popUpdate->PcrCtid();
CColRef *pcrSegmentId = popUpdate->PcrSegmentId();
CColRef *pcrTupleOid = popUpdate->PcrTupleOid();
@@ -160,11 +161,12 @@ CXformUpdate2DML::Transform(CXformContext *pxfctxt, CXformResult *pxfres,
// create logical DML
ptabdesc->AddRef();
pdrgpcrDelete->AddRef();
+ pdrgpcrOutput->AddRef();
CExpression *pexprDML = GPOS_NEW(mp) CExpression(
mp,
GPOS_NEW(mp) CLogicalDML(mp, CLogicalDML::EdmlUpdate, ptabdesc,
- pdrgpcrDelete, pbsModified, pcrAction, pcrCtid,
- pcrSegmentId, pcrTupleOid, pcrTableOid),
+ pdrgpcrDelete, pdrgpcrOutput, pbsModified, pcrAction, pcrCtid,
+ pcrSegmentId, pcrTupleOid, pcrTableOid),
pexprAssertConstraints);
// TODO: - Oct 30, 2012; detect and handle AFTER triggers on update
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformUtils.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformUtils.cpp
index d7512648b69..7363f1231aa 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformUtils.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformUtils.cpp
@@ -1312,7 +1312,7 @@ CXformUtils::PexprLogicalPartitionSelector(CMemoryPool *mp,
CExpression *
CXformUtils::PexprLogicalDMLOverProject(
CMemoryPool *mp, CExpression *pexprChild, CLogicalDML::EDMLOperator edmlop,
- CTableDescriptor *ptabdesc, CColRefArray *colref_array, CColRef *pcrCtid,
+ CTableDescriptor *ptabdesc, CColRefArray *colref_array, CColRefArray *pdrgpcrOutput, CColRef *pcrCtid,
CColRef *pcrSegmentId, CColRef *pcrTableOid)
{
GPOS_ASSERT(CLogicalDML::EdmlInsert == edmlop ||
@@ -1353,7 +1353,7 @@ CXformUtils::PexprLogicalDMLOverProject(
CExpression *pexprDML = GPOS_NEW(mp) CExpression(
mp,
- GPOS_NEW(mp) CLogicalDML(mp, edmlop, ptabdesc, colref_array,
+ GPOS_NEW(mp) CLogicalDML(mp, edmlop, ptabdesc, colref_array, pdrgpcrOutput,
GPOS_NEW(mp) CBitSet(mp) /*pbsModified*/,
pcrAction, pcrCtid, pcrSegmentId,
NULL /*pcrTupleOid*/, pcrTableOid),
@@ -1407,6 +1407,39 @@ CXformUtils::FTriggersExist(CLogicalDML::EDMLOperator edmlop,
return false;
}
+//---------------------------------------------------------------------------
+// @function:
+// CXformUtils::FTriggersExist
+//
+// @doc:
+// Check whether there are any row-level triggers on
+// the given table that match the given DML operation
+//
+//---------------------------------------------------------------------------
+BOOL
+CXformUtils::FTriggersExist(CLogicalDML::EDMLOperator edmlop,
+ CTableDescriptor *ptabdesc)
+{
+ CMDAccessor *md_accessor = COptCtxt::PoctxtFromTLS()->Pmda();
+ const IMDRelation *pmdrel = md_accessor->RetrieveRel(ptabdesc->MDId());
+ const ULONG ulTriggers = pmdrel->TriggerCount();
+
+ for (ULONG ul = 0; ul < ulTriggers; ul++)
+ {
+ const IMDTrigger *pmdtrigger =
+ md_accessor->RetrieveTrigger(pmdrel->TriggerMDidAt(ul));
+ if (!pmdtrigger->IsEnabled() || !pmdtrigger->ExecutesOnRowLevel() ||
+ !FTriggerApplies(edmlop, pmdtrigger))
+ {
+ continue;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
//---------------------------------------------------------------------------
// @function:
// CXformUtils::FTriggerApplies
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLTableDescr.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLTableDescr.h
index df9705590f5..00b9142ea1b 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLTableDescr.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLTableDescr.h
@@ -87,6 +87,13 @@ class CDXLTableDescr : public CRefCount
// user id
ULONG GetExecuteAsUserId() const;
+ // get the column descriptor array
+ const CDXLColDescrArray *
+ GetColumnDescr() const
+ {
+ return m_dxl_column_descr_array;
+ }
+
// get the column descriptor at the given position
const CDXLColDescr *GetColumnDescrAt(ULONG idx) const;
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDML.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDML.cpp
index d98b2b80598..a20781161d6 100644
--- a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDML.cpp
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDML.cpp
@@ -172,11 +172,14 @@ CDXLPhysicalDML::SerializeToDXL(CXMLSerializer *xml_serializer,
// serialize project list
(*node)[0]->SerializeToDXL(xml_serializer);
+ // serialize project list for returning list
+ (*node)[1]->SerializeToDXL(xml_serializer);
+
// serialize table descriptor
m_dxl_table_descr->SerializeToDXL(xml_serializer);
// serialize physical child
- (*node)[1]->SerializeToDXL(xml_serializer);
+ (*node)[2]->SerializeToDXL(xml_serializer);
xml_serializer->CloseElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
@@ -194,8 +197,8 @@ CDXLPhysicalDML::SerializeToDXL(CXMLSerializer *xml_serializer,
void
CDXLPhysicalDML::AssertValid(const CDXLNode *node, BOOL validate_children) const
{
- GPOS_ASSERT(2 == node->Arity());
- CDXLNode *child_dxlnode = (*node)[1];
+ GPOS_ASSERT(3 == node->Arity());
+ CDXLNode *child_dxlnode = (*node)[2];
GPOS_ASSERT(EdxloptypePhysical ==
child_dxlnode->GetOperator()->GetDXLOperatorType());
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDML.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDML.cpp
index 3a78d517472..d1e7964fb79 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDML.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDML.cpp
@@ -145,6 +145,13 @@ CParseHandlerPhysicalDML::StartElement(const XMLCh *const, // element_uri,
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(table_descr_parse_handler);
+ // parse handler for the returning proj list
+ CParseHandlerBase *proj_list_output_parse_handler =
+ CParseHandlerFactory::GetParseHandler(
+ m_mp, CDXLTokens::XmlstrToken(EdxltokenScalarProjList),
+ m_parse_handler_mgr, this);
+ m_parse_handler_mgr->ActivateParseHandler(proj_list_output_parse_handler);
+
// parse handler for the proj list
CParseHandlerBase *proj_list_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -170,6 +177,7 @@ CParseHandlerPhysicalDML::StartElement(const XMLCh *const, // element_uri,
this->Append(prop_parse_handler);
this->Append(direct_dispatch_parse_handler);
this->Append(proj_list_parse_handler);
+ this->Append(proj_list_output_parse_handler);
this->Append(table_descr_parse_handler);
this->Append(child_parse_handler);
}
@@ -199,7 +207,7 @@ CParseHandlerPhysicalDML::EndElement(const XMLCh *const, // element_uri,
str->GetBuffer());
}
- GPOS_ASSERT(5 == this->Length());
+ GPOS_ASSERT(6 == this->Length());
CParseHandlerProperties *prop_parse_handler =
dynamic_cast((*this)[0]);
@@ -217,15 +225,20 @@ CParseHandlerPhysicalDML::EndElement(const XMLCh *const, // element_uri,
GPOS_ASSERT(NULL != proj_list_parse_handler);
GPOS_ASSERT(NULL != proj_list_parse_handler->CreateDXLNode());
+ CParseHandlerProjList *proj_list_output_parse_handler =
+ dynamic_cast((*this)[3]);
+ GPOS_ASSERT(NULL != proj_list_output_parse_handler);
+ GPOS_ASSERT(NULL != proj_list_output_parse_handler->CreateDXLNode());
+
CParseHandlerTableDescr *table_descr_parse_handler =
- dynamic_cast((*this)[3]);
+ dynamic_cast((*this)[4]);
GPOS_ASSERT(NULL != table_descr_parse_handler);
GPOS_ASSERT(NULL != table_descr_parse_handler->GetDXLTableDescr());
CDXLTableDescr *table_descr = table_descr_parse_handler->GetDXLTableDescr();
table_descr->AddRef();
CParseHandlerPhysicalOp *child_parse_handler =
- dynamic_cast((*this)[4]);
+ dynamic_cast((*this)[5]);
GPOS_ASSERT(NULL != child_parse_handler);
GPOS_ASSERT(NULL != child_parse_handler->CreateDXLNode());
@@ -242,6 +255,7 @@ CParseHandlerPhysicalDML::EndElement(const XMLCh *const, // element_uri,
CParseHandlerUtils::SetProperties(m_dxl_node, prop_parse_handler);
AddChildFromParseHandler(proj_list_parse_handler);
+ AddChildFromParseHandler(proj_list_output_parse_handler);
AddChildFromParseHandler(child_parse_handler);
#ifdef GPOS_DEBUG
diff --git a/src/backend/gporca/server/src/unittest/gpopt/minidump/CDMLTest.cpp b/src/backend/gporca/server/src/unittest/gpopt/minidump/CDMLTest.cpp
index 00eefe0d279..86b7bb5312c 100644
--- a/src/backend/gporca/server/src/unittest/gpopt/minidump/CDMLTest.cpp
+++ b/src/backend/gporca/server/src/unittest/gpopt/minidump/CDMLTest.cpp
@@ -28,6 +28,7 @@ ULONG CDMLTest::m_ulDMLTestCounter = 0; // start from first test
// minidump files
const CHAR *rgszDMLFileNames[] = {
"../data/dxl/minidump/Insert.mdp",
+ "../data/dxl/minidump/InsertIntoReturning.mdp",
"../data/dxl/minidump/MultipleUpdateWithJoinOnDistCol.mdp",
"../data/dxl/minidump/UpdatingNonDistributionColumnFunc.mdp",
"../data/dxl/minidump/UpdatingMultipleColumn.mdp",
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index d14dd2013d8..232b797d210 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -1339,6 +1339,7 @@ _copyDML(const DML *from)
COPY_SCALAR_FIELD(tupleoidColIdx);
COPY_SCALAR_FIELD(tableoidColIdx);
COPY_SCALAR_FIELD(canSetTag);
+ COPY_NODE_FIELD(returningList);
return newnode;
}
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 1f2938a15e6..4aeca5a3c8c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -1219,6 +1219,7 @@ _outDML(StringInfo str, const DML *node)
WRITE_INT_FIELD(tupleoidColIdx);
WRITE_INT_FIELD(tableoidColIdx);
WRITE_BOOL_FIELD(canSetTag);
+ WRITE_NODE_FIELD(returningList);
_outPlanInfo(str, (Plan *) node);
}
diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c
index db590df1a12..f9da665c20c 100644
--- a/src/backend/nodes/readfast.c
+++ b/src/backend/nodes/readfast.c
@@ -2240,6 +2240,7 @@ _readDML(void)
READ_INT_FIELD(tupleoidColIdx);
READ_INT_FIELD(tableoidColIdx);
READ_BOOL_FIELD(canSetTag);
+ READ_NODE_FIELD(returningList);
readPlanInfo((Plan *)local_node);
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index f832db6271a..c677b48b54f 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -248,7 +248,10 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
}
if (result)
+ {
+ result->hasReturning = (parse->returningList != NIL);
return result;
+ }
}
/*
diff --git a/src/include/gpopt/translate/CTranslatorQueryToDXL.h b/src/include/gpopt/translate/CTranslatorQueryToDXL.h
index f90a916cd21..4761b2c0901 100644
--- a/src/include/gpopt/translate/CTranslatorQueryToDXL.h
+++ b/src/include/gpopt/translate/CTranslatorQueryToDXL.h
@@ -211,6 +211,10 @@ class CTranslatorQueryToDXL
// translate an Expr into CDXLNode
CDXLNode *TranslateExprToDXL(Expr *expr);
+ // translate an Expr into CDXLNode with specified mapping
+ CDXLNode *TranslateExprToDXL(Expr *expr,
+ CMappingVarColId *var_to_colid_map);
+
// translate the JoinExpr (inside FromExpr) into a CDXLLogicalJoin node
CDXLNode *TranslateJoinExprInFromToDXL(JoinExpr *join_expr);
@@ -298,6 +302,11 @@ class CTranslatorQueryToDXL
CDXLNode *TranslateExprToDXLProject(Expr *expr, const CHAR *alias_name,
BOOL insist_new_colids = false);
+ // translate a target list entry or a join alias entry into a project element using specified mapping
+ CDXLNode *TranslateExprToDXLProject(Expr *expr, const CHAR *alias_name,
+ CMappingVarColId *var_to_colid_map,
+ BOOL insist_new_colids = false);
+
// translate a CTE into a DXL logical CTE operator
CDXLNode *TranslateCTEToDXL(const RangeTblEntry *rte, ULONG rti,
ULONG current_query_level);
@@ -423,6 +432,11 @@ class CTranslatorQueryToDXL
// returns the corresponding ColId for the given system attribute numbber
ULONG GetSystemColId(INT attribute_number);
+ // Wrap dxl node in logical project with return columns from returningList
+ CDXLNode *ProcessReturningList(
+ CDXLNode *dml_dxlnode, CDXLTableDescr *table_descr,
+ IntToUlongMap *output_attno_to_colid_mapping);
+
public:
// dtor
~CTranslatorQueryToDXL();
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index 21e8e8c88b1..b162e9c11bc 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -1330,6 +1330,7 @@ typedef struct DML
AttrNumber tupleoidColIdx; /* index of tuple oid column into the target list */
AttrNumber tableoidColIdx; /* index of table oid column into the target list */
bool canSetTag; /* calculate processed tuples */
+ List *returningList; /* return-values list (of TargetEntry) */
} DML;
/*