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; /*