From 219fe0c4fd60662a481a2a927835c6309e02a995 Mon Sep 17 00:00:00 2001 From: Jesse Zhang Date: Thu, 17 Sep 2020 11:19:38 -0700 Subject: [PATCH] Format ORCA and GPOPT. The canonical config file is in src/backend/gpopt/.clang-format (instead of under the non-existent src/backend/gporca), I've created one (instead of two) symlink, for GPOPT headers. Care has been taken to repoint the symlink to the canonical config under gpopt, instead of gpopt as it is under HEAD. This is spiritually a cherry-pick of commit 2f7dd76cadee68dc. (cherry picked from commit 2f7dd76cadee68dc279b4fee866fe940e16fc9d7) --- src/backend/gpopt/CGPOptimizer.cpp | 80 +- .../gpopt/config/CConfigParamMapping.cpp | 653 ++- src/backend/gpopt/gpdbwrappers.cpp | 1289 ++---- .../gpopt/relcache/CMDProviderRelcache.cpp | 22 +- src/backend/gpopt/translate/CCTEListEntry.cpp | 97 +- .../gpopt/translate/CContextDXLToPlStmt.cpp | 95 +- .../gpopt/translate/CDXLTranslateContext.cpp | 57 +- .../CDXLTranslateContextBaseTable.cpp | 32 +- .../gpopt/translate/CMappingColIdVar.cpp | 7 +- .../translate/CMappingColIdVarPlStmt.cpp | 55 +- .../translate/CMappingElementColIdParamId.cpp | 20 +- .../translate/CMappingElementColIdTE.cpp | 13 +- .../gpopt/translate/CMappingVarColId.cpp | 364 +- .../gpopt/translate/CQueryMutators.cpp | 994 +++-- .../translate/CTranslatorDXLToPlStmt.cpp | 3883 ++++++++--------- .../translate/CTranslatorDXLToScalar.cpp | 1119 ++--- .../gpopt/translate/CTranslatorQueryToDXL.cpp | 2589 +++++------ .../translate/CTranslatorRelcacheToDXL.cpp | 1825 ++++---- .../translate/CTranslatorScalarToDXL.cpp | 1309 +++--- .../gpopt/translate/CTranslatorUtils.cpp | 1281 +++--- src/backend/gpopt/utils/CCatalogUtils.cpp | 6 +- .../gpopt/utils/CConstExprEvaluatorProxy.cpp | 42 +- src/backend/gpopt/utils/CMemoryPoolPalloc.cpp | 29 +- .../gpopt/utils/CMemoryPoolPallocManager.cpp | 14 +- src/backend/gpopt/utils/COptTasks.cpp | 794 ++-- src/backend/gpopt/utils/funcs.cpp | 6 +- src/include/gpopt/.clang-format | 1 + src/include/gpopt/CGPOptimizer.h | 48 +- .../gpopt/config/CConfigParamMapping.h | 74 +- src/include/gpopt/gpdbwrappers.h | 955 ++-- .../gpopt/relcache/CMDProviderRelcache.h | 89 +- src/include/gpopt/translate/CCTEListEntry.h | 183 +- .../gpopt/translate/CContextDXLToPlStmt.h | 298 +- .../gpopt/translate/CDXLTranslateContext.h | 134 +- .../translate/CDXLTranslateContextBaseTable.h | 89 +- src/include/gpopt/translate/CGPDBAttInfo.h | 176 +- src/include/gpopt/translate/CGPDBAttOptCol.h | 95 +- src/include/gpopt/translate/CIndexQualInfo.h | 127 +- .../gpopt/translate/CMappingColIdVar.h | 58 +- .../gpopt/translate/CMappingColIdVarPlStmt.h | 104 +- .../translate/CMappingElementColIdParamId.h | 105 +- .../gpopt/translate/CMappingElementColIdTE.h | 85 +- .../gpopt/translate/CMappingVarColId.h | 258 +- src/include/gpopt/translate/COptColInfo.h | 156 +- src/include/gpopt/translate/CQueryMutators.h | 430 +- .../gpopt/translate/CTranslatorDXLToPlStmt.h | 1307 +++--- .../gpopt/translate/CTranslatorDXLToScalar.h | 618 ++- .../gpopt/translate/CTranslatorQueryToDXL.h | 889 ++-- .../translate/CTranslatorRelcacheToDXL.h | 758 ++-- .../gpopt/translate/CTranslatorScalarToDXL.h | 827 ++-- .../gpopt/translate/CTranslatorUtils.h | 688 ++- src/include/gpopt/utils/CCatalogUtils.h | 31 +- .../gpopt/utils/CConstExprEvaluatorProxy.h | 162 +- src/include/gpopt/utils/CMemoryPoolPalloc.h | 67 +- .../gpopt/utils/CMemoryPoolPallocManager.h | 42 +- src/include/gpopt/utils/COptClient.h | 166 +- src/include/gpopt/utils/COptServer.h | 182 +- src/include/gpopt/utils/COptTasks.h | 387 +- src/include/gpopt/utils/funcs.h | 8 +- src/include/gpopt/utils/gpdbdefs.h | 46 +- 60 files changed, 11911 insertions(+), 14407 deletions(-) create mode 120000 src/include/gpopt/.clang-format diff --git a/src/backend/gpopt/CGPOptimizer.cpp b/src/backend/gpopt/CGPOptimizer.cpp index 7ad9d4132d..99dd491d70 100644 --- a/src/backend/gpopt/CGPOptimizer.cpp +++ b/src/backend/gpopt/CGPOptimizer.cpp @@ -40,24 +40,26 @@ extern MemoryContext MessageContext; // //--------------------------------------------------------------------------- PlannedStmt * -CGPOptimizer::GPOPTOptimizedPlan - ( +CGPOptimizer::GPOPTOptimizedPlan( Query *query, - bool *had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan - ) + bool * + had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan +) { SOptContext gpopt_context; - PlannedStmt* plStmt = NULL; + PlannedStmt *plStmt = NULL; GPOS_TRY { - plStmt = COptTasks::GPOPTOptimizedPlan(query, &gpopt_context, had_unexpected_failure); + plStmt = COptTasks::GPOPTOptimizedPlan(query, &gpopt_context, + had_unexpected_failure); // clean up context gpopt_context.Free(gpopt_context.epinQuery, gpopt_context.epinPlStmt); } GPOS_CATCH_EX(ex) { // clone the error message before context free. - CHAR* serialized_error_msg = gpopt_context.CloneErrorMsg(MessageContext); + CHAR *serialized_error_msg = + gpopt_context.CloneErrorMsg(MessageContext); // clean up context gpopt_context.Free(gpopt_context.epinQuery, gpopt_context.epinPlStmt); @@ -66,36 +68,41 @@ CGPOptimizer::GPOPTOptimizedPlan // tries to do something smart with them. Also, ERRCODE_INTERNAL_ERROR // is handled specially in elog.c, and we don't want that for "normal" // application errors. - if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLNotNullViolation)) + if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, + gpdxl::ExmiQuery2DXLNotNullViolation)) { errstart(ERROR, ex.Filename(), ex.Line(), NULL, TEXTDOMAIN); errfinish(errcode(ERRCODE_NOT_NULL_VIOLATION), - errmsg("%s", serialized_error_msg)); + errmsg("%s", serialized_error_msg)); } else if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, gpdxl::ExmiOptimizerError) || - NULL != serialized_error_msg) + NULL != serialized_error_msg) { Assert(NULL != serialized_error_msg); errstart(ERROR, ex.Filename(), ex.Line(), NULL, TEXTDOMAIN); errfinish(errcode(ERRCODE_INTERNAL_ERROR), - errmsg("%s", serialized_error_msg)); + errmsg("%s", serialized_error_msg)); } else if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) { PG_RE_THROW(); } - else if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, gpdxl::ExmiNoAvailableMemory)) + else if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, + gpdxl::ExmiNoAvailableMemory)) { errstart(ERROR, ex.Filename(), ex.Line(), NULL, TEXTDOMAIN); errfinish(errcode(ERRCODE_INTERNAL_ERROR), - errmsg("No available memory to allocate string buffer.")); + errmsg("No available memory to allocate string buffer.")); } - else if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, gpdxl::ExmiInvalidComparisonTypeCode)) + else if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, + gpdxl::ExmiInvalidComparisonTypeCode)) { errstart(ERROR, ex.Filename(), ex.Line(), NULL, TEXTDOMAIN); - errfinish(errcode(ERRCODE_INTERNAL_ERROR), - errmsg("Invalid comparison type code. Valid values are Eq, NEq, LT, LEq, GT, GEq.")); + errfinish( + errcode(ERRCODE_INTERNAL_ERROR), + errmsg( + "Invalid comparison type code. Valid values are Eq, NEq, LT, LEq, GT, GEq.")); } } GPOS_CATCH_END; @@ -112,10 +119,7 @@ CGPOptimizer::GPOPTOptimizedPlan // //--------------------------------------------------------------------------- char * -CGPOptimizer::SerializeDXLPlan - ( - Query *query - ) +CGPOptimizer::SerializeDXLPlan(Query *query) { return COptTasks::Optimize(query); } @@ -129,9 +133,8 @@ CGPOptimizer::SerializeDXLPlan // //--------------------------------------------------------------------------- void -CGPOptimizer::InitGPOPT () +CGPOptimizer::InitGPOPT() { - if (optimizer_use_gpdb_allocators) { CMemoryPoolPallocManager::Init(); @@ -153,7 +156,7 @@ CGPOptimizer::InitGPOPT () // //--------------------------------------------------------------------------- void -CGPOptimizer::TerminateGPOPT () +CGPOptimizer::TerminateGPOPT() { gpopt_terminate(); gpdxl_terminate(); @@ -168,13 +171,9 @@ CGPOptimizer::TerminateGPOPT () // Expose GP optimizer API to C files // //--------------------------------------------------------------------------- -extern "C" -{ -PlannedStmt *GPOPTOptimizedPlan - ( - Query *query, - bool *had_unexpected_failure - ) +extern "C" { +PlannedStmt * +GPOPTOptimizedPlan(Query *query, bool *had_unexpected_failure) { return CGPOptimizer::GPOPTOptimizedPlan(query, had_unexpected_failure); } @@ -188,12 +187,9 @@ PlannedStmt *GPOPTOptimizedPlan // Serialize planned statement to DXL // //--------------------------------------------------------------------------- -extern "C" -{ -char *SerializeDXLPlan - ( - Query *query - ) +extern "C" { +char * +SerializeDXLPlan(Query *query) { return CGPOptimizer::SerializeDXLPlan(query); } @@ -207,9 +203,9 @@ char *SerializeDXLPlan // Initialize GPTOPT and dependent libraries // //--------------------------------------------------------------------------- -extern "C" -{ -void InitGPOPT () +extern "C" { +void +InitGPOPT() { GPOS_TRY { @@ -234,9 +230,9 @@ void InitGPOPT () // Terminate GPOPT and dependent libraries // //--------------------------------------------------------------------------- -extern "C" -{ -void TerminateGPOPT () +extern "C" { +void +TerminateGPOPT() { GPOS_TRY { diff --git a/src/backend/gpopt/config/CConfigParamMapping.cpp b/src/backend/gpopt/config/CConfigParamMapping.cpp index 979e35cab6..bb1f987843 100644 --- a/src/backend/gpopt/config/CConfigParamMapping.cpp +++ b/src/backend/gpopt/config/CConfigParamMapping.cpp @@ -24,377 +24,249 @@ using namespace gpdxl; using namespace gpopt; // array mapping GUCs to traceflags -CConfigParamMapping::SConfigMappingElem CConfigParamMapping::m_elements[] = -{ - { - EopttracePrintQuery, - &optimizer_print_query, - false, // m_negate_param - GPOS_WSZ_LIT("Prints the optimizer's input query expression tree.") - }, - - { - EopttracePrintPlan, - &optimizer_print_plan, - false, // m_negate_param - GPOS_WSZ_LIT("Prints the plan expression tree produced by the optimizer.") - }, - - { - EopttracePrintXform, - &optimizer_print_xform, - false, // m_negate_param - GPOS_WSZ_LIT("Prints the input and output expression trees of the optimizer transformations.") - }, - - { - EopttracePrintXformResults, - &optimizer_print_xform_results, - false, // m_negate_param - GPOS_WSZ_LIT("Print input and output of xforms.") - }, - - { - EopttracePrintMemoAfterExploration, - &optimizer_print_memo_after_exploration, - false, // m_negate_param - GPOS_WSZ_LIT("Prints MEMO after exploration.") - }, - - { - EopttracePrintMemoAfterImplementation, - &optimizer_print_memo_after_implementation, - false, // m_negate_param - GPOS_WSZ_LIT("Prints MEMO after implementation.") - }, - - { - EopttracePrintMemoAfterOptimization, - &optimizer_print_memo_after_optimization, - false, // m_negate_param - GPOS_WSZ_LIT("Prints MEMO after optimization.") - }, - - { - EopttracePrintJobScheduler, - &optimizer_print_job_scheduler, - false, // m_negate_param - GPOS_WSZ_LIT("Prints jobs in scheduler on each job completion.") - }, - - { - EopttracePrintExpressionProperties, - &optimizer_print_expression_properties, - false, // m_negate_param - GPOS_WSZ_LIT("Prints expression properties.") - }, - - { - EopttracePrintGroupProperties, - &optimizer_print_group_properties, - false, // m_negate_param - GPOS_WSZ_LIT("Prints group properties.") - }, - - { - EopttracePrintOptimizationContext, - &optimizer_print_optimization_context, - false, // m_negate_param - GPOS_WSZ_LIT("Prints optimization context.") - }, - - { - EopttracePrintOptimizationStatistics, - &optimizer_print_optimization_stats, - false, // m_negate_param - GPOS_WSZ_LIT("Prints optimization stats.") - }, - - { - EopttraceMinidump, - &optimizer_minidump, - false, // m_fNegate - GPOS_WSZ_LIT("Generate optimizer minidump.") - }, - - { - EopttraceDisableMotions, - &optimizer_enable_motions, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion nodes in optimizer.") - }, - - { - EopttraceDisableMotionBroadcast, - &optimizer_enable_motion_broadcast, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion broadcast nodes in optimizer.") - }, - - { - EopttraceDisableMotionGather, - &optimizer_enable_motion_gather, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion gather nodes in optimizer.") - }, - - { - EopttraceDisableMotionHashDistribute, - &optimizer_enable_motion_redistribute, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion hash-distribute nodes in optimizer.") - }, - - { - EopttraceDisableMotionRandom, - &optimizer_enable_motion_redistribute, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion random nodes in optimizer.") - }, - - { - EopttraceDisableMotionRountedDistribute, - &optimizer_enable_motion_redistribute, - true, // m_negate_param - GPOS_WSZ_LIT("Disable motion routed-distribute nodes in optimizer.") - }, - - { - EopttraceDisableSort, - &optimizer_enable_sort, - true, // m_negate_param - GPOS_WSZ_LIT("Disable sort nodes in optimizer.") - }, +CConfigParamMapping::SConfigMappingElem CConfigParamMapping::m_elements[] = { + {EopttracePrintQuery, &optimizer_print_query, + false, // m_negate_param + GPOS_WSZ_LIT("Prints the optimizer's input query expression tree.")}, + + {EopttracePrintPlan, &optimizer_print_plan, + false, // m_negate_param + GPOS_WSZ_LIT( + "Prints the plan expression tree produced by the optimizer.")}, + + {EopttracePrintXform, &optimizer_print_xform, + false, // m_negate_param + GPOS_WSZ_LIT( + "Prints the input and output expression trees of the optimizer transformations.")}, + + {EopttracePrintXformResults, &optimizer_print_xform_results, + false, // m_negate_param + GPOS_WSZ_LIT("Print input and output of xforms.")}, + + {EopttracePrintMemoAfterExploration, + &optimizer_print_memo_after_exploration, + false, // m_negate_param + GPOS_WSZ_LIT("Prints MEMO after exploration.")}, + + {EopttracePrintMemoAfterImplementation, + &optimizer_print_memo_after_implementation, + false, // m_negate_param + GPOS_WSZ_LIT("Prints MEMO after implementation.")}, + + {EopttracePrintMemoAfterOptimization, + &optimizer_print_memo_after_optimization, + false, // m_negate_param + GPOS_WSZ_LIT("Prints MEMO after optimization.")}, + + {EopttracePrintJobScheduler, &optimizer_print_job_scheduler, + false, // m_negate_param + GPOS_WSZ_LIT("Prints jobs in scheduler on each job completion.")}, + + {EopttracePrintExpressionProperties, &optimizer_print_expression_properties, + false, // m_negate_param + GPOS_WSZ_LIT("Prints expression properties.")}, + + {EopttracePrintGroupProperties, &optimizer_print_group_properties, + false, // m_negate_param + GPOS_WSZ_LIT("Prints group properties.")}, + + {EopttracePrintOptimizationContext, &optimizer_print_optimization_context, + false, // m_negate_param + GPOS_WSZ_LIT("Prints optimization context.")}, + + {EopttracePrintOptimizationStatistics, &optimizer_print_optimization_stats, + false, // m_negate_param + GPOS_WSZ_LIT("Prints optimization stats.")}, + + {EopttraceMinidump, &optimizer_minidump, + false, // m_fNegate + GPOS_WSZ_LIT("Generate optimizer minidump.")}, + + {EopttraceDisableMotions, &optimizer_enable_motions, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion nodes in optimizer.")}, + + {EopttraceDisableMotionBroadcast, &optimizer_enable_motion_broadcast, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion broadcast nodes in optimizer.")}, + + {EopttraceDisableMotionGather, &optimizer_enable_motion_gather, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion gather nodes in optimizer.")}, + + {EopttraceDisableMotionHashDistribute, + &optimizer_enable_motion_redistribute, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion hash-distribute nodes in optimizer.")}, + + {EopttraceDisableMotionRandom, &optimizer_enable_motion_redistribute, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion random nodes in optimizer.")}, + + {EopttraceDisableMotionRountedDistribute, + &optimizer_enable_motion_redistribute, + true, // m_negate_param + GPOS_WSZ_LIT("Disable motion routed-distribute nodes in optimizer.")}, + + {EopttraceDisableSort, &optimizer_enable_sort, + true, // m_negate_param + GPOS_WSZ_LIT("Disable sort nodes in optimizer.")}, + + {EopttraceDisableSpool, &optimizer_enable_materialize, + true, // m_negate_param + GPOS_WSZ_LIT("Disable spool nodes in optimizer.")}, + + {EopttraceDisablePartPropagation, &optimizer_enable_partition_propagation, + true, // m_negate_param + GPOS_WSZ_LIT("Disable partition propagation nodes in optimizer.")}, + + {EopttraceDisablePartSelection, &optimizer_enable_partition_selection, + true, // m_negate_param + GPOS_WSZ_LIT("Disable partition selection in optimizer.")}, + + {EopttraceDisableOuterJoin2InnerJoinRewrite, + &optimizer_enable_outerjoin_rewrite, + true, // m_negate_param + GPOS_WSZ_LIT("Disable outer join to inner join rewrite in optimizer.")}, + + {EopttraceDonotDeriveStatsForAllGroups, + &optimizer_enable_derive_stats_all_groups, + true, // m_negate_param + GPOS_WSZ_LIT("Disable deriving stats for all groups after exploration.")}, + + {EopttraceEnableSpacePruning, &optimizer_enable_space_pruning, + false, // m_negate_param + GPOS_WSZ_LIT("Enable space pruning in optimizer.")}, + + {EopttraceForceMultiStageAgg, &optimizer_force_multistage_agg, + false, // m_negate_param + GPOS_WSZ_LIT( + "Force optimizer to always pick multistage aggregates when such a plan alternative is generated.")}, + + {EopttracePrintColsWithMissingStats, &optimizer_print_missing_stats, + false, // m_negate_param + GPOS_WSZ_LIT("Print columns with missing statistics.")}, + + {EopttraceEnableRedistributeBroadcastHashJoin, + &optimizer_enable_hashjoin_redistribute_broadcast_children, + false, // m_negate_param + GPOS_WSZ_LIT( + "Enable generating hash join plan where outer child is Redistribute and inner child is Broadcast.")}, + + {EopttraceExtractDXLStats, &optimizer_extract_dxl_stats, + false, // m_negate_param + GPOS_WSZ_LIT("Extract plan stats in dxl.")}, + + {EopttraceExtractDXLStatsAllNodes, &optimizer_extract_dxl_stats_all_nodes, + false, // m_negate_param + GPOS_WSZ_LIT("Extract plan stats for all physical dxl nodes.")}, + + {EopttraceDeriveStatsForDPE, &optimizer_dpe_stats, + false, // m_negate_param + GPOS_WSZ_LIT( + "Enable stats derivation of partitioned tables with dynamic partition elimination.")}, + + {EopttraceEnumeratePlans, &optimizer_enumerate_plans, + false, // m_negate_param + GPOS_WSZ_LIT("Enable plan enumeration.")}, + + {EopttraceSamplePlans, &optimizer_sample_plans, + false, // m_negate_param + GPOS_WSZ_LIT("Enable plan sampling.")}, + + {EopttraceEnableCTEInlining, &optimizer_cte_inlining, + false, // m_negate_param + GPOS_WSZ_LIT("Enable CTE inlining.")}, + + {EopttraceEnableConstantExpressionEvaluation, + &optimizer_enable_constant_expression_evaluation, + false, // m_negate_param + GPOS_WSZ_LIT("Enable constant expression evaluation in the optimizer")}, + + {EopttraceUseExternalConstantExpressionEvaluationForInts, + &optimizer_use_external_constant_expression_evaluation_for_ints, + false, // m_negate_param + GPOS_WSZ_LIT( + "Enable constant expression evaluation for integers in the optimizer")}, + + {EopttraceApplyLeftOuter2InnerUnionAllLeftAntiSemiJoinDisregardingStats, + &optimizer_apply_left_outer_to_union_all_disregarding_stats, + false, // m_negate_param + GPOS_WSZ_LIT( + "Always apply Left Outer Join to Inner Join UnionAll Left Anti Semi Join without looking at stats")}, + + {EopttraceRemoveOrderBelowDML, &optimizer_remove_order_below_dml, + false, // m_negate_param + GPOS_WSZ_LIT("Remove OrderBy below a DML operation")}, + + {EopttraceDisableReplicateInnerNLJOuterChild, + &optimizer_enable_broadcast_nestloop_outer_child, + true, // m_negate_param + GPOS_WSZ_LIT( + "Enable plan alternatives where NLJ's outer child is replicated")}, + + {EopttraceMotionHazardHandling, &optimizer_enable_streaming_material, + false, // m_fNegate + GPOS_WSZ_LIT( + "Enable motion hazard handling during NLJ optimization and generate streaming material when appropriate")}, + + {EopttraceDisableNonMasterGatherForDML, + &optimizer_enable_gather_on_segment_for_dml, + true, // m_fNegate + GPOS_WSZ_LIT( + "Enable DML optimization by enforcing a non-master gather when appropriate")}, + + {EopttraceEnforceCorrelatedExecution, &optimizer_enforce_subplans, + false, // m_negate_param + GPOS_WSZ_LIT("Enforce correlated execution in the optimizer")}, + + {EopttraceForceExpandedMDQAs, &optimizer_force_expanded_distinct_aggs, + false, // m_negate_param + GPOS_WSZ_LIT( + "Always pick plans that expand multiple distinct aggregates into join of single distinct aggregate in the optimizer")}, + + {EopttraceDisablePushingCTEConsumerReqsToCTEProducer, + &optimizer_push_requirements_from_consumer_to_producer, + true, // m_negate_param + GPOS_WSZ_LIT( + "Optimize CTE producer plan on requirements enforced on top of CTE consumer")}, + + {EopttraceDisablePruneUnusedComputedColumns, + &optimizer_prune_computed_columns, + true, // m_negate_param + GPOS_WSZ_LIT("Prune unused computed columns when pre-processing query")}, + + {EopttraceForceThreeStageScalarDQA, &optimizer_force_three_stage_scalar_dqa, + false, // m_negate_param + GPOS_WSZ_LIT( + "Force optimizer to always pick 3 stage aggregate plan for scalar distinct qualified aggregate.")}, + + {EopttraceEnableParallelAppend, &optimizer_parallel_union, + false, // m_negate_param + GPOS_WSZ_LIT("Enable parallel execution for UNION/UNION ALL queries.")}, + + {EopttraceArrayConstraints, &optimizer_array_constraints, + false, // m_negate_param + GPOS_WSZ_LIT( + "Allows the constraint framework to derive array constraints in the optimizer.")}, + + {EopttraceForceAggSkewAvoidance, &optimizer_force_agg_skew_avoidance, + false, // m_negate_param + GPOS_WSZ_LIT( + "Always pick a plan for aggregate distinct that minimizes skew.")}, + + {EopttraceExpandFullJoin, &optimizer_enable_full_join, + false, // m_negate_param + GPOS_WSZ_LIT( + "Enable Expand Full Join transform for converting FULL JOIN into UNION ALL.")}, + {EopttracePenalizeSkewedHashJoin, &optimizer_penalize_skew, + true, // m_negate_param + GPOS_WSZ_LIT( + "Penalize a hash join with a skewed redistribute as a child.")}, + {EopttraceTranslateUnusedColrefs, &optimizer_prune_unused_columns, + true, // m_negate_param + GPOS_WSZ_LIT("Prune unused columns from the query.")} - { - EopttraceDisableSpool, - &optimizer_enable_materialize, - true, // m_negate_param - GPOS_WSZ_LIT("Disable spool nodes in optimizer.") - }, - - { - EopttraceDisablePartPropagation, - &optimizer_enable_partition_propagation, - true, // m_negate_param - GPOS_WSZ_LIT("Disable partition propagation nodes in optimizer.") - }, - - { - EopttraceDisablePartSelection, - &optimizer_enable_partition_selection, - true, // m_negate_param - GPOS_WSZ_LIT("Disable partition selection in optimizer.") - }, - - { - EopttraceDisableOuterJoin2InnerJoinRewrite, - &optimizer_enable_outerjoin_rewrite, - true, // m_negate_param - GPOS_WSZ_LIT("Disable outer join to inner join rewrite in optimizer.") - }, - - { - EopttraceDonotDeriveStatsForAllGroups, - &optimizer_enable_derive_stats_all_groups, - true, // m_negate_param - GPOS_WSZ_LIT("Disable deriving stats for all groups after exploration.") - }, - - { - EopttraceEnableSpacePruning, - &optimizer_enable_space_pruning, - false, // m_negate_param - GPOS_WSZ_LIT("Enable space pruning in optimizer.") - }, - - { - EopttraceForceMultiStageAgg, - &optimizer_force_multistage_agg, - false, // m_negate_param - GPOS_WSZ_LIT("Force optimizer to always pick multistage aggregates when such a plan alternative is generated.") - }, - - { - EopttracePrintColsWithMissingStats, - &optimizer_print_missing_stats, - false, // m_negate_param - GPOS_WSZ_LIT("Print columns with missing statistics.") - }, - - { - EopttraceEnableRedistributeBroadcastHashJoin, - &optimizer_enable_hashjoin_redistribute_broadcast_children, - false, // m_negate_param - GPOS_WSZ_LIT("Enable generating hash join plan where outer child is Redistribute and inner child is Broadcast.") - }, - - { - EopttraceExtractDXLStats, - &optimizer_extract_dxl_stats, - false, // m_negate_param - GPOS_WSZ_LIT("Extract plan stats in dxl.") - }, - - { - EopttraceExtractDXLStatsAllNodes, - &optimizer_extract_dxl_stats_all_nodes, - false, // m_negate_param - GPOS_WSZ_LIT("Extract plan stats for all physical dxl nodes.") - }, - - { - EopttraceDeriveStatsForDPE, - &optimizer_dpe_stats, - false, // m_negate_param - GPOS_WSZ_LIT("Enable stats derivation of partitioned tables with dynamic partition elimination.") - }, - - { - EopttraceEnumeratePlans, - &optimizer_enumerate_plans, - false, // m_negate_param - GPOS_WSZ_LIT("Enable plan enumeration.") - }, - - { - EopttraceSamplePlans, - &optimizer_sample_plans, - false, // m_negate_param - GPOS_WSZ_LIT("Enable plan sampling.") - }, - - { - EopttraceEnableCTEInlining, - &optimizer_cte_inlining, - false, // m_negate_param - GPOS_WSZ_LIT("Enable CTE inlining.") - }, - - { - EopttraceEnableConstantExpressionEvaluation, - &optimizer_enable_constant_expression_evaluation, - false, // m_negate_param - GPOS_WSZ_LIT("Enable constant expression evaluation in the optimizer") - }, - - { - EopttraceUseExternalConstantExpressionEvaluationForInts, - &optimizer_use_external_constant_expression_evaluation_for_ints, - false, // m_negate_param - GPOS_WSZ_LIT("Enable constant expression evaluation for integers in the optimizer") - }, - - { - EopttraceApplyLeftOuter2InnerUnionAllLeftAntiSemiJoinDisregardingStats, - &optimizer_apply_left_outer_to_union_all_disregarding_stats, - false, // m_negate_param - GPOS_WSZ_LIT("Always apply Left Outer Join to Inner Join UnionAll Left Anti Semi Join without looking at stats") - }, - - { - EopttraceRemoveOrderBelowDML, - &optimizer_remove_order_below_dml, - false, // m_negate_param - GPOS_WSZ_LIT("Remove OrderBy below a DML operation") - }, - - { - EopttraceDisableReplicateInnerNLJOuterChild, - &optimizer_enable_broadcast_nestloop_outer_child, - true, // m_negate_param - GPOS_WSZ_LIT("Enable plan alternatives where NLJ's outer child is replicated") - }, - - { - EopttraceMotionHazardHandling, - &optimizer_enable_streaming_material, - false, // m_fNegate - GPOS_WSZ_LIT("Enable motion hazard handling during NLJ optimization and generate streaming material when appropriate") - }, - - { - EopttraceDisableNonMasterGatherForDML, - &optimizer_enable_gather_on_segment_for_dml, - true, // m_fNegate - GPOS_WSZ_LIT("Enable DML optimization by enforcing a non-master gather when appropriate") - }, - - { - EopttraceEnforceCorrelatedExecution, - &optimizer_enforce_subplans, - false, // m_negate_param - GPOS_WSZ_LIT("Enforce correlated execution in the optimizer") - }, - - { - EopttraceForceExpandedMDQAs, - &optimizer_force_expanded_distinct_aggs, - false, // m_negate_param - GPOS_WSZ_LIT("Always pick plans that expand multiple distinct aggregates into join of single distinct aggregate in the optimizer") - }, - - { - EopttraceDisablePushingCTEConsumerReqsToCTEProducer, - &optimizer_push_requirements_from_consumer_to_producer, - true, // m_negate_param - GPOS_WSZ_LIT("Optimize CTE producer plan on requirements enforced on top of CTE consumer") - }, - - { - EopttraceDisablePruneUnusedComputedColumns, - &optimizer_prune_computed_columns, - true, // m_negate_param - GPOS_WSZ_LIT("Prune unused computed columns when pre-processing query") - }, - - { - EopttraceForceThreeStageScalarDQA, - &optimizer_force_three_stage_scalar_dqa, - false, // m_negate_param - GPOS_WSZ_LIT("Force optimizer to always pick 3 stage aggregate plan for scalar distinct qualified aggregate.") - }, - - { - EopttraceEnableParallelAppend, - &optimizer_parallel_union, - false, // m_negate_param - GPOS_WSZ_LIT("Enable parallel execution for UNION/UNION ALL queries.") - }, - - { - EopttraceArrayConstraints, - &optimizer_array_constraints, - false, // m_negate_param - GPOS_WSZ_LIT("Allows the constraint framework to derive array constraints in the optimizer.") - }, - - { - EopttraceForceAggSkewAvoidance, - &optimizer_force_agg_skew_avoidance, - false, // m_negate_param - GPOS_WSZ_LIT("Always pick a plan for aggregate distinct that minimizes skew.") - }, - - { - EopttraceExpandFullJoin, - &optimizer_enable_full_join, - false, // m_negate_param - GPOS_WSZ_LIT("Enable Expand Full Join transform for converting FULL JOIN into UNION ALL.") - }, - { - EopttracePenalizeSkewedHashJoin, - &optimizer_penalize_skew, - true, // m_negate_param - GPOS_WSZ_LIT("Penalize a hash join with a skewed redistribute as a child.") - }, - { - EopttraceTranslateUnusedColrefs, - &optimizer_prune_unused_columns, - true, // m_negate_param - GPOS_WSZ_LIT("Prune unused columns from the query.") - } - }; //--------------------------------------------------------------------------- @@ -406,11 +278,10 @@ CConfigParamMapping::SConfigMappingElem CConfigParamMapping::m_elements[] = // //--------------------------------------------------------------------------- CBitSet * -CConfigParamMapping::PackConfigParamInBitset - ( +CConfigParamMapping::PackConfigParamInBitset( CMemoryPool *mp, - ULONG xform_id // number of available xforms - ) + ULONG xform_id // number of available xforms +) { CBitSet *traceflag_bitset = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel); @@ -431,7 +302,7 @@ CConfigParamMapping::PackConfigParamInBitset { #ifdef GPOS_DEBUG BOOL is_traceflag_set = -#endif // GPOS_DEBUG +#endif // GPOS_DEBUG traceflag_bitset->ExchangeSet((ULONG) elem.m_trace_flag); GPOS_ASSERT(!is_traceflag_set); } @@ -447,7 +318,7 @@ CConfigParamMapping::PackConfigParamInBitset { #ifdef GPOS_DEBUG BOOL is_traceflag_set = -#endif // GPOS_DEBUG +#endif // GPOS_DEBUG traceflag_bitset->ExchangeSet(EopttraceDisableXformBase + ul); GPOS_ASSERT(!is_traceflag_set); } @@ -472,18 +343,21 @@ CConfigParamMapping::PackConfigParamInBitset // disable outerjoin to unionall transformation if GUC is turned off if (!optimizer_enable_outerjoin_to_unionall_rewrite) { - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuter2InnerUnionAllLeftAntiSemiJoin)); + traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF( + CXform::ExfLeftOuter2InnerUnionAllLeftAntiSemiJoin)); } // disable Assert MaxOneRow plans if GUC is turned off if (!optimizer_enable_assert_maxonerow) { - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfMaxOneRow2Assert)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfMaxOneRow2Assert)); } if (!optimizer_enable_partial_index) { - CBitSet *heterogeneous_index_bitset = CXform::PbsHeterogeneousIndexXforms(mp); + CBitSet *heterogeneous_index_bitset = + CXform::PbsHeterogeneousIndexXforms(mp); traceflag_bitset->Union(heterogeneous_index_bitset); heterogeneous_index_bitset->Release(); } @@ -499,19 +373,22 @@ CConfigParamMapping::PackConfigParamInBitset if (!optimizer_enable_dynamictablescan) { // disable dynamic table scan if the corresponding GUC is turned off - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfDynamicGet2DynamicTableScan)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfDynamicGet2DynamicTableScan)); } if (!optimizer_enable_tablescan) { // disable table scan if the corresponding GUC is turned off - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfGet2TableScan)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfGet2TableScan)); } if (!optimizer_enable_indexscan) { // disable index scan if the corresponding GUC is turned off - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfIndexGet2IndexScan)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfIndexGet2IndexScan)); } CBitSet *join_heuristic_bitset = NULL; @@ -530,7 +407,8 @@ CConfigParamMapping::PackConfigParamInBitset join_heuristic_bitset = CXform::PbsJoinOrderOnExhaustive2Xforms(mp); break; default: - elog(ERROR, "Invalid value for optimizer_join_order, must \ + elog(ERROR, + "Invalid value for optimizer_join_order, must \ not come here"); break; } @@ -541,15 +419,18 @@ CConfigParamMapping::PackConfigParamInBitset // is turned off independent of the join order algorithm chosen if (!optimizer_enable_associativity) { - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinAssociativity)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinAssociativity)); } // full merge join is disabled in 5x - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfImplementFullOuterMergeJoin)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfImplementFullOuterMergeJoin)); if (!optimizer_enable_full_join) { - traceflag_bitset->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandFullOuterJoin)); + traceflag_bitset->ExchangeSet( + GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandFullOuterJoin)); } if (OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) diff --git a/src/backend/gpopt/gpdbwrappers.cpp b/src/backend/gpopt/gpdbwrappers.cpp index cdeae98903..8cab6cae65 100644 --- a/src/backend/gpopt/gpdbwrappers.cpp +++ b/src/backend/gpopt/gpdbwrappers.cpp @@ -30,31 +30,29 @@ #include "gpopt/gpdbwrappers.h" extern "C" { - #include "utils/memutils.h" -} -#define GP_WRAP_START \ - sigjmp_buf local_sigjmp_buf; \ - { \ - CAutoExceptionStack aes((void **) &PG_exception_stack, (void**) &error_context_stack); \ - if (0 == sigsetjmp(local_sigjmp_buf, 0)) \ - { \ +#include "utils/memutils.h" +} +#define GP_WRAP_START \ + sigjmp_buf local_sigjmp_buf; \ + { \ + CAutoExceptionStack aes((void **) &PG_exception_stack, \ + (void **) &error_context_stack); \ + if (0 == sigsetjmp(local_sigjmp_buf, 0)) \ + { \ aes.SetLocalJmp(&local_sigjmp_buf) -#define GP_WRAP_END \ - } \ - else \ - { \ - GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError); \ - } \ - } \ +#define GP_WRAP_END \ + } \ + else \ + { \ + GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError); \ + } \ + } using namespace gpos; bool -gpdb::BoolFromDatum - ( - Datum d - ) +gpdb::BoolFromDatum(Datum d) { GP_WRAP_START; { @@ -65,10 +63,7 @@ gpdb::BoolFromDatum } Datum -gpdb::DatumFromBool - ( - bool b - ) +gpdb::DatumFromBool(bool b) { GP_WRAP_START; { @@ -79,10 +74,7 @@ gpdb::DatumFromBool } char -gpdb::CharFromDatum - ( - Datum d - ) +gpdb::CharFromDatum(Datum d) { GP_WRAP_START; { @@ -93,10 +85,7 @@ gpdb::CharFromDatum } Datum -gpdb::DatumFromChar - ( - char c - ) +gpdb::DatumFromChar(char c) { GP_WRAP_START; { @@ -107,10 +96,7 @@ gpdb::DatumFromChar } int8 -gpdb::Int8FromDatum - ( - Datum d - ) +gpdb::Int8FromDatum(Datum d) { GP_WRAP_START; { @@ -121,10 +107,7 @@ gpdb::Int8FromDatum } Datum -gpdb::DatumFromInt8 - ( - int8 i8 - ) +gpdb::DatumFromInt8(int8 i8) { GP_WRAP_START; { @@ -135,10 +118,7 @@ gpdb::DatumFromInt8 } uint8 -gpdb::Uint8FromDatum - ( - Datum d - ) +gpdb::Uint8FromDatum(Datum d) { GP_WRAP_START; { @@ -149,10 +129,7 @@ gpdb::Uint8FromDatum } Datum -gpdb::DatumFromUint8 - ( - uint8 ui8 - ) +gpdb::DatumFromUint8(uint8 ui8) { GP_WRAP_START; { @@ -163,10 +140,7 @@ gpdb::DatumFromUint8 } int16 -gpdb::Int16FromDatum - ( - Datum d - ) +gpdb::Int16FromDatum(Datum d) { GP_WRAP_START; { @@ -177,10 +151,7 @@ gpdb::Int16FromDatum } Datum -gpdb::DatumFromInt16 - ( - int16 i16 - ) +gpdb::DatumFromInt16(int16 i16) { GP_WRAP_START; { @@ -191,10 +162,7 @@ gpdb::DatumFromInt16 } uint16 -gpdb::Uint16FromDatum - ( - Datum d - ) +gpdb::Uint16FromDatum(Datum d) { GP_WRAP_START; { @@ -205,10 +173,7 @@ gpdb::Uint16FromDatum } Datum -gpdb::DatumFromUint16 - ( - uint16 ui16 - ) +gpdb::DatumFromUint16(uint16 ui16) { GP_WRAP_START; { @@ -219,10 +184,7 @@ gpdb::DatumFromUint16 } int32 -gpdb::Int32FromDatum - ( - Datum d - ) +gpdb::Int32FromDatum(Datum d) { GP_WRAP_START; { @@ -233,10 +195,7 @@ gpdb::Int32FromDatum } Datum -gpdb::DatumFromInt32 - ( - int32 i32 - ) +gpdb::DatumFromInt32(int32 i32) { GP_WRAP_START; { @@ -247,10 +206,7 @@ gpdb::DatumFromInt32 } uint32 -gpdb::lUint32FromDatum - ( - Datum d - ) +gpdb::lUint32FromDatum(Datum d) { GP_WRAP_START; { @@ -261,10 +217,7 @@ gpdb::lUint32FromDatum } Datum -gpdb::DatumFromUint32 - ( - uint32 ui32 - ) +gpdb::DatumFromUint32(uint32 ui32) { GP_WRAP_START; { @@ -275,10 +228,7 @@ gpdb::DatumFromUint32 } int64 -gpdb::Int64FromDatum - ( - Datum d - ) +gpdb::Int64FromDatum(Datum d) { Datum d2 = d; GP_WRAP_START; @@ -290,10 +240,7 @@ gpdb::Int64FromDatum } Datum -gpdb::DatumFromInt64 - ( - int64 i64 - ) +gpdb::DatumFromInt64(int64 i64) { int64 ii64 = i64; GP_WRAP_START; @@ -305,10 +252,7 @@ gpdb::DatumFromInt64 } uint64 -gpdb::Uint64FromDatum - ( - Datum d - ) +gpdb::Uint64FromDatum(Datum d) { GP_WRAP_START; { @@ -319,10 +263,7 @@ gpdb::Uint64FromDatum } Datum -gpdb::DatumFromUint64 - ( - uint64 ui64 - ) +gpdb::DatumFromUint64(uint64 ui64) { GP_WRAP_START; { @@ -333,10 +274,7 @@ gpdb::DatumFromUint64 } Oid -gpdb::OidFromDatum - ( - Datum d - ) +gpdb::OidFromDatum(Datum d) { GP_WRAP_START; { @@ -347,10 +285,7 @@ gpdb::OidFromDatum } void * -gpdb::PointerFromDatum - ( - Datum d - ) +gpdb::PointerFromDatum(Datum d) { GP_WRAP_START; { @@ -361,10 +296,7 @@ gpdb::PointerFromDatum } float4 -gpdb::Float4FromDatum - ( - Datum d - ) +gpdb::Float4FromDatum(Datum d) { GP_WRAP_START; { @@ -375,10 +307,7 @@ gpdb::Float4FromDatum } float8 -gpdb::Float8FromDatum - ( - Datum d - ) +gpdb::Float8FromDatum(Datum d) { GP_WRAP_START; { @@ -389,10 +318,7 @@ gpdb::Float8FromDatum } Datum -gpdb::DatumFromPointer - ( - const void *p - ) +gpdb::DatumFromPointer(const void *p) { GP_WRAP_START; { @@ -403,10 +329,7 @@ gpdb::DatumFromPointer } bool -gpdb::AggregateExists - ( - Oid oid - ) +gpdb::AggregateExists(Oid oid) { GP_WRAP_START; { @@ -417,11 +340,7 @@ gpdb::AggregateExists } Bitmapset * -gpdb::BmsAddMember - ( - Bitmapset *a, - int x - ) +gpdb::BmsAddMember(Bitmapset *a, int x) { GP_WRAP_START; { @@ -432,10 +351,7 @@ gpdb::BmsAddMember } void * -gpdb::CopyObject - ( - void *from - ) +gpdb::CopyObject(void *from) { GP_WRAP_START; { @@ -446,12 +362,7 @@ gpdb::CopyObject } Size -gpdb::DatumSize - ( - Datum value, - bool type_by_val, - int iTypLen - ) +gpdb::DatumSize(Datum value, bool type_by_val, int iTypLen) { GP_WRAP_START; { @@ -462,33 +373,21 @@ gpdb::DatumSize } void -gpdb::DeconstructArray - ( - struct ArrayType *array, - Oid elmtype, - int elmlen, - bool elmbyval, - char elmalign, - Datum **elemsp, - bool **nullsp, - int *nelemsp - ) +gpdb::DeconstructArray(struct ArrayType *array, Oid elmtype, int elmlen, + bool elmbyval, char elmalign, Datum **elemsp, + bool **nullsp, int *nelemsp) { GP_WRAP_START; { - deconstruct_array(array, elmtype, elmlen, elmbyval, elmalign, elemsp, nullsp, nelemsp); + deconstruct_array(array, elmtype, elmlen, elmbyval, elmalign, elemsp, + nullsp, nelemsp); return; } GP_WRAP_END; } Node * -gpdb::MutateExpressionTree - ( - Node *node, - Node *(*mutator) (), - void *context - ) +gpdb::MutateExpressionTree(Node *node, Node *(*mutator)(), void *context) { GP_WRAP_START; { @@ -499,12 +398,7 @@ gpdb::MutateExpressionTree } bool -gpdb::WalkExpressionTree - ( - Node *node, - bool (*walker) (), - void *context - ) +gpdb::WalkExpressionTree(Node *node, bool (*walker)(), void *context) { GP_WRAP_START; { @@ -515,10 +409,7 @@ gpdb::WalkExpressionTree } Oid -gpdb::ExprType - ( - Node *expr - ) +gpdb::ExprType(Node *expr) { GP_WRAP_START; { @@ -529,10 +420,7 @@ gpdb::ExprType } int32 -gpdb::ExprTypeMod - ( - Node *expr - ) +gpdb::ExprTypeMod(Node *expr) { GP_WRAP_START; { @@ -543,12 +431,7 @@ gpdb::ExprTypeMod } List * -gpdb::ExtractNodesPlan - ( - Plan *pl, - int node_tag, - bool descend_into_subqueries - ) +gpdb::ExtractNodesPlan(Plan *pl, int node_tag, bool descend_into_subqueries) { GP_WRAP_START; { @@ -559,26 +442,20 @@ gpdb::ExtractNodesPlan } List * -gpdb::ExtractNodesExpression - ( - Node *node, - int node_tag, - bool descend_into_subqueries - ) +gpdb::ExtractNodesExpression(Node *node, int node_tag, + bool descend_into_subqueries) { GP_WRAP_START; { - return extract_nodes_expression(node, node_tag, descend_into_subqueries); + return extract_nodes_expression(node, node_tag, + descend_into_subqueries); } GP_WRAP_END; return NIL; } void -gpdb::FreeAttrStatsSlot - ( - AttStatsSlot *sslot - ) +gpdb::FreeAttrStatsSlot(AttStatsSlot *sslot) { GP_WRAP_START; { @@ -589,10 +466,7 @@ gpdb::FreeAttrStatsSlot } bool -gpdb::FuncStrict - ( - Oid funcid - ) +gpdb::FuncStrict(Oid funcid) { GP_WRAP_START; { @@ -604,10 +478,7 @@ gpdb::FuncStrict } bool -gpdb::IsFuncNDVPreserving - ( - Oid funcid - ) +gpdb::IsFuncNDVPreserving(Oid funcid) { // Given a function oid, return whether it's one of a list of NDV-preserving // functions (estimated NDV of output is similar to that of the input) @@ -626,10 +497,7 @@ gpdb::IsFuncNDVPreserving } char -gpdb::FuncStability - ( - Oid funcid - ) +gpdb::FuncStability(Oid funcid) { GP_WRAP_START; { @@ -641,10 +509,7 @@ gpdb::FuncStability } char -gpdb::FuncDataAccess - ( - Oid funcid - ) +gpdb::FuncDataAccess(Oid funcid) { GP_WRAP_START; { @@ -656,10 +521,7 @@ gpdb::FuncDataAccess } bool -gpdb::FunctionExists - ( - Oid oid - ) +gpdb::FunctionExists(Oid oid) { GP_WRAP_START; { @@ -683,10 +545,7 @@ gpdb::FunctionOids(void) } Oid -gpdb::GetAggIntermediateResultType - ( - Oid aggid - ) +gpdb::GetAggIntermediateResultType(Oid aggid) { GP_WRAP_START; { @@ -698,11 +557,7 @@ gpdb::GetAggIntermediateResultType } Query * -gpdb::FlattenJoinAliasVar - ( - Query *query, - gpos::ULONG query_level - ) +gpdb::FlattenJoinAliasVar(Query *query, gpos::ULONG query_level) { GP_WRAP_START; { @@ -714,10 +569,7 @@ gpdb::FlattenJoinAliasVar } bool -gpdb::IsOrderedAgg - ( - Oid aggid - ) +gpdb::IsOrderedAgg(Oid aggid) { GP_WRAP_START; { @@ -729,10 +581,7 @@ gpdb::IsOrderedAgg } bool -gpdb::AggHasPrelimFunc - ( - Oid aggid - ) +gpdb::AggHasPrelimFunc(Oid aggid) { GP_WRAP_START; { @@ -744,10 +593,7 @@ gpdb::AggHasPrelimFunc } bool -gpdb::AggHasPrelimOrInvPrelimFunc - ( - Oid aggid - ) +gpdb::AggHasPrelimOrInvPrelimFunc(Oid aggid) { GP_WRAP_START; { @@ -759,11 +605,7 @@ gpdb::AggHasPrelimOrInvPrelimFunc } Oid -gpdb::GetAggregate - ( - const char *agg, - Oid type_oid - ) +gpdb::GetAggregate(const char *agg, Oid type_oid) { GP_WRAP_START; { @@ -775,10 +617,7 @@ gpdb::GetAggregate } Oid -gpdb::GetArrayType - ( - Oid typid - ) +gpdb::GetArrayType(Oid typid) { GP_WRAP_START; { @@ -790,14 +629,8 @@ gpdb::GetArrayType } bool -gpdb::GetAttrStatsSlot - ( - AttStatsSlot *sslot, - HeapTuple statstuple, - int reqkind, - Oid reqop, - int flags - ) +gpdb::GetAttrStatsSlot(AttStatsSlot *sslot, HeapTuple statstuple, int reqkind, + Oid reqop, int flags) { GP_WRAP_START; { @@ -808,11 +641,7 @@ gpdb::GetAttrStatsSlot } HeapTuple -gpdb::GetAttStats - ( - Oid relid, - AttrNumber attnum - ) +gpdb::GetAttStats(Oid relid, AttrNumber attnum) { GP_WRAP_START; { @@ -824,10 +653,7 @@ gpdb::GetAttStats } Oid -gpdb::GetCommutatorOp - ( - Oid opno - ) +gpdb::GetCommutatorOp(Oid opno) { GP_WRAP_START; { @@ -839,10 +665,7 @@ gpdb::GetCommutatorOp } char * -gpdb::GetTriggerName - ( - Oid triggerid - ) +gpdb::GetTriggerName(Oid triggerid) { GP_WRAP_START; { @@ -854,10 +677,7 @@ gpdb::GetTriggerName } Oid -gpdb::GetTriggerRelid - ( - Oid triggerid - ) +gpdb::GetTriggerRelid(Oid triggerid) { GP_WRAP_START; { @@ -869,10 +689,7 @@ gpdb::GetTriggerRelid } Oid -gpdb::GetTriggerFuncid - ( - Oid triggerid - ) +gpdb::GetTriggerFuncid(Oid triggerid) { GP_WRAP_START; { @@ -884,10 +701,7 @@ gpdb::GetTriggerFuncid } int32 -gpdb::GetTriggerType - ( - Oid triggerid - ) +gpdb::GetTriggerType(Oid triggerid) { GP_WRAP_START; { @@ -899,10 +713,7 @@ gpdb::GetTriggerType } bool -gpdb::IsTriggerEnabled - ( - Oid triggerid - ) +gpdb::IsTriggerEnabled(Oid triggerid) { GP_WRAP_START; { @@ -914,10 +725,7 @@ gpdb::IsTriggerEnabled } bool -gpdb::TriggerExists - ( - Oid oid - ) +gpdb::TriggerExists(Oid oid) { GP_WRAP_START; { @@ -929,10 +737,7 @@ gpdb::TriggerExists } bool -gpdb::CheckConstraintExists - ( - Oid check_constraint_oid - ) +gpdb::CheckConstraintExists(Oid check_constraint_oid) { GP_WRAP_START; { @@ -944,10 +749,7 @@ gpdb::CheckConstraintExists } char * -gpdb::GetCheckConstraintName - ( - Oid check_constraint_oid - ) +gpdb::GetCheckConstraintName(Oid check_constraint_oid) { GP_WRAP_START; { @@ -959,10 +761,7 @@ gpdb::GetCheckConstraintName } Oid -gpdb::GetCheckConstraintRelid - ( - Oid check_constraint_oid - ) +gpdb::GetCheckConstraintRelid(Oid check_constraint_oid) { GP_WRAP_START; { @@ -974,10 +773,7 @@ gpdb::GetCheckConstraintRelid } Node * -gpdb::PnodeCheckConstraint - ( - Oid check_constraint_oid - ) +gpdb::PnodeCheckConstraint(Oid check_constraint_oid) { GP_WRAP_START; { @@ -989,10 +785,7 @@ gpdb::PnodeCheckConstraint } List * -gpdb::GetCheckConstraintOids - ( - Oid rel_oid - ) +gpdb::GetCheckConstraintOids(Oid rel_oid) { GP_WRAP_START; { @@ -1004,11 +797,7 @@ gpdb::GetCheckConstraintOids } Node * -gpdb::GetRelationPartContraints - ( - Oid rel_oid, - List **default_levels - ) +gpdb::GetRelationPartContraints(Oid rel_oid, List **default_levels) { GP_WRAP_START; { @@ -1020,10 +809,7 @@ gpdb::GetRelationPartContraints } bool -gpdb::HasExternalPartition - ( - Oid oid - ) +gpdb::HasExternalPartition(Oid oid) { GP_WRAP_START; { @@ -1036,10 +822,7 @@ gpdb::HasExternalPartition bool -gpdb::IsLeafPartition - ( - Oid oid - ) +gpdb::IsLeafPartition(Oid oid) { GP_WRAP_START; { @@ -1051,10 +834,7 @@ gpdb::IsLeafPartition } Oid -gpdb::GetRootPartition - ( - Oid oid - ) +gpdb::GetRootPartition(Oid oid) { GP_WRAP_START; { @@ -1066,31 +846,21 @@ gpdb::GetRootPartition } bool -gpdb::GetCastFunc - ( - Oid src_oid, - Oid dest_oid, - bool *is_binary_coercible, - Oid *cast_fn_oid, - CoercionPathType *pathtype - ) +gpdb::GetCastFunc(Oid src_oid, Oid dest_oid, bool *is_binary_coercible, + Oid *cast_fn_oid, CoercionPathType *pathtype) { GP_WRAP_START; { /* catalog tables: pg_cast */ - return get_cast_func(src_oid, dest_oid, is_binary_coercible, cast_fn_oid, pathtype); + return get_cast_func(src_oid, dest_oid, is_binary_coercible, + cast_fn_oid, pathtype); } GP_WRAP_END; return false; } unsigned int -gpdb::GetComparisonType - ( - Oid op_oid, - Oid left_oid, - Oid right_oid - ) +gpdb::GetComparisonType(Oid op_oid, Oid left_oid, Oid right_oid) { GP_WRAP_START; { @@ -1102,12 +872,7 @@ gpdb::GetComparisonType } Oid -gpdb::GetComparisonOperator - ( - Oid left_oid, - Oid right_oid, - unsigned int cmpt - ) +gpdb::GetComparisonOperator(Oid left_oid, Oid right_oid, unsigned int cmpt) { GP_WRAP_START; { @@ -1119,10 +884,7 @@ gpdb::GetComparisonOperator } Oid -gpdb::GetEqualityOp - ( - Oid type_oid - ) +gpdb::GetEqualityOp(Oid type_oid) { GP_WRAP_START; { @@ -1134,10 +896,7 @@ gpdb::GetEqualityOp } char * -gpdb::GetFuncName - ( - Oid funcid - ) +gpdb::GetFuncName(Oid funcid) { GP_WRAP_START; { @@ -1149,10 +908,7 @@ gpdb::GetFuncName } List * -gpdb::GetFuncOutputArgTypes - ( - Oid funcid - ) +gpdb::GetFuncOutputArgTypes(Oid funcid) { GP_WRAP_START; { @@ -1164,10 +920,7 @@ gpdb::GetFuncOutputArgTypes } List * -gpdb::GetFuncArgTypes - ( - Oid funcid - ) +gpdb::GetFuncArgTypes(Oid funcid) { GP_WRAP_START; { @@ -1179,10 +932,7 @@ gpdb::GetFuncArgTypes } bool -gpdb::GetFuncRetset - ( - Oid funcid - ) +gpdb::GetFuncRetset(Oid funcid) { GP_WRAP_START; { @@ -1194,10 +944,7 @@ gpdb::GetFuncRetset } Oid -gpdb::GetFuncRetType - ( - Oid funcid - ) +gpdb::GetFuncRetType(Oid funcid) { GP_WRAP_START; { @@ -1209,10 +956,7 @@ gpdb::GetFuncRetType } Oid -gpdb::GetInverseOp - ( - Oid opno - ) +gpdb::GetInverseOp(Oid opno) { GP_WRAP_START; { @@ -1224,10 +968,7 @@ gpdb::GetInverseOp } RegProcedure -gpdb::GetOpFunc - ( - Oid opno - ) +gpdb::GetOpFunc(Oid opno) { GP_WRAP_START; { @@ -1239,10 +980,7 @@ gpdb::GetOpFunc } char * -gpdb::GetOpName - ( - Oid opno - ) +gpdb::GetOpName(Oid opno) { GP_WRAP_START; { @@ -1254,10 +992,7 @@ gpdb::GetOpName } List * -gpdb::GetPartitionAttrs - ( - Oid oid - ) +gpdb::GetPartitionAttrs(Oid oid) { GP_WRAP_START; { @@ -1270,12 +1005,7 @@ gpdb::GetPartitionAttrs } void -gpdb::GetOrderedPartKeysAndKinds - ( - Oid oid, - List **pkeys, - List **pkinds - ) +gpdb::GetOrderedPartKeysAndKinds(Oid oid, List **pkeys, List **pkinds) { GP_WRAP_START; { @@ -1286,14 +1016,8 @@ gpdb::GetOrderedPartKeysAndKinds } PartitionNode * -gpdb::GetParts - ( - Oid relid, - int2 level, - Oid parent, - bool inctemplate, - bool includesubparts - ) +gpdb::GetParts(Oid relid, int2 level, Oid parent, bool inctemplate, + bool includesubparts) { GP_WRAP_START; { @@ -1305,10 +1029,7 @@ gpdb::GetParts } List * -gpdb::GetRelationKeys - ( - Oid relid - ) +gpdb::GetRelationKeys(Oid relid) { GP_WRAP_START; { @@ -1320,10 +1041,7 @@ gpdb::GetRelationKeys } Oid -gpdb::GetTypeRelid - ( - Oid typid - ) +gpdb::GetTypeRelid(Oid typid) { GP_WRAP_START; { @@ -1335,10 +1053,7 @@ gpdb::GetTypeRelid } char * -gpdb::GetTypeName - ( - Oid typid - ) +gpdb::GetTypeName(Oid typid) { GP_WRAP_START; { @@ -1361,11 +1076,7 @@ gpdb::GetGPSegmentCount(void) } bool -gpdb::HeapAttIsNull - ( - HeapTuple tup, - int attno - ) +gpdb::HeapAttIsNull(HeapTuple tup, int attno) { GP_WRAP_START; { @@ -1376,10 +1087,7 @@ gpdb::HeapAttIsNull } void -gpdb::FreeHeapTuple - ( - HeapTuple htup - ) +gpdb::FreeHeapTuple(HeapTuple htup) { GP_WRAP_START; { @@ -1390,10 +1098,7 @@ gpdb::FreeHeapTuple } bool -gpdb::IndexExists - ( - Oid oid - ) +gpdb::IndexExists(Oid oid) { GP_WRAP_START; { @@ -1405,10 +1110,7 @@ gpdb::IndexExists } bool -gpdb::IsGreenplumDbHashable - ( - Oid typid - ) +gpdb::IsGreenplumDbHashable(Oid typid) { GP_WRAP_START; { @@ -1420,11 +1122,7 @@ gpdb::IsGreenplumDbHashable } List * -gpdb::LAppend - ( - List *list, - void *datum - ) +gpdb::LAppend(List *list, void *datum) { GP_WRAP_START; { @@ -1435,11 +1133,7 @@ gpdb::LAppend } List * -gpdb::LAppendInt - ( - List *list, - int iDatum - ) +gpdb::LAppendInt(List *list, int iDatum) { GP_WRAP_START; { @@ -1450,11 +1144,7 @@ gpdb::LAppendInt } List * -gpdb::LAppendOid - ( - List *list, - Oid datum - ) +gpdb::LAppendOid(List *list, Oid datum) { GP_WRAP_START; { @@ -1465,11 +1155,7 @@ gpdb::LAppendOid } List * -gpdb::LPrepend - ( - void *datum, - List *list - ) +gpdb::LPrepend(void *datum, List *list) { GP_WRAP_START; { @@ -1480,11 +1166,7 @@ gpdb::LPrepend } List * -gpdb::LPrependInt - ( - int datum, - List *list - ) +gpdb::LPrependInt(int datum, List *list) { GP_WRAP_START; { @@ -1495,11 +1177,7 @@ gpdb::LPrependInt } List * -gpdb::LPrependOid - ( - Oid datum, - List *list - ) +gpdb::LPrependOid(Oid datum, List *list) { GP_WRAP_START; { @@ -1510,11 +1188,7 @@ gpdb::LPrependOid } List * -gpdb::ListConcat - ( - List *list1, - List *list2 - ) +gpdb::ListConcat(List *list1, List *list2) { GP_WRAP_START; { @@ -1525,10 +1199,7 @@ gpdb::ListConcat } List * -gpdb::ListCopy - ( - List *list - ) +gpdb::ListCopy(List *list) { GP_WRAP_START; { @@ -1539,10 +1210,7 @@ gpdb::ListCopy } ListCell * -gpdb::ListHead - ( - List *l - ) +gpdb::ListHead(List *l) { GP_WRAP_START; { @@ -1553,10 +1221,7 @@ gpdb::ListHead } ListCell * -gpdb::ListTail - ( - List *l - ) +gpdb::ListTail(List *l) { GP_WRAP_START; { @@ -1567,10 +1232,7 @@ gpdb::ListTail } uint32 -gpdb::ListLength - ( - List *l - ) +gpdb::ListLength(List *l) { GP_WRAP_START; { @@ -1581,11 +1243,7 @@ gpdb::ListLength } void * -gpdb::ListNth - ( - List *list, - int n - ) +gpdb::ListNth(List *list, int n) { GP_WRAP_START; { @@ -1596,11 +1254,7 @@ gpdb::ListNth } int -gpdb::ListNthInt - ( - List *list, - int n - ) +gpdb::ListNthInt(List *list, int n) { GP_WRAP_START; { @@ -1611,11 +1265,7 @@ gpdb::ListNthInt } Oid -gpdb::ListNthOid - ( - List *list, - int n - ) +gpdb::ListNthOid(List *list, int n) { GP_WRAP_START; { @@ -1626,11 +1276,7 @@ gpdb::ListNthOid } bool -gpdb::ListMemberOid - ( - List *list, - Oid oid - ) +gpdb::ListMemberOid(List *list, Oid oid) { GP_WRAP_START; { @@ -1641,10 +1287,7 @@ gpdb::ListMemberOid } void -gpdb::ListFree - ( - List *list - ) +gpdb::ListFree(List *list) { GP_WRAP_START; { @@ -1655,10 +1298,7 @@ gpdb::ListFree } void -gpdb::ListFreeDeep - ( - List *list - ) +gpdb::ListFreeDeep(List *list) { GP_WRAP_START; { @@ -1669,10 +1309,7 @@ gpdb::ListFreeDeep } bool -gpdb::IsMotionGather - ( - const Motion *motion - ) +gpdb::IsMotionGather(const Motion *motion) { GP_WRAP_START; { @@ -1683,10 +1320,7 @@ gpdb::IsMotionGather } bool -gpdb::IsAppendOnlyPartitionTable - ( - Oid root_oid - ) +gpdb::IsAppendOnlyPartitionTable(Oid root_oid) { GP_WRAP_START; { @@ -1697,10 +1331,7 @@ gpdb::IsAppendOnlyPartitionTable } bool -gpdb::IsMultilevelPartitionUniform - ( - Oid root_oid - ) +gpdb::IsMultilevelPartitionUniform(Oid root_oid) { GP_WRAP_START; { @@ -1712,11 +1343,7 @@ gpdb::IsMultilevelPartitionUniform } TypeCacheEntry * -gpdb::LookupTypeCache - ( - Oid type_id, - int flags - ) +gpdb::LookupTypeCache(Oid type_id, int flags) { GP_WRAP_START; { @@ -1728,10 +1355,7 @@ gpdb::LookupTypeCache } Value * -gpdb::MakeStringValue - ( - char *str - ) +gpdb::MakeStringValue(char *str) { GP_WRAP_START; { @@ -1742,10 +1366,7 @@ gpdb::MakeStringValue } Value * -gpdb::MakeIntegerValue - ( - long i - ) +gpdb::MakeIntegerValue(long i) { GP_WRAP_START; { @@ -1756,11 +1377,7 @@ gpdb::MakeIntegerValue } Node * -gpdb::MakeBoolConst - ( - bool value, - bool isnull - ) +gpdb::MakeBoolConst(bool value, bool isnull) { GP_WRAP_START; { @@ -1771,10 +1388,7 @@ gpdb::MakeBoolConst } Node * -gpdb::MakeNULLConst - ( - Oid type_oid - ) +gpdb::MakeNULLConst(Oid type_oid) { GP_WRAP_START; { @@ -1785,13 +1399,7 @@ gpdb::MakeNULLConst } TargetEntry * -gpdb::MakeTargetEntry - ( - Expr *expr, - AttrNumber resno, - char *resname, - bool resjunk - ) +gpdb::MakeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk) { GP_WRAP_START; { @@ -1802,14 +1410,8 @@ gpdb::MakeTargetEntry } Var * -gpdb::MakeVar - ( - Index varno, - AttrNumber varattno, - Oid vartype, - int32 vartypmod, - Index varlevelsup - ) +gpdb::MakeVar(Index varno, AttrNumber varattno, Oid vartype, int32 vartypmod, + Index varlevelsup) { GP_WRAP_START; { @@ -1820,14 +1422,8 @@ gpdb::MakeVar } void * -gpdb::MemCtxtAllocImpl - ( - MemoryContext context, - Size size, - const char* file, - const char * func, - int line - ) +gpdb::MemCtxtAllocImpl(MemoryContext context, Size size, const char *file, + const char *func, int line) { GP_WRAP_START; { @@ -1838,32 +1434,21 @@ gpdb::MemCtxtAllocImpl } void * -gpdb::MemCtxtAllocZeroAlignedImpl - ( - MemoryContext context, - Size size, - const char* file, - const char * func, - int line - ) +gpdb::MemCtxtAllocZeroAlignedImpl(MemoryContext context, Size size, + const char *file, const char *func, int line) { GP_WRAP_START; { - return MemoryContextAllocZeroAlignedImpl(context, size, file, func, line); + return MemoryContextAllocZeroAlignedImpl(context, size, file, func, + line); } GP_WRAP_END; return NULL; } void * -gpdb::MemCtxtAllocZeroImpl - ( - MemoryContext context, - Size size, - const char* file, - const char * func, - int line - ) +gpdb::MemCtxtAllocZeroImpl(MemoryContext context, Size size, const char *file, + const char *func, int line) { GP_WRAP_START; { @@ -1874,14 +1459,8 @@ gpdb::MemCtxtAllocZeroImpl } void * -gpdb::MemCtxtReallocImpl - ( - void *pointer, - Size size, - const char* file, - const char * func, - int line - ) +gpdb::MemCtxtReallocImpl(void *pointer, Size size, const char *file, + const char *func, int line) { GP_WRAP_START; { @@ -1892,11 +1471,7 @@ gpdb::MemCtxtReallocImpl } char * -gpdb::MemCtxtStrdup - ( - MemoryContext context, - const char *string - ) +gpdb::MemCtxtStrdup(MemoryContext context, const char *string) { GP_WRAP_START; { @@ -1910,16 +1485,9 @@ gpdb::MemCtxtStrdup // would with ereport(...) in the backend. This could be extended for other // fields, but this is all we need at the moment. void -gpdb::GpdbEreportImpl - ( - int xerrcode, - int severitylevel, - const char *xerrmsg, - const char *xerrhint, - const char *filename, - int lineno, - const char *funcname - ) +gpdb::GpdbEreportImpl(int xerrcode, int severitylevel, const char *xerrmsg, + const char *xerrhint, const char *filename, int lineno, + const char *funcname) { GP_WRAP_START; { @@ -1929,18 +1497,14 @@ gpdb::GpdbEreportImpl // GP_WRAP_END, and propagated up as a C++ exception, to be // re-thrown as a Postgres error once we leave the C++ land. if (errstart(severitylevel, filename, lineno, funcname, TEXTDOMAIN)) - errfinish (errcode(xerrcode), - errmsg("%s", xerrmsg), - xerrhint ? errhint("%s", xerrhint) : 0); + errfinish(errcode(xerrcode), errmsg("%s", xerrmsg), + xerrhint ? errhint("%s", xerrhint) : 0); } GP_WRAP_END; } char * -gpdb::NodeToString - ( - void *obj - ) +gpdb::NodeToString(void *obj) { GP_WRAP_START; { @@ -1951,14 +1515,11 @@ gpdb::NodeToString } Node * -gpdb::StringToNode - ( - char *string - ) +gpdb::StringToNode(char *string) { GP_WRAP_START; { - return (Node*) stringToNode(string); + return (Node *) stringToNode(string); } GP_WRAP_END; return NULL; @@ -1966,10 +1527,7 @@ gpdb::StringToNode Node * -gpdb::GetTypeDefault - ( - Oid typid - ) +gpdb::GetTypeDefault(Oid typid) { GP_WRAP_START; { @@ -1982,10 +1540,7 @@ gpdb::GetTypeDefault double -gpdb::NumericToDoubleNoOverflow - ( - Numeric num - ) +gpdb::NumericToDoubleNoOverflow(Numeric num) { GP_WRAP_START; { @@ -1996,11 +1551,7 @@ gpdb::NumericToDoubleNoOverflow } double -gpdb::ConvertTimeValueToScalar - ( - Datum datum, - Oid typid - ) +gpdb::ConvertTimeValueToScalar(Datum datum, Oid typid) { GP_WRAP_START; { @@ -2011,11 +1562,7 @@ gpdb::ConvertTimeValueToScalar } double -gpdb::ConvertNetworkToScalar - ( - Datum datum, - Oid typid - ) +gpdb::ConvertNetworkToScalar(Datum datum, Oid typid) { GP_WRAP_START; { @@ -2026,10 +1573,7 @@ gpdb::ConvertNetworkToScalar } bool -gpdb::IsOpHashJoinable - ( - Oid opno - ) +gpdb::IsOpHashJoinable(Oid opno) { GP_WRAP_START; { @@ -2041,10 +1585,7 @@ gpdb::IsOpHashJoinable } bool -gpdb::IsOpMergeJoinable - ( - Oid opno - ) +gpdb::IsOpMergeJoinable(Oid opno) { GP_WRAP_START; { @@ -2056,10 +1597,7 @@ gpdb::IsOpMergeJoinable } bool -gpdb::IsOpStrict - ( - Oid opno - ) +gpdb::IsOpStrict(Oid opno) { GP_WRAP_START; { @@ -2071,10 +1609,7 @@ gpdb::IsOpStrict } bool -gpdb::IsOpNDVPreserving - ( - Oid opno - ) +gpdb::IsOpNDVPreserving(Oid opno) { switch (opno) { @@ -2089,12 +1624,7 @@ gpdb::IsOpNDVPreserving } void -gpdb::GetOpInputTypes - ( - Oid opno, - Oid *lefttype, - Oid *righttype - ) +gpdb::GetOpInputTypes(Oid opno, Oid *lefttype, Oid *righttype) { GP_WRAP_START; { @@ -2106,10 +1636,7 @@ gpdb::GetOpInputTypes } bool -gpdb::OperatorExists - ( - Oid oid - ) +gpdb::OperatorExists(Oid oid) { GP_WRAP_START; { @@ -2121,10 +1648,7 @@ gpdb::OperatorExists } void * -gpdb::GPDBAlloc - ( - Size size - ) +gpdb::GPDBAlloc(Size size) { GP_WRAP_START; { @@ -2135,10 +1659,7 @@ gpdb::GPDBAlloc } void -gpdb::GPDBFree - ( - void *ptr - ) +gpdb::GPDBFree(void *ptr) { GP_WRAP_START; { @@ -2149,10 +1670,7 @@ gpdb::GPDBFree } struct varlena * -gpdb::DetoastDatum - ( - struct varlena * datum - ) +gpdb::DetoastDatum(struct varlena *datum) { GP_WRAP_START; { @@ -2163,13 +1681,8 @@ gpdb::DetoastDatum } bool -gpdb::WalkQueryOrExpressionTree - ( - Node *node, - bool (*walker) (), - void *context, - int flags - ) +gpdb::WalkQueryOrExpressionTree(Node *node, bool (*walker)(), void *context, + int flags) { GP_WRAP_START; { @@ -2180,13 +1693,8 @@ gpdb::WalkQueryOrExpressionTree } Node * -gpdb::MutateQueryOrExpressionTree - ( - Node *node, - Node *(*mutator) (), - void *context, - int flags - ) +gpdb::MutateQueryOrExpressionTree(Node *node, Node *(*mutator)(), void *context, + int flags) { GP_WRAP_START; { @@ -2197,13 +1705,8 @@ gpdb::MutateQueryOrExpressionTree } Query * -gpdb::MutateQueryTree - ( - Query *query, - Node *(*mutator) (), - void *context, - int flags - ) +gpdb::MutateQueryTree(Query *query, Node *(*mutator)(), void *context, + int flags) { GP_WRAP_START; { @@ -2214,13 +1717,8 @@ gpdb::MutateQueryTree } List * -gpdb::MutateRangeTable - ( - List *rtable, - Node *(*mutator) (), - void *context, - int flags - ) +gpdb::MutateRangeTable(List *rtable, Node *(*mutator)(), void *context, + int flags) { GP_WRAP_START; { @@ -2231,10 +1729,7 @@ gpdb::MutateRangeTable } bool -gpdb::RelPartIsRoot - ( - Oid relid - ) +gpdb::RelPartIsRoot(Oid relid) { GP_WRAP_START; { @@ -2245,10 +1740,7 @@ gpdb::RelPartIsRoot } bool -gpdb::RelPartIsInterior - ( - Oid relid - ) +gpdb::RelPartIsInterior(Oid relid) { GP_WRAP_START; { @@ -2259,10 +1751,7 @@ gpdb::RelPartIsInterior } bool -gpdb::RelPartIsNone - ( - Oid relid - ) +gpdb::RelPartIsNone(Oid relid) { GP_WRAP_START; { @@ -2273,10 +1762,7 @@ gpdb::RelPartIsNone } bool -gpdb::FHashPartitioned - ( - char c - ) +gpdb::FHashPartitioned(char c) { GP_WRAP_START; { @@ -2287,10 +1773,7 @@ gpdb::FHashPartitioned } bool -gpdb::FHasSubclass - ( - Oid rel_oid - ) +gpdb::FHasSubclass(Oid rel_oid) { GP_WRAP_START; { @@ -2303,10 +1786,7 @@ gpdb::FHasSubclass bool -gpdb::HasParquetChildren - ( - Oid rel_oid - ) +gpdb::HasParquetChildren(Oid rel_oid) { GP_WRAP_START; { @@ -2318,56 +1798,43 @@ gpdb::HasParquetChildren } GpPolicy * -gpdb::GetDistributionPolicy - ( - Relation rel - ) +gpdb::GetDistributionPolicy(Relation rel) { - GP_WRAP_START; - { - /* catalog tables: pg_class */ - return relation_policy(rel); - } - GP_WRAP_END; - return NULL; + GP_WRAP_START; + { + /* catalog tables: pg_class */ + return relation_policy(rel); + } + GP_WRAP_END; + return NULL; } gpos::BOOL -gpdb::IsChildPartDistributionMismatched - ( - Relation rel - ) +gpdb::IsChildPartDistributionMismatched(Relation rel) { - GP_WRAP_START; - { - /* catalog tables: pg_class, pg_inherits */ - return child_distribution_mismatch(rel); - } - GP_WRAP_END; - return false; + GP_WRAP_START; + { + /* catalog tables: pg_class, pg_inherits */ + return child_distribution_mismatch(rel); + } + GP_WRAP_END; + return false; } gpos::BOOL -gpdb::ChildPartHasTriggers - ( - Oid oid, - int trigger_type - ) -{ - GP_WRAP_START; - { +gpdb::ChildPartHasTriggers(Oid oid, int trigger_type) +{ + GP_WRAP_START; + { /* catalog tables: pg_inherits, pg_trigger */ - return child_triggers(oid, trigger_type); - } - GP_WRAP_END; - return false; + return child_triggers(oid, trigger_type); + } + GP_WRAP_END; + return false; } bool -gpdb::RelationExists - ( - Oid oid - ) +gpdb::RelationExists(Oid oid) { GP_WRAP_START; { @@ -2391,13 +1858,8 @@ gpdb::GetAllRelationOids(void) } void -gpdb::EstimateRelationSize - ( - Relation rel, - int32 *attr_widths, - BlockNumber *pages, - double *tuples - ) +gpdb::EstimateRelationSize(Relation rel, int32 *attr_widths, BlockNumber *pages, + double *tuples) { GP_WRAP_START; { @@ -2408,29 +1870,21 @@ gpdb::EstimateRelationSize } void -gpdb::CdbEstimateRelationSize - ( - RelOptInfo *relOptInfo, - Relation rel, - int32 *attr_widths, - BlockNumber *pages, - double *tuples, - bool *default_stats_used - ) +gpdb::CdbEstimateRelationSize(RelOptInfo *relOptInfo, Relation rel, + int32 *attr_widths, BlockNumber *pages, + double *tuples, bool *default_stats_used) { GP_WRAP_START; { - cdb_estimate_rel_size(relOptInfo, rel, rel, attr_widths, pages, tuples, default_stats_used); + cdb_estimate_rel_size(relOptInfo, rel, rel, attr_widths, pages, tuples, + default_stats_used); return; } GP_WRAP_END; } void -gpdb::CloseRelation - ( - Relation rel - ) +gpdb::CloseRelation(Relation rel) { GP_WRAP_START; { @@ -2441,10 +1895,7 @@ gpdb::CloseRelation } List * -gpdb::GetRelationIndexes - ( - Relation relation - ) +gpdb::GetRelationIndexes(Relation relation) { GP_WRAP_START; { @@ -2459,10 +1910,7 @@ gpdb::GetRelationIndexes } LogicalIndexes * -gpdb::GetLogicalPartIndexes - ( - Oid oid - ) +gpdb::GetLogicalPartIndexes(Oid oid) { GP_WRAP_START; { @@ -2474,11 +1922,7 @@ gpdb::GetLogicalPartIndexes } LogicalIndexInfo * -gpdb::GetLogicalIndexInfo - ( - Oid root_oid, - Oid index_oid - ) +gpdb::GetLogicalIndexInfo(Oid root_oid, Oid index_oid) { GP_WRAP_START; { @@ -2490,10 +1934,7 @@ gpdb::GetLogicalIndexInfo } void -gpdb::BuildRelationTriggers - ( - Relation rel - ) +gpdb::BuildRelationTriggers(Relation rel) { GP_WRAP_START; { @@ -2505,10 +1946,7 @@ gpdb::BuildRelationTriggers } Relation -gpdb::GetRelation - ( - Oid rel_oid - ) +gpdb::GetRelation(Oid rel_oid) { GP_WRAP_START; { @@ -2520,10 +1958,7 @@ gpdb::GetRelation } ExtTableEntry * -gpdb::GetExternalTableEntry - ( - Oid rel_oid - ) +gpdb::GetExternalTableEntry(Oid rel_oid) { GP_WRAP_START; { @@ -2535,11 +1970,7 @@ gpdb::GetExternalTableEntry } TargetEntry * -gpdb::FindFirstMatchingMemberInTargetList - ( - Node *node, - List *targetlist - ) +gpdb::FindFirstMatchingMemberInTargetList(Node *node, List *targetlist) { GP_WRAP_START; { @@ -2550,11 +1981,7 @@ gpdb::FindFirstMatchingMemberInTargetList } List * -gpdb::FindMatchingMembersInTargetList - ( - Node *node, - List *targetlist - ) +gpdb::FindMatchingMembersInTargetList(Node *node, List *targetlist) { GP_WRAP_START; { @@ -2566,11 +1993,7 @@ gpdb::FindMatchingMembersInTargetList } bool -gpdb::Equals - ( - void *p1, - void *p2 - ) +gpdb::Equals(void *p1, void *p2) { GP_WRAP_START; { @@ -2581,10 +2004,7 @@ gpdb::Equals } bool -gpdb::TypeExists - ( - Oid oid - ) +gpdb::TypeExists(Oid oid) { GP_WRAP_START; { @@ -2596,10 +2016,7 @@ gpdb::TypeExists } bool -gpdb::IsCompositeType - ( - Oid typid - ) +gpdb::IsCompositeType(Oid typid) { GP_WRAP_START; { @@ -2611,19 +2028,12 @@ gpdb::IsCompositeType } bool -gpdb::IsTextRelatedType - ( - Oid typid - ) +gpdb::IsTextRelatedType(Oid typid) { GP_WRAP_START; { - if (TEXTOID == typid - || BPCHAROID == typid - || VARCHAROID == typid - || CASHOID == typid - || UUIDOID == typid - || NAMEOID == typid) + if (TEXTOID == typid || BPCHAROID == typid || VARCHAROID == typid || + CASHOID == typid || UUIDOID == typid || NAMEOID == typid) { return true; } @@ -2634,10 +2044,7 @@ gpdb::IsTextRelatedType int -gpdb::GetIntFromValue - ( - Node *node - ) +gpdb::GetIntFromValue(Node *node) { GP_WRAP_START; { @@ -2648,10 +2055,7 @@ gpdb::GetIntFromValue } Uri * -gpdb::ParseExternTableUri - ( - const char *uri - ) +gpdb::ParseExternTableUri(const char *uri) { GP_WRAP_START; { @@ -2674,11 +2078,7 @@ gpdb::GetComponentDatabases(void) } int -gpdb::StrCmpIgnoreCase - ( - const char *s1, - const char *s2 - ) +gpdb::StrCmpIgnoreCase(const char *s1, const char *s2) { GP_WRAP_START; { @@ -2689,11 +2089,7 @@ gpdb::StrCmpIgnoreCase } bool * -gpdb::ConstructRandomSegMap - ( - int total_primaries, - int total_to_skip - ) +gpdb::ConstructRandomSegMap(int total_primaries, int total_to_skip) { GP_WRAP_START; { @@ -2715,12 +2111,7 @@ gpdb::MakeStringInfo(void) } void -gpdb::AppendStringInfo - ( - StringInfo str, - const char *str1, - const char *str2 - ) +gpdb::AppendStringInfo(StringInfo str, const char *str1, const char *str2) { GP_WRAP_START; { @@ -2731,11 +2122,7 @@ gpdb::AppendStringInfo } int -gpdb::FindNodes - ( - Node *node, - List *nodeTags - ) +gpdb::FindNodes(Node *node, List *nodeTags) { GP_WRAP_START; { @@ -2746,54 +2133,35 @@ gpdb::FindNodes } Node * -gpdb::CoerceToCommonType - ( - ParseState *pstate, - Node *node, - Oid target_type, - const char *context - ) +gpdb::CoerceToCommonType(ParseState *pstate, Node *node, Oid target_type, + const char *context) { GP_WRAP_START; { /* catalog tables: pg_type, pg_cast */ - return coerce_to_common_type - ( - pstate, - node, - target_type, - context - ); + return coerce_to_common_type(pstate, node, target_type, context); } GP_WRAP_END; return NULL; } bool -gpdb::ResolvePolymorphicArgType - ( - int numargs, - Oid *argtypes, - char *argmodes, - FuncExpr *call_expr - ) +gpdb::ResolvePolymorphicArgType(int numargs, Oid *argtypes, char *argmodes, + FuncExpr *call_expr) { GP_WRAP_START; { /* catalog tables: pg_proc */ - return resolve_polymorphic_argtypes(numargs, argtypes, argmodes, (Node *)call_expr); + return resolve_polymorphic_argtypes(numargs, argtypes, argmodes, + (Node *) call_expr); } GP_WRAP_END; return false; } // hash a const value with GPDB's hash function -int32 -gpdb::CdbHashConst - ( - Const *constant, - int num_segments - ) +int32 +gpdb::CdbHashConst(Const *constant, int num_segments) { GP_WRAP_START; { @@ -2805,14 +2173,11 @@ gpdb::CdbHashConst // pick a segment randomly from a pool of segments using GPDB's hash function int32 -gpdb::CdbHashRandom - ( - int num_segments - ) +gpdb::CdbHashRandom(int num_segments) { GP_WRAP_START; { - CdbHash *pcdbhash = makeCdbHash(num_segments); + CdbHash *pcdbhash = makeCdbHash(num_segments); cdbhashinit(pcdbhash); @@ -2825,12 +2190,8 @@ gpdb::CdbHashRandom } // hash a list of const values with GPDB's hash function -int32 -gpdb::CdbHashConstList - ( - List *constants, - int num_segments - ) +int32 +gpdb::CdbHashConstList(List *constants, int num_segments) { GP_WRAP_START; { @@ -2842,10 +2203,7 @@ gpdb::CdbHashConstList // check permissions on range table void -gpdb::CheckRTPermissions - ( - List *rtable - ) +gpdb::CheckRTPermissions(List *rtable) { GP_WRAP_START; { @@ -2857,14 +2215,8 @@ gpdb::CheckRTPermissions // get index op family properties void -gpdb::IndexOpProperties - ( - Oid opno, - Oid opfamily, - int *strategy, - Oid *subtype, - bool *recheck - ) +gpdb::IndexOpProperties(Oid opno, Oid opfamily, int *strategy, Oid *subtype, + bool *recheck) { GP_WRAP_START; { @@ -2872,9 +2224,10 @@ gpdb::IndexOpProperties // Only the right type is returned to the caller, the left // type is simply ignored. - Oid lefttype; + Oid lefttype; - get_op_opfamily_properties(opno, opfamily, strategy, &lefttype, subtype, recheck); + get_op_opfamily_properties(opno, opfamily, strategy, &lefttype, subtype, + recheck); return; } GP_WRAP_END; @@ -2882,10 +2235,7 @@ gpdb::IndexOpProperties // get oids of opfamilies for the index keys List * -gpdb::GetIndexOpFamilies - ( - Oid index_oid - ) +gpdb::GetIndexOpFamilies(Oid index_oid) { GP_WRAP_START; { @@ -2895,16 +2245,13 @@ gpdb::GetIndexOpFamilies return get_index_opfamilies(index_oid); } GP_WRAP_END; - + return NIL; } // get oids of families this operator belongs to List * -gpdb::GetOpFamiliesForScOp - ( - Oid opno - ) +gpdb::GetOpFamiliesForScOp(Oid opno) { GP_WRAP_START; { @@ -2915,15 +2262,12 @@ gpdb::GetOpFamiliesForScOp return get_operator_opfamilies(opno); } GP_WRAP_END; - + return NIL; } List * -gpdb::GetMergeJoinOpFamilies - ( - Oid opno - ) +gpdb::GetMergeJoinOpFamilies(Oid opno) { GP_WRAP_START; { @@ -2939,12 +2283,7 @@ gpdb::GetMergeJoinOpFamilies // Evaluates 'expr' and returns the result as an Expr. // Caller keeps ownership of 'expr' and takes ownership of the result Expr * -gpdb::EvaluateExpr - ( - Expr *expr, - Oid result_type, - int32 typmod - ) +gpdb::EvaluateExpr(Expr *expr, Oid result_type, int32 typmod) { GP_WRAP_START; { @@ -2956,10 +2295,7 @@ gpdb::EvaluateExpr // interpret the value of "With oids" option from a list of defelems bool -gpdb::InterpretOidsOption - ( - List *options - ) +gpdb::InterpretOidsOption(List *options) { GP_WRAP_START; { @@ -2970,10 +2306,7 @@ gpdb::InterpretOidsOption } char * -gpdb::DefGetString - ( - DefElem *defelem - ) +gpdb::DefGetString(DefElem *defelem) { GP_WRAP_START; { @@ -2984,10 +2317,7 @@ gpdb::DefGetString } Expr * -gpdb::TransformArrayConstToArrayExpr - ( - Const *c - ) +gpdb::TransformArrayConstToArrayExpr(Const *c) { GP_WRAP_START; { @@ -2998,10 +2328,7 @@ gpdb::TransformArrayConstToArrayExpr } Node * -gpdb::EvalConstExpressions - ( - Node *node - ) +gpdb::EvalConstExpressions(Node *node) { GP_WRAP_START; { @@ -3012,10 +2339,7 @@ gpdb::EvalConstExpressions } SelectedParts * -gpdb::RunStaticPartitionSelection - ( - PartitionSelector *ps - ) +gpdb::RunStaticPartitionSelection(PartitionSelector *ps) { GP_WRAP_START; { @@ -3026,27 +2350,22 @@ gpdb::RunStaticPartitionSelection } FaultInjectorType_e -gpdb::InjectFaultInOptTasks - ( - FaultInjectorIdentifier_e identifier - ) +gpdb::InjectFaultInOptTasks(FaultInjectorIdentifier_e identifier) { // use gpfaultinjector to activate // e.g. gpfaultinjector -f opt_task_allocate_string_buffer -y --seg_dbid 1 // use 'reset' as to clear injected fault GP_WRAP_START; { - return FaultInjector_InjectFaultIfSet(identifier, DDLNotSpecified, "", ""); + return FaultInjector_InjectFaultIfSet(identifier, DDLNotSpecified, "", + ""); } GP_WRAP_END; return FaultInjectorTypeNotSpecified; } gpos::ULONG -gpdb::CountLeafPartTables - ( - Oid rel_oid - ) +gpdb::CountLeafPartTables(Oid rel_oid) { GP_WRAP_START; { @@ -3082,7 +2401,8 @@ static int64 mdcache_invalidation_counter = 0; static int64 last_mdcache_invalidation_counter = 0; static void -mdsyscache_invalidation_counter_callback(Datum arg, int cacheid, ItemPointer tuplePtr) +mdsyscache_invalidation_counter_callback(Datum arg, int cacheid, + ItemPointer tuplePtr) { mdcache_invalidation_counter++; } @@ -3097,18 +2417,18 @@ static void register_mdcache_invalidation_callbacks(void) { /* These are all the catalog tables that we care about. */ - int metadata_caches[] = { - AGGFNOID, /* pg_aggregate */ - AMOPOPID, /* pg_amop */ - CASTSOURCETARGET, /* pg_cast */ - CONSTROID, /* pg_constraint */ - OPEROID, /* pg_operator */ - OPFAMILYOID, /* pg_opfamily */ - PARTOID, /* pg_partition */ - PARTRULEOID, /* pg_partition_rule */ - STATRELATT, /* pg_statistics */ - TYPEOID, /* pg_type */ - PROCOID, /* pg_proc */ + int metadata_caches[] = { + AGGFNOID, /* pg_aggregate */ + AMOPOPID, /* pg_amop */ + CASTSOURCETARGET, /* pg_cast */ + CONSTROID, /* pg_constraint */ + OPEROID, /* pg_operator */ + OPFAMILYOID, /* pg_opfamily */ + PARTOID, /* pg_partition */ + PARTRULEOID, /* pg_partition_rule */ + STATRELATT, /* pg_statistics */ + TYPEOID, /* pg_type */ + PROCOID, /* pg_proc */ /* * lookup_type_cache() will also access pg_opclass, via GetDefaultOpClass(), @@ -3163,10 +2483,7 @@ register_mdcache_invalidation_callbacks(void) // Has there been any catalog changes since last call? bool -gpdb::MDCacheNeedsReset - ( - void - ) +gpdb::MDCacheNeedsReset(void) { GP_WRAP_START; { @@ -3190,10 +2507,7 @@ gpdb::MDCacheNeedsReset // returns true if a query cancel is requested in GPDB bool -gpdb::IsAbortRequested - ( - void - ) +gpdb::IsAbortRequested(void) { return (QueryCancelPending || ProcDiePending); } @@ -3249,11 +2563,7 @@ gpdb::UUIDHash(Datum d) } void * -gpdb::GPDBMemoryContextAlloc - ( - MemoryContext context, - Size size - ) +gpdb::GPDBMemoryContextAlloc(MemoryContext context, Size size) { GP_WRAP_START; { @@ -3278,11 +2588,10 @@ gpdb::GPDBAllocSetContextCreate() { GP_WRAP_START; { - return AllocSetContextCreate(OptimizerMemoryContext, - "GPORCA memory pool", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + return AllocSetContextCreate( + OptimizerMemoryContext, "GPORCA memory pool", + ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); } GP_WRAP_END; return NULL; diff --git a/src/backend/gpopt/relcache/CMDProviderRelcache.cpp b/src/backend/gpopt/relcache/CMDProviderRelcache.cpp index a35736b9df..ea07bb654f 100644 --- a/src/backend/gpopt/relcache/CMDProviderRelcache.cpp +++ b/src/backend/gpopt/relcache/CMDProviderRelcache.cpp @@ -35,12 +35,7 @@ using namespace gpmd; // Constructs a file-based metadata provider // //--------------------------------------------------------------------------- -CMDProviderRelcache::CMDProviderRelcache - ( - CMemoryPool *mp - ) - : - m_mp(mp) +CMDProviderRelcache::CMDProviderRelcache(CMemoryPool *mp) : m_mp(mp) { GPOS_ASSERT(NULL != m_mp); } @@ -54,19 +49,16 @@ CMDProviderRelcache::CMDProviderRelcache // //--------------------------------------------------------------------------- CWStringBase * -CMDProviderRelcache::GetMDObjDXLStr - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *md_id - ) - const +CMDProviderRelcache::GetMDObjDXLStr(CMemoryPool *mp, CMDAccessor *md_accessor, + IMDId *md_id) const { - IMDCacheObject *md_obj = CTranslatorRelcacheToDXL::RetrieveObject(mp, md_accessor, md_id); + IMDCacheObject *md_obj = + CTranslatorRelcacheToDXL::RetrieveObject(mp, md_accessor, md_id); GPOS_ASSERT(NULL != md_obj); - CWStringDynamic *str = CDXLUtils::SerializeMDObj(m_mp, md_obj, true /*fSerializeHeaders*/, false /*findent*/); + CWStringDynamic *str = CDXLUtils::SerializeMDObj( + m_mp, md_obj, true /*fSerializeHeaders*/, false /*findent*/); // cleanup DXL object md_obj->Release(); diff --git a/src/backend/gpopt/translate/CCTEListEntry.cpp b/src/backend/gpopt/translate/CCTEListEntry.cpp index be761aba8f..641255198e 100644 --- a/src/backend/gpopt/translate/CCTEListEntry.cpp +++ b/src/backend/gpopt/translate/CCTEListEntry.cpp @@ -31,27 +31,22 @@ using namespace gpdxl; // Ctor: single CTE // //--------------------------------------------------------------------------- -CCTEListEntry::CCTEListEntry - ( - CMemoryPool *mp, - ULONG query_level, - CommonTableExpr *cte, - CDXLNode *cte_producer - ) - : - m_query_level(query_level), - m_cte_info(NULL) +CCTEListEntry::CCTEListEntry(CMemoryPool *mp, ULONG query_level, + CommonTableExpr *cte, CDXLNode *cte_producer) + : m_query_level(query_level), m_cte_info(NULL) { GPOS_ASSERT(NULL != cte && NULL != cte_producer); - + m_cte_info = GPOS_NEW(mp) HMSzCTEInfo(mp); - Query *cte_query = (Query*) cte->ctequery; - + Query *cte_query = (Query *) cte->ctequery; + #ifdef GPOS_DEBUG - BOOL result = + BOOL result = #endif - m_cte_info->Insert(cte->ctename, GPOS_NEW(mp) SCTEProducerInfo(cte_producer, cte_query->targetList)); - + m_cte_info->Insert( + cte->ctename, + GPOS_NEW(mp) SCTEProducerInfo(cte_producer, cte_query->targetList)); + GPOS_ASSERT(result); } @@ -63,35 +58,30 @@ CCTEListEntry::CCTEListEntry // Ctor: multiple CTEs // //--------------------------------------------------------------------------- -CCTEListEntry::CCTEListEntry - ( - CMemoryPool *mp, - ULONG query_level, - List *cte_list, - CDXLNodeArray *cte_dxl_arr - ) - : - m_query_level(query_level), - m_cte_info(NULL) +CCTEListEntry::CCTEListEntry(CMemoryPool *mp, ULONG query_level, List *cte_list, + CDXLNodeArray *cte_dxl_arr) + : m_query_level(query_level), m_cte_info(NULL) { GPOS_ASSERT(NULL != cte_dxl_arr); GPOS_ASSERT(cte_dxl_arr->Size() == gpdb::ListLength(cte_list)); - + m_cte_info = GPOS_NEW(mp) HMSzCTEInfo(mp); const ULONG num_cte = cte_dxl_arr->Size(); - + for (ULONG ul = 0; ul < num_cte; ul++) { CDXLNode *cte_producer = (*cte_dxl_arr)[ul]; - CommonTableExpr *cte = (CommonTableExpr*) gpdb::ListNth(cte_list, ul); + CommonTableExpr *cte = (CommonTableExpr *) gpdb::ListNth(cte_list, ul); + + Query *cte_query = (Query *) cte->ctequery; - Query *cte_query = (Query*) cte->ctequery; - #ifdef GPOS_DEBUG BOOL result = #endif - m_cte_info->Insert(cte->ctename, GPOS_NEW(mp) SCTEProducerInfo(cte_producer, cte_query->targetList)); - + m_cte_info->Insert(cte->ctename, + GPOS_NEW(mp) SCTEProducerInfo( + cte_producer, cte_query->targetList)); + GPOS_ASSERT(result); GPOS_ASSERT(NULL != m_cte_info->Find(cte->ctename)); } @@ -106,18 +96,14 @@ CCTEListEntry::CCTEListEntry // //--------------------------------------------------------------------------- const CDXLNode * -CCTEListEntry::GetCTEProducer - ( - const CHAR *cte_str - ) - const +CCTEListEntry::GetCTEProducer(const CHAR *cte_str) const { SCTEProducerInfo *cte_info = m_cte_info->Find(cte_str); if (NULL == cte_info) { - return NULL; + return NULL; } - + return cte_info->m_cte_producer; } @@ -130,18 +116,14 @@ CCTEListEntry::GetCTEProducer // //--------------------------------------------------------------------------- List * -CCTEListEntry::GetCTEProducerTargetList - ( - const CHAR *cte_str - ) - const +CCTEListEntry::GetCTEProducerTargetList(const CHAR *cte_str) const { SCTEProducerInfo *cte_info = m_cte_info->Find(cte_str); if (NULL == cte_info) { - return NULL; + return NULL; } - + return cte_info->m_target_list; } @@ -154,21 +136,20 @@ CCTEListEntry::GetCTEProducerTargetList // //--------------------------------------------------------------------------- void -CCTEListEntry::AddCTEProducer - ( - CMemoryPool *mp, - CommonTableExpr *cte, - const CDXLNode *cte_producer - ) +CCTEListEntry::AddCTEProducer(CMemoryPool *mp, CommonTableExpr *cte, + const CDXLNode *cte_producer) { - GPOS_ASSERT(NULL == m_cte_info->Find(cte->ctename) && "CTE entry already exists"); - Query *cte_query = (Query*) cte->ctequery; - + GPOS_ASSERT(NULL == m_cte_info->Find(cte->ctename) && + "CTE entry already exists"); + Query *cte_query = (Query *) cte->ctequery; + #ifdef GPOS_DEBUG BOOL result = #endif - m_cte_info->Insert(cte->ctename, GPOS_NEW(mp) SCTEProducerInfo(cte_producer, cte_query->targetList)); - + m_cte_info->Insert( + cte->ctename, + GPOS_NEW(mp) SCTEProducerInfo(cte_producer, cte_query->targetList)); + GPOS_ASSERT(result); } diff --git a/src/backend/gpopt/translate/CContextDXLToPlStmt.cpp b/src/backend/gpopt/translate/CContextDXLToPlStmt.cpp index cc4360a58b..558c61c1e6 100644 --- a/src/backend/gpopt/translate/CContextDXLToPlStmt.cpp +++ b/src/backend/gpopt/translate/CContextDXLToPlStmt.cpp @@ -33,27 +33,23 @@ using namespace gpdxl; // Ctor // //--------------------------------------------------------------------------- -CContextDXLToPlStmt::CContextDXLToPlStmt - ( - CMemoryPool *mp, - CIdGenerator *plan_id_counter, - CIdGenerator *motion_id_counter, - CIdGenerator *param_id_counter, - List **rtable_entries_list, - List **subplan_entries_list - ) - : - m_mp(mp), - m_plan_id_counter(plan_id_counter), - m_motion_id_counter(motion_id_counter), - m_param_id_counter(param_id_counter), - m_rtable_entries_list(rtable_entries_list), - m_partitioned_tables_list(NULL), - m_num_partition_selectors_array(NULL), - m_subplan_entries_list(subplan_entries_list), - m_result_relation_index(0), - m_into_clause(NULL), - m_distribution_policy(NULL) +CContextDXLToPlStmt::CContextDXLToPlStmt(CMemoryPool *mp, + CIdGenerator *plan_id_counter, + CIdGenerator *motion_id_counter, + CIdGenerator *param_id_counter, + List **rtable_entries_list, + List **subplan_entries_list) + : m_mp(mp), + m_plan_id_counter(plan_id_counter), + m_motion_id_counter(motion_id_counter), + m_param_id_counter(param_id_counter), + m_rtable_entries_list(rtable_entries_list), + m_partitioned_tables_list(NULL), + m_num_partition_selectors_array(NULL), + m_subplan_entries_list(subplan_entries_list), + m_result_relation_index(0), + m_into_clause(NULL), + m_distribution_policy(NULL) { m_cte_consumer_info = GPOS_NEW(m_mp) HMUlCTEConsumerInfo(m_mp); m_num_partition_selectors_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); @@ -152,11 +148,8 @@ CContextDXLToPlStmt::GetCurrentParamId() // //--------------------------------------------------------------------------- void -CContextDXLToPlStmt::AddCTEConsumerInfo - ( - ULONG cte_id, - ShareInputScan *share_input_scan - ) +CContextDXLToPlStmt::AddCTEConsumerInfo(ULONG cte_id, + ShareInputScan *share_input_scan) { GPOS_ASSERT(NULL != share_input_scan); @@ -173,7 +166,8 @@ CContextDXLToPlStmt::AddCTEConsumerInfo #ifdef GPOS_DEBUG BOOL result = #endif - m_cte_consumer_info->Insert(key, GPOS_NEW(m_mp) SCTEConsumerInfo(cte_plan)); + m_cte_consumer_info->Insert(key, + GPOS_NEW(m_mp) SCTEConsumerInfo(cte_plan)); GPOS_ASSERT(result); } @@ -187,11 +181,7 @@ CContextDXLToPlStmt::AddCTEConsumerInfo // with the given CTE identifier //--------------------------------------------------------------------------- List * -CContextDXLToPlStmt::GetCTEConsumerList - ( - ULONG cte_id - ) - const +CContextDXLToPlStmt::GetCTEConsumerList(ULONG cte_id) const { SCTEConsumerInfo *cte_info = m_cte_consumer_info->Find(&cte_id); if (NULL != cte_info) @@ -239,19 +229,16 @@ CContextDXLToPlStmt::GetSubplanEntriesList() // //--------------------------------------------------------------------------- void -CContextDXLToPlStmt::AddRTE - ( - RangeTblEntry *rte, - BOOL is_result_relation - ) +CContextDXLToPlStmt::AddRTE(RangeTblEntry *rte, BOOL is_result_relation) { - (* (m_rtable_entries_list)) = gpdb::LAppend((*(m_rtable_entries_list)), rte); + (*(m_rtable_entries_list)) = gpdb::LAppend((*(m_rtable_entries_list)), rte); rte->inFromCl = true; if (is_result_relation) { - GPOS_ASSERT(0 == m_result_relation_index && "Only one result relation supported"); + GPOS_ASSERT(0 == m_result_relation_index && + "Only one result relation supported"); rte->inFromCl = false; m_result_relation_index = gpdb::ListLength(*(m_rtable_entries_list)); } @@ -266,14 +253,12 @@ CContextDXLToPlStmt::AddRTE // //--------------------------------------------------------------------------- void -CContextDXLToPlStmt::AddPartitionedTable - ( - OID oid - ) +CContextDXLToPlStmt::AddPartitionedTable(OID oid) { if (!gpdb::ListMemberOid(m_partitioned_tables_list, oid)) { - m_partitioned_tables_list = gpdb::LAppendOid(m_partitioned_tables_list, oid); + m_partitioned_tables_list = + gpdb::LAppendOid(m_partitioned_tables_list, oid); } } @@ -286,10 +271,7 @@ CContextDXLToPlStmt::AddPartitionedTable // //--------------------------------------------------------------------------- void -CContextDXLToPlStmt::IncrementPartitionSelectors - ( - ULONG scan_id - ) +CContextDXLToPlStmt::IncrementPartitionSelectors(ULONG scan_id) { // add extra elements to the array if necessary const ULONG len = m_num_partition_selectors_array->Size(); @@ -300,7 +282,7 @@ CContextDXLToPlStmt::IncrementPartitionSelectors } ULONG *ul = (*m_num_partition_selectors_array)[scan_id]; - (*ul) ++; + (*ul)++; } //--------------------------------------------------------------------------- @@ -319,7 +301,8 @@ CContextDXLToPlStmt::GetNumPartitionSelectorsList() const for (ULONG ul = 0; ul < len; ul++) { ULONG *num_partition_selectors = (*m_num_partition_selectors_array)[ul]; - partition_selectors_list = gpdb::LAppendInt(partition_selectors_list, *num_partition_selectors); + partition_selectors_list = gpdb::LAppendInt(partition_selectors_list, + *num_partition_selectors); } return partition_selectors_list; @@ -336,7 +319,8 @@ CContextDXLToPlStmt::GetNumPartitionSelectorsList() const void CContextDXLToPlStmt::AddSubplan(Plan *plan) { - (* (m_subplan_entries_list)) = gpdb::LAppend((*(m_subplan_entries_list)), plan); + (*(m_subplan_entries_list)) = + gpdb::LAppend((*(m_subplan_entries_list)), plan); } //--------------------------------------------------------------------------- @@ -348,15 +332,12 @@ CContextDXLToPlStmt::AddSubplan(Plan *plan) // //--------------------------------------------------------------------------- void -CContextDXLToPlStmt::AddCtasInfo - ( - IntoClause *into_clause, - GpPolicy *distribution_policy - ) +CContextDXLToPlStmt::AddCtasInfo(IntoClause *into_clause, + GpPolicy *distribution_policy) { GPOS_ASSERT(NULL != into_clause); GPOS_ASSERT(NULL != distribution_policy); - + m_into_clause = into_clause; m_distribution_policy = distribution_policy; } diff --git a/src/backend/gpopt/translate/CDXLTranslateContext.cpp b/src/backend/gpopt/translate/CDXLTranslateContext.cpp index 2575fc0fea..7c870054c3 100644 --- a/src/backend/gpopt/translate/CDXLTranslateContext.cpp +++ b/src/backend/gpopt/translate/CDXLTranslateContext.cpp @@ -26,14 +26,9 @@ using namespace gpos; // Ctor // //--------------------------------------------------------------------------- -CDXLTranslateContext::CDXLTranslateContext - ( - CMemoryPool *mp, - BOOL is_child_agg_node - ) - : - m_mp(mp), - m_is_child_agg_node(is_child_agg_node) +CDXLTranslateContext::CDXLTranslateContext(CMemoryPool *mp, + BOOL is_child_agg_node) + : m_mp(mp), m_is_child_agg_node(is_child_agg_node) { // initialize hash table m_colid_to_target_entry_map = GPOS_NEW(m_mp) ULongToTargetEntryMap(m_mp); @@ -48,15 +43,10 @@ CDXLTranslateContext::CDXLTranslateContext // Ctor // //--------------------------------------------------------------------------- -CDXLTranslateContext::CDXLTranslateContext - ( - CMemoryPool *mp, - BOOL is_child_agg_node, - ULongToColParamMap *original - ) - : - m_mp(mp), - m_is_child_agg_node(is_child_agg_node) +CDXLTranslateContext::CDXLTranslateContext(CMemoryPool *mp, + BOOL is_child_agg_node, + ULongToColParamMap *original) + : m_mp(mp), m_is_child_agg_node(is_child_agg_node) { m_colid_to_target_entry_map = GPOS_NEW(m_mp) ULongToTargetEntryMap(m_mp); m_colid_to_paramid_map = GPOS_NEW(m_mp) ULongToColParamMap(m_mp); @@ -100,16 +90,14 @@ CDXLTranslateContext::IsParentAggNode() const // //--------------------------------------------------------------------------- void -CDXLTranslateContext::CopyParamHashmap - ( - ULongToColParamMap *original - ) +CDXLTranslateContext::CopyParamHashmap(ULongToColParamMap *original) { // iterate over full map ULongToColParamMapIter hashmapiter(original); while (hashmapiter.Advance()) { - CMappingElementColIdParamId *colidparamid = const_cast(hashmapiter.Value()); + CMappingElementColIdParamId *colidparamid = + const_cast(hashmapiter.Value()); const ULONG colid = colidparamid->GetColId(); ULONG *key = GPOS_NEW(m_mp) ULONG(colid); @@ -127,11 +115,7 @@ CDXLTranslateContext::CopyParamHashmap // //--------------------------------------------------------------------------- const TargetEntry * -CDXLTranslateContext::GetTargetEntry - ( - ULONG colid - ) - const +CDXLTranslateContext::GetTargetEntry(ULONG colid) const { return m_colid_to_target_entry_map->Find(&colid); } @@ -145,11 +129,7 @@ CDXLTranslateContext::GetTargetEntry // //--------------------------------------------------------------------------- const CMappingElementColIdParamId * -CDXLTranslateContext::GetParamIdMappingElement - ( - ULONG colid - ) - const +CDXLTranslateContext::GetParamIdMappingElement(ULONG colid) const { return m_colid_to_paramid_map->Find(&colid); } @@ -163,11 +143,7 @@ CDXLTranslateContext::GetParamIdMappingElement // //--------------------------------------------------------------------------- void -CDXLTranslateContext::InsertMapping - ( - ULONG colid, - TargetEntry *target_entry - ) +CDXLTranslateContext::InsertMapping(ULONG colid, TargetEntry *target_entry) { // copy key ULONG *key = GPOS_NEW(m_mp) ULONG(colid); @@ -190,11 +166,8 @@ CDXLTranslateContext::InsertMapping // //--------------------------------------------------------------------------- BOOL -CDXLTranslateContext::FInsertParamMapping - ( - ULONG colid, - CMappingElementColIdParamId *colidparamid - ) +CDXLTranslateContext::FInsertParamMapping( + ULONG colid, CMappingElementColIdParamId *colidparamid) { // copy key ULONG *key = GPOS_NEW(m_mp) ULONG(colid); diff --git a/src/backend/gpopt/translate/CDXLTranslateContextBaseTable.cpp b/src/backend/gpopt/translate/CDXLTranslateContextBaseTable.cpp index 991a8833ef..ea1649e2f5 100644 --- a/src/backend/gpopt/translate/CDXLTranslateContextBaseTable.cpp +++ b/src/backend/gpopt/translate/CDXLTranslateContextBaseTable.cpp @@ -27,14 +27,8 @@ using namespace gpos; // Constructor // //--------------------------------------------------------------------------- -CDXLTranslateContextBaseTable::CDXLTranslateContextBaseTable - ( - CMemoryPool *mp - ) - : - m_mp(mp), - m_oid(InvalidOid), - m_rel_index(0) +CDXLTranslateContextBaseTable::CDXLTranslateContextBaseTable(CMemoryPool *mp) + : m_mp(mp), m_oid(InvalidOid), m_rel_index(0) { // initialize hash table m_colid_to_attno_map = GPOS_NEW(m_mp) UlongToIntMap(m_mp); @@ -63,10 +57,7 @@ CDXLTranslateContextBaseTable::~CDXLTranslateContextBaseTable() // //--------------------------------------------------------------------------- void -CDXLTranslateContextBaseTable::SetOID - ( - OID oid - ) +CDXLTranslateContextBaseTable::SetOID(OID oid) { GPOS_ASSERT(oid != InvalidOid); m_oid = oid; @@ -81,10 +72,7 @@ CDXLTranslateContextBaseTable::SetOID // //--------------------------------------------------------------------------- void -CDXLTranslateContextBaseTable::SetRelIndex - ( - Index rel_index - ) +CDXLTranslateContextBaseTable::SetRelIndex(Index rel_index) { GPOS_ASSERT(0 < rel_index); m_rel_index = rel_index; @@ -129,11 +117,7 @@ CDXLTranslateContextBaseTable::GetRelIndex() const // //--------------------------------------------------------------------------- INT -CDXLTranslateContextBaseTable::GetAttnoForColId - ( - ULONG colid - ) - const +CDXLTranslateContextBaseTable::GetAttnoForColId(ULONG colid) const { const INT *pi = m_colid_to_attno_map->Find(&colid); if (NULL != pi) @@ -155,11 +139,7 @@ CDXLTranslateContextBaseTable::GetAttnoForColId // //--------------------------------------------------------------------------- BOOL -CDXLTranslateContextBaseTable::InsertMapping - ( - ULONG dxl_colid, - INT att_no - ) +CDXLTranslateContextBaseTable::InsertMapping(ULONG dxl_colid, INT att_no) { // copy key and value ULONG *key = GPOS_NEW(m_mp) ULONG(dxl_colid); diff --git a/src/backend/gpopt/translate/CMappingColIdVar.cpp b/src/backend/gpopt/translate/CMappingColIdVar.cpp index 8b1bec0330..01fa633c96 100644 --- a/src/backend/gpopt/translate/CMappingColIdVar.cpp +++ b/src/backend/gpopt/translate/CMappingColIdVar.cpp @@ -25,12 +25,7 @@ using namespace gpdxl; // Constructor // //--------------------------------------------------------------------------- -CMappingColIdVar::CMappingColIdVar - ( - CMemoryPool *mp - ) - : - m_mp(mp) +CMappingColIdVar::CMappingColIdVar(CMemoryPool *mp) : m_mp(mp) { } diff --git a/src/backend/gpopt/translate/CMappingColIdVarPlStmt.cpp b/src/backend/gpopt/translate/CMappingColIdVarPlStmt.cpp index b416489c96..869fd624d8 100644 --- a/src/backend/gpopt/translate/CMappingColIdVarPlStmt.cpp +++ b/src/backend/gpopt/translate/CMappingColIdVarPlStmt.cpp @@ -41,20 +41,16 @@ using namespace gpmd; // Constructor // //--------------------------------------------------------------------------- -CMappingColIdVarPlStmt::CMappingColIdVarPlStmt - ( - CMemoryPool *mp, - const CDXLTranslateContextBaseTable *base_table_context, +CMappingColIdVarPlStmt::CMappingColIdVarPlStmt( + CMemoryPool *mp, const CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *child_contexts, CDXLTranslateContext *output_context, - CContextDXLToPlStmt *dxl_to_plstmt_context - ) - : - CMappingColIdVar(mp), - m_base_table_context(base_table_context), - m_child_contexts(child_contexts), - m_output_context(output_context), - m_dxl_to_plstmt_context(dxl_to_plstmt_context) + CContextDXLToPlStmt *dxl_to_plstmt_context) + : CMappingColIdVar(mp), + m_base_table_context(base_table_context), + m_child_contexts(child_contexts), + m_output_context(output_context), + m_dxl_to_plstmt_context(dxl_to_plstmt_context) { } @@ -95,17 +91,15 @@ CMappingColIdVarPlStmt::GetOutputContext() // //--------------------------------------------------------------------------- Param * -CMappingColIdVarPlStmt::ParamFromDXLNodeScId - ( - const CDXLScalarIdent *dxlop - ) +CMappingColIdVarPlStmt::ParamFromDXLNodeScId(const CDXLScalarIdent *dxlop) { GPOS_ASSERT(NULL != m_output_context); Param *param = NULL; const ULONG colid = dxlop->GetDXLColRef()->Id(); - const CMappingElementColIdParamId *elem = m_output_context->GetParamIdMappingElement(colid); + const CMappingElementColIdParamId *elem = + m_output_context->GetParamIdMappingElement(colid); if (NULL != elem) { @@ -128,10 +122,7 @@ CMappingColIdVarPlStmt::ParamFromDXLNodeScId // //--------------------------------------------------------------------------- Var * -CMappingColIdVarPlStmt::VarFromDXLNodeScId - ( - const CDXLScalarIdent *dxlop - ) +CMappingColIdVarPlStmt::VarFromDXLNodeScId(const CDXLScalarIdent *dxlop) { Index varno = 0; AttrNumber attno = 0; @@ -199,14 +190,15 @@ CMappingColIdVarPlStmt::VarFromDXLNodeScId continue; } - Var *var = (Var*) target_entry->expr; + Var *var = (Var *) target_entry->expr; varno = var->varno; } } - if (NULL == target_entry) + if (NULL == target_entry) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, colid); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + colid); } attno = target_entry->resno; @@ -214,7 +206,7 @@ CMappingColIdVarPlStmt::VarFromDXLNodeScId // find the original varno and attno for this column if (IsA(target_entry->expr, Var)) { - Var *var = (Var*) target_entry->expr; + Var *var = (Var *) target_entry->expr; varno_old = var->varnoold; attno_old = var->varoattno; } @@ -225,14 +217,11 @@ CMappingColIdVarPlStmt::VarFromDXLNodeScId } } - Var *var = gpdb::MakeVar - ( - varno, - attno, - CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(), - dxlop->TypeModifier(), - 0 // varlevelsup - ); + Var *var = gpdb::MakeVar(varno, attno, + CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(), + dxlop->TypeModifier(), + 0 // varlevelsup + ); // set varnoold and varoattno since makeVar does not set them properly var->varnoold = varno_old; diff --git a/src/backend/gpopt/translate/CMappingElementColIdParamId.cpp b/src/backend/gpopt/translate/CMappingElementColIdParamId.cpp index 1fb8647e57..443285319d 100644 --- a/src/backend/gpopt/translate/CMappingElementColIdParamId.cpp +++ b/src/backend/gpopt/translate/CMappingElementColIdParamId.cpp @@ -31,18 +31,14 @@ using namespace gpos; // Ctor // //--------------------------------------------------------------------------- -CMappingElementColIdParamId::CMappingElementColIdParamId - ( - ULONG colid, - ULONG paramid, - IMDId *mdid, - INT type_modifier - ) - : - m_colid(colid), - m_paramid(paramid), - m_mdid(mdid), - m_type_modifier(type_modifier) +CMappingElementColIdParamId::CMappingElementColIdParamId(ULONG colid, + ULONG paramid, + IMDId *mdid, + INT type_modifier) + : m_colid(colid), + m_paramid(paramid), + m_mdid(mdid), + m_type_modifier(type_modifier) { } diff --git a/src/backend/gpopt/translate/CMappingElementColIdTE.cpp b/src/backend/gpopt/translate/CMappingElementColIdTE.cpp index fa3be1b877..71ef5a8a0c 100644 --- a/src/backend/gpopt/translate/CMappingElementColIdTE.cpp +++ b/src/backend/gpopt/translate/CMappingElementColIdTE.cpp @@ -31,16 +31,9 @@ using namespace gpos; // Constructor // //--------------------------------------------------------------------------- -CMappingElementColIdTE::CMappingElementColIdTE - ( - ULONG colid, - ULONG query_level, - TargetEntry *target_entry - ) - : - m_colid(colid), - m_query_level(query_level), - m_target_entry(target_entry) +CMappingElementColIdTE::CMappingElementColIdTE(ULONG colid, ULONG query_level, + TargetEntry *target_entry) + : m_colid(colid), m_query_level(query_level), m_target_entry(target_entry) { } diff --git a/src/backend/gpopt/translate/CMappingVarColId.cpp b/src/backend/gpopt/translate/CMappingVarColId.cpp index 7cf1a15b8e..b001cc5bf6 100644 --- a/src/backend/gpopt/translate/CMappingVarColId.cpp +++ b/src/backend/gpopt/translate/CMappingVarColId.cpp @@ -38,16 +38,12 @@ using namespace gpmd; // Ctor // //--------------------------------------------------------------------------- -CMappingVarColId::CMappingVarColId - ( - CMemoryPool *mp - ) - : - m_mp(mp) +CMappingVarColId::CMappingVarColId(CMemoryPool *mp) : m_mp(mp) { // This map can have many entries if there are many tables with many columns // in the query, so use a larger hash map to minimize collisions - m_gpdb_att_opt_col_mapping = GPOS_NEW(m_mp) GPDBAttOptColHashMap(m_mp, 2047); + m_gpdb_att_opt_col_mapping = + GPOS_NEW(m_mp) GPDBAttOptColHashMap(m_mp, 2047); } //--------------------------------------------------------------------------- @@ -59,13 +55,9 @@ CMappingVarColId::CMappingVarColId // //--------------------------------------------------------------------------- const CGPDBAttOptCol * -CMappingVarColId::GetGPDBAttOptColMapping - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const +CMappingVarColId::GetGPDBAttOptColMapping( + ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const { GPOS_ASSERT(NULL != var); GPOS_ASSERT(current_query_level >= var->varlevelsup); @@ -75,20 +67,25 @@ CMappingVarColId::GetGPDBAttOptColMapping // extract varno ULONG var_no = var->varno; - if (EpspotWindow == plstmt_physical_op_type || EpspotAgg == plstmt_physical_op_type || EpspotMaterialize == plstmt_physical_op_type) + if (EpspotWindow == plstmt_physical_op_type || + EpspotAgg == plstmt_physical_op_type || + EpspotMaterialize == plstmt_physical_op_type) { // Agg and Materialize need to employ OUTER, since they have other // values in GPDB world var_no = OUTER; } - CGPDBAttInfo *gpdb_att_info = GPOS_NEW(m_mp) CGPDBAttInfo(abs_query_level, var_no, var->varattno); - CGPDBAttOptCol *gpdb_att_opt_col_info = m_gpdb_att_opt_col_mapping->Find(gpdb_att_info); - + CGPDBAttInfo *gpdb_att_info = + GPOS_NEW(m_mp) CGPDBAttInfo(abs_query_level, var_no, var->varattno); + CGPDBAttOptCol *gpdb_att_opt_col_info = + m_gpdb_att_opt_col_mapping->Find(gpdb_att_info); + if (NULL == gpdb_att_opt_col_info) { // TODO: Sept 09 2013, remove temporary fix (revert exception to assert) to avoid crash during algebrization - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, GPOS_WSZ_LIT("No variable")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, + GPOS_WSZ_LIT("No variable")); } gpdb_att_info->Release(); @@ -104,15 +101,14 @@ CMappingVarColId::GetGPDBAttOptColMapping // //--------------------------------------------------------------------------- const CWStringBase * -CMappingVarColId::GetOptColName - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const +CMappingVarColId::GetOptColName( + ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const { - return GetGPDBAttOptColMapping(current_query_level, var, plstmt_physical_op_type)->GetOptColInfo()->GetOptColName(); + return GetGPDBAttOptColMapping(current_query_level, var, + plstmt_physical_op_type) + ->GetOptColInfo() + ->GetOptColName(); } //--------------------------------------------------------------------------- @@ -124,15 +120,13 @@ CMappingVarColId::GetOptColName // //--------------------------------------------------------------------------- ULONG -CMappingVarColId::GetColId - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const +CMappingVarColId::GetColId(ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const { - return GetGPDBAttOptColMapping(current_query_level, var, plstmt_physical_op_type)->GetOptColInfo()->GetColId(); + return GetGPDBAttOptColMapping(current_query_level, var, + plstmt_physical_op_type) + ->GetOptColInfo() + ->GetColId(); } //--------------------------------------------------------------------------- @@ -144,33 +138,30 @@ CMappingVarColId::GetColId // //--------------------------------------------------------------------------- void -CMappingVarColId::Insert - ( - ULONG query_level, - ULONG var_no, - INT attrnum, - ULONG colid, - CWStringBase *column_name - ) +CMappingVarColId::Insert(ULONG query_level, ULONG var_no, INT attrnum, + ULONG colid, CWStringBase *column_name) { // GPDB agg node uses 0 in Var, but that should've been taken care of // by translator GPOS_ASSERT(var_no > 0); // create key - CGPDBAttInfo *gpdb_att_info = GPOS_NEW(m_mp) CGPDBAttInfo(query_level, var_no, attrnum); + CGPDBAttInfo *gpdb_att_info = + GPOS_NEW(m_mp) CGPDBAttInfo(query_level, var_no, attrnum); // create value COptColInfo *opt_col_info = GPOS_NEW(m_mp) COptColInfo(colid, column_name); // key is part of value, bump up refcount gpdb_att_info->AddRef(); - CGPDBAttOptCol *gpdb_att_opt_col_info = GPOS_NEW(m_mp) CGPDBAttOptCol(gpdb_att_info, opt_col_info); + CGPDBAttOptCol *gpdb_att_opt_col_info = + GPOS_NEW(m_mp) CGPDBAttOptCol(gpdb_att_info, opt_col_info); #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - m_gpdb_att_opt_col_mapping->Insert(gpdb_att_info, gpdb_att_opt_col_info); +#endif // GPOS_DEBUG + m_gpdb_att_opt_col_mapping->Insert(gpdb_att_info, + gpdb_att_opt_col_info); GPOS_ASSERT(result); } @@ -185,12 +176,8 @@ CMappingVarColId::Insert // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadTblColumns - ( - ULONG query_level, - ULONG RTE_index, - const CDXLTableDescr *table_descr - ) +CMappingVarColId::LoadTblColumns(ULONG query_level, ULONG RTE_index, + const CDXLTableDescr *table_descr) { GPOS_ASSERT(NULL != table_descr); const ULONG size = table_descr->Arity(); @@ -199,16 +186,10 @@ CMappingVarColId::LoadTblColumns for (ULONG i = 0; i < size; i++) { const CDXLColDescr *dxl_col_descr = table_descr->GetColumnDescrAt(i); - this->Insert - ( - query_level, - RTE_index, - dxl_col_descr->AttrNum(), - dxl_col_descr->Id(), - dxl_col_descr->MdName()->GetMDName()->Copy(m_mp) - ); + this->Insert(query_level, RTE_index, dxl_col_descr->AttrNum(), + dxl_col_descr->Id(), + dxl_col_descr->MdName()->GetMDName()->Copy(m_mp)); } - } //--------------------------------------------------------------------------- @@ -221,13 +202,9 @@ CMappingVarColId::LoadTblColumns // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadIndexColumns - ( - ULONG query_level, - ULONG RTE_index, - const IMDIndex *index, - const CDXLTableDescr *table_descr - ) +CMappingVarColId::LoadIndexColumns(ULONG query_level, ULONG RTE_index, + const IMDIndex *index, + const CDXLTableDescr *table_descr) { GPOS_ASSERT(NULL != table_descr); @@ -238,16 +215,9 @@ CMappingVarColId::LoadIndexColumns { ULONG pos = index->KeyAt(i); const CDXLColDescr *dxl_col_descr = table_descr->GetColumnDescrAt(pos); - this->Insert - ( - query_level, - RTE_index, - INT(i + 1), - dxl_col_descr->Id(), - dxl_col_descr->MdName()->GetMDName()->Copy(m_mp) - ); + this->Insert(query_level, RTE_index, INT(i + 1), dxl_col_descr->Id(), + dxl_col_descr->MdName()->GetMDName()->Copy(m_mp)); } - } //--------------------------------------------------------------------------- @@ -259,13 +229,8 @@ CMappingVarColId::LoadIndexColumns // //--------------------------------------------------------------------------- void -CMappingVarColId::Load - ( - ULONG query_level, - ULONG RTE_index, - CIdGenerator *id_generator, - List *col_names - ) +CMappingVarColId::Load(ULONG query_level, ULONG RTE_index, + CIdGenerator *id_generator, List *col_names) { ListCell *col_name = NULL; ULONG i = 0; @@ -276,18 +241,14 @@ CMappingVarColId::Load Value *value = (Value *) lfirst(col_name); CHAR *col_name_char_array = strVal(value); - CWStringDynamic *column_name = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, col_name_char_array); + CWStringDynamic *column_name = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, + col_name_char_array); - this->Insert - ( - query_level, - RTE_index, - INT(i + 1), - id_generator->next_id(), - column_name->Copy(m_mp) - ); + this->Insert(query_level, RTE_index, INT(i + 1), + id_generator->next_id(), column_name->Copy(m_mp)); - i ++; + i++; GPOS_DELETE(column_name); } } @@ -301,12 +262,8 @@ CMappingVarColId::Load // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadColumns - ( - ULONG query_level, - ULONG RTE_index, - const CDXLColDescrArray *column_descrs - ) +CMappingVarColId::LoadColumns(ULONG query_level, ULONG RTE_index, + const CDXLColDescrArray *column_descrs) { GPOS_ASSERT(NULL != column_descrs); const ULONG size = column_descrs->Size(); @@ -315,16 +272,10 @@ CMappingVarColId::LoadColumns for (ULONG i = 0; i < size; i++) { const CDXLColDescr *dxl_col_descr = (*column_descrs)[i]; - this->Insert - ( - query_level, - RTE_index, - dxl_col_descr->AttrNum(), - dxl_col_descr->Id(), - dxl_col_descr->MdName()->GetMDName()->Copy(m_mp) - ); + this->Insert(query_level, RTE_index, dxl_col_descr->AttrNum(), + dxl_col_descr->Id(), + dxl_col_descr->MdName()->GetMDName()->Copy(m_mp)); } - } //--------------------------------------------------------------------------- @@ -336,37 +287,31 @@ CMappingVarColId::LoadColumns // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadDerivedTblColumns - ( - ULONG query_level, - ULONG RTE_index, - const CDXLNodeArray *derived_columns_dxl, - List *target_list - ) +CMappingVarColId::LoadDerivedTblColumns( + ULONG query_level, ULONG RTE_index, + const CDXLNodeArray *derived_columns_dxl, List *target_list) { GPOS_ASSERT(NULL != derived_columns_dxl); - GPOS_ASSERT( (ULONG) gpdb::ListLength(target_list) >= derived_columns_dxl->Size()); + GPOS_ASSERT((ULONG) gpdb::ListLength(target_list) >= + derived_columns_dxl->Size()); - ULONG drvd_tbl_col_counter = 0; // counter for the dynamic array of DXL nodes + ULONG drvd_tbl_col_counter = + 0; // counter for the dynamic array of DXL nodes ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); if (!target_entry->resjunk) { GPOS_ASSERT(0 < target_entry->resno); CDXLNode *dxlnode = (*derived_columns_dxl)[drvd_tbl_col_counter]; GPOS_ASSERT(NULL != dxlnode); - CDXLScalarIdent *dxl_sc_ident = CDXLScalarIdent::Cast(dxlnode->GetOperator()); + CDXLScalarIdent *dxl_sc_ident = + CDXLScalarIdent::Cast(dxlnode->GetOperator()); const CDXLColRef *dxl_colref = dxl_sc_ident->GetDXLColRef(); - this->Insert - ( - query_level, - RTE_index, - INT(target_entry->resno), - dxl_colref->Id(), - dxl_colref->MdName()->GetMDName()->Copy(m_mp) - ); + this->Insert(query_level, RTE_index, INT(target_entry->resno), + dxl_colref->Id(), + dxl_colref->MdName()->GetMDName()->Copy(m_mp)); drvd_tbl_col_counter++; } } @@ -381,36 +326,28 @@ CMappingVarColId::LoadDerivedTblColumns // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadCTEColumns - ( - ULONG query_level, - ULONG RTE_index, - const ULongPtrArray *CTE_columns, - List *target_list - ) +CMappingVarColId::LoadCTEColumns(ULONG query_level, ULONG RTE_index, + const ULongPtrArray *CTE_columns, + List *target_list) { GPOS_ASSERT(NULL != CTE_columns); - GPOS_ASSERT( (ULONG) gpdb::ListLength(target_list) >= CTE_columns->Size()); + GPOS_ASSERT((ULONG) gpdb::ListLength(target_list) >= CTE_columns->Size()); ULONG idx = 0; ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); if (!target_entry->resjunk) { GPOS_ASSERT(0 < target_entry->resno); ULONG CTE_colid = *((*CTE_columns)[idx]); - - CWStringDynamic *column_name = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, target_entry->resname); - this->Insert - ( - query_level, - RTE_index, - INT(target_entry->resno), - CTE_colid, - column_name - ); + + CWStringDynamic *column_name = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, target_entry->resname); + this->Insert(query_level, RTE_index, INT(target_entry->resno), + CTE_colid, column_name); idx++; } } @@ -425,12 +362,8 @@ CMappingVarColId::LoadCTEColumns // //--------------------------------------------------------------------------- void -CMappingVarColId::LoadProjectElements - ( - ULONG query_level, - ULONG RTE_index, - const CDXLNode *project_list_dxlnode - ) +CMappingVarColId::LoadProjectElements(ULONG query_level, ULONG RTE_index, + const CDXLNode *project_list_dxlnode) { GPOS_ASSERT(NULL != project_list_dxlnode); const ULONG size = project_list_dxlnode->Arity(); @@ -438,15 +371,10 @@ CMappingVarColId::LoadProjectElements for (ULONG i = 0; i < size; i++) { CDXLNode *dxlnode = (*project_list_dxlnode)[i]; - CDXLScalarProjElem *dxl_proj_elem = CDXLScalarProjElem::Cast(dxlnode->GetOperator()); - this->Insert - ( - query_level, - RTE_index, - INT(i + 1), - dxl_proj_elem->Id(), - dxl_proj_elem->GetMdNameAlias()->GetMDName()->Copy(m_mp) - ); + CDXLScalarProjElem *dxl_proj_elem = + CDXLScalarProjElem::Cast(dxlnode->GetOperator()); + this->Insert(query_level, RTE_index, INT(i + 1), dxl_proj_elem->Id(), + dxl_proj_elem->GetMdNameAlias()->GetMDName()->Copy(m_mp)); } } @@ -459,11 +387,7 @@ CMappingVarColId::LoadProjectElements // //--------------------------------------------------------------------------- CMappingVarColId * -CMappingVarColId::CopyMapColId - ( - ULONG query_level - ) - const +CMappingVarColId::CopyMapColId(ULONG query_level) const { CMappingVarColId *var_colid_mapping = GPOS_NEW(m_mp) CMappingVarColId(m_mp); @@ -472,22 +396,31 @@ CMappingVarColId::CopyMapColId while (col_map_iterator.Advance()) { const CGPDBAttOptCol *gpdb_att_opt_col_info = col_map_iterator.Value(); - const CGPDBAttInfo *gpdb_att_info = gpdb_att_opt_col_info->GetGPDBAttInfo(); - const COptColInfo *opt_col_info = gpdb_att_opt_col_info->GetOptColInfo(); + const CGPDBAttInfo *gpdb_att_info = + gpdb_att_opt_col_info->GetGPDBAttInfo(); + const COptColInfo *opt_col_info = + gpdb_att_opt_col_info->GetOptColInfo(); if (gpdb_att_info->GetQueryLevel() <= query_level) { // include all variables defined at same query level or before - CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(m_mp) CGPDBAttInfo(gpdb_att_info->GetQueryLevel(), gpdb_att_info->GetVarNo(), gpdb_att_info->GetAttNo()); - COptColInfo *opt_col_info_new = GPOS_NEW(m_mp) COptColInfo(opt_col_info->GetColId(), GPOS_NEW(m_mp) CWStringConst(m_mp, opt_col_info->GetOptColName()->GetBuffer())); + CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(m_mp) CGPDBAttInfo( + gpdb_att_info->GetQueryLevel(), gpdb_att_info->GetVarNo(), + gpdb_att_info->GetAttNo()); + COptColInfo *opt_col_info_new = GPOS_NEW(m_mp) COptColInfo( + opt_col_info->GetColId(), + GPOS_NEW(m_mp) CWStringConst( + m_mp, opt_col_info->GetOptColName()->GetBuffer())); gpdb_att_info_new->AddRef(); - CGPDBAttOptCol *gpdb_att_opt_col_new = GPOS_NEW(m_mp) CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); + CGPDBAttOptCol *gpdb_att_opt_col_new = GPOS_NEW(m_mp) + CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); // insert into hashmap #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert(gpdb_att_info_new, gpdb_att_opt_col_new); +#endif // GPOS_DEBUG + var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert( + gpdb_att_info_new, gpdb_att_opt_col_new); GPOS_ASSERT(result); } } @@ -504,11 +437,7 @@ CMappingVarColId::CopyMapColId // //--------------------------------------------------------------------------- CMappingVarColId * -CMappingVarColId::CopyMapColId - ( - CMemoryPool *mp - ) - const +CMappingVarColId::CopyMapColId(CMemoryPool *mp) const { CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); @@ -517,19 +446,28 @@ CMappingVarColId::CopyMapColId while (col_map_iterator.Advance()) { const CGPDBAttOptCol *gpdb_att_opt_col_info = col_map_iterator.Value(); - const CGPDBAttInfo *gpdb_att_info = gpdb_att_opt_col_info->GetGPDBAttInfo(); - const COptColInfo *opt_col_info = gpdb_att_opt_col_info->GetOptColInfo(); - - CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(mp) CGPDBAttInfo(gpdb_att_info->GetQueryLevel(), gpdb_att_info->GetVarNo(), gpdb_att_info->GetAttNo()); - COptColInfo *opt_col_info_new = GPOS_NEW(mp) COptColInfo(opt_col_info->GetColId(), GPOS_NEW(mp) CWStringConst(mp, opt_col_info->GetOptColName()->GetBuffer())); + const CGPDBAttInfo *gpdb_att_info = + gpdb_att_opt_col_info->GetGPDBAttInfo(); + const COptColInfo *opt_col_info = + gpdb_att_opt_col_info->GetOptColInfo(); + + CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(mp) + CGPDBAttInfo(gpdb_att_info->GetQueryLevel(), + gpdb_att_info->GetVarNo(), gpdb_att_info->GetAttNo()); + COptColInfo *opt_col_info_new = GPOS_NEW(mp) COptColInfo( + opt_col_info->GetColId(), + GPOS_NEW(mp) + CWStringConst(mp, opt_col_info->GetOptColName()->GetBuffer())); gpdb_att_info_new->AddRef(); - CGPDBAttOptCol *gpdb_att_opt_col_new = GPOS_NEW(mp) CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); + CGPDBAttOptCol *gpdb_att_opt_col_new = + GPOS_NEW(mp) CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); // insert into hashmap #ifdef GPOS_DEBUG - BOOL result = -#endif // GPOS_DEBUG - var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert(gpdb_att_info_new, gpdb_att_opt_col_new); + BOOL result = +#endif // GPOS_DEBUG + var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert( + gpdb_att_info_new, gpdb_att_opt_col_new); GPOS_ASSERT(result); } @@ -545,49 +483,53 @@ CMappingVarColId::CopyMapColId // //--------------------------------------------------------------------------- CMappingVarColId * -CMappingVarColId::CopyRemapColId - ( - CMemoryPool *mp, - ULongPtrArray *old_colids, - ULongPtrArray *new_colids - ) - const +CMappingVarColId::CopyRemapColId(CMemoryPool *mp, ULongPtrArray *old_colids, + ULongPtrArray *new_colids) const { GPOS_ASSERT(NULL != old_colids); GPOS_ASSERT(NULL != new_colids); GPOS_ASSERT(new_colids->Size() == old_colids->Size()); - + // construct a mapping old cols -> new cols - UlongToUlongMap *old_new_col_mapping = CTranslatorUtils::MakeNewToOldColMapping(mp, old_colids, new_colids); - + UlongToUlongMap *old_new_col_mapping = + CTranslatorUtils::MakeNewToOldColMapping(mp, old_colids, new_colids); + CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); GPDBAttOptColHashMapIter col_map_iterator(this->m_gpdb_att_opt_col_mapping); while (col_map_iterator.Advance()) { const CGPDBAttOptCol *gpdb_att_opt_col_info = col_map_iterator.Value(); - const CGPDBAttInfo *gpdb_att_info = gpdb_att_opt_col_info->GetGPDBAttInfo(); - const COptColInfo *opt_col_info = gpdb_att_opt_col_info->GetOptColInfo(); - - CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(mp) CGPDBAttInfo(gpdb_att_info->GetQueryLevel(), gpdb_att_info->GetVarNo(), gpdb_att_info->GetAttNo()); + const CGPDBAttInfo *gpdb_att_info = + gpdb_att_opt_col_info->GetGPDBAttInfo(); + const COptColInfo *opt_col_info = + gpdb_att_opt_col_info->GetOptColInfo(); + + CGPDBAttInfo *gpdb_att_info_new = GPOS_NEW(mp) + CGPDBAttInfo(gpdb_att_info->GetQueryLevel(), + gpdb_att_info->GetVarNo(), gpdb_att_info->GetAttNo()); ULONG colid = opt_col_info->GetColId(); ULONG *new_colid = old_new_col_mapping->Find(&colid); if (NULL != new_colid) { colid = *new_colid; } - - COptColInfo *opt_col_info_new = GPOS_NEW(mp) COptColInfo(colid, GPOS_NEW(mp) CWStringConst(mp, opt_col_info->GetOptColName()->GetBuffer())); + + COptColInfo *opt_col_info_new = GPOS_NEW(mp) COptColInfo( + colid, GPOS_NEW(mp) CWStringConst( + mp, opt_col_info->GetOptColName()->GetBuffer())); gpdb_att_info_new->AddRef(); - CGPDBAttOptCol *gpdb_att_opt_col_new = GPOS_NEW(mp) CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); + CGPDBAttOptCol *gpdb_att_opt_col_new = + GPOS_NEW(mp) CGPDBAttOptCol(gpdb_att_info_new, opt_col_info_new); #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert(gpdb_att_info_new, gpdb_att_opt_col_new); +#endif // GPOS_DEBUG + var_colid_mapping->m_gpdb_att_opt_col_mapping->Insert( + gpdb_att_info_new, gpdb_att_opt_col_new); GPOS_ASSERT(result); } - + old_new_col_mapping->Release(); return var_colid_mapping; diff --git a/src/backend/gpopt/translate/CQueryMutators.cpp b/src/backend/gpopt/translate/CQueryMutators.cpp index 46fcfa0c72..f2800147e2 100644 --- a/src/backend/gpopt/translate/CQueryMutators.cpp +++ b/src/backend/gpopt/translate/CQueryMutators.cpp @@ -44,10 +44,7 @@ using namespace gpmd; // and grouping columns) //--------------------------------------------------------------------------- BOOL -CQueryMutators::NeedsProjListNormalization - ( - const Query *query - ) +CQueryMutators::NeedsProjListNormalization(const Query *query) { if (!query->hasAggs && NULL == query->groupClause) { @@ -57,19 +54,25 @@ CQueryMutators::NeedsProjListNormalization SContextTLWalker context(query->targetList, query->groupClause); ListCell *lc = NULL; - ForEach (lc, query->targetList) + ForEach(lc, query->targetList) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); if (ShouldFallback((Node *) target_entry->expr, &context)) { // TODO: remove temporary fix (revert exception to assert) to avoid crash during algebrization - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, GPOS_WSZ_LIT("No attribute")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, + GPOS_WSZ_LIT("No attribute")); } // Normalize when there is an expression that is neither used for grouping // nor is an aggregate function - if (!IsA(target_entry->expr, PercentileExpr) && !IsA(target_entry->expr, Aggref) && !IsA(target_entry->expr, GroupingFunc) && !CTranslatorUtils::IsGroupingColumn( (Node*) target_entry->expr, query->groupClause, query->targetList)) + if (!IsA(target_entry->expr, PercentileExpr) && + !IsA(target_entry->expr, Aggref) && + !IsA(target_entry->expr, GroupingFunc) && + !CTranslatorUtils::IsGroupingColumn((Node *) target_entry->expr, + query->groupClause, + query->targetList)) { return true; } @@ -88,24 +91,24 @@ CQueryMutators::NeedsProjListNormalization // at this point cannot resolve //--------------------------------------------------------------------------- BOOL -CQueryMutators::ShouldFallback - ( - Node *node, - SContextTLWalker *context - ) +CQueryMutators::ShouldFallback(Node *node, SContextTLWalker *context) { if (NULL == node) { return false; } - if (IsA(node, Const) || IsA(node, Aggref) || IsA(node, PercentileExpr) || IsA(node, GroupingFunc) || IsA(node, SubLink)) + if (IsA(node, Const) || IsA(node, Aggref) || IsA(node, PercentileExpr) || + IsA(node, GroupingFunc) || IsA(node, SubLink)) { return false; } - TargetEntry *entry = gpdb::FindFirstMatchingMemberInTargetList(node, context->m_target_entries); - if (NULL != entry && CTranslatorUtils::IsGroupingColumn( (Node *) entry->expr, context->m_group_clause, context->m_target_entries)) + TargetEntry *entry = gpdb::FindFirstMatchingMemberInTargetList( + node, context->m_target_entries); + if (NULL != entry && CTranslatorUtils::IsGroupingColumn( + (Node *) entry->expr, context->m_group_clause, + context->m_target_entries)) { return false; } @@ -134,7 +137,8 @@ CQueryMutators::ShouldFallback return false; } - return gpdb::WalkExpressionTree(node, (FallbackWalkerFn) CQueryMutators::ShouldFallback, context); + return gpdb::WalkExpressionTree( + node, (FallbackWalkerFn) CQueryMutators::ShouldFallback, context); } @@ -153,57 +157,63 @@ CQueryMutators::ShouldFallback // FROM t where r.b = t.e) t2) //--------------------------------------------------------------------------- Query * -CQueryMutators::NormalizeGroupByProjList - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const Query *query - ) +CQueryMutators::NormalizeGroupByProjList(CMemoryPool *mp, + CMDAccessor *md_accessor, + const Query *query) { - Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); + Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); if (!NeedsProjListNormalization(query_copy)) { return query_copy; } - Query *new_query = ConvertToDerivedTable(query_copy, false /*should_fix_target_list*/, true /*should_fix_having_qual*/); + Query *new_query = + ConvertToDerivedTable(query_copy, false /*should_fix_target_list*/, + true /*should_fix_having_qual*/); gpdb::GPDBFree(query_copy); GPOS_ASSERT(1 == gpdb::ListLength(new_query->rtable)); - Query *derived_table_query = (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0))->subquery; + Query *derived_table_query = + (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0)) + ->subquery; SContextGrpbyPlMutator context(mp, md_accessor, derived_table_query, NULL); - List *target_list_copy = (List*) gpdb::CopyObject(derived_table_query->targetList); + List *target_list_copy = + (List *) gpdb::CopyObject(derived_table_query->targetList); ListCell *lc = NULL; // first normalize grouping columns - ForEach (lc, target_list_copy) + ForEach(lc, target_list_copy) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(NULL != target_entry); - if (CTranslatorUtils::IsGroupingColumn(target_entry, derived_table_query->groupClause)) + if (CTranslatorUtils::IsGroupingColumn( + target_entry, derived_table_query->groupClause)) { - target_entry->expr = (Expr*) FixGroupingCols( (Node*) target_entry->expr, target_entry, &context); + target_entry->expr = (Expr *) FixGroupingCols( + (Node *) target_entry->expr, target_entry, &context); } } lc = NULL; // normalize remaining project elements - ForEach (lc, target_list_copy) + ForEach(lc, target_list_copy) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(NULL != target_entry); - BOOL is_grouping_col = CTranslatorUtils::IsGroupingColumn(target_entry, derived_table_query->groupClause); + BOOL is_grouping_col = CTranslatorUtils::IsGroupingColumn( + target_entry, derived_table_query->groupClause); if (!is_grouping_col) { - target_entry->expr = (Expr*) RunExtractAggregatesMutator((Node*) target_entry->expr, &context); - GPOS_ASSERT - ( - (!IsA(target_entry->expr, Aggref) && !IsA(target_entry->expr, PercentileExpr)) && !IsA(target_entry->expr, GroupingFunc) && - "New target list entry should not contain any Aggrefs or PercentileExpr" - ); + target_entry->expr = (Expr *) RunExtractAggregatesMutator( + (Node *) target_entry->expr, &context); + GPOS_ASSERT( + (!IsA(target_entry->expr, Aggref) && + !IsA(target_entry->expr, PercentileExpr)) && + !IsA(target_entry->expr, GroupingFunc) && + "New target list entry should not contain any Aggrefs or PercentileExpr"); } } @@ -223,11 +233,8 @@ CQueryMutators::NormalizeGroupByProjList // Increment any the query levels up of any outer reference by one //--------------------------------------------------------------------------- Node * -CQueryMutators::RunIncrLevelsUpMutator - ( - Node *node, - SContextIncLevelsupMutator *context - ) +CQueryMutators::RunIncrLevelsUpMutator(Node *node, + SContextIncLevelsupMutator *context) { if (NULL == node) { @@ -282,14 +289,16 @@ CQueryMutators::RunIncrLevelsUpMutator Query *sublink_query = (Query *) sublink->subselect; context->m_current_query_level++; - sublink->subselect = RunIncrLevelsUpMutator( (Node *) sublink_query, context); + sublink->subselect = + RunIncrLevelsUpMutator((Node *) sublink_query, context); context->m_current_query_level--; gpdb::GPDBFree(sublink_query); return (Node *) sublink; } - if (IsA(node, TargetEntry) && 0 == context->m_current_query_level && !context->m_should_fix_top_level_target_list) + if (IsA(node, TargetEntry) && 0 == context->m_current_query_level && + !context->m_should_fix_top_level_target_list) { return (Node *) gpdb::CopyObject(node); } @@ -297,18 +306,16 @@ CQueryMutators::RunIncrLevelsUpMutator // recurse into query structure if (IsA(node, Query)) { - Query *query = gpdb::MutateQueryTree - ( - (Query *) node, - (MutatorWalkerFn) CQueryMutators::RunIncrLevelsUpMutator, - context, - 1 // flag -- do not mutate range table entries - ); + Query *query = gpdb::MutateQueryTree( + (Query *) node, + (MutatorWalkerFn) CQueryMutators::RunIncrLevelsUpMutator, context, + 1 // flag -- do not mutate range table entries + ); // fix the outer reference in derived table entries List *rtable = query->rtable; ListCell *lc = NULL; - ForEach (lc, rtable) + ForEach(lc, rtable) { RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); @@ -317,7 +324,8 @@ CQueryMutators::RunIncrLevelsUpMutator Query *subquery = rte->subquery; // since we did not walk inside derived tables context->m_current_query_level++; - rte->subquery = (Query *) RunIncrLevelsUpMutator( (Node *) subquery, context); + rte->subquery = (Query *) RunIncrLevelsUpMutator( + (Node *) subquery, context); context->m_current_query_level--; gpdb::GPDBFree(subquery); } @@ -326,7 +334,9 @@ CQueryMutators::RunIncrLevelsUpMutator return (Node *) query; } - return gpdb::MutateExpressionTree(node, (MutatorWalkerFn) CQueryMutators::RunIncrLevelsUpMutator, context); + return gpdb::MutateExpressionTree( + node, (MutatorWalkerFn) CQueryMutators::RunIncrLevelsUpMutator, + context); } @@ -338,11 +348,8 @@ CQueryMutators::RunIncrLevelsUpMutator // Increment any the query levels up of any CTE range table reference by one //--------------------------------------------------------------------------- Node * -CQueryMutators::RunFixCTELevelsUpMutator - ( - Node *node, - SContextIncLevelsupMutator *context - ) +CQueryMutators::RunFixCTELevelsUpMutator(Node *node, + SContextIncLevelsupMutator *context) { if (NULL == node) { @@ -352,20 +359,19 @@ CQueryMutators::RunFixCTELevelsUpMutator // recurse into query structure if (IsA(node, Query)) { - Query *query = gpdb::MutateQueryTree - ( - (Query *) node, - (MutatorWalkerFn) CQueryMutators::RunFixCTELevelsUpMutator, - context, - 1 // flag -- do not mutate range table entries - ); + Query *query = gpdb::MutateQueryTree( + (Query *) node, + (MutatorWalkerFn) CQueryMutators::RunFixCTELevelsUpMutator, context, + 1 // flag -- do not mutate range table entries + ); List *rtable = query->rtable; ListCell *lc = NULL; - ForEach (lc, rtable) + ForEach(lc, rtable) { RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); - if (RTE_CTE == rte->rtekind && NeedsLevelsUpCorrection(context, rte->ctelevelsup)) + if (RTE_CTE == rte->rtekind && + NeedsLevelsUpCorrection(context, rte->ctelevelsup)) { // fix the levels up for CTE range table entry when needed // the walker in GPDB does not walk range table entries of type CTE @@ -377,7 +383,8 @@ CQueryMutators::RunFixCTELevelsUpMutator Query *subquery = rte->subquery; // since we did not walk inside derived tables context->m_current_query_level++; - rte->subquery = (Query *) RunFixCTELevelsUpMutator( (Node *) subquery, context); + rte->subquery = (Query *) RunFixCTELevelsUpMutator( + (Node *) subquery, context); context->m_current_query_level--; gpdb::GPDBFree(subquery); } @@ -413,7 +420,8 @@ CQueryMutators::RunFixCTELevelsUpMutator sublink->subselect = NULL; context->m_current_query_level++; - sublink->subselect = RunFixCTELevelsUpMutator((Node *) sublink_query, context); + sublink->subselect = + RunFixCTELevelsUpMutator((Node *) sublink_query, context); context->m_current_query_level--; gpdb::GPDBFree(sublink_query); @@ -421,7 +429,9 @@ CQueryMutators::RunFixCTELevelsUpMutator return (Node *) sublink; } - return gpdb::MutateExpressionTree(node, (MutatorWalkerFn) CQueryMutators::RunFixCTELevelsUpMutator, context); + return gpdb::MutateExpressionTree( + node, (MutatorWalkerFn) CQueryMutators::RunFixCTELevelsUpMutator, + context); } //--------------------------------------------------------------------------- @@ -432,11 +442,8 @@ CQueryMutators::RunFixCTELevelsUpMutator // Check if the cte levels up is the expected query level //--------------------------------------------------------------------------- BOOL -CQueryMutators::NeedsLevelsUpCorrection - ( - SContextIncLevelsupMutator *context, - Index cte_levels_up - ) +CQueryMutators::NeedsLevelsUpCorrection(SContextIncLevelsupMutator *context, + Index cte_levels_up) { // when converting the query to derived table, all references to cte defined at the current level // or above needs to be incremented @@ -452,11 +459,8 @@ CQueryMutators::NeedsLevelsUpCorrection // //--------------------------------------------------------------------------- Node * -CQueryMutators::RunGroupingColMutator - ( - Node *node, - SContextGrpbyPlMutator *context - ) +CQueryMutators::RunGroupingColMutator(Node *node, + SContextGrpbyPlMutator *context) { if (NULL == node) { @@ -483,7 +487,7 @@ CQueryMutators::RunGroupingColMutator if (IsA(node, Aggref)) { // merely fix the arguments of an aggregate - Aggref *old_aggref = (Aggref*) node; + Aggref *old_aggref = (Aggref *) node; Aggref *aggref = FlatCopyAggref(old_aggref); aggref->agglevelsup = old_aggref->agglevelsup; @@ -493,27 +497,24 @@ CQueryMutators::RunGroupingColMutator BOOL is_agg = context->m_is_mutating_agg_arg; context->m_is_mutating_agg_arg = true; - ForEach (lc, old_aggref->args) + ForEach(lc, old_aggref->args) { - Node *arg = (Node *) gpdb::CopyObject((Node*) lfirst(lc)); + Node *arg = (Node *) gpdb::CopyObject((Node *) lfirst(lc)); GPOS_ASSERT(NULL != arg); // traverse each argument and fix levels up when needed - new_args = gpdb::LAppend - ( - new_args, - gpdb::MutateQueryOrExpressionTree - ( - arg, - (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, - (void *) context, - 0 // flags -- mutate into cte-lists - ) - ); + new_args = gpdb::LAppend( + new_args, + gpdb::MutateQueryOrExpressionTree( + arg, + (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, + (void *) context, + 0 // flags -- mutate into cte-lists + )); } context->m_is_mutating_agg_arg = is_agg; aggref->args = new_args; - return (Node*) aggref; + return (Node *) aggref; } if (IsA(node, PercentileExpr) || IsA(node, GroupingFunc)) @@ -528,26 +529,24 @@ CQueryMutators::RunGroupingColMutator SubLink *new_sublink = MakeNode(SubLink); new_sublink->subLinkType = old_sublink->subLinkType; new_sublink->location = old_sublink->location; - new_sublink->operName = (List *) gpdb::CopyObject(old_sublink->operName); - - new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->testexpr, - (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, - (void *) context, - 0 // flags -- mutate into cte-lists - ); + new_sublink->operName = + (List *) gpdb::CopyObject(old_sublink->operName); + + new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree( + old_sublink->testexpr, + (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, + (void *) context, + 0 // flags -- mutate into cte-lists + ); context->m_current_query_level++; GPOS_ASSERT(IsA(old_sublink->subselect, Query)); - new_sublink->subselect = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->subselect, - (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, - context, - 0 // flags -- mutate into cte-lists - ); + new_sublink->subselect = gpdb::MutateQueryOrExpressionTree( + old_sublink->subselect, + (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, context, + 0 // flags -- mutate into cte-lists + ); context->m_current_query_level--; @@ -561,13 +560,12 @@ CQueryMutators::RunGroupingColMutator GPOS_ASSERT(IsA(cte->ctequery, Query)); - cte->ctequery = gpdb::MutateQueryOrExpressionTree - ( - cte->ctequery, - (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, - (void *) context, - 0 // flags --- mutate into cte-lists - ); + cte->ctequery = gpdb::MutateQueryOrExpressionTree( + cte->ctequery, + (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, + (void *) context, + 0 // flags --- mutate into cte-lists + ); context->m_current_query_level--; return (Node *) cte; @@ -576,18 +574,16 @@ CQueryMutators::RunGroupingColMutator // recurse into query structure if (IsA(node, Query)) { - Query *query = gpdb::MutateQueryTree - ( - (Query *) node, - (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, - context, - 1 // flag -- do not mutate range table entries - ); + Query *query = gpdb::MutateQueryTree( + (Query *) node, + (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, context, + 1 // flag -- do not mutate range table entries + ); // fix the outer reference in derived table entries List *rtable = query->rtable; ListCell *lc = NULL; - ForEach (lc, rtable) + ForEach(lc, rtable) { RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); @@ -596,7 +592,8 @@ CQueryMutators::RunGroupingColMutator Query *subquery = rte->subquery; // since we did not walk inside derived tables context->m_current_query_level++; - rte->subquery = (Query *) RunGroupingColMutator( (Node *) subquery, context); + rte->subquery = + (Query *) RunGroupingColMutator((Node *) subquery, context); context->m_current_query_level--; gpdb::GPDBFree(subquery); } @@ -605,7 +602,8 @@ CQueryMutators::RunGroupingColMutator return (Node *) query; } - return gpdb::MutateExpressionTree(node, (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, context); + return gpdb::MutateExpressionTree( + node, (MutatorWalkerFn) CQueryMutators::RunGroupingColMutator, context); } @@ -617,12 +615,8 @@ CQueryMutators::RunGroupingColMutator // Mutate the grouping columns, fix levels up when necessary //--------------------------------------------------------------------------- Node * -CQueryMutators::FixGroupingCols - ( - Node *node, - TargetEntry *orginal_target_entry, - SContextGrpbyPlMutator *context - ) +CQueryMutators::FixGroupingCols(Node *node, TargetEntry *orginal_target_entry, + SContextGrpbyPlMutator *context) { GPOS_ASSERT(NULL != node); @@ -631,24 +625,25 @@ CQueryMutators::FixGroupingCols // fix any outer references in the grouping column expression Node *expr = (Node *) RunGroupingColMutator(node, context); - CHAR* name = CQueryMutators::GetTargetEntryColName(orginal_target_entry,context->m_query); - TargetEntry *new_target_entry = gpdb::MakeTargetEntry((Expr*) expr, (AttrNumber) arity, name, false /*resjunk */); + CHAR *name = CQueryMutators::GetTargetEntryColName(orginal_target_entry, + context->m_query); + TargetEntry *new_target_entry = gpdb::MakeTargetEntry( + (Expr *) expr, (AttrNumber) arity, name, false /*resjunk */); new_target_entry->ressortgroupref = orginal_target_entry->ressortgroupref; new_target_entry->resjunk = false; - context->m_derived_table_tlist = gpdb::LAppend(context->m_derived_table_tlist, new_target_entry); + context->m_derived_table_tlist = + gpdb::LAppend(context->m_derived_table_tlist, new_target_entry); - Var *new_var = gpdb::MakeVar - ( - 1, // varno - (AttrNumber) arity, - gpdb::ExprType( (Node*) orginal_target_entry->expr), - gpdb::ExprTypeMod( (Node*) orginal_target_entry->expr), - 0 // query levelsup - ); + Var *new_var = gpdb::MakeVar( + 1, // varno + (AttrNumber) arity, gpdb::ExprType((Node *) orginal_target_entry->expr), + gpdb::ExprTypeMod((Node *) orginal_target_entry->expr), + 0 // query levelsup + ); - return (Node*) new_var; + return (Node *) new_var; } @@ -660,54 +655,57 @@ CQueryMutators::FixGroupingCols // Return a target entry for an aggregate or percentile expression //--------------------------------------------------------------------------- TargetEntry * -CQueryMutators::PteAggregateOrPercentileExpr - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - Node *node, - ULONG attno - ) +CQueryMutators::PteAggregateOrPercentileExpr(CMemoryPool *mp, + CMDAccessor *md_accessor, + Node *node, ULONG attno) { - GPOS_ASSERT(IsA(node, PercentileExpr) || IsA(node, Aggref) || IsA(node, GroupingFunc)); + GPOS_ASSERT(IsA(node, PercentileExpr) || IsA(node, Aggref) || + IsA(node, GroupingFunc)); // get the function/aggregate name CHAR *name = NULL; if (IsA(node, PercentileExpr)) { - PercentileExpr *percentile = (PercentileExpr*) node; + PercentileExpr *percentile = (PercentileExpr *) node; if (PERC_MEDIAN == percentile->perckind) { - name = CTranslatorUtils::CreateMultiByteCharStringFromWCString(GPOS_WSZ_LIT("Median")); + name = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + GPOS_WSZ_LIT("Median")); } else if (PERC_CONT == percentile->perckind) { - name = CTranslatorUtils::CreateMultiByteCharStringFromWCString(GPOS_WSZ_LIT("Cont")); + name = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + GPOS_WSZ_LIT("Cont")); } else { GPOS_ASSERT(PERC_DISC == percentile->perckind); - name = CTranslatorUtils::CreateMultiByteCharStringFromWCString(GPOS_WSZ_LIT("Disc")); + name = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + GPOS_WSZ_LIT("Disc")); } } else if (IsA(node, GroupingFunc)) { - name = CTranslatorUtils::CreateMultiByteCharStringFromWCString(GPOS_WSZ_LIT("grouping")); + name = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + GPOS_WSZ_LIT("grouping")); } else { - Aggref *aggref = (Aggref*) node; + Aggref *aggref = (Aggref *) node; CMDIdGPDB *agg_mdid = GPOS_NEW(mp) CMDIdGPDB(aggref->aggfnoid); const IMDAggregate *md_agg = md_accessor->RetrieveAgg(agg_mdid); agg_mdid->Release(); const CWStringConst *str = md_agg->Mdname().GetMDName(); - name = CTranslatorUtils::CreateMultiByteCharStringFromWCString(str->GetBuffer()); + name = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str->GetBuffer()); } GPOS_ASSERT(NULL != name); - return gpdb::MakeTargetEntry((Expr*) node, (AttrNumber) attno, name, false); + return gpdb::MakeTargetEntry((Expr *) node, (AttrNumber) attno, name, + false); } // Traverse the entire tree under an arbitrarily complex project element (node) @@ -719,11 +717,8 @@ CQueryMutators::PteAggregateOrPercentileExpr // // See comments below & in the callers for specific use cases. Node * -CQueryMutators::RunExtractAggregatesMutator - ( - Node *node, - SContextGrpbyPlMutator *context - ) +CQueryMutators::RunExtractAggregatesMutator(Node *node, + SContextGrpbyPlMutator *context) { if (NULL == node) { @@ -746,7 +741,7 @@ CQueryMutators::RunExtractAggregatesMutator if (old_aggref->agglevelsup == context->m_current_query_level) { Aggref *new_aggref = FlatCopyAggref(old_aggref); - + BOOL is_agg_old = context->m_is_mutating_agg_arg; ULONG agg_levels_up = context->m_agg_levels_up; @@ -756,22 +751,18 @@ CQueryMutators::RunExtractAggregatesMutator List *new_args = NIL; ListCell *lc = NULL; - ForEach (lc, old_aggref->args) + ForEach(lc, old_aggref->args) { - Node *arg = (Node*) lfirst(lc); + Node *arg = (Node *) lfirst(lc); GPOS_ASSERT(NULL != arg); // traverse each argument and fix levels up when needed - new_args = gpdb::LAppend - ( - new_args, - gpdb::MutateQueryOrExpressionTree - ( - arg, - (MutatorWalkerFn) RunExtractAggregatesMutator, - (void *) context, - 0 // mutate into cte-lists - ) - ); + new_args = gpdb::LAppend( + new_args, + gpdb::MutateQueryOrExpressionTree( + arg, (MutatorWalkerFn) RunExtractAggregatesMutator, + (void *) context, + 0 // mutate into cte-lists + )); } new_aggref->args = new_args; context->m_is_mutating_agg_arg = is_agg_old; @@ -794,13 +785,13 @@ CQueryMutators::RunExtractAggregatesMutator // e.g SELECT (SELECT sum(o.o) + 1 FROM i GRP BY i.i) FROM o; // becomes SELECT (SELECT x + 1 FROM (SELECT sum(o.o) GRP BY i.i)) FROM o; // which means Var::varlevelup must be increased for o.o - return (Node *) IncrLevelsUpIfOuterRef((Var*) node); + return (Node *) IncrLevelsUpIfOuterRef((Var *) node); } if (IsA(node, PercentileExpr) || IsA(node, GroupingFunc)) { // create a new entry in the derived table and return its corresponding var - Node *node_copy = (Node*) gpdb::CopyObject(node); + Node *node_copy = (Node *) gpdb::CopyObject(node); return (Node *) MakeVarInDerivedTable(node_copy, context); } @@ -868,9 +859,8 @@ CQueryMutators::RunExtractAggregatesMutator // Set varlevelsup to 0 temporarily while searching in the target list var->varlevelsup = 0; - TargetEntry *found_tle = - gpdb::FindFirstMatchingMemberInTargetList((Node*) var, - context->m_derived_table_tlist); + TargetEntry *found_tle = gpdb::FindFirstMatchingMemberInTargetList( + (Node *) var, context->m_derived_table_tlist); if (NULL == found_tle) { @@ -882,16 +872,19 @@ CQueryMutators::RunExtractAggregatesMutator // Therefore, found_target_entry will be NULL and we fall back. // TODO: Oct 14 2013, remove temporary fix (revert exception to assert) to avoid crash during algebrization - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, GPOS_WSZ_LIT("No attribute")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, + GPOS_WSZ_LIT("No attribute")); return NULL; } - var->varno = 1; // derived query is the only table in FROM expression + var->varno = + 1; // derived query is the only table in FROM expression var->varattno = found_tle->resno; - var->varlevelsup = context->m_current_query_level; // reset varlevels up + var->varlevelsup = + context->m_current_query_level; // reset varlevels up found_tle->resjunk = false; - return (Node*) var; + return (Node *) var; } return (Node *) var; } @@ -903,13 +896,11 @@ CQueryMutators::RunExtractAggregatesMutator GPOS_ASSERT(IsA(cte->ctequery, Query)); - cte->ctequery = gpdb::MutateQueryOrExpressionTree - ( - cte->ctequery, - (MutatorWalkerFn) RunExtractAggregatesMutator, - (void *) context, - 0 // mutate into cte-lists - ); + cte->ctequery = gpdb::MutateQueryOrExpressionTree( + cte->ctequery, (MutatorWalkerFn) RunExtractAggregatesMutator, + (void *) context, + 0 // mutate into cte-lists + ); context->m_current_query_level--; return (Node *) cte; @@ -922,67 +913,66 @@ CQueryMutators::RunExtractAggregatesMutator SubLink *new_sublink = MakeNode(SubLink); new_sublink->subLinkType = old_sublink->subLinkType; new_sublink->location = old_sublink->location; - new_sublink->operName = (List *) gpdb::CopyObject(old_sublink->operName); - - new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->testexpr, - (MutatorWalkerFn) RunExtractAggregatesMutator, - (void *) context, - 0 // mutate into cte-lists - ); + new_sublink->operName = + (List *) gpdb::CopyObject(old_sublink->operName); + + new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree( + old_sublink->testexpr, + (MutatorWalkerFn) RunExtractAggregatesMutator, (void *) context, + 0 // mutate into cte-lists + ); context->m_current_query_level++; GPOS_ASSERT(IsA(old_sublink->subselect, Query)); - new_sublink->subselect = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->subselect, - (MutatorWalkerFn) RunExtractAggregatesMutator, - (void *) context, - 0 // mutate into cte-lists - ); + new_sublink->subselect = gpdb::MutateQueryOrExpressionTree( + old_sublink->subselect, + (MutatorWalkerFn) RunExtractAggregatesMutator, (void *) context, + 0 // mutate into cte-lists + ); context->m_current_query_level--; return (Node *) new_sublink; } - - return gpdb::MutateExpressionTree(node, (MutatorWalkerFn) RunExtractAggregatesMutator, context); + + return gpdb::MutateExpressionTree( + node, (MutatorWalkerFn) RunExtractAggregatesMutator, context); } // Create a new entry in the derived table and return its corresponding var Var * -CQueryMutators::MakeVarInDerivedTable - ( - Node *node, - SContextGrpbyPlMutator *context - ) +CQueryMutators::MakeVarInDerivedTable(Node *node, + SContextGrpbyPlMutator *context) { GPOS_ASSERT(NULL != node); GPOS_ASSERT(NULL != context); - GPOS_ASSERT(IsA(node, PercentileExpr) || IsA(node, Aggref) || IsA(node, GroupingFunc) || IsA(node, Var)); + GPOS_ASSERT(IsA(node, PercentileExpr) || IsA(node, Aggref) || + IsA(node, GroupingFunc) || IsA(node, Var)); // Append a new target entry for the node to the derived target list ... TargetEntry *tle = NULL; const ULONG attno = gpdb::ListLength(context->m_derived_table_tlist) + 1; - if (IsA(node, Aggref) || IsA(node, GroupingFunc) || IsA(node, PercentileExpr)) - tle = PteAggregateOrPercentileExpr(context->m_mp, context->m_mda, node, attno); + if (IsA(node, Aggref) || IsA(node, GroupingFunc) || + IsA(node, PercentileExpr)) + tle = PteAggregateOrPercentileExpr(context->m_mp, context->m_mda, node, + attno); else if (IsA(node, Var)) - tle = gpdb::MakeTargetEntry((Expr*) node, (AttrNumber) attno, NULL, false); + tle = gpdb::MakeTargetEntry((Expr *) node, (AttrNumber) attno, NULL, + false); - context->m_derived_table_tlist = gpdb::LAppend(context->m_derived_table_tlist, tle); + context->m_derived_table_tlist = + gpdb::LAppend(context->m_derived_table_tlist, tle); // ... and return a Var referring to it in its stead // NB: Since the new tle is appended at the top query level, Var::varlevelsup // should equal the current nested level. This will take care of any outer references // to the original tlist. - Var *new_var = gpdb::MakeVar(1 /* varno */, - attno, - gpdb::ExprType((Node*) node), - gpdb::ExprTypeMod((Node*) node), - context->m_current_query_level /* varlevelsup */); + Var *new_var = + gpdb::MakeVar(1 /* varno */, attno, gpdb::ExprType((Node *) node), + gpdb::ExprTypeMod((Node *) node), + context->m_current_query_level /* varlevelsup */); return new_var; } @@ -991,31 +981,28 @@ CQueryMutators::MakeVarInDerivedTable // Check if a matching entry already exists in the list of target // entries, if yes return its corresponding var, otherwise return NULL Node * -CQueryMutators::FindNodeInGroupByTargetList - ( - Node *node, - SContextGrpbyPlMutator *context - ) +CQueryMutators::FindNodeInGroupByTargetList(Node *node, + SContextGrpbyPlMutator *context) { GPOS_ASSERT(NULL != node); GPOS_ASSERT(NULL != context); - - TargetEntry *found_tle = - gpdb::FindFirstMatchingMemberInTargetList(node, context->m_derived_table_tlist); + + TargetEntry *found_tle = gpdb::FindFirstMatchingMemberInTargetList( + node, context->m_derived_table_tlist); if (NULL != found_tle) { gpdb::GPDBFree(node); // NB: Var::varlevelsup is set to the current query level since the created // Var must reference the group by targetlist at the top level. - Var *new_var = gpdb::MakeVar(1 /* varno */, - found_tle->resno, - gpdb::ExprType( (Node*) found_tle->expr), - gpdb::ExprTypeMod( (Node*) found_tle->expr), - context->m_current_query_level /* varlevelsup */); + Var *new_var = + gpdb::MakeVar(1 /* varno */, found_tle->resno, + gpdb::ExprType((Node *) found_tle->expr), + gpdb::ExprTypeMod((Node *) found_tle->expr), + context->m_current_query_level /* varlevelsup */); found_tle->resjunk = false; - return (Node*) new_var; + return (Node *) new_var; } return NULL; @@ -1029,20 +1016,17 @@ CQueryMutators::FindNodeInGroupByTargetList // Make a copy of the aggref (minus the arguments) //--------------------------------------------------------------------------- Aggref * -CQueryMutators::FlatCopyAggref - ( - Aggref *old_aggref - ) +CQueryMutators::FlatCopyAggref(Aggref *old_aggref) { Aggref *new_aggref = MakeNode(Aggref); - new_aggref->aggfnoid = old_aggref->aggfnoid; - new_aggref->aggdistinct = old_aggref->aggdistinct; - new_aggref->agglevelsup = 0; - new_aggref->location = old_aggref->location; - new_aggref->aggtype = old_aggref->aggtype; - new_aggref->aggstage = old_aggref->aggstage; - new_aggref->aggstar = old_aggref->aggstar; + new_aggref->aggfnoid = old_aggref->aggfnoid; + new_aggref->aggdistinct = old_aggref->aggdistinct; + new_aggref->agglevelsup = 0; + new_aggref->location = old_aggref->location; + new_aggref->aggtype = old_aggref->aggtype; + new_aggref->aggstage = old_aggref->aggstage; + new_aggref->aggstar = old_aggref->aggstar; return new_aggref; } @@ -1055,10 +1039,7 @@ CQueryMutators::FlatCopyAggref // Make a copy of the aggref (minus the arguments) //--------------------------------------------------------------------------- WindowRef * -CQueryMutators::FlatCopyWindowRef -( - WindowRef *old_windowref - ) +CQueryMutators::FlatCopyWindowRef(WindowRef *old_windowref) { WindowRef *new_windowref = MakeNode(WindowRef); @@ -1071,10 +1052,7 @@ CQueryMutators::FlatCopyWindowRef // Increment the levels up of outer references Var * -CQueryMutators::IncrLevelsUpIfOuterRef - ( - Var *var - ) +CQueryMutators::IncrLevelsUpIfOuterRef(Var *var) { GPOS_ASSERT(NULL != var); @@ -1096,46 +1074,51 @@ CQueryMutators::IncrLevelsUpIfOuterRef // to the top-level query //--------------------------------------------------------------------------- Query * -CQueryMutators::NormalizeHaving - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const Query *query - ) +CQueryMutators::NormalizeHaving(CMemoryPool *mp, CMDAccessor *md_accessor, + const Query *query) { - Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); + Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); if (NULL == query->havingQual) { return query_copy; } - Query *new_query = ConvertToDerivedTable(query_copy, true /*should_fix_target_list*/, false /*should_fix_having_qual*/); + Query *new_query = + ConvertToDerivedTable(query_copy, true /*should_fix_target_list*/, + false /*should_fix_having_qual*/); gpdb::GPDBFree(query_copy); - RangeTblEntry *rte = ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0)); + RangeTblEntry *rte = + ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0)); Query *derived_table_query = (Query *) rte->subquery; // Add all necessary target list entries of subquery // into the target list of the RTE as well as the new top most query ListCell *lc = NULL; ULONG num_target_entries = 1; - ForEach (lc, derived_table_query->targetList) + ForEach(lc, derived_table_query->targetList) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(NULL != target_entry); // Add to the target lists: // (1) All grouping / sorting columns even if they do not appear in the subquery output (resjunked) // (2) All non-resjunked target list entries - if (CTranslatorUtils::IsGroupingColumn(target_entry, derived_table_query->groupClause) || - CTranslatorUtils::IsSortingColumn(target_entry, derived_table_query->sortClause) || !target_entry->resjunk) + if (CTranslatorUtils::IsGroupingColumn( + target_entry, derived_table_query->groupClause) || + CTranslatorUtils::IsSortingColumn( + target_entry, derived_table_query->sortClause) || + !target_entry->resjunk) { - TargetEntry *new_target_entry = MakeTopLevelTargetEntry(target_entry, num_target_entries); - new_query->targetList = gpdb::LAppend(new_query->targetList, new_target_entry); + TargetEntry *new_target_entry = + MakeTopLevelTargetEntry(target_entry, num_target_entries); + new_query->targetList = + gpdb::LAppend(new_query->targetList, new_target_entry); // Ensure that such target entries is not suppressed in the target list of the RTE // and has a name - target_entry->resname = GetTargetEntryColName(target_entry, derived_table_query); + target_entry->resname = + GetTargetEntryColName(target_entry, derived_table_query); target_entry->resjunk = false; new_target_entry->ressortgroupref = target_entry->ressortgroupref; @@ -1143,10 +1126,12 @@ CQueryMutators::NormalizeHaving } } - SContextGrpbyPlMutator context(mp, md_accessor, derived_table_query, derived_table_query->targetList); + SContextGrpbyPlMutator context(mp, md_accessor, derived_table_query, + derived_table_query->targetList); // fix outer references in the qual - new_query->jointree->quals = RunExtractAggregatesMutator(derived_table_query->havingQual, &context); + new_query->jointree->quals = + RunExtractAggregatesMutator(derived_table_query->havingQual, &context); derived_table_query->havingQual = NULL; ReassignSortClause(new_query, rte->subquery); @@ -1154,7 +1139,7 @@ CQueryMutators::NormalizeHaving if (!rte->subquery->hasAggs && NIL == rte->subquery->groupClause) { // if the derived table has no grouping columns or aggregates then the - // subquery is equivalent to select XXXX FROM CONST-TABLE + // subquery is equivalent to select XXXX FROM CONST-TABLE // (where XXXX is the original subquery's target list) Query *new_subquery = MakeNode(Query); @@ -1167,18 +1152,17 @@ CQueryMutators::NormalizeHaving new_subquery->hasSubLinks = false; ListCell *lc = NULL; - ForEach (lc, rte->subquery->targetList) + ForEach(lc, rte->subquery->targetList) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(NULL != target_entry); GPOS_ASSERT(!target_entry->resjunk); - - new_subquery->targetList = gpdb::LAppend - ( - new_subquery->targetList, - (TargetEntry *) gpdb::CopyObject(const_cast(target_entry)) - ); + + new_subquery->targetList = + gpdb::LAppend(new_subquery->targetList, + (TargetEntry *) gpdb::CopyObject( + const_cast(target_entry))); } gpdb::GPDBFree(rte->subquery); @@ -1201,37 +1185,39 @@ CQueryMutators::NormalizeHaving // Normalize queries with having and group by clauses //--------------------------------------------------------------------------- Query * -CQueryMutators::NormalizeQuery - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const Query *query, - ULONG query_level - ) +CQueryMutators::NormalizeQuery(CMemoryPool *mp, CMDAccessor *md_accessor, + const Query *query, ULONG query_level) { // flatten join alias vars defined at the current level of the query - Query *pqueryResolveJoinVarReferences = gpdb::FlattenJoinAliasVar(const_cast(query), query_level); + Query *pqueryResolveJoinVarReferences = + gpdb::FlattenJoinAliasVar(const_cast(query), query_level); // eliminate distinct clause - Query *pqueryEliminateDistinct = CQueryMutators::EliminateDistinctClause(pqueryResolveJoinVarReferences); + Query *pqueryEliminateDistinct = + CQueryMutators::EliminateDistinctClause(pqueryResolveJoinVarReferences); GPOS_ASSERT(NULL == pqueryEliminateDistinct->distinctClause); gpdb::GPDBFree(pqueryResolveJoinVarReferences); // fix window frame edge boundary - Query *pqueryFixedWindowFrameEdge = CQueryMutators::PqueryFixWindowFrameEdgeBoundary(pqueryEliminateDistinct); + Query *pqueryFixedWindowFrameEdge = + CQueryMutators::PqueryFixWindowFrameEdgeBoundary( + pqueryEliminateDistinct); gpdb::GPDBFree(pqueryEliminateDistinct); // normalize window operator's project list - Query *pqueryWindowPlNormalized = CQueryMutators::NormalizeWindowProjList(mp, md_accessor, pqueryFixedWindowFrameEdge); + Query *pqueryWindowPlNormalized = CQueryMutators::NormalizeWindowProjList( + mp, md_accessor, pqueryFixedWindowFrameEdge); gpdb::GPDBFree(pqueryFixedWindowFrameEdge); // pull-up having quals into a select - Query *pqueryHavingNormalized = CQueryMutators::NormalizeHaving(mp, md_accessor, pqueryWindowPlNormalized); + Query *pqueryHavingNormalized = CQueryMutators::NormalizeHaving( + mp, md_accessor, pqueryWindowPlNormalized); GPOS_ASSERT(NULL == pqueryHavingNormalized->havingQual); gpdb::GPDBFree(pqueryWindowPlNormalized); // normalize the group by project list - Query *new_query = CQueryMutators::NormalizeGroupByProjList(mp, md_accessor, pqueryHavingNormalized); + Query *new_query = CQueryMutators::NormalizeGroupByProjList( + mp, md_accessor, pqueryHavingNormalized); gpdb::GPDBFree(pqueryHavingNormalized); return new_query; @@ -1247,22 +1233,18 @@ CQueryMutators::NormalizeQuery // memory //--------------------------------------------------------------------------- TargetEntry * -CQueryMutators::MakeTopLevelTargetEntry - ( - TargetEntry *old_target_entry, - ULONG attno - ) +CQueryMutators::MakeTopLevelTargetEntry(TargetEntry *old_target_entry, + ULONG attno) { - Var *new_var = gpdb::MakeVar - ( - 1, - (AttrNumber) attno, - gpdb::ExprType( (Node*) old_target_entry->expr), - gpdb::ExprTypeMod( (Node*) old_target_entry->expr), - 0 // query levelsup - ); + Var *new_var = gpdb::MakeVar( + 1, (AttrNumber) attno, gpdb::ExprType((Node *) old_target_entry->expr), + gpdb::ExprTypeMod((Node *) old_target_entry->expr), + 0 // query levelsup + ); - TargetEntry *new_target_entry = gpdb::MakeTargetEntry((Expr*) new_var, (AttrNumber) attno, old_target_entry->resname, old_target_entry->resjunk); + TargetEntry *new_target_entry = gpdb::MakeTargetEntry( + (Expr *) new_var, (AttrNumber) attno, old_target_entry->resname, + old_target_entry->resjunk); return new_target_entry; } @@ -1275,11 +1257,7 @@ CQueryMutators::MakeTopLevelTargetEntry // Return the column name of the target list entry //--------------------------------------------------------------------------- CHAR * -CQueryMutators::GetTargetEntryColName - ( - TargetEntry *target_entry, - Query *query - ) +CQueryMutators::GetTargetEntryColName(TargetEntry *target_entry, Query *query) { if (NULL != target_entry->resname) { @@ -1289,7 +1267,8 @@ CQueryMutators::GetTargetEntryColName // Since a resjunked target list entry will not have a column name create a dummy column name CWStringConst dummy_colname(GPOS_WSZ_LIT("?column?")); - return CTranslatorUtils::CreateMultiByteCharStringFromWCString(dummy_colname.GetBuffer()); + return CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dummy_colname.GetBuffer()); } //--------------------------------------------------------------------------- @@ -1300,14 +1279,11 @@ CQueryMutators::GetTargetEntryColName // Converts query into a derived table and return the new top-level query //--------------------------------------------------------------------------- Query * -CQueryMutators::ConvertToDerivedTable - ( - const Query *query, - BOOL should_fix_target_list, - BOOL should_fix_having_qual - ) +CQueryMutators::ConvertToDerivedTable(const Query *query, + BOOL should_fix_target_list, + BOOL should_fix_having_qual) { - Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); + Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); Node *having_qual = NULL; if (!should_fix_having_qual) @@ -1320,7 +1296,8 @@ CQueryMutators::ConvertToDerivedTable Query *derived_table_query; { SContextIncLevelsupMutator context(0, should_fix_target_list); - derived_table_query = (Query *) RunIncrLevelsUpMutator((Node*) query_copy, &context); + derived_table_query = + (Query *) RunIncrLevelsUpMutator((Node *) query_copy, &context); } gpdb::GPDBFree(query_copy); @@ -1333,8 +1310,10 @@ CQueryMutators::ConvertToDerivedTable Query *new_derived_table_query; { - SContextIncLevelsupMutator context(0 /*starting level */, should_fix_target_list); - new_derived_table_query = (Query *) RunFixCTELevelsUpMutator( (Node *) derived_table_query, &context); + SContextIncLevelsupMutator context(0 /*starting level */, + should_fix_target_list); + new_derived_table_query = (Query *) RunFixCTELevelsUpMutator( + (Node *) derived_table_query, &context); } gpdb::GPDBFree(derived_table_query); derived_table_query = new_derived_table_query; @@ -1360,16 +1339,16 @@ CQueryMutators::ConvertToDerivedTable IntoClause *origIntoClause = derived_table_query->intoClause; derived_table_query->intoClause = NULL; // intoClause, if not null, must be set on the top query, not on the derived table - struct GpPolicy* into_policy = derived_table_query->intoPolicy; + struct GpPolicy *into_policy = derived_table_query->intoPolicy; derived_table_query->intoPolicy = NULL; // create a new top-level query with the new RTE in its from clause Query *new_query = MakeNode(Query); - new_query->cteList = original_cte_list; - new_query->hasAggs = false; - new_query->rtable = gpdb::LAppend(new_query->rtable, rte); - new_query->intoClause = origIntoClause; - new_query->intoPolicy = into_policy; + new_query->cteList = original_cte_list; + new_query->hasAggs = false; + new_query->rtable = gpdb::LAppend(new_query->rtable, rte); + new_query->intoClause = origIntoClause; + new_query->intoPolicy = into_policy; new_query->isCopy = derived_table_query->isCopy; derived_table_query->isCopy = false; @@ -1392,21 +1371,22 @@ CQueryMutators::ConvertToDerivedTable // Eliminate distinct columns by translating it into a grouping columns //--------------------------------------------------------------------------- Query * -CQueryMutators::EliminateDistinctClause - ( - const Query *query - ) +CQueryMutators::EliminateDistinctClause(const Query *query) { if (0 == gpdb::ListLength(query->distinctClause)) { - return (Query*) gpdb::CopyObject(const_cast(query)); + return (Query *) gpdb::CopyObject(const_cast(query)); } // create a derived table out of the previous query - Query *new_query = ConvertToDerivedTable(query, true /*should_fix_target_list*/, true /*should_fix_having_qual*/); + Query *new_query = + ConvertToDerivedTable(query, true /*should_fix_target_list*/, + true /*should_fix_having_qual*/); GPOS_ASSERT(1 == gpdb::ListLength(new_query->rtable)); - Query *derived_table_query = (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0))->subquery; + Query *derived_table_query = + (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0)) + ->subquery; ReassignSortClause(new_query, derived_table_query); @@ -1415,54 +1395,62 @@ CQueryMutators::EliminateDistinctClause ListCell *lc = NULL; // build the project list of the new top-level query - ForEach (lc, target_entries) + ForEach(lc, target_entries) { ULONG resno = gpdb::ListLength(new_query->targetList) + 1; - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(NULL != target_entry); if (!target_entry->resjunk) { // create a new target entry that points to the corresponding entry in the derived table - Var *new_var = gpdb::MakeVar - ( - 1, - target_entry->resno, - gpdb::ExprType((Node*) target_entry->expr), - gpdb::ExprTypeMod((Node*) target_entry->expr), - 0 // query levels up - ); - TargetEntry *new_target_entry= gpdb::MakeTargetEntry((Expr*) new_var, (AttrNumber) resno, target_entry->resname, false); - - new_target_entry->ressortgroupref = target_entry->ressortgroupref; - new_query->targetList = gpdb::LAppend(new_query->targetList, new_target_entry); + Var *new_var = + gpdb::MakeVar(1, target_entry->resno, + gpdb::ExprType((Node *) target_entry->expr), + gpdb::ExprTypeMod((Node *) target_entry->expr), + 0 // query levels up + ); + TargetEntry *new_target_entry = + gpdb::MakeTargetEntry((Expr *) new_var, (AttrNumber) resno, + target_entry->resname, false); + + new_target_entry->ressortgroupref = target_entry->ressortgroupref; + new_query->targetList = + gpdb::LAppend(new_query->targetList, new_target_entry); } if (0 < target_entry->ressortgroupref && - !CTranslatorUtils::IsGroupingColumn(target_entry, derived_table_query->groupClause) && - !CTranslatorUtils::IsWindowSpec(target_entry, derived_table_query->windowClause)) + !CTranslatorUtils::IsGroupingColumn( + target_entry, derived_table_query->groupClause) && + !CTranslatorUtils::IsWindowSpec(target_entry, + derived_table_query->windowClause)) { // initialize the ressortgroupref of target entries not used in the grouping clause - target_entry->ressortgroupref = 0; + target_entry->ressortgroupref = 0; } } - if (gpdb::ListLength(new_query->targetList) != gpdb::ListLength(query->distinctClause)) + if (gpdb::ListLength(new_query->targetList) != + gpdb::ListLength(query->distinctClause)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("DISTINCT operation on a subset of target list columns")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "DISTINCT operation on a subset of target list columns")); } ListCell *pl = NULL; - ForEach (pl, query->distinctClause) + ForEach(pl, query->distinctClause) { - SortClause *sort_group_clause = (SortClause*) lfirst(pl); + SortClause *sort_group_clause = (SortClause *) lfirst(pl); GPOS_ASSERT(NULL != sort_group_clause); GroupClause *new_group_clause = MakeNode(GroupClause); - new_group_clause->tleSortGroupRef = sort_group_clause->tleSortGroupRef; - new_group_clause->sortop = sort_group_clause->sortop; - new_group_clause->nulls_first = sort_group_clause->nulls_first; - new_query->groupClause = gpdb::LAppend(new_query->groupClause, new_group_clause); + new_group_clause->tleSortGroupRef = sort_group_clause->tleSortGroupRef; + new_group_clause->sortop = sort_group_clause->sortop; + new_group_clause->nulls_first = sort_group_clause->nulls_first; + new_query->groupClause = + gpdb::LAppend(new_query->groupClause, new_group_clause); } new_query->distinctClause = NIL; derived_table_query->distinctClause = NIL; @@ -1479,10 +1467,7 @@ CQueryMutators::EliminateDistinctClause // window functions and columns used in the window specification //--------------------------------------------------------------------------- BOOL -CQueryMutators::NeedsProjListWindowNormalization - ( - const Query *query - ) +CQueryMutators::NeedsProjListWindowNormalization(const Query *query) { if (!query->hasWindFuncs) { @@ -1490,11 +1475,15 @@ CQueryMutators::NeedsProjListWindowNormalization } ListCell *lc = NULL; - ForEach (lc, query->targetList) + ForEach(lc, query->targetList) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); - if (!CTranslatorUtils::IsWindowSpec( (Node *) target_entry->expr, query->windowClause, query->targetList) && !IsA(target_entry->expr, WindowRef) && !IsA(target_entry->expr, Var)) + if (!CTranslatorUtils::IsWindowSpec((Node *) target_entry->expr, + query->windowClause, + query->targetList) && + !IsA(target_entry->expr, WindowRef) && + !IsA(target_entry->expr, Var)) { // computed columns in the target list that is not // used in the order by or partition by of the window specification(s) @@ -1513,22 +1502,20 @@ CQueryMutators::NeedsProjListWindowNormalization // Fix window frame edge boundary when its value is defined by a subquery //--------------------------------------------------------------------------- Query * -CQueryMutators::PqueryFixWindowFrameEdgeBoundary - ( - const Query *pquery - ) +CQueryMutators::PqueryFixWindowFrameEdgeBoundary(const Query *pquery) { - Query *pqueryNew = (Query *) gpdb::CopyObject(const_cast(pquery)); + Query *pqueryNew = (Query *) gpdb::CopyObject(const_cast(pquery)); List *plWindowClause = pqueryNew->windowClause; ListCell *plcWindowCl = NULL; - ForEach (plcWindowCl, plWindowClause) + ForEach(plcWindowCl, plWindowClause) { - WindowSpec *pwindowspec = (WindowSpec*) lfirst(plcWindowCl); + WindowSpec *pwindowspec = (WindowSpec *) lfirst(plcWindowCl); if (NULL != pwindowspec->frame) { WindowFrame *pwindowframe = pwindowspec->frame; - if (NULL != pwindowframe->lead->val && IsA(pwindowframe->lead->val, SubLink)) + if (NULL != pwindowframe->lead->val && + IsA(pwindowframe->lead->val, SubLink)) { if (WINDOW_BOUND_PRECEDING == pwindowframe->lead->kind) { @@ -1536,12 +1523,14 @@ CQueryMutators::PqueryFixWindowFrameEdgeBoundary } else { - GPOS_ASSERT(WINDOW_BOUND_FOLLOWING == pwindowframe->lead->kind); + GPOS_ASSERT(WINDOW_BOUND_FOLLOWING == + pwindowframe->lead->kind); pwindowframe->lead->kind = WINDOW_DELAYED_BOUND_FOLLOWING; } } - if (NULL != pwindowframe->trail->val && IsA(pwindowframe->trail->val, SubLink)) + if (NULL != pwindowframe->trail->val && + IsA(pwindowframe->trail->val, SubLink)) { if (WINDOW_BOUND_PRECEDING == pwindowframe->trail->kind) { @@ -1549,7 +1538,8 @@ CQueryMutators::PqueryFixWindowFrameEdgeBoundary } else { - GPOS_ASSERT(WINDOW_BOUND_FOLLOWING == pwindowframe->trail->kind); + GPOS_ASSERT(WINDOW_BOUND_FOLLOWING == + pwindowframe->trail->kind); pwindowframe->trail->kind = WINDOW_DELAYED_BOUND_FOLLOWING; } } @@ -1574,14 +1564,11 @@ CQueryMutators::PqueryFixWindowFrameEdgeBoundary // SELECT rn+rk from (SELECT row_number() over() as rn, rank() over(partition by a+b order by a-b) as rk FROM foo) foo_new //--------------------------------------------------------------------------- Query * -CQueryMutators::NormalizeWindowProjList - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const Query *query - ) +CQueryMutators::NormalizeWindowProjList(CMemoryPool *mp, + CMDAccessor *md_accessor, + const Query *query) { - Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); + Query *query_copy = (Query *) gpdb::CopyObject(const_cast(query)); if (!NeedsProjListWindowNormalization(query)) { @@ -1590,79 +1577,99 @@ CQueryMutators::NormalizeWindowProjList // we do not fix target list of the derived table since we will be mutating it below // to ensure that it does not have operations with window function - Query *new_query = ConvertToDerivedTable(query_copy, false /*should_fix_target_list*/, true /*should_fix_having_qual*/); + Query *new_query = + ConvertToDerivedTable(query_copy, false /*should_fix_target_list*/, + true /*should_fix_having_qual*/); gpdb::GPDBFree(query_copy); GPOS_ASSERT(1 == gpdb::ListLength(new_query->rtable)); - Query *derived_table_query = (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0))->subquery; + Query *derived_table_query = + (Query *) ((RangeTblEntry *) gpdb::ListNth(new_query->rtable, 0)) + ->subquery; SContextGrpbyPlMutator context(mp, md_accessor, derived_table_query, NULL); ListCell *lc = NULL; List *target_entries = derived_table_query->targetList; - ForEach (lc, target_entries) + ForEach(lc, target_entries) { - TargetEntry *target_entry = (TargetEntry*) lfirst(lc); + TargetEntry *target_entry = (TargetEntry *) lfirst(lc); const ULONG ulResNoNew = gpdb::ListLength(new_query->targetList) + 1; if (CTranslatorUtils::IsWindowSpec(target_entry, query->windowClause)) { // insert the target list entry used in the window specification as is - if (!target_entry->resjunk || CTranslatorUtils::IsSortingColumn(target_entry, query->sortClause)) + if (!target_entry->resjunk || CTranslatorUtils::IsSortingColumn( + target_entry, query->sortClause)) { - TargetEntry *new_target_entry = (TargetEntry *) gpdb::CopyObject(target_entry); + TargetEntry *new_target_entry = + (TargetEntry *) gpdb::CopyObject(target_entry); { SContextIncLevelsupMutator context(0, false); - new_target_entry->expr = (Expr *) RunIncrLevelsUpMutator((Node *)new_target_entry->expr, &context); + new_target_entry->expr = (Expr *) RunIncrLevelsUpMutator( + (Node *) new_target_entry->expr, &context); } - new_target_entry->resno = gpdb::ListLength(context.m_derived_table_tlist) + 1; - context.m_derived_table_tlist = gpdb::LAppend(context.m_derived_table_tlist, new_target_entry); + new_target_entry->resno = + gpdb::ListLength(context.m_derived_table_tlist) + 1; + context.m_derived_table_tlist = gpdb::LAppend( + context.m_derived_table_tlist, new_target_entry); // if the target list entry used in the window specification is present // in the query output then add it to the target list of the new top level query - Var *new_var = gpdb::MakeVar - ( - 1, - new_target_entry->resno, - gpdb::ExprType((Node*) target_entry->expr), - gpdb::ExprTypeMod((Node*) target_entry->expr), - 0 // query levels up - ); - TargetEntry *new_target_entry_copy = gpdb::MakeTargetEntry((Expr*) new_var, ulResNoNew, target_entry->resname, target_entry->resjunk); + Var *new_var = gpdb::MakeVar( + 1, new_target_entry->resno, + gpdb::ExprType((Node *) target_entry->expr), + gpdb::ExprTypeMod((Node *) target_entry->expr), + 0 // query levels up + ); + TargetEntry *new_target_entry_copy = gpdb::MakeTargetEntry( + (Expr *) new_var, ulResNoNew, target_entry->resname, + target_entry->resjunk); // Copy the resortgroupref and resjunk information for the top-level target list entry // Set target list entry of the derived table to be non-resjunked new_target_entry_copy->resjunk = new_target_entry->resjunk; - new_target_entry_copy->ressortgroupref = new_target_entry->ressortgroupref; + new_target_entry_copy->ressortgroupref = + new_target_entry->ressortgroupref; new_target_entry->resjunk = false; - new_query->targetList = gpdb::LAppend(new_query->targetList, new_target_entry_copy); + new_query->targetList = + gpdb::LAppend(new_query->targetList, new_target_entry_copy); } else { // This target entry is not required to be output, so we just insert it into the // derived table. Since we are moving it down by a level, we need to fix the // varlevelsup of outer refs. - TargetEntry *new_target_entry = (TargetEntry *) gpdb::CopyObject(target_entry); + TargetEntry *new_target_entry = + (TargetEntry *) gpdb::CopyObject(target_entry); { SContextIncLevelsupMutator context(0, false); - new_target_entry->expr = (Expr *) RunIncrLevelsUpMutator((Node *)new_target_entry->expr, &context); + new_target_entry->expr = (Expr *) RunIncrLevelsUpMutator( + (Node *) new_target_entry->expr, &context); } - new_target_entry->resno = gpdb::ListLength(context.m_derived_table_tlist) + 1; - context.m_derived_table_tlist = gpdb::LAppend(context.m_derived_table_tlist, new_target_entry); + new_target_entry->resno = + gpdb::ListLength(context.m_derived_table_tlist) + 1; + context.m_derived_table_tlist = gpdb::LAppend( + context.m_derived_table_tlist, new_target_entry); } } else { // normalize target list entry - Expr *pexprNew = (Expr*) RunWindowProjListMutator( (Node*) target_entry->expr, &context); - TargetEntry *new_target_entry = gpdb::MakeTargetEntry(pexprNew, ulResNoNew, target_entry->resname, target_entry->resjunk); + Expr *pexprNew = (Expr *) RunWindowProjListMutator( + (Node *) target_entry->expr, &context); + TargetEntry *new_target_entry = gpdb::MakeTargetEntry( + pexprNew, ulResNoNew, target_entry->resname, + target_entry->resjunk); new_target_entry->ressortgroupref = target_entry->ressortgroupref; - new_query->targetList = gpdb::LAppend(new_query->targetList, new_target_entry); + new_query->targetList = + gpdb::LAppend(new_query->targetList, new_target_entry); } } derived_table_query->targetList = context.m_derived_table_tlist; - GPOS_ASSERT(gpdb::ListLength(new_query->targetList) <= gpdb::ListLength(query->targetList)); + GPOS_ASSERT(gpdb::ListLength(new_query->targetList) <= + gpdb::ListLength(query->targetList)); new_query->hasWindFuncs = false; ReassignSortClause(new_query, derived_table_query); @@ -1679,11 +1686,8 @@ CQueryMutators::NormalizeWindowProjList // arbitrarily complex project element //--------------------------------------------------------------------------- Node * -CQueryMutators::RunWindowProjListMutator - ( - Node *node, - SContextGrpbyPlMutator *context - ) +CQueryMutators::RunWindowProjListMutator(Node *node, + SContextGrpbyPlMutator *context) { if (NULL == node) { @@ -1698,11 +1702,13 @@ CQueryMutators::RunWindowProjListMutator { // insert window operator into the derived table // and refer to it in the top-level query's target list - WindowRef *window_ref = FlatCopyWindowRef((WindowRef *)node); + WindowRef *window_ref = FlatCopyWindowRef((WindowRef *) node); // get the function name and add it to the target list - CMDIdGPDB *mdid_func = GPOS_NEW(context->m_mp) CMDIdGPDB(window_ref->winfnoid); - const CWStringConst *str = CMDAccessorUtils::PstrWindowFuncName(context->m_mda, mdid_func); + CMDIdGPDB *mdid_func = + GPOS_NEW(context->m_mp) CMDIdGPDB(window_ref->winfnoid); + const CWStringConst *str = + CMDAccessorUtils::PstrWindowFuncName(context->m_mda, mdid_func); mdid_func->Release(); ListCell *lc = NULL; @@ -1711,46 +1717,39 @@ CQueryMutators::RunWindowProjListMutator BOOL is_arg = context->m_is_mutating_window_arg; context->m_is_mutating_window_arg = true; - ForEach (lc, ((WindowRef *)node)->args) + ForEach(lc, ((WindowRef *) node)->args) { - Node *arg = (Node*) lfirst(lc); + Node *arg = (Node *) lfirst(lc); GPOS_ASSERT(NULL != arg); // traverse each argument and fix levels up when needed - new_args = gpdb::LAppend - ( - new_args, - gpdb::MutateQueryOrExpressionTree - ( - arg, - (MutatorWalkerFn) RunWindowProjListMutator, - (void *) context, - 0 // mutate into cte-lists - ) - ); + new_args = gpdb::LAppend( + new_args, + gpdb::MutateQueryOrExpressionTree( + arg, (MutatorWalkerFn) RunWindowProjListMutator, + (void *) context, + 0 // mutate into cte-lists + )); } context->m_is_mutating_window_arg = is_arg; window_ref->args = new_args; - TargetEntry *target_entry = gpdb::MakeTargetEntry - ( - (Expr*) gpdb::CopyObject(window_ref), - (AttrNumber) resno, - CTranslatorUtils::CreateMultiByteCharStringFromWCString(str->GetBuffer()), - false /* resjunk */ - ); - context->m_derived_table_tlist = gpdb::LAppend(context->m_derived_table_tlist, target_entry); + TargetEntry *target_entry = gpdb::MakeTargetEntry( + (Expr *) gpdb::CopyObject(window_ref), (AttrNumber) resno, + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str->GetBuffer()), + false /* resjunk */ + ); + context->m_derived_table_tlist = + gpdb::LAppend(context->m_derived_table_tlist, target_entry); // return a variable referring to the new derived table's corresponding target list entry - Var *new_var = gpdb::MakeVar - ( - 1, - (AttrNumber) resno, - gpdb::ExprType(node), - gpdb::ExprTypeMod(node), - 0 // query levelsup - ); - - return (Node*) new_var; + Var *new_var = + gpdb::MakeVar(1, (AttrNumber) resno, gpdb::ExprType(node), + gpdb::ExprTypeMod(node), + 0 // query levelsup + ); + + return (Node *) new_var; } } @@ -1767,36 +1766,37 @@ CQueryMutators::RunWindowProjListMutator // var->varlevelsup > context->m_current_query_level: The outer reference is referencing // a value above our current scope. The new place for the var is the same difference // from those outer refs, therefore we also don't have to change anything. - if (var->varlevelsup == context->m_current_query_level && !context->m_is_mutating_window_arg) + if (var->varlevelsup == context->m_current_query_level && + !context->m_is_mutating_window_arg) { - // For other top-level references, correct their varno & varattno, since // they now must refer to the target list of the derived query - whose // target list may be different from the original query. // Set varlevelsup to 0 temporarily while searching in the target list var->varlevelsup = 0; - TargetEntry *found_tle = - gpdb::FindFirstMatchingMemberInTargetList((Node*) var, - context->m_derived_table_tlist); + TargetEntry *found_tle = gpdb::FindFirstMatchingMemberInTargetList( + (Node *) var, context->m_derived_table_tlist); if (NULL == found_tle) { - Node *var_copy = (Node*) gpdb::CopyObject(var); + Node *var_copy = (Node *) gpdb::CopyObject(var); return (Node *) MakeVarInDerivedTable(var_copy, context); } - var->varno = 1; // derived query is the only table in FROM expression + var->varno = + 1; // derived query is the only table in FROM expression var->varattno = found_tle->resno; - var->varlevelsup = context->m_current_query_level; // reset varlevels up + var->varlevelsup = + context->m_current_query_level; // reset varlevels up found_tle->resjunk = false; - return (Node*) var; + return (Node *) var; } if (context->m_is_mutating_window_arg) { - return (Node *) IncrLevelsUpIfOuterRef((Var*) node); + return (Node *) IncrLevelsUpIfOuterRef((Var *) node); } return (Node *) var; @@ -1809,32 +1809,31 @@ CQueryMutators::RunWindowProjListMutator SubLink *new_sublink = MakeNode(SubLink); new_sublink->subLinkType = old_sublink->subLinkType; new_sublink->location = old_sublink->location; - new_sublink->operName = (List *) gpdb::CopyObject(old_sublink->operName); - - new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->testexpr, - (MutatorWalkerFn) RunWindowProjListMutator, - (void *) context, - 0 // mutate into cte-lists - ); + new_sublink->operName = + (List *) gpdb::CopyObject(old_sublink->operName); + + new_sublink->testexpr = gpdb::MutateQueryOrExpressionTree( + old_sublink->testexpr, (MutatorWalkerFn) RunWindowProjListMutator, + (void *) context, + 0 // mutate into cte-lists + ); context->m_current_query_level++; GPOS_ASSERT(IsA(old_sublink->subselect, Query)); - new_sublink->subselect = gpdb::MutateQueryOrExpressionTree - ( - old_sublink->subselect, - (MutatorWalkerFn) RunWindowProjListMutator, - (void *) context, - 0 // mutate into cte-lists - ); + new_sublink->subselect = gpdb::MutateQueryOrExpressionTree( + old_sublink->subselect, (MutatorWalkerFn) RunWindowProjListMutator, + (void *) context, + 0 // mutate into cte-lists + ); context->m_current_query_level--; return (Node *) new_sublink; } - return gpdb::MutateExpressionTree(node, (MutatorWalkerFn) CQueryMutators::RunWindowProjListMutator, context); + return gpdb::MutateExpressionTree( + node, (MutatorWalkerFn) CQueryMutators::RunWindowProjListMutator, + context); } //--------------------------------------------------------------------------- @@ -1845,11 +1844,8 @@ CQueryMutators::RunWindowProjListMutator // Reassign the sorting clause from the derived table to the new top-level query //--------------------------------------------------------------------------- void -CQueryMutators::ReassignSortClause - ( - Query *top_level_query, - Query *derived_table_query - ) +CQueryMutators::ReassignSortClause(Query *top_level_query, + Query *derived_table_query) { top_level_query->sortClause = derived_table_query->sortClause; top_level_query->limitOffset = derived_table_query->limitOffset; diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp index f09af87ae1..254a3cf31d 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp @@ -64,25 +64,21 @@ using namespace gpmd; // Ctor // //--------------------------------------------------------------------------- -CTranslatorDXLToPlStmt::CTranslatorDXLToPlStmt - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CContextDXLToPlStmt* dxl_to_plstmt_context, - ULONG num_of_segments - ) - : - m_mp(mp), - m_md_accessor(md_accessor), - m_dxl_to_plstmt_context(dxl_to_plstmt_context), - m_cmd_type(CMD_SELECT), - m_is_tgt_tbl_distributed(false), - m_result_rel_list(NULL), - m_external_scan_counter(0), - m_num_of_segments(num_of_segments), - m_partition_selector_counter(0) +CTranslatorDXLToPlStmt::CTranslatorDXLToPlStmt( + CMemoryPool *mp, CMDAccessor *md_accessor, + CContextDXLToPlStmt *dxl_to_plstmt_context, ULONG num_of_segments) + : m_mp(mp), + m_md_accessor(md_accessor), + m_dxl_to_plstmt_context(dxl_to_plstmt_context), + m_cmd_type(CMD_SELECT), + m_is_tgt_tbl_distributed(false), + m_result_rel_list(NULL), + m_external_scan_counter(0), + m_num_of_segments(num_of_segments), + m_partition_selector_counter(0) { - m_translator_dxl_to_scalar = GPOS_NEW(m_mp) CTranslatorDXLToScalar(m_mp, m_md_accessor, m_num_of_segments); + m_translator_dxl_to_scalar = GPOS_NEW(m_mp) + CTranslatorDXLToScalar(m_mp, m_md_accessor, m_num_of_segments); InitTranslators(); } @@ -110,56 +106,87 @@ CTranslatorDXLToPlStmt::~CTranslatorDXLToPlStmt() void CTranslatorDXLToPlStmt::InitTranslators() { - for (ULONG idx = 0; idx < GPOS_ARRAY_SIZE(m_dxlop_translator_func_mapping_array); idx++) + for (ULONG idx = 0; + idx < GPOS_ARRAY_SIZE(m_dxlop_translator_func_mapping_array); idx++) { m_dxlop_translator_func_mapping_array[idx] = NULL; } // array mapping operator type to translator function - static const STranslatorMapping dxlop_translator_func_mapping_array[] = - { - {EdxlopPhysicalTableScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTblScan}, - {EdxlopPhysicalExternalScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTblScan}, - {EdxlopPhysicalIndexScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLIndexScan}, - {EdxlopPhysicalHashJoin, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLHashJoin}, - {EdxlopPhysicalNLJoin, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLNLJoin}, - {EdxlopPhysicalMergeJoin, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMergeJoin}, - {EdxlopPhysicalMotionGather, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, - {EdxlopPhysicalMotionBroadcast, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, - {EdxlopPhysicalMotionRedistribute, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion}, - {EdxlopPhysicalMotionRandom, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion}, - {EdxlopPhysicalMotionRoutedDistribute, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, - {EdxlopPhysicalLimit, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLLimit}, - {EdxlopPhysicalAgg, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAgg}, - {EdxlopPhysicalWindow, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLWindow}, - {EdxlopPhysicalSort, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSort}, - {EdxlopPhysicalSubqueryScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan}, - {EdxlopPhysicalResult, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLResult}, - {EdxlopPhysicalAppend, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAppend}, - {EdxlopPhysicalMaterialize, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMaterialize}, - {EdxlopPhysicalSequence, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSequence}, - {EdxlopPhysicalDynamicTableScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDynTblScan}, - {EdxlopPhysicalDynamicIndexScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan}, - {EdxlopPhysicalTVF, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTvf}, - {EdxlopPhysicalDML, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDml}, - {EdxlopPhysicalSplit, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSplit}, - {EdxlopPhysicalRowTrigger, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLRowTrigger}, - {EdxlopPhysicalAssert, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAssert}, - {EdxlopPhysicalCTEProducer, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan}, - {EdxlopPhysicalCTEConsumer, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan}, - {EdxlopPhysicalBitmapTableScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan}, - {EdxlopPhysicalDynamicBitmapTableScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan}, - {EdxlopPhysicalCTAS, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCtas}, - {EdxlopPhysicalPartitionSelector, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLPartSelector}, - {EdxlopPhysicalValuesScan, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLValueScan}, + static const STranslatorMapping dxlop_translator_func_mapping_array[] = { + {EdxlopPhysicalTableScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTblScan}, + {EdxlopPhysicalExternalScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTblScan}, + {EdxlopPhysicalIndexScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLIndexScan}, + {EdxlopPhysicalHashJoin, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLHashJoin}, + {EdxlopPhysicalNLJoin, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLNLJoin}, + {EdxlopPhysicalMergeJoin, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMergeJoin}, + {EdxlopPhysicalMotionGather, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, + {EdxlopPhysicalMotionBroadcast, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, + {EdxlopPhysicalMotionRedistribute, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion}, + {EdxlopPhysicalMotionRandom, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion}, + {EdxlopPhysicalMotionRoutedDistribute, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMotion}, + {EdxlopPhysicalLimit, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLLimit}, + {EdxlopPhysicalAgg, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAgg}, + {EdxlopPhysicalWindow, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLWindow}, + {EdxlopPhysicalSort, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSort}, + {EdxlopPhysicalSubqueryScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan}, + {EdxlopPhysicalResult, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLResult}, + {EdxlopPhysicalAppend, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAppend}, + {EdxlopPhysicalMaterialize, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLMaterialize}, + {EdxlopPhysicalSequence, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSequence}, + {EdxlopPhysicalDynamicTableScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDynTblScan}, + {EdxlopPhysicalDynamicIndexScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan}, + {EdxlopPhysicalTVF, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLTvf}, + {EdxlopPhysicalDML, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLDml}, + {EdxlopPhysicalSplit, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLSplit}, + {EdxlopPhysicalRowTrigger, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLRowTrigger}, + {EdxlopPhysicalAssert, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLAssert}, + {EdxlopPhysicalCTEProducer, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan}, + {EdxlopPhysicalCTEConsumer, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan}, + {EdxlopPhysicalBitmapTableScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan}, + {EdxlopPhysicalDynamicBitmapTableScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan}, + {EdxlopPhysicalCTAS, &gpopt::CTranslatorDXLToPlStmt::TranslateDXLCtas}, + {EdxlopPhysicalPartitionSelector, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLPartSelector}, + {EdxlopPhysicalValuesScan, + &gpopt::CTranslatorDXLToPlStmt::TranslateDXLValueScan}, }; - const ULONG num_of_translators = GPOS_ARRAY_SIZE(dxlop_translator_func_mapping_array); + const ULONG num_of_translators = + GPOS_ARRAY_SIZE(dxlop_translator_func_mapping_array); for (ULONG idx = 0; idx < num_of_translators; idx++) { STranslatorMapping elem = dxlop_translator_func_mapping_array[idx]; - m_dxlop_translator_func_mapping_array[elem.dxl_op_id] = elem.dxlnode_to_logical_funct; + m_dxlop_translator_func_mapping_array[elem.dxl_op_id] = + elem.dxlnode_to_logical_funct; } } @@ -172,18 +199,17 @@ CTranslatorDXLToPlStmt::InitTranslators() // //--------------------------------------------------------------------------- PlannedStmt * -CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL - ( - const CDXLNode *dxlnode, - bool can_set_tag - ) +CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL(const CDXLNode *dxlnode, + bool can_set_tag) { GPOS_ASSERT(NULL != dxlnode); CDXLTranslateContext dxl_translate_ctxt(m_mp, false); - CDXLTranslationContextArray *ctxt_translation_prev_siblings = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - Plan *plan = TranslateDXLOperatorToPlan(dxlnode, &dxl_translate_ctxt, ctxt_translation_prev_siblings); + CDXLTranslationContextArray *ctxt_translation_prev_siblings = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + Plan *plan = TranslateDXLOperatorToPlan(dxlnode, &dxl_translate_ctxt, + ctxt_translation_prev_siblings); ctxt_translation_prev_siblings->Release(); GPOS_ASSERT(NULL != plan); @@ -192,7 +218,7 @@ CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL List *oids_list = NIL; ListCell *lc_rte = NULL; - ForEach (lc_rte, m_dxl_to_plstmt_context->GetRTableEntriesList()) + ForEach(lc_rte, m_dxl_to_plstmt_context->GetRTableEntriesList()) { RangeTblEntry *pRTE = (RangeTblEntry *) lfirst(lc_rte); @@ -205,22 +231,25 @@ CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL // assemble planned stmt PlannedStmt *planned_stmt = MakeNode(PlannedStmt); planned_stmt->planGen = PLANGEN_OPTIMIZER; - + planned_stmt->rtable = m_dxl_to_plstmt_context->GetRTableEntriesList(); planned_stmt->subplans = m_dxl_to_plstmt_context->GetSubplanEntriesList(); planned_stmt->planTree = plan; // store partitioned table indexes in planned stmt - planned_stmt->queryPartOids = m_dxl_to_plstmt_context->GetPartitionedTablesList(); + planned_stmt->queryPartOids = + m_dxl_to_plstmt_context->GetPartitionedTablesList(); planned_stmt->canSetTag = can_set_tag; planned_stmt->relationOids = oids_list; - planned_stmt->numSelectorsPerScanId = m_dxl_to_plstmt_context->GetNumPartitionSelectorsList(); + planned_stmt->numSelectorsPerScanId = + m_dxl_to_plstmt_context->GetNumPartitionSelectorsList(); - plan->nMotionNodes = m_dxl_to_plstmt_context->GetCurrentMotionId()-1; - planned_stmt->nMotionNodes = m_dxl_to_plstmt_context->GetCurrentMotionId()-1; + plan->nMotionNodes = m_dxl_to_plstmt_context->GetCurrentMotionId() - 1; + planned_stmt->nMotionNodes = + m_dxl_to_plstmt_context->GetCurrentMotionId() - 1; planned_stmt->commandType = m_cmd_type; - + GPOS_ASSERT(plan->nMotionNodes >= 0); if (0 == plan->nMotionNodes && !m_is_tgt_tbl_distributed) { @@ -231,35 +260,39 @@ CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL { plan->dispatch = DISPATCH_PARALLEL; } - + planned_stmt->resultRelations = m_result_rel_list; planned_stmt->intoClause = m_dxl_to_plstmt_context->GetIntoClause(); planned_stmt->intoPolicy = m_dxl_to_plstmt_context->GetDistributionPolicy(); - + SetInitPlanVariables(planned_stmt); - + if (CMD_SELECT == m_cmd_type && NULL != dxlnode->GetDXLDirectDispatchInfo()) { - List *direct_dispatch_segids = TranslateDXLDirectDispatchInfo(dxlnode->GetDXLDirectDispatchInfo()); + List *direct_dispatch_segids = + TranslateDXLDirectDispatchInfo(dxlnode->GetDXLDirectDispatchInfo()); plan->directDispatch.contentIds = direct_dispatch_segids; plan->directDispatch.isDirectDispatch = (NIL != direct_dispatch_segids); - + if (plan->directDispatch.isDirectDispatch) { - List *motion_node_list = gpdb::ExtractNodesPlan(planned_stmt->planTree, T_Motion, true /*descendIntoSubqueries*/); + List *motion_node_list = + gpdb::ExtractNodesPlan(planned_stmt->planTree, T_Motion, + true /*descendIntoSubqueries*/); ListCell *lc = NULL; ForEach(lc, motion_node_list) { Motion *motion = (Motion *) lfirst(lc); GPOS_ASSERT(IsA(motion, Motion)); GPOS_ASSERT(gpdb::IsMotionGather(motion)); - + motion->plan.directDispatch.isDirectDispatch = true; - motion->plan.directDispatch.contentIds = plan->directDispatch.contentIds; + motion->plan.directDispatch.contentIds = + plan->directDispatch.contentIds; } } } - + return planned_stmt; } @@ -272,27 +305,27 @@ CTranslatorDXLToPlStmt::GetPlannedStmtFromDXL // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan - ( - const CDXLNode *dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan( + const CDXLNode *dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { GPOS_ASSERT(NULL != dxlnode); GPOS_ASSERT(NULL != ctxt_translation_prev_siblings); CDXLOperator *dxlop = dxlnode->GetOperator(); - ULONG ulOpId = (ULONG) dxlop->GetDXLOperator(); + ULONG ulOpId = (ULONG) dxlop->GetDXLOperator(); - PfPplan dxlnode_to_logical_funct = m_dxlop_translator_func_mapping_array[ulOpId]; + PfPplan dxlnode_to_logical_funct = + m_dxlop_translator_func_mapping_array[ulOpId]; if (NULL == dxlnode_to_logical_funct) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, dxlnode->GetOperator()->GetOpNameStr()->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + dxlnode->GetOperator()->GetOpNameStr()->GetBuffer()); } - return (this->* dxlnode_to_logical_funct)(dxlnode, output_context, ctxt_translation_prev_siblings); + return (this->*dxlnode_to_logical_funct)(dxlnode, output_context, + ctxt_translation_prev_siblings); } //--------------------------------------------------------------------------- @@ -304,24 +337,28 @@ CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan // as well as its subplans. Set the number of parameters used in the plan. //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::SetInitPlanVariables(PlannedStmt* planned_stmt) +CTranslatorDXLToPlStmt::SetInitPlanVariables(PlannedStmt *planned_stmt) { - if(1 != m_dxl_to_plstmt_context->GetCurrentMotionId()) // For Distributed Tables m_ulMotionId > 1 + if (1 != + m_dxl_to_plstmt_context + ->GetCurrentMotionId()) // For Distributed Tables m_ulMotionId > 1 { planned_stmt->nInitPlans = m_dxl_to_plstmt_context->GetCurrentParamId(); - planned_stmt->planTree->nInitPlans = m_dxl_to_plstmt_context->GetCurrentParamId(); + planned_stmt->planTree->nInitPlans = + m_dxl_to_plstmt_context->GetCurrentParamId(); } planned_stmt->nParamExec = m_dxl_to_plstmt_context->GetCurrentParamId(); // Extract all subplans defined in the planTree - List *subplan_list = gpdb::ExtractNodesPlan(planned_stmt->planTree, T_SubPlan, true); + List *subplan_list = + gpdb::ExtractNodesPlan(planned_stmt->planTree, T_SubPlan, true); ListCell *lc = NULL; - ForEach (lc, subplan_list) + ForEach(lc, subplan_list) { - SubPlan *subplan = (SubPlan*) lfirst(lc); + SubPlan *subplan = (SubPlan *) lfirst(lc); if (subplan->is_initplan) { SetInitPlanSliceInformation(subplan); @@ -333,14 +370,15 @@ CTranslatorDXLToPlStmt::SetInitPlanVariables(PlannedStmt* planned_stmt) List *initplan_list = planned_stmt->subplans; - ForEach (lc,initplan_list) + ForEach(lc, initplan_list) { - subplan_list = gpdb::ExtractNodesPlan((Plan*) lfirst(lc), T_SubPlan, true); + subplan_list = + gpdb::ExtractNodesPlan((Plan *) lfirst(lc), T_SubPlan, true); ListCell *lc2; - ForEach (lc2, subplan_list) + ForEach(lc2, subplan_list) { - SubPlan *subplan = (SubPlan*) lfirst(lc2); + SubPlan *subplan = (SubPlan *) lfirst(lc2); if (subplan->is_initplan) { SetInitPlanSliceInformation(subplan); @@ -362,7 +400,7 @@ CTranslatorDXLToPlStmt::SetInitPlanVariables(PlannedStmt* planned_stmt) // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::SetInitPlanSliceInformation(SubPlan * subplan) +CTranslatorDXLToPlStmt::SetInitPlanSliceInformation(SubPlan *subplan) { GPOS_ASSERT(subplan->is_initplan && "This is processed for initplans only"); @@ -370,9 +408,11 @@ CTranslatorDXLToPlStmt::SetInitPlanSliceInformation(SubPlan * subplan) { GPOS_ASSERT(0 < m_dxl_to_plstmt_context->GetCurrentMotionId()); - if(1 < m_dxl_to_plstmt_context->GetCurrentMotionId()) + if (1 < m_dxl_to_plstmt_context->GetCurrentMotionId()) { - subplan->qDispSliceId = m_dxl_to_plstmt_context->GetCurrentMotionId() + subplan->plan_id-1; + subplan->qDispSliceId = + m_dxl_to_plstmt_context->GetCurrentMotionId() + + subplan->plan_id - 1; } else { @@ -390,17 +430,18 @@ CTranslatorDXLToPlStmt::SetInitPlanSliceInformation(SubPlan * subplan) // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::SetParamIds(Plan* plan) +CTranslatorDXLToPlStmt::SetParamIds(Plan *plan) { - List *params_node_list = gpdb::ExtractNodesPlan(plan, T_Param, true /* descend_into_subqueries */); + List *params_node_list = gpdb::ExtractNodesPlan( + plan, T_Param, true /* descend_into_subqueries */); ListCell *lc = NULL; - Bitmapset *bitmapset = NULL; + Bitmapset *bitmapset = NULL; - ForEach (lc, params_node_list) + ForEach(lc, params_node_list) { - Param *param = (Param*) lfirst(lc); + Param *param = (Param *) lfirst(lc); bitmapset = gpdb::BmsAddMember(bitmapset, param->paramid); } @@ -421,21 +462,17 @@ CTranslatorDXLToPlStmt::SetParamIds(Plan* plan) // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsFile - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsFile(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB) { // extract file path and name from URI strings and assign them a primary segdb ExtTableEntry *extentry = gpdb::GetExternalTableEntry(oidRel); ListCell *plcLocation = NULL; - ForEach (plcLocation, extentry->urilocations) + ForEach(plcLocation, extentry->urilocations) { - Value* pvLocation = (Value *)lfirst(plcLocation); + Value *pvLocation = (Value *) lfirst(plcLocation); CHAR *szUri = pvLocation->val.str; Uri *pUri = gpdb::ParseExternTableUri(szUri); @@ -446,13 +483,16 @@ CTranslatorDXLToPlStmt::MapLocationsFile // try to find a segment database that can handle this uri for (int i = 0; i < pcdbCompDB->total_segment_dbs && !fMatchFound; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) { if (URI_FILE == pUri->protocol && - 0 != gpdb::StrCmpIgnoreCase(pUri->hostname, pcdbCompDBInfo->hostname) && - 0 != gpdb::StrCmpIgnoreCase(pUri->hostname, pcdbCompDBInfo->address)) + 0 != gpdb::StrCmpIgnoreCase(pUri->hostname, + pcdbCompDBInfo->hostname) && + 0 != gpdb::StrCmpIgnoreCase(pUri->hostname, + pcdbCompDBInfo->address)) { continue; } @@ -468,8 +508,10 @@ CTranslatorDXLToPlStmt::MapLocationsFile if (!fMatchFound) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("Could not assign a segment database for external file")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT( + "Could not assign a segment database for external file")); } } } @@ -487,14 +529,10 @@ CTranslatorDXLToPlStmt::MapLocationsFile // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsFdist - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - Uri *pUri, - const ULONG ulTotalPrimaries - ) +CTranslatorDXLToPlStmt::MapLocationsFdist(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, + Uri *pUri, + const ULONG ulTotalPrimaries) { ULONG ulParticipatingSegments = ulTotalPrimaries; ULONG ulMaxParticipants = ulParticipatingSegments; @@ -521,14 +559,15 @@ CTranslatorDXLToPlStmt::MapLocationsFdist // This should match the same error in createplan.c char msgbuf[200]; - snprintf(msgbuf, sizeof(msgbuf), - "There are more external files (URLs) than primary segments that can read them. Found %d URLs and %d primary segments.", - ulLocations, ulParticipatingSegments); + snprintf( + msgbuf, sizeof(msgbuf), + "There are more external files (URLs) than primary segments that can read them. Found %d URLs and %d primary segments.", + ulLocations, ulParticipatingSegments); - GpdbEreport(ERRCODE_INVALID_TABLE_DEFINITION, // errcode - ERROR, - msgbuf, // errmsg - NULL); // errhint + GpdbEreport(ERRCODE_INVALID_TABLE_DEFINITION, // errcode + ERROR, + msgbuf, // errmsg + NULL); // errhint } BOOL fDone = false; @@ -537,12 +576,13 @@ CTranslatorDXLToPlStmt::MapLocationsFdist while (!fDone) { ListCell *plcLocation = NULL; - ForEach (plcLocation, extentry->urilocations) + ForEach(plcLocation, extentry->urilocations) { - Value* pvLocation = (Value *)lfirst(plcLocation); + Value *pvLocation = (Value *) lfirst(plcLocation); CHAR *szUri = pvLocation->val.str; - plModifiedLocations = gpdb::LAppend(plModifiedLocations, gpdb::MakeStringValue(szUri)); - ulModifiedLocations ++; + plModifiedLocations = gpdb::LAppend(plModifiedLocations, + gpdb::MakeStringValue(szUri)); + ulModifiedLocations++; if (ulModifiedLocations == ulParticipatingSegments) { @@ -552,8 +592,10 @@ CTranslatorDXLToPlStmt::MapLocationsFdist if (ulModifiedLocations > ulParticipatingSegments) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("External scan location list failed building distribution")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT( + "External scan location list failed building distribution")); } } } @@ -566,7 +608,7 @@ CTranslatorDXLToPlStmt::MapLocationsFdist // assign each URI from the new location list a primary segdb ListCell *plc = NULL; - ForEach (plc, plModifiedLocations) + ForEach(plc, plModifiedLocations) { const CHAR *szUri = (CHAR *) strVal(lfirst(plc)); @@ -575,7 +617,8 @@ CTranslatorDXLToPlStmt::MapLocationsFdist for (int i = 0; i < pcdbCompDB->total_segment_dbs && !fMatchFound; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) @@ -600,8 +643,9 @@ CTranslatorDXLToPlStmt::MapLocationsFdist if (!fMatchFound) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("Unable to assign segments for gpfdist(s)")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT("Unable to assign segments for gpfdist(s)")); } } } @@ -620,13 +664,9 @@ CTranslatorDXLToPlStmt::MapLocationsFdist // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecute - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - const ULONG ulTotalPrimaries - ) +CTranslatorDXLToPlStmt::MapLocationsExecute(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, + const ULONG ulTotalPrimaries) { ExtTableEntry *extentry = gpdb::GetExternalTableEntry(oidRel); CHAR *szCommand = extentry->command; @@ -646,30 +686,41 @@ CTranslatorDXLToPlStmt::MapLocationsExecute if (0 == gpos::clib::Strcmp(szOnClause, "ALL_SEGMENTS")) { - MapLocationsExecuteAllSegments(szPrefixedCommand, rgszSegFileMap, pcdbCompDB); + MapLocationsExecuteAllSegments(szPrefixedCommand, rgszSegFileMap, + pcdbCompDB); } else if (0 == gpos::clib::Strcmp(szOnClause, "PER_HOST")) { - MapLocationsExecutePerHost(szPrefixedCommand, rgszSegFileMap, pcdbCompDB); + MapLocationsExecutePerHost(szPrefixedCommand, rgszSegFileMap, + pcdbCompDB); } - else if (0 == gpos::clib::Strncmp(szOnClause, "HOST:", gpos::clib::Strlen("HOST:"))) + else if (0 == gpos::clib::Strncmp(szOnClause, + "HOST:", gpos::clib::Strlen("HOST:"))) { CHAR *szHostName = szOnClause + gpos::clib::Strlen("HOST:"); - MapLocationsExecuteOneHost(szHostName, szPrefixedCommand, rgszSegFileMap, pcdbCompDB); + MapLocationsExecuteOneHost(szHostName, szPrefixedCommand, + rgszSegFileMap, pcdbCompDB); } - else if (0 == gpos::clib::Strncmp(szOnClause, "SEGMENT_ID:", gpos::clib::Strlen("SEGMENT_ID:"))) + else if (0 == gpos::clib::Strncmp(szOnClause, "SEGMENT_ID:", + gpos::clib::Strlen("SEGMENT_ID:"))) { CHAR *pcEnd = NULL; - INT iTargetSegInd = (INT) gpos::clib::Strtol(szOnClause + gpos::clib::Strlen("SEGMENT_ID:"), &pcEnd, 10); - MapLocationsExecuteOneSegment(iTargetSegInd, szPrefixedCommand, rgszSegFileMap, pcdbCompDB); + INT iTargetSegInd = (INT) gpos::clib::Strtol( + szOnClause + gpos::clib::Strlen("SEGMENT_ID:"), &pcEnd, 10); + MapLocationsExecuteOneSegment(iTargetSegInd, szPrefixedCommand, + rgszSegFileMap, pcdbCompDB); } - else if (0 == gpos::clib::Strncmp(szOnClause, "TOTAL_SEGS:", gpos::clib::Strlen("TOTAL_SEGS:"))) + else if (0 == gpos::clib::Strncmp(szOnClause, "TOTAL_SEGS:", + gpos::clib::Strlen("TOTAL_SEGS:"))) { // total n segments selected randomly CHAR *pcEnd = NULL; - ULONG ulSegsToUse = gpos::clib::Strtol(szOnClause + gpos::clib::Strlen("TOTAL_SEGS:"), &pcEnd, 10); + ULONG ulSegsToUse = gpos::clib::Strtol( + szOnClause + gpos::clib::Strlen("TOTAL_SEGS:"), &pcEnd, 10); - MapLocationsExecuteRandomSegments(ulSegsToUse, ulTotalPrimaries, szPrefixedCommand, rgszSegFileMap, pcdbCompDB); + MapLocationsExecuteRandomSegments(ulSegsToUse, ulTotalPrimaries, + szPrefixedCommand, rgszSegFileMap, + pcdbCompDB); } else if (0 == gpos::clib::Strcmp(szOnClause, "MASTER_ONLY")) { @@ -678,7 +729,7 @@ CTranslatorDXLToPlStmt::MapLocationsExecute else { GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("Invalid ON clause")); + GPOS_WSZ_LIT("Invalid ON clause")); } gpdb::GPDBFree(szPrefixedCommand); @@ -693,16 +744,14 @@ CTranslatorDXLToPlStmt::MapLocationsExecute // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecuteAllSegments - ( - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsExecuteAllSegments( + CHAR *szPrefixedCommand, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB) { for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) { @@ -720,26 +769,25 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteAllSegments // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecutePerHost - ( - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsExecutePerHost( + CHAR *szPrefixedCommand, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB) { List *plVisitedHosts = NIL; for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) { BOOL fHostTaken = false; ListCell *plc = NULL; - ForEach (plc, plVisitedHosts) + ForEach(plc, plVisitedHosts) { const CHAR *szHostName = (CHAR *) strVal(lfirst(plc)); - if (0 == gpdb::StrCmpIgnoreCase(szHostName, pcdbCompDBInfo->hostname)) + if (0 == gpdb::StrCmpIgnoreCase(szHostName, + pcdbCompDBInfo->hostname)) { fHostTaken = true; break; @@ -749,11 +797,9 @@ CTranslatorDXLToPlStmt::MapLocationsExecutePerHost if (!fHostTaken) { rgszSegFileMap[iSegInd] = PStrDup(szPrefixedCommand); - plVisitedHosts = gpdb::LAppend - ( - plVisitedHosts, - gpdb::MakeStringValue(PStrDup(pcdbCompDBInfo->hostname)) - ); + plVisitedHosts = gpdb::LAppend( + plVisitedHosts, + gpdb::MakeStringValue(PStrDup(pcdbCompDBInfo->hostname))); } } } @@ -768,18 +814,15 @@ CTranslatorDXLToPlStmt::MapLocationsExecutePerHost // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecuteOneHost - ( - CHAR *szHostName, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsExecuteOneHost( + CHAR *szHostName, CHAR *szPrefixedCommand, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB) { BOOL fMatchFound = false; for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo) && @@ -792,8 +835,10 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteOneHost if (!fMatchFound) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("Could not assign a segment database for given command. No valid primary segment was found in the requested host name.")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT( + "Could not assign a segment database for given command. No valid primary segment was found in the requested host name.")); } } @@ -806,30 +851,30 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteOneHost // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecuteOneSegment - ( - INT iTargetSegInd, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsExecuteOneSegment( + INT iTargetSegInd, CHAR *szPrefixedCommand, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB) { BOOL fMatchFound = false; for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; - if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo) && iSegInd == iTargetSegInd) + if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo) && + iSegInd == iTargetSegInd) { rgszSegFileMap[iSegInd] = PStrDup(szPrefixedCommand); fMatchFound = true; } } - if(!fMatchFound) + if (!fMatchFound) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("Could not assign a segment database for given command. The requested segment id is not a valid primary segment.")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT( + "Could not assign a segment database for given command. The requested segment id is not a valid primary segment.")); } } @@ -842,19 +887,16 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteOneSegment // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsExecuteRandomSegments - ( - ULONG ulSegments, - const ULONG ulTotalPrimaries, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ) +CTranslatorDXLToPlStmt::MapLocationsExecuteRandomSegments( + ULONG ulSegments, const ULONG ulTotalPrimaries, CHAR *szPrefixedCommand, + char **rgszSegFileMap, CdbComponentDatabases *pcdbCompDB) { if (ulSegments > ulTotalPrimaries) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, - GPOS_WSZ_LIT("More segments in table definition than valid primary segments in the database.")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT( + "More segments in table definition than valid primary segments in the database.")); } ULONG ulSkip = ulTotalPrimaries - ulSegments; @@ -862,7 +904,8 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteRandomSegments for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; INT iSegInd = pcdbCompDBInfo->segindex; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) { @@ -887,16 +930,14 @@ CTranslatorDXLToPlStmt::MapLocationsExecuteRandomSegments // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::MapLocationsHdfs - ( - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - CHAR *szFirstUri - ) +CTranslatorDXLToPlStmt::MapLocationsHdfs(char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, + CHAR *szFirstUri) { for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; rgszSegFileMap[pcdbCompDBInfo->segindex] = PStrDup(szFirstUri); } } @@ -909,21 +950,18 @@ CTranslatorDXLToPlStmt::MapLocationsHdfs // List of URIs for external scan // //--------------------------------------------------------------------------- -List* -CTranslatorDXLToPlStmt::PlExternalScanUriList - ( - OID oidRel - ) +List * +CTranslatorDXLToPlStmt::PlExternalScanUriList(OID oidRel) { ExtTableEntry *extentry = gpdb::GetExternalTableEntry(oidRel); if (extentry->iswritable) { // This should match the same error in createplan.c - GpdbEreport(ERRCODE_WRONG_OBJECT_TYPE, // errcode - ERROR, - "cannot read from a WRITABLE external table", // errmsg - "Create the table as READABLE instead."); // errhint + GpdbEreport(ERRCODE_WRONG_OBJECT_TYPE, // errcode + ERROR, + "cannot read from a WRITABLE external table", // errmsg + "Create the table as READABLE instead."); // errhint } //get the total valid primary segdb count @@ -931,7 +969,8 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList ULONG ulTotalPrimaries = 0; for (int i = 0; i < pcdbCompDB->total_segment_dbs; i++) { - CdbComponentDatabaseInfo *pcdbCompDBInfo = &pcdbCompDB->segment_db_info[i]; + CdbComponentDatabaseInfo *pcdbCompDBInfo = + &pcdbCompDB->segment_db_info[i]; if (SEGMENT_IS_ACTIVE_PRIMARY(pcdbCompDBInfo)) { ulTotalPrimaries++; @@ -939,8 +978,9 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList } char **rgszSegFileMap = NULL; - rgszSegFileMap = (char **) gpdb::GPDBAlloc(ulTotalPrimaries * sizeof(char *)); - gpos::clib::Memset(rgszSegFileMap, 0, ulTotalPrimaries * sizeof(char *)); + rgszSegFileMap = + (char **) gpdb::GPDBAlloc(ulTotalPrimaries * sizeof(char *)); + gpos::clib::Memset(rgszSegFileMap, 0, ulTotalPrimaries * sizeof(char *)); // is this an EXECUTE table or a LOCATION (URI) table BOOL fUsingExecute = false; @@ -951,10 +991,11 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList if (!gp_external_enable_exec) { // This should match the same error in createplan.c - GpdbEreport(ERRCODE_GP_FEATURE_NOT_CONFIGURED, // errcode - ERROR, - "Using external tables with OS level commands (EXECUTE clause) is disabled", // errmsg - "To enable set gp_external_enable_exec=on"); // errhint + GpdbEreport( + ERRCODE_GP_FEATURE_NOT_CONFIGURED, // errcode + ERROR, + "Using external tables with OS level commands (EXECUTE clause) is disabled", // errmsg + "To enable set gp_external_enable_exec=on"); // errhint } fUsingExecute = true; } @@ -969,21 +1010,27 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList Uri *pUri = NULL; if (!fUsingExecute) { - szFirstUri = ((Value *) gpdb::ListNth(extentry->urilocations, 0))->val.str; + szFirstUri = + ((Value *) gpdb::ListNth(extentry->urilocations, 0))->val.str; pUri = gpdb::ParseExternTableUri(szFirstUri); } - if (fUsingLocation && (URI_FILE == pUri->protocol || URI_HTTP == pUri->protocol)) + if (fUsingLocation && + (URI_FILE == pUri->protocol || URI_HTTP == pUri->protocol)) { MapLocationsFile(oidRel, rgszSegFileMap, pcdbCompDB); } - else if (fUsingLocation && (URI_GPFDIST == pUri->protocol || URI_GPFDISTS == pUri->protocol || URI_CUSTOM == pUri->protocol)) + else if (fUsingLocation && + (URI_GPFDIST == pUri->protocol || URI_GPFDISTS == pUri->protocol || + URI_CUSTOM == pUri->protocol)) { - MapLocationsFdist(oidRel, rgszSegFileMap, pcdbCompDB, pUri, ulTotalPrimaries); + MapLocationsFdist(oidRel, rgszSegFileMap, pcdbCompDB, pUri, + ulTotalPrimaries); } else if (fUsingExecute) { - MapLocationsExecute(oidRel, rgszSegFileMap, pcdbCompDB, ulTotalPrimaries); + MapLocationsExecute(oidRel, rgszSegFileMap, pcdbCompDB, + ulTotalPrimaries); } else if (fUsingLocation && URI_GPHDFS == pUri->protocol) { @@ -991,19 +1038,20 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList } else { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, GPOS_WSZ_LIT("Unsupported protocol and/or file location")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtExternalScanError, + GPOS_WSZ_LIT("Unsupported protocol and/or file location")); } - // convert array map to a list so it can be serialized as part of the plan + // convert array map to a list so it can be serialized as part of the plan List *plFileNames = NIL; for (ULONG ul = 0; ul < ulTotalPrimaries; ul++) { Value *pval = NULL; - if (NULL != rgszSegFileMap[ul]) - { - pval = gpdb::MakeStringValue(rgszSegFileMap[ul]); - } - else + if (NULL != rgszSegFileMap[ul]) + { + pval = gpdb::MakeStringValue(rgszSegFileMap[ul]); + } + else { // no file for this segdb. add a null entry pval = MakeNode(Value); @@ -1025,25 +1073,27 @@ CTranslatorDXLToPlStmt::PlExternalScanUriList // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLTblScan - ( - const CDXLNode *tbl_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLTblScan( + const CDXLNode *tbl_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translate table descriptor into a range table entry - CDXLPhysicalTableScan *phy_tbl_scan_dxlop = CDXLPhysicalTableScan::Cast(tbl_scan_dxlnode->GetOperator()); + CDXLPhysicalTableScan *phy_tbl_scan_dxlop = + CDXLPhysicalTableScan::Cast(tbl_scan_dxlnode->GetOperator()); // translation context for column mappings in the base relation CDXLTranslateContextBaseTable base_table_context(m_mp); // we will add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; - - const CDXLTableDescr *dxl_table_descr = phy_tbl_scan_dxlop->GetDXLTableDescr(); - const IMDRelation *md_rel = m_md_accessor->RetrieveRel(dxl_table_descr->MDId()); - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(dxl_table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + + const CDXLTableDescr *dxl_table_descr = + phy_tbl_scan_dxlop->GetDXLTableDescr(); + const IMDRelation *md_rel = + m_md_accessor->RetrieveRel(dxl_table_descr->MDId()); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + dxl_table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= ACL_SELECT; m_dxl_to_plstmt_context->AddRTE(rte); @@ -1052,10 +1102,11 @@ CTranslatorDXLToPlStmt::TranslateDXLTblScan Plan *plan_return = NULL; if (IMDRelation::ErelstorageExternal == md_rel->RetrieveRelStorageType()) { - const IMDRelationExternal *md_rel_ext = dynamic_cast(md_rel); + const IMDRelationExternal *md_rel_ext = + dynamic_cast(md_rel); OID oidRel = CMDIdGPDB::CastMdid(md_rel->MDId())->Oid(); ExtTableEntry *ext_table_entry = gpdb::GetExternalTableEntry(oidRel); - + // create external scan node ExternalScan *ext_scan = MakeNode(ExternalScan); ext_scan->scan.scanrelid = index; @@ -1063,7 +1114,8 @@ CTranslatorDXLToPlStmt::TranslateDXLTblScan Value *val = gpdb::MakeStringValue(ext_table_entry->fmtopts); ext_scan->fmtOpts = ListMake1(val); ext_scan->fmtType = ext_table_entry->fmtcode; - ext_scan->isMasterOnly = (IMDRelation::EreldistrMasterOnly == md_rel_ext->GetRelDistribution()); + ext_scan->isMasterOnly = (IMDRelation::EreldistrMasterOnly == + md_rel_ext->GetRelDistribution()); ext_scan->rejLimit = md_rel_ext->RejectLimit(); ext_scan->rejLimitInRows = md_rel_ext->IsRejectLimitInRows(); @@ -1096,14 +1148,11 @@ CTranslatorDXLToPlStmt::TranslateDXLTblScan plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(tbl_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + tbl_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // a table scan node must have 2 children: projection list and filter GPOS_ASSERT(2 == tbl_scan_dxlnode->Arity()); @@ -1112,16 +1161,11 @@ CTranslatorDXLToPlStmt::TranslateDXLTblScan CDXLNode *project_list_dxlnode = (*tbl_scan_dxlnode)[EdxltsIndexProjList]; CDXLNode *filter_dxlnode = (*tbl_scan_dxlnode)[EdxltsIndexFilter]; - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - &base_table_context, // translate context for the base table - NULL, // translate_ctxt_left and pdxltrctxRight, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter( + project_list_dxlnode, filter_dxlnode, + &base_table_context, // translate context for the base table + NULL, // translate_ctxt_left and pdxltrctxRight, + &plan->targetlist, &plan->qual, output_context); SetParamIds(plan); @@ -1140,20 +1184,17 @@ CTranslatorDXLToPlStmt::TranslateDXLTblScan // //--------------------------------------------------------------------------- BOOL -CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker - ( - Node *node, - SContextIndexVarAttno *ctxt_index_var_attno_walker - ) +CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker( + Node *node, SContextIndexVarAttno *ctxt_index_var_attno_walker) { if (NULL == node) { return false; } - if (IsA(node, Var) && ((Var *)node)->varno != OUTER) + if (IsA(node, Var) && ((Var *) node)->varno != OUTER) { - INT attno = ((Var *)node)->varattno; + INT attno = ((Var *) node)->varattno; const IMDRelation *md_rel = ctxt_index_var_attno_walker->m_md_rel; const IMDIndex *index = ctxt_index_var_attno_walker->m_md_index; @@ -1171,18 +1212,16 @@ CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker if (gpos::ulong_max > index_col_pos_idx_max) { - ((Var *)node)->varattno = 1 + index->GetKeyPos(index_col_pos_idx_max); + ((Var *) node)->varattno = + 1 + index->GetKeyPos(index_col_pos_idx_max); } return false; } - return gpdb::WalkExpressionTree - ( - node, - (BOOL (*)()) CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker, - ctxt_index_var_attno_walker - ); + return gpdb::WalkExpressionTree( + node, (BOOL(*)()) CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker, + ctxt_index_var_attno_walker); } @@ -1195,17 +1234,17 @@ CTranslatorDXLToPlStmt::SetIndexVarAttnoWalker // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLIndexScan - ( - const CDXLNode *index_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLIndexScan( + const CDXLNode *index_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translate table descriptor into a range table entry - CDXLPhysicalIndexScan *physical_idx_scan_dxlop = CDXLPhysicalIndexScan::Cast(index_scan_dxlnode->GetOperator()); + CDXLPhysicalIndexScan *physical_idx_scan_dxlop = + CDXLPhysicalIndexScan::Cast(index_scan_dxlnode->GetOperator()); - return TranslateDXLIndexScan(index_scan_dxlnode, physical_idx_scan_dxlop, output_context, false /*is_index_only_scan*/, ctxt_translation_prev_siblings); + return TranslateDXLIndexScan(index_scan_dxlnode, physical_idx_scan_dxlop, + output_context, false /*is_index_only_scan*/, + ctxt_translation_prev_siblings); } //--------------------------------------------------------------------------- @@ -1217,19 +1256,17 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLIndexScan - ( +CTranslatorDXLToPlStmt::TranslateDXLIndexScan( const CDXLNode *index_scan_dxlnode, CDXLPhysicalIndexScan *physical_idx_scan_dxlop, - CDXLTranslateContext *output_context, - BOOL is_index_only_scan, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) + CDXLTranslateContext *output_context, BOOL is_index_only_scan, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translation context for column mappings in the base relation CDXLTranslateContextBaseTable base_table_context(m_mp); - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; const CDXLIndexDescr *index_descr_dxl = NULL; if (is_index_only_scan) @@ -1237,9 +1274,12 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan index_descr_dxl = physical_idx_scan_dxlop->GetDXLIndexDescr(); } - const IMDRelation *md_rel = m_md_accessor->RetrieveRel(physical_idx_scan_dxlop->GetDXLTableDescr()->MDId()); + const IMDRelation *md_rel = m_md_accessor->RetrieveRel( + physical_idx_scan_dxlop->GetDXLTableDescr()->MDId()); - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(physical_idx_scan_dxlop->GetDXLTableDescr(), index_descr_dxl, index, &base_table_context); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + physical_idx_scan_dxlop->GetDXLTableDescr(), index_descr_dxl, index, + &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= ACL_SELECT; m_dxl_to_plstmt_context->AddRTE(rte); @@ -1249,7 +1289,8 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan index_scan = MakeNode(IndexScan); index_scan->scan.scanrelid = index; - CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid(physical_idx_scan_dxlop->GetDXLIndexDescr()->MDId()); + CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid( + physical_idx_scan_dxlop->GetDXLIndexDescr()->MDId()); const IMDIndex *md_index = m_md_accessor->RetrieveIndex(mdid_index); Oid index_oid = mdid_index->Oid(); @@ -1261,14 +1302,11 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(index_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + index_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // an index scan node must have 3 children: projection list, filter and index condition list GPOS_ASSERT(3 == index_scan_dxlnode->Arity()); @@ -1276,21 +1314,21 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan // translate proj list and filter CDXLNode *project_list_dxlnode = (*index_scan_dxlnode)[EdxlisIndexProjList]; CDXLNode *filter_dxlnode = (*index_scan_dxlnode)[EdxlisIndexFilter]; - CDXLNode *index_cond_list_dxlnode = (*index_scan_dxlnode)[EdxlisIndexCondition]; + CDXLNode *index_cond_list_dxlnode = + (*index_scan_dxlnode)[EdxlisIndexCondition]; // translate proj list - plan->targetlist = TranslateDXLProjList(project_list_dxlnode, &base_table_context, NULL /*child_contexts*/, output_context); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, &base_table_context, + NULL /*child_contexts*/, output_context); // translate index filter - plan->qual = TranslateDXLIndexFilter - ( - filter_dxlnode, - output_context, - &base_table_context, - ctxt_translation_prev_siblings - ); + plan->qual = TranslateDXLIndexFilter(filter_dxlnode, output_context, + &base_table_context, + ctxt_translation_prev_siblings); - index_scan->indexorderdir = CTranslatorUtils::GetScanDirection(physical_idx_scan_dxlop->GetIndexScanDir()); + index_scan->indexorderdir = CTranslatorUtils::GetScanDirection( + physical_idx_scan_dxlop->GetIndexScanDir()); // translate index condition list List *index_cond = NIL; @@ -1298,22 +1336,13 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan List *index_strategy_list = NIL; List *index_subtype_list = NIL; - TranslateIndexConditions - ( - index_cond_list_dxlnode, - physical_idx_scan_dxlop->GetDXLTableDescr(), + TranslateIndexConditions( + index_cond_list_dxlnode, physical_idx_scan_dxlop->GetDXLTableDescr(), is_index_only_scan, - false, // is_bitmap_index_probe - md_index, - md_rel, - output_context, - &base_table_context, - ctxt_translation_prev_siblings, - &index_cond, - &index_orig_cond, - &index_strategy_list, - &index_subtype_list - ); + false, // is_bitmap_index_probe + md_index, md_rel, output_context, &base_table_context, + ctxt_translation_prev_siblings, &index_cond, &index_orig_cond, + &index_strategy_list, &index_subtype_list); index_scan->indexqual = index_cond; index_scan->indexqualorig = index_orig_cond; @@ -1333,24 +1362,25 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexScan // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLIndexFilter - ( - CDXLNode *filter_dxlnode, - CDXLTranslateContext *output_context, +CTranslatorDXLToPlStmt::TranslateDXLIndexFilter( + CDXLNode *filter_dxlnode, CDXLTranslateContext *output_context, CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { List *quals_list = NIL; // build colid->var mapping - CMappingColIdVarPlStmt colid_var_mapping(m_mp, base_table_context, ctxt_translation_prev_siblings, output_context, m_dxl_to_plstmt_context); + CMappingColIdVarPlStmt colid_var_mapping( + m_mp, base_table_context, ctxt_translation_prev_siblings, + output_context, m_dxl_to_plstmt_context); const ULONG arity = filter_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *index_filter_dxlnode = (*filter_dxlnode)[ul]; - Expr *index_filter_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(index_filter_dxlnode, &colid_var_mapping); + Expr *index_filter_expr = + m_translator_dxl_to_scalar->TranslateDXLToScalar( + index_filter_dxlnode, &colid_var_mapping); quals_list = gpdb::LAppend(quals_list, index_filter_expr); } @@ -1366,45 +1396,46 @@ CTranslatorDXLToPlStmt::TranslateDXLIndexFilter // Translate the index condition list in an Index scan // //--------------------------------------------------------------------------- -void -CTranslatorDXLToPlStmt::TranslateIndexConditions - ( - CDXLNode *index_cond_list_dxlnode, - const CDXLTableDescr *dxl_tbl_descr, - BOOL is_index_only_scan, - BOOL is_bitmap_index_probe, - const IMDIndex *index, - const IMDRelation *md_rel, - CDXLTranslateContext *output_context, +void +CTranslatorDXLToPlStmt::TranslateIndexConditions( + CDXLNode *index_cond_list_dxlnode, const CDXLTableDescr *dxl_tbl_descr, + BOOL is_index_only_scan, BOOL is_bitmap_index_probe, const IMDIndex *index, + const IMDRelation *md_rel, CDXLTranslateContext *output_context, CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *ctxt_translation_prev_siblings, - List **index_cond, - List **index_orig_cond, - List **index_strategy_list, - List **index_subtype_list - ) + List **index_cond, List **index_orig_cond, List **index_strategy_list, + List **index_subtype_list) { // array of index qual info - CIndexQualInfoArray *index_qual_info_array = GPOS_NEW(m_mp) CIndexQualInfoArray(m_mp); + CIndexQualInfoArray *index_qual_info_array = + GPOS_NEW(m_mp) CIndexQualInfoArray(m_mp); // build colid->var mapping - CMappingColIdVarPlStmt colid_var_mapping(m_mp, base_table_context, ctxt_translation_prev_siblings, output_context, m_dxl_to_plstmt_context); + CMappingColIdVarPlStmt colid_var_mapping( + m_mp, base_table_context, ctxt_translation_prev_siblings, + output_context, m_dxl_to_plstmt_context); const ULONG arity = index_cond_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *index_cond_dxlnode = (*index_cond_list_dxlnode)[ul]; - Expr *original_index_cond_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(index_cond_dxlnode, &colid_var_mapping); - Expr *index_cond_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(index_cond_dxlnode, &colid_var_mapping); - GPOS_ASSERT((IsA(index_cond_expr, OpExpr) || IsA(index_cond_expr, ScalarArrayOpExpr)) - && "expected OpExpr or ScalarArrayOpExpr in index qual"); - - if (!is_bitmap_index_probe && - IsA(index_cond_expr, ScalarArrayOpExpr) && + Expr *original_index_cond_expr = + m_translator_dxl_to_scalar->TranslateDXLToScalar( + index_cond_dxlnode, &colid_var_mapping); + Expr *index_cond_expr = + m_translator_dxl_to_scalar->TranslateDXLToScalar( + index_cond_dxlnode, &colid_var_mapping); + GPOS_ASSERT((IsA(index_cond_expr, OpExpr) || + IsA(index_cond_expr, ScalarArrayOpExpr)) && + "expected OpExpr or ScalarArrayOpExpr in index qual"); + + if (!is_bitmap_index_probe && IsA(index_cond_expr, ScalarArrayOpExpr) && IMDIndex::EmdindBitmap != index->IndexType()) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, GPOS_WSZ_LIT("ScalarArrayOpExpr condition on index scan")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + GPOS_WSZ_LIT("ScalarArrayOpExpr condition on index scan")); } // for indexonlyscan, we already have the attno referring to the index @@ -1412,9 +1443,10 @@ CTranslatorDXLToPlStmt::TranslateIndexConditions { // Otherwise, we need to perform mapping of Varattnos relative to column positions in index keys SContextIndexVarAttno index_varattno_ctxt(md_rel, index); - SetIndexVarAttnoWalker((Node *) index_cond_expr, &index_varattno_ctxt); + SetIndexVarAttnoWalker((Node *) index_cond_expr, + &index_varattno_ctxt); } - + // find index key's attno List *args_list = NULL; if (IsA(index_cond_expr, OpExpr)) @@ -1428,19 +1460,21 @@ CTranslatorDXLToPlStmt::TranslateIndexConditions Node *left_arg = (Node *) lfirst(gpdb::ListHead(args_list)); Node *right_arg = (Node *) lfirst(gpdb::ListTail(args_list)); - + BOOL is_relabel_type = false; - if (IsA(left_arg, RelabelType) && IsA(((RelabelType *) left_arg)->arg, Var)) + if (IsA(left_arg, RelabelType) && + IsA(((RelabelType *) left_arg)->arg, Var)) { left_arg = (Node *) ((RelabelType *) left_arg)->arg; is_relabel_type = true; } - else if (IsA(right_arg, RelabelType) && IsA(((RelabelType *) right_arg)->arg, Var)) + else if (IsA(right_arg, RelabelType) && + IsA(((RelabelType *) right_arg)->arg, Var)) { right_arg = (Node *) ((RelabelType *) right_arg)->arg; is_relabel_type = true; } - + if (is_relabel_type) { List *new_args_list = ListMake2(left_arg, right_arg); @@ -1454,35 +1488,42 @@ CTranslatorDXLToPlStmt::TranslateIndexConditions ((ScalarArrayOpExpr *) index_cond_expr)->args = new_args_list; } } - - GPOS_ASSERT((IsA(left_arg, Var) || IsA(right_arg, Var)) && "expected index key in index qual"); + + GPOS_ASSERT((IsA(left_arg, Var) || IsA(right_arg, Var)) && + "expected index key in index qual"); INT attno = 0; if (IsA(left_arg, Var) && ((Var *) left_arg)->varno != OUTER) { // index key is on the left side - attno = ((Var *) left_arg)->varattno; + attno = ((Var *) left_arg)->varattno; } else { // index key is on the right side - GPOS_ASSERT(((Var *) right_arg)->varno != OUTER && "unexpected outer reference in index qual"); + GPOS_ASSERT(((Var *) right_arg)->varno != OUTER && + "unexpected outer reference in index qual"); attno = ((Var *) right_arg)->varattno; } - + // retrieve index strategy and subtype INT strategy_num = 0; OID index_subtype_oid = InvalidOid; BOOL recheck = false; - - OID cmp_operator_oid = CTranslatorUtils::OidCmpOperator(index_cond_expr); + + OID cmp_operator_oid = + CTranslatorUtils::OidCmpOperator(index_cond_expr); GPOS_ASSERT(InvalidOid != cmp_operator_oid); - OID op_family_oid = CTranslatorUtils::GetOpFamilyForIndexQual(attno, CMDIdGPDB::CastMdid(index->MDId())->Oid()); + OID op_family_oid = CTranslatorUtils::GetOpFamilyForIndexQual( + attno, CMDIdGPDB::CastMdid(index->MDId())->Oid()); GPOS_ASSERT(InvalidOid != op_family_oid); - gpdb::IndexOpProperties(cmp_operator_oid, op_family_oid, &strategy_num, &index_subtype_oid, &recheck); - + gpdb::IndexOpProperties(cmp_operator_oid, op_family_oid, &strategy_num, + &index_subtype_oid, &recheck); + // create index qual - index_qual_info_array->Append(GPOS_NEW(m_mp) CIndexQualInfo(attno, index_cond_expr, original_index_cond_expr, (StrategyNumber) strategy_num, index_subtype_oid)); + index_qual_info_array->Append(GPOS_NEW(m_mp) CIndexQualInfo( + attno, index_cond_expr, original_index_cond_expr, + (StrategyNumber) strategy_num, index_subtype_oid)); } // the index quals much be ordered by attribute number @@ -1493,9 +1534,12 @@ CTranslatorDXLToPlStmt::TranslateIndexConditions { CIndexQualInfo *index_qual_info = (*index_qual_info_array)[ul]; *index_cond = gpdb::LAppend(*index_cond, index_qual_info->m_expr); - *index_orig_cond = gpdb::LAppend(*index_orig_cond, index_qual_info->m_original_expr); - *index_strategy_list = gpdb::LAppendInt(*index_strategy_list, index_qual_info->m_strategy_num); - *index_subtype_list = gpdb::LAppendOid(*index_subtype_list, index_qual_info->m_index_subtype_oid); + *index_orig_cond = + gpdb::LAppend(*index_orig_cond, index_qual_info->m_original_expr); + *index_strategy_list = gpdb::LAppendInt( + *index_strategy_list, index_qual_info->m_strategy_num); + *index_subtype_list = gpdb::LAppendOid( + *index_subtype_list, index_qual_info->m_index_subtype_oid); } // clean up @@ -1511,23 +1555,26 @@ CTranslatorDXLToPlStmt::TranslateIndexConditions // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLAssertConstraints - ( +CTranslatorDXLToPlStmt::TranslateDXLAssertConstraints( CDXLNode *assert_contraint_list_dxlnode, CDXLTranslateContext *output_context, - CDXLTranslationContextArray *child_contexts - ) + CDXLTranslationContextArray *child_contexts) { List *quals_list = NIL; // build colid->var mapping - CMappingColIdVarPlStmt colid_var_mapping(m_mp, NULL /*base_table_context*/, child_contexts, output_context, m_dxl_to_plstmt_context); + CMappingColIdVarPlStmt colid_var_mapping(m_mp, NULL /*base_table_context*/, + child_contexts, output_context, + m_dxl_to_plstmt_context); const ULONG arity = assert_contraint_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { - CDXLNode *assert_contraint_dxlnode = (*assert_contraint_list_dxlnode)[ul]; - Expr *assert_contraint_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar((*assert_contraint_dxlnode)[0], &colid_var_mapping); + CDXLNode *assert_contraint_dxlnode = + (*assert_contraint_list_dxlnode)[ul]; + Expr *assert_contraint_expr = + m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*assert_contraint_dxlnode)[0], &colid_var_mapping); quals_list = gpdb::LAppend(quals_list, assert_contraint_expr); } @@ -1543,12 +1590,9 @@ CTranslatorDXLToPlStmt::TranslateDXLAssertConstraints // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLLimit - ( - const CDXLNode *limit_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLLimit( + const CDXLNode *limit_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create limit node Limit *limit = MakeNode(Limit); @@ -1557,52 +1601,59 @@ CTranslatorDXLToPlStmt::TranslateDXLLimit plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(limit_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(limit_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); GPOS_ASSERT(4 == limit_dxlnode->Arity()); - CDXLTranslateContext left_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext left_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); // translate proj list CDXLNode *project_list_dxlnode = (*limit_dxlnode)[EdxllimitIndexProjList]; CDXLNode *child_plan_dxlnode = (*limit_dxlnode)[EdxllimitIndexChildPlan]; CDXLNode *limit_count_dxlnode = (*limit_dxlnode)[EdxllimitIndexLimitCount]; - CDXLNode *limit_offset_dxlnode = (*limit_dxlnode)[EdxllimitIndexLimitOffset]; + CDXLNode *limit_offset_dxlnode = + (*limit_dxlnode)[EdxllimitIndexLimitOffset]; // NOTE: Limit node has only the left plan while the right plan is left empty - Plan *left_plan = TranslateDXLOperatorToPlan(child_plan_dxlnode, &left_dxl_translate_ctxt, ctxt_translation_prev_siblings); + Plan *left_plan = + TranslateDXLOperatorToPlan(child_plan_dxlnode, &left_dxl_translate_ctxt, + ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&left_dxl_translate_ctxt); - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // base table translation context + child_contexts, output_context); plan->lefttree = left_plan; - if(NULL != limit_count_dxlnode && limit_count_dxlnode->Arity() >0) + if (NULL != limit_count_dxlnode && limit_count_dxlnode->Arity() > 0) { - CMappingColIdVarPlStmt colid_var_mapping(m_mp, NULL, child_contexts, output_context, m_dxl_to_plstmt_context); - Node *limit_count = (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar((*limit_count_dxlnode)[0], &colid_var_mapping); + CMappingColIdVarPlStmt colid_var_mapping(m_mp, NULL, child_contexts, + output_context, + m_dxl_to_plstmt_context); + Node *limit_count = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*limit_count_dxlnode)[0], &colid_var_mapping); limit->limitCount = limit_count; } - if(NULL != limit_offset_dxlnode && limit_offset_dxlnode->Arity() >0) + if (NULL != limit_offset_dxlnode && limit_offset_dxlnode->Arity() > 0) { - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt(m_mp, NULL, child_contexts, output_context, m_dxl_to_plstmt_context); - Node *limit_offset = (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar((*limit_offset_dxlnode)[0], &colid_var_mapping); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, NULL, child_contexts, output_context, + m_dxl_to_plstmt_context); + Node *limit_offset = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*limit_offset_dxlnode)[0], &colid_var_mapping); limit->limitOffset = limit_offset; } @@ -1612,7 +1663,7 @@ CTranslatorDXLToPlStmt::TranslateDXLLimit // cleanup child_contexts->Release(); - return (Plan *) limit; + return (Plan *) limit; } //--------------------------------------------------------------------------- @@ -1624,14 +1675,12 @@ CTranslatorDXLToPlStmt::TranslateDXLLimit // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLHashJoin - ( - const CDXLNode *hj_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLHashJoin( + const CDXLNode *hj_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - GPOS_ASSERT(hj_dxlnode->GetOperator()->GetDXLOperator() == EdxlopPhysicalHashJoin); + GPOS_ASSERT(hj_dxlnode->GetOperator()->GetDXLOperator() == + EdxlopPhysicalHashJoin); GPOS_ASSERT(hj_dxlnode->Arity() == EdxlhjIndexSentinel); // create hash join node @@ -1641,21 +1690,20 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin Plan *plan = &(join->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalHashJoin *hashjoin_dxlop = CDXLPhysicalHashJoin::Cast(hj_dxlnode->GetOperator()); + CDXLPhysicalHashJoin *hashjoin_dxlop = + CDXLPhysicalHashJoin::Cast(hj_dxlnode->GetOperator()); // set join type - join->jointype = GetGPDBJoinTypeFromDXLJoinType(hashjoin_dxlop->GetJoinType()); + join->jointype = + GetGPDBJoinTypeFromDXLJoinType(hashjoin_dxlop->GetJoinType()); join->prefetch_inner = true; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(hj_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(hj_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); // translate join children CDXLNode *left_tree_dxlnode = (*hj_dxlnode)[EdxlhjIndexHashLeft]; @@ -1665,40 +1713,42 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin CDXLNode *join_filter_dxlnode = (*hj_dxlnode)[EdxlhjIndexJoinFilter]; CDXLNode *hash_cond_list_dxlnode = (*hj_dxlnode)[EdxlhjIndexHashCondList]; - CDXLTranslateContext left_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); - CDXLTranslateContext right_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext left_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext right_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); - Plan *left_plan = TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, ctxt_translation_prev_siblings); + Plan *left_plan = + TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, + ctxt_translation_prev_siblings); // the right side of the join is the one where the hash phase is done - CDXLTranslationContextArray *translation_context_arr_with_siblings = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *translation_context_arr_with_siblings = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); translation_context_arr_with_siblings->Append(&left_dxl_translate_ctxt); - translation_context_arr_with_siblings->AppendArray(ctxt_translation_prev_siblings); - Plan *right_plan = (Plan*) TranslateDXLHash(right_tree_dxlnode, &right_dxl_translate_ctxt, translation_context_arr_with_siblings); - - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&left_dxl_translate_ctxt)); - child_contexts->Append(const_cast(&right_dxl_translate_ctxt)); + translation_context_arr_with_siblings->AppendArray( + ctxt_translation_prev_siblings); + Plan *right_plan = + (Plan *) TranslateDXLHash(right_tree_dxlnode, &right_dxl_translate_ctxt, + translation_context_arr_with_siblings); + + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append( + const_cast(&left_dxl_translate_ctxt)); + child_contexts->Append( + const_cast(&right_dxl_translate_ctxt)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); // translate join filter - join->joinqual = TranslateDXLFilterToQual - ( - join_filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + join->joinqual = + TranslateDXLFilterToQual(join_filter_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); // translate hash cond List *hash_conditions_list = NIL; @@ -1710,13 +1760,10 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin { CDXLNode *hash_cond_dxlnode = (*hash_cond_list_dxlnode)[ul]; - List *hash_cond_list = TranslateDXLScCondToQual - ( - hash_cond_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + List *hash_cond_list = + TranslateDXLScCondToQual(hash_cond_dxlnode, + NULL, // base table translation context + child_contexts, output_context); GPOS_ASSERT(1 == gpdb::ListLength(hash_cond_list)); @@ -1725,10 +1772,12 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin { // INDF test GPOS_ASSERT(gpdb::ListLength(((BoolExpr *) expr)->args) == 1 && - (IsA((Expr *) LInitial(((BoolExpr *) expr)->args), DistinctExpr))); + (IsA((Expr *) LInitial(((BoolExpr *) expr)->args), + DistinctExpr))); has_is_not_distinct_from_cond = true; } - hash_conditions_list = gpdb::ListConcat(hash_conditions_list, hash_cond_list); + hash_conditions_list = + gpdb::ListConcat(hash_conditions_list, hash_cond_list); } if (!has_is_not_distinct_from_cond) @@ -1747,35 +1796,37 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin CDXLNode *hash_cond_dxlnode = (*hash_cond_list_dxlnode)[ul]; // condition can be either a scalar comparison or a NOT DISTINCT FROM expression - GPOS_ASSERT(EdxlopScalarCmp == hash_cond_dxlnode->GetOperator()->GetDXLOperator() || - EdxlopScalarBoolExpr == hash_cond_dxlnode->GetOperator()->GetDXLOperator()); - - if (EdxlopScalarBoolExpr == hash_cond_dxlnode->GetOperator()->GetDXLOperator()) + GPOS_ASSERT( + EdxlopScalarCmp == + hash_cond_dxlnode->GetOperator()->GetDXLOperator() || + EdxlopScalarBoolExpr == + hash_cond_dxlnode->GetOperator()->GetDXLOperator()); + + if (EdxlopScalarBoolExpr == + hash_cond_dxlnode->GetOperator()->GetDXLOperator()) { // clause is a NOT DISTINCT FROM check -> extract the distinct comparison node - GPOS_ASSERT(Edxlnot == CDXLScalarBoolExpr::Cast(hash_cond_dxlnode->GetOperator())->GetDxlBoolTypeStr()); + GPOS_ASSERT(Edxlnot == CDXLScalarBoolExpr::Cast( + hash_cond_dxlnode->GetOperator()) + ->GetDxlBoolTypeStr()); hash_cond_dxlnode = (*hash_cond_dxlnode)[0]; - GPOS_ASSERT(EdxlopScalarDistinct == hash_cond_dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarDistinct == + hash_cond_dxlnode->GetOperator()->GetDXLOperator()); } - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - NULL, - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, NULL, child_contexts, + output_context, m_dxl_to_plstmt_context); // translate the DXL scalar or scalar distinct comparison into an equality comparison // to store in the hash clauses - Expr *hash_clause_expr = (Expr *) m_translator_dxl_to_scalar->TranslateDXLScalarCmpToScalar - ( - hash_cond_dxlnode, - &colid_var_mapping - ); + Expr *hash_clause_expr = + (Expr *) + m_translator_dxl_to_scalar->TranslateDXLScalarCmpToScalar( + hash_cond_dxlnode, &colid_var_mapping); - hash_clauses_list = gpdb::LAppend(hash_clauses_list, hash_clause_expr); + hash_clauses_list = + gpdb::LAppend(hash_clauses_list, hash_clause_expr); } hashjoin->hashclauses = hash_clauses_list; @@ -1793,7 +1844,7 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin translation_context_arr_with_siblings->Release(); child_contexts->Release(); - return (Plan *) hashjoin; + return (Plan *) hashjoin; } //--------------------------------------------------------------------------- @@ -1805,12 +1856,9 @@ CTranslatorDXLToPlStmt::TranslateDXLHashJoin // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLTvf - ( - const CDXLNode *tvf_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLTvf( + const CDXLNode *tvf_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translation context for column mappings CDXLTranslateContextBaseTable base_table_context(m_mp); @@ -1819,14 +1867,16 @@ CTranslatorDXLToPlStmt::TranslateDXLTvf FunctionScan *func_scan = MakeNode(FunctionScan); Plan *plan = &(func_scan->scan.plan); - RangeTblEntry *rte = TranslateDXLTvfToRangeTblEntry(tvf_dxlnode, output_context, &base_table_context); + RangeTblEntry *rte = TranslateDXLTvfToRangeTblEntry( + tvf_dxlnode, output_context, &base_table_context); GPOS_ASSERT(NULL != rte); func_scan->funcexpr = rte->funcexpr; func_scan->funccolnames = rte->eref->colnames; // we will add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; base_table_context.SetRelIndex(index); func_scan->scan.scanrelid = index; @@ -1836,14 +1886,11 @@ CTranslatorDXLToPlStmt::TranslateDXLTvf plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(tvf_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(tvf_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); // a table scan node must have at least 1 child: projection list GPOS_ASSERT(1 <= tvf_dxlnode->Arity()); @@ -1851,28 +1898,25 @@ CTranslatorDXLToPlStmt::TranslateDXLTvf CDXLNode *project_list_dxlnode = (*tvf_dxlnode)[EdxltsIndexProjList]; // translate proj list - List *target_list = TranslateDXLProjList - ( - project_list_dxlnode, - &base_table_context, - NULL, - output_context - ); + List *target_list = TranslateDXLProjList( + project_list_dxlnode, &base_table_context, NULL, output_context); plan->targetlist = target_list; ListCell *lc_target_entry = NULL; - ForEach (lc_target_entry, target_list) + ForEach(lc_target_entry, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc_target_entry); - OID oid_type = gpdb::ExprType((Node*) target_entry->expr); + OID oid_type = gpdb::ExprType((Node *) target_entry->expr); GPOS_ASSERT(InvalidOid != oid_type); - INT typ_mod = gpdb::ExprTypeMod((Node*) target_entry->expr); + INT typ_mod = gpdb::ExprTypeMod((Node *) target_entry->expr); - func_scan->funccoltypes = gpdb::LAppendOid(func_scan->funccoltypes, oid_type); - func_scan->funccoltypmods = gpdb::LAppendInt(func_scan->funccoltypmods, typ_mod); + func_scan->funccoltypes = + gpdb::LAppendOid(func_scan->funccoltypes, oid_type); + func_scan->funccoltypmods = + gpdb::LAppendInt(func_scan->funccoltypmods, typ_mod); } SetParamIds(plan); @@ -1889,12 +1933,9 @@ CTranslatorDXLToPlStmt::TranslateDXLTvf // //--------------------------------------------------------------------------- RangeTblEntry * -CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry - ( - const CDXLNode *tvf_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context - ) +CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry( + const CDXLNode *tvf_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context) { CDXLPhysicalTVF *dxlop = CDXLPhysicalTVF::Cast(tvf_dxlnode->GetOperator()); @@ -1907,13 +1948,15 @@ CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry func_expr->funcretset = true; // this is a function call, as opposed to a cast func_expr->funcformat = COERCE_EXPLICIT_CALL; - func_expr->funcresulttype = CMDIdGPDB::CastMdid(dxlop->ReturnTypeMdId())->Oid(); + func_expr->funcresulttype = + CMDIdGPDB::CastMdid(dxlop->ReturnTypeMdId())->Oid(); Alias *alias = MakeNode(Alias); alias->colnames = NIL; // get function alias - alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(dxlop->Pstr()->GetBuffer()); + alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dxlop->Pstr()->GetBuffer()); // project list CDXLNode *project_list_dxlnode = (*tvf_dxlnode)[EdxltsIndexProjList]; @@ -1923,15 +1966,19 @@ CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry for (ULONG ul = 0; ul < num_of_cols; ul++) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - CDXLScalarProjElem *dxl_proj_elem = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + CDXLScalarProjElem *dxl_proj_elem = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); - CHAR *col_name_char_array = CTranslatorUtils::CreateMultiByteCharStringFromWCString(dxl_proj_elem->GetMdNameAlias()->GetMDName()->GetBuffer()); + CHAR *col_name_char_array = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dxl_proj_elem->GetMdNameAlias()->GetMDName()->GetBuffer()); Value *val_colname = gpdb::MakeStringValue(col_name_char_array); alias->colnames = gpdb::LAppend(alias->colnames, val_colname); // save mapping col id -> index in translate context - (void) base_table_context->InsertMapping(dxl_proj_elem->Id(), ul+1 /*attno*/); + (void) base_table_context->InsertMapping(dxl_proj_elem->Id(), + ul + 1 /*attno*/); } // function arguments @@ -1940,20 +1987,16 @@ CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry { CDXLNode *func_arg_dxlnode = (*tvf_dxlnode)[ul]; - CMappingColIdVarPlStmt colid_var_mapping - ( - m_mp, - base_table_context, - NULL, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping(m_mp, base_table_context, NULL, + output_context, + m_dxl_to_plstmt_context); - Expr *pexprFuncArg = m_translator_dxl_to_scalar->TranslateDXLToScalar(func_arg_dxlnode, &colid_var_mapping); + Expr *pexprFuncArg = m_translator_dxl_to_scalar->TranslateDXLToScalar( + func_arg_dxlnode, &colid_var_mapping); func_expr->args = gpdb::LAppend(func_expr->args, pexprFuncArg); } - rte->funcexpr = (Node *)func_expr; + rte->funcexpr = (Node *) func_expr; rte->inFromCl = true; rte->eref = alias; @@ -1963,21 +2006,19 @@ CTranslatorDXLToPlStmt::TranslateDXLTvfToRangeTblEntry // create a range table entry from a CDXLPhysicalValuesScan node RangeTblEntry * -CTranslatorDXLToPlStmt::TranslateDXLValueScanToRangeTblEntry - ( - const CDXLNode *value_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context - ) +CTranslatorDXLToPlStmt::TranslateDXLValueScanToRangeTblEntry( + const CDXLNode *value_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context) { - CDXLPhysicalValuesScan *phy_values_scan_dxlop = CDXLPhysicalValuesScan::Cast(value_scan_dxlnode->GetOperator()); + CDXLPhysicalValuesScan *phy_values_scan_dxlop = + CDXLPhysicalValuesScan::Cast(value_scan_dxlnode->GetOperator()); RangeTblEntry *rte = MakeNode(RangeTblEntry); rte->relid = InvalidOid; rte->subquery = NULL; rte->rtekind = RTE_VALUES; - rte->inh = false; /* never true for values RTEs */ + rte->inh = false; /* never true for values RTEs */ rte->inFromCl = true; rte->requiredPerms = 0; rte->checkAsUser = InvalidOid; @@ -1986,7 +2027,8 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScanToRangeTblEntry alias->colnames = NIL; // get value alias - alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(phy_values_scan_dxlop->GetOpNameStr()->GetBuffer()); + alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + phy_values_scan_dxlop->GetOpNameStr()->GetBuffer()); // project list CDXLNode *project_list_dxlnode = (*value_scan_dxlnode)[EdxltsIndexProjList]; @@ -1996,28 +2038,36 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScanToRangeTblEntry for (ULONG ul = 0; ul < num_of_cols; ul++) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - CDXLScalarProjElem *dxl_proj_elem = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + CDXLScalarProjElem *dxl_proj_elem = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); - CHAR *col_name_char_array = CTranslatorUtils::CreateMultiByteCharStringFromWCString(dxl_proj_elem->GetMdNameAlias()->GetMDName()->GetBuffer()); + CHAR *col_name_char_array = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dxl_proj_elem->GetMdNameAlias()->GetMDName()->GetBuffer()); Value *val_colname = gpdb::MakeStringValue(col_name_char_array); alias->colnames = gpdb::LAppend(alias->colnames, val_colname); // save mapping col id -> index in translate context - (void) base_table_context->InsertMapping(dxl_proj_elem->Id(), ul+1 /*attno*/); + (void) base_table_context->InsertMapping(dxl_proj_elem->Id(), + ul + 1 /*attno*/); } - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt(m_mp, base_table_context, NULL, output_context, m_dxl_to_plstmt_context); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, base_table_context, NULL, output_context, + m_dxl_to_plstmt_context); const ULONG num_of_child = value_scan_dxlnode->Arity(); List *values_lists = NIL; - for (ULONG ulValue = EdxlValIndexConstStart; ulValue < num_of_child; ulValue++) + for (ULONG ulValue = EdxlValIndexConstStart; ulValue < num_of_child; + ulValue++) { CDXLNode *value_list_dxlnode = (*value_scan_dxlnode)[ulValue]; const ULONG num_of_cols = value_list_dxlnode->Arity(); List *value = NIL; - for (ULONG ulCol = 0; ulCol < num_of_cols ; ulCol++) + for (ULONG ulCol = 0; ulCol < num_of_cols; ulCol++) { - Expr *const_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar((*value_list_dxlnode)[ulCol], &colid_var_mapping); + Expr *const_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*value_list_dxlnode)[ulCol], &colid_var_mapping); value = gpdb::LAppend(value, const_expr); } values_lists = gpdb::LAppend(values_lists, value); @@ -2039,14 +2089,12 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScanToRangeTblEntry // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLNLJoin - ( - const CDXLNode *nl_join_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLNLJoin( + const CDXLNode *nl_join_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - GPOS_ASSERT(nl_join_dxlnode->GetOperator()->GetDXLOperator() == EdxlopPhysicalNLJoin); + GPOS_ASSERT(nl_join_dxlnode->GetOperator()->GetDXLOperator() == + EdxlopPhysicalNLJoin); GPOS_ASSERT(nl_join_dxlnode->Arity() == EdxlnljIndexSentinel); // create hash join node @@ -2056,20 +2104,18 @@ CTranslatorDXLToPlStmt::TranslateDXLNLJoin Plan *plan = &(join->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalNLJoin *dxl_nlj = CDXLPhysicalNLJoin::PdxlConvert(nl_join_dxlnode->GetOperator()); + CDXLPhysicalNLJoin *dxl_nlj = + CDXLPhysicalNLJoin::PdxlConvert(nl_join_dxlnode->GetOperator()); // set join type join->jointype = GetGPDBJoinTypeFromDXLJoinType(dxl_nlj->GetJoinType()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(nl_join_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + nl_join_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // translate join children CDXLNode *left_tree_dxlnode = (*nl_join_dxlnode)[EdxlnljIndexLeftChild]; @@ -2079,64 +2125,70 @@ CTranslatorDXLToPlStmt::TranslateDXLNLJoin CDXLNode *filter_dxlnode = (*nl_join_dxlnode)[EdxlnljIndexFilter]; CDXLNode *join_filter_dxlnode = (*nl_join_dxlnode)[EdxlnljIndexJoinFilter]; - CDXLTranslateContext left_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); - CDXLTranslateContext right_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext left_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext right_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); // setting of prefetch_inner to true except for the case of index NLJ where we cannot prefetch inner // because inner child depends on variables coming from outer child join->prefetch_inner = !dxl_nlj->IsIndexNLJ(); - CDXLTranslationContextArray *translation_context_arr_with_siblings = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *translation_context_arr_with_siblings = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); Plan *left_plan = NULL; Plan *right_plan = NULL; if (dxl_nlj->IsIndexNLJ()) { // right child (the index scan side) has references to left child's columns, // we need to translate left child first to load its columns into translation context - left_plan = TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, ctxt_translation_prev_siblings); + left_plan = TranslateDXLOperatorToPlan(left_tree_dxlnode, + &left_dxl_translate_ctxt, + ctxt_translation_prev_siblings); translation_context_arr_with_siblings->Append(&left_dxl_translate_ctxt); - translation_context_arr_with_siblings->AppendArray(ctxt_translation_prev_siblings); + translation_context_arr_with_siblings->AppendArray( + ctxt_translation_prev_siblings); - // translate right child after left child translation is complete - right_plan = TranslateDXLOperatorToPlan(right_tree_dxlnode, &right_dxl_translate_ctxt, translation_context_arr_with_siblings); + // translate right child after left child translation is complete + right_plan = TranslateDXLOperatorToPlan( + right_tree_dxlnode, &right_dxl_translate_ctxt, + translation_context_arr_with_siblings); } else { // left child may include a PartitionSelector with references to right child's columns, // we need to translate right child first to load its columns into translation context - right_plan = TranslateDXLOperatorToPlan(right_tree_dxlnode, &right_dxl_translate_ctxt, ctxt_translation_prev_siblings); + right_plan = TranslateDXLOperatorToPlan(right_tree_dxlnode, + &right_dxl_translate_ctxt, + ctxt_translation_prev_siblings); - translation_context_arr_with_siblings->Append(&right_dxl_translate_ctxt); - translation_context_arr_with_siblings->AppendArray(ctxt_translation_prev_siblings); + translation_context_arr_with_siblings->Append( + &right_dxl_translate_ctxt); + translation_context_arr_with_siblings->AppendArray( + ctxt_translation_prev_siblings); // translate left child after right child translation is complete - left_plan = TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, translation_context_arr_with_siblings); + left_plan = TranslateDXLOperatorToPlan( + left_tree_dxlnode, &left_dxl_translate_ctxt, + translation_context_arr_with_siblings); } - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&left_dxl_translate_ctxt); child_contexts->Append(&right_dxl_translate_ctxt); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); // translate join condition - join->joinqual = TranslateDXLFilterToQual - ( - join_filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + join->joinqual = + TranslateDXLFilterToQual(join_filter_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); plan->lefttree = left_plan; plan->righttree = right_plan; @@ -2147,7 +2199,7 @@ CTranslatorDXLToPlStmt::TranslateDXLNLJoin translation_context_arr_with_siblings->Release(); child_contexts->Release(); - return (Plan *) nested_loop; + return (Plan *) nested_loop; } //--------------------------------------------------------------------------- @@ -2159,14 +2211,12 @@ CTranslatorDXLToPlStmt::TranslateDXLNLJoin // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLMergeJoin - ( - const CDXLNode *merge_join_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLMergeJoin( + const CDXLNode *merge_join_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - GPOS_ASSERT(merge_join_dxlnode->GetOperator()->GetDXLOperator() == EdxlopPhysicalMergeJoin); + GPOS_ASSERT(merge_join_dxlnode->GetOperator()->GetDXLOperator() == + EdxlopPhysicalMergeJoin); GPOS_ASSERT(merge_join_dxlnode->Arity() == EdxlmjIndexSentinel); // create merge join node @@ -2176,20 +2226,19 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin Plan *plan = &(join->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalMergeJoin *merge_join_dxlop = CDXLPhysicalMergeJoin::Cast(merge_join_dxlnode->GetOperator()); + CDXLPhysicalMergeJoin *merge_join_dxlop = + CDXLPhysicalMergeJoin::Cast(merge_join_dxlnode->GetOperator()); // set join type - join->jointype = GetGPDBJoinTypeFromDXLJoinType(merge_join_dxlop->GetJoinType()); + join->jointype = + GetGPDBJoinTypeFromDXLJoinType(merge_join_dxlop->GetJoinType()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(merge_join_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + merge_join_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // translate join children CDXLNode *left_tree_dxlnode = (*merge_join_dxlnode)[EdxlmjIndexLeftChild]; @@ -2197,44 +2246,48 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin CDXLNode *project_list_dxlnode = (*merge_join_dxlnode)[EdxlmjIndexProjList]; CDXLNode *filter_dxlnode = (*merge_join_dxlnode)[EdxlmjIndexFilter]; - CDXLNode *join_filter_dxlnode = (*merge_join_dxlnode)[EdxlmjIndexJoinFilter]; - CDXLNode *merge_cond_list_dxlnode = (*merge_join_dxlnode)[EdxlmjIndexMergeCondList]; - - CDXLTranslateContext left_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); - CDXLTranslateContext right_dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); - - Plan *left_plan = TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, ctxt_translation_prev_siblings); - - CDXLTranslationContextArray *translation_context_arr_with_siblings = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLNode *join_filter_dxlnode = + (*merge_join_dxlnode)[EdxlmjIndexJoinFilter]; + CDXLNode *merge_cond_list_dxlnode = + (*merge_join_dxlnode)[EdxlmjIndexMergeCondList]; + + CDXLTranslateContext left_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext right_dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); + + Plan *left_plan = + TranslateDXLOperatorToPlan(left_tree_dxlnode, &left_dxl_translate_ctxt, + ctxt_translation_prev_siblings); + + CDXLTranslationContextArray *translation_context_arr_with_siblings = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); translation_context_arr_with_siblings->Append(&left_dxl_translate_ctxt); - translation_context_arr_with_siblings->AppendArray(ctxt_translation_prev_siblings); + translation_context_arr_with_siblings->AppendArray( + ctxt_translation_prev_siblings); - Plan *right_plan = TranslateDXLOperatorToPlan(right_tree_dxlnode, &right_dxl_translate_ctxt, translation_context_arr_with_siblings); + Plan *right_plan = TranslateDXLOperatorToPlan( + right_tree_dxlnode, &right_dxl_translate_ctxt, + translation_context_arr_with_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&left_dxl_translate_ctxt)); - child_contexts->Append(const_cast(&right_dxl_translate_ctxt)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append( + const_cast(&left_dxl_translate_ctxt)); + child_contexts->Append( + const_cast(&right_dxl_translate_ctxt)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); // translate join filter - join->joinqual = TranslateDXLFilterToQual - ( - join_filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + join->joinqual = + TranslateDXLFilterToQual(join_filter_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); // translate merge cond List *merge_conditions_list = NIL; @@ -2243,16 +2296,14 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin for (ULONG ul = 0; ul < num_join_conds; ul++) { CDXLNode *merge_condition_dxlnode = (*merge_cond_list_dxlnode)[ul]; - List *merge_condition_list = TranslateDXLScCondToQual - ( - merge_condition_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + List *merge_condition_list = + TranslateDXLScCondToQual(merge_condition_dxlnode, + NULL, // base table translation context + child_contexts, output_context); GPOS_ASSERT(1 == gpdb::ListLength(merge_condition_list)); - merge_conditions_list = gpdb::ListConcat(merge_conditions_list, merge_condition_list); + merge_conditions_list = + gpdb::ListConcat(merge_conditions_list, merge_condition_list); } GPOS_ASSERT(NIL != merge_conditions_list); @@ -2264,13 +2315,16 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin plan->nMotionNodes = left_plan->nMotionNodes + right_plan->nMotionNodes; SetParamIds(plan); - merge_join->mergeFamilies = (Oid *) gpdb::GPDBAlloc(sizeof(Oid) * num_join_conds); - merge_join->mergeStrategies = (int *) gpdb::GPDBAlloc(sizeof(int) * num_join_conds); - merge_join->mergeNullsFirst = (bool *) gpdb::GPDBAlloc(sizeof(bool) * num_join_conds); + merge_join->mergeFamilies = + (Oid *) gpdb::GPDBAlloc(sizeof(Oid) * num_join_conds); + merge_join->mergeStrategies = + (int *) gpdb::GPDBAlloc(sizeof(int) * num_join_conds); + merge_join->mergeNullsFirst = + (bool *) gpdb::GPDBAlloc(sizeof(bool) * num_join_conds); ListCell *lc; ULONG ul = 0; - foreach(lc, merge_join->mergeclauses) + foreach (lc, merge_join->mergeclauses) { Expr *expr = (Expr *) lfirst(lc); @@ -2280,7 +2334,8 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin OpExpr *opexpr = (OpExpr *) expr; List *mergefamilies = gpdb::GetMergeJoinOpFamilies(opexpr->opno); - GPOS_ASSERT(NULL != mergefamilies && gpdb::ListLength(mergefamilies) > 0); + GPOS_ASSERT(NULL != mergefamilies && + gpdb::ListLength(mergefamilies) > 0); // Pick the first - it's probably what we want merge_join->mergeFamilies[ul] = gpdb::ListNthOid(mergefamilies, 0); @@ -2302,7 +2357,7 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin translation_context_arr_with_siblings->Release(); child_contexts->Release(); - return (Plan *) merge_join; + return (Plan *) merge_join; } //--------------------------------------------------------------------------- @@ -2314,12 +2369,9 @@ CTranslatorDXLToPlStmt::TranslateDXLMergeJoin // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLHash - ( - const CDXLNode *dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLHash( + const CDXLNode *dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { Hash *hash = MakeNode(Hash); @@ -2327,16 +2379,19 @@ CTranslatorDXLToPlStmt::TranslateDXLHash plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate dxl node - CDXLTranslateContext dxl_translate_ctxt(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext dxl_translate_ctxt( + m_mp, false, output_context->GetColIdToParamIdMap()); - Plan *left_plan = TranslateDXLOperatorToPlan(dxlnode, &dxl_translate_ctxt, ctxt_translation_prev_siblings); + Plan *left_plan = TranslateDXLOperatorToPlan( + dxlnode, &dxl_translate_ctxt, ctxt_translation_prev_siblings); GPOS_ASSERT(0 < dxlnode->Arity()); // create a reference to each entry in the child project list to create the target list of // the hash node CDXLNode *project_list_dxlnode = (*dxlnode)[0]; - List *target_list = TranslateDXLProjectListToHashTargetList(project_list_dxlnode, &dxl_translate_ctxt, output_context); + List *target_list = TranslateDXLProjectListToHashTargetList( + project_list_dxlnode, &dxl_translate_ctxt, output_context); // copy costs from child node; the startup cost for the hash node is the total cost // of the child plan, see make_hash in createplan.c @@ -2366,20 +2421,20 @@ CTranslatorDXLToPlStmt::TranslateDXLHash // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalMotion *motion_dxlop = CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); + CDXLPhysicalMotion *motion_dxlop = + CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); if (CTranslatorUtils::IsDuplicateSensitiveMotion(motion_dxlop)) { - return TranslateDXLRedistributeMotionToResultHashFilters(motion_dxlnode, output_context, ctxt_translation_prev_siblings); + return TranslateDXLRedistributeMotionToResultHashFilters( + motion_dxlnode, output_context, ctxt_translation_prev_siblings); } - - return TranslateDXLMotion(motion_dxlnode, output_context, ctxt_translation_prev_siblings); + + return TranslateDXLMotion(motion_dxlnode, output_context, + ctxt_translation_prev_siblings); } //--------------------------------------------------------------------------- @@ -2391,14 +2446,12 @@ CTranslatorDXLToPlStmt::TranslateDXLDuplicateSensitiveMotion // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLMotion - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLMotion( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalMotion *motion_dxlop = CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); + CDXLPhysicalMotion *motion_dxlop = + CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); // create motion node Motion *motion = MakeNode(Motion); @@ -2407,14 +2460,11 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(motion_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(motion_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); CDXLNode *project_list_dxlnode = (*motion_dxlnode)[EdxlgmIndexProjList]; CDXLNode *filter_dxlnode = (*motion_dxlnode)[EdxlgmIndexFilter]; @@ -2428,24 +2478,21 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion CDXLNode *child_dxlnode = (*motion_dxlnode)[child_index]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); // translate sorting info ULONG num_sort_cols = sort_col_list_dxl->Arity(); @@ -2453,11 +2500,15 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion { motion->sendSorted = true; motion->numSortCols = num_sort_cols; - motion->sortColIdx = (AttrNumber *) gpdb::GPDBAlloc(num_sort_cols * sizeof(AttrNumber)); - motion->sortOperators = (Oid *) gpdb::GPDBAlloc(num_sort_cols * sizeof(Oid)); - motion->nullsFirst = (bool *) gpdb::GPDBAlloc(num_sort_cols * sizeof(bool)); + motion->sortColIdx = + (AttrNumber *) gpdb::GPDBAlloc(num_sort_cols * sizeof(AttrNumber)); + motion->sortOperators = + (Oid *) gpdb::GPDBAlloc(num_sort_cols * sizeof(Oid)); + motion->nullsFirst = + (bool *) gpdb::GPDBAlloc(num_sort_cols * sizeof(bool)); - TranslateSortCols(sort_col_list_dxl, output_context, motion->sortColIdx, motion->sortOperators, motion->nullsFirst); + TranslateSortCols(sort_col_list_dxl, output_context, motion->sortColIdx, + motion->sortOperators, motion->nullsFirst); } else { @@ -2470,7 +2521,8 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion } if (motion_dxlop->GetDXLOperator() == EdxlopPhysicalMotionRedistribute || - motion_dxlop->GetDXLOperator() == EdxlopPhysicalMotionRoutedDistribute || + motion_dxlop->GetDXLOperator() == + EdxlopPhysicalMotionRoutedDistribute || motion_dxlop->GetDXLOperator() == EdxlopPhysicalMotionRandom) { // translate hash expr list @@ -2479,18 +2531,15 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion if (EdxlopPhysicalMotionRedistribute == motion_dxlop->GetDXLOperator()) { - CDXLNode *hash_expr_list_dxlnode = (*motion_dxlnode)[EdxlrmIndexHashExprList]; - - TranslateHashExprList - ( - hash_expr_list_dxlnode, - &child_context, - &hash_expr_list, - &hash_expr_types_list, - output_context - ); + CDXLNode *hash_expr_list_dxlnode = + (*motion_dxlnode)[EdxlrmIndexHashExprList]; + + TranslateHashExprList(hash_expr_list_dxlnode, &child_context, + &hash_expr_list, &hash_expr_types_list, + output_context); } - GPOS_ASSERT(gpdb::ListLength(hash_expr_list) == gpdb::ListLength(hash_expr_types_list)); + GPOS_ASSERT(gpdb::ListLength(hash_expr_list) == + gpdb::ListLength(hash_expr_types_list)); motion->hashExpr = hash_expr_list; motion->hashDataTypes = hash_expr_types_list; @@ -2547,7 +2596,8 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion { motion->motionType = MOTIONTYPE_FIXED; // get segment id - INT segid = CDXLPhysicalGatherMotion::Cast(motion_dxlop)->IOutputSegIdx(); + INT segid = + CDXLPhysicalGatherMotion::Cast(motion_dxlop)->IOutputSegIdx(); // if it's a gather on a segment, pick a segment from // available segments using GPDB's hash function. @@ -2573,14 +2623,17 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion { motion->motionType = MOTIONTYPE_HASH; // translate output segment ids - const IntPtrArray *output_segids_array = CDXLPhysicalMotion::Cast(motion_dxlop)->GetOutputSegIdsArray(); + const IntPtrArray *output_segids_array = + CDXLPhysicalMotion::Cast(motion_dxlop)->GetOutputSegIdsArray(); - GPOS_ASSERT(NULL != output_segids_array && 0 < output_segids_array->Size()); + GPOS_ASSERT(NULL != output_segids_array && + 0 < output_segids_array->Size()); ULONG segid_count = output_segids_array->Size(); - motion->outputSegIdx = (INT *) gpdb::GPDBAlloc (segid_count * sizeof(INT)); + motion->outputSegIdx = + (INT *) gpdb::GPDBAlloc(segid_count * sizeof(INT)); motion->numOutputSegs = segid_count; - for(ULONG ul = 0; ul < segid_count; ul++) + for (ULONG ul = 0; ul < segid_count; ul++) { INT segid = *((*output_segids_array)[ul]); motion->outputSegIdx[ul] = segid; @@ -2600,12 +2653,14 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion motion->motionType = MOTIONTYPE_EXPLICIT; motion->numOutputSegs = 0; motion->outputSegIdx = NULL; - ULONG segid_col = CDXLPhysicalRoutedDistributeMotion::Cast(motion_dxlop)->SegmentIdCol(); - const TargetEntry *te_sort_col = child_context.GetTargetEntry(segid_col); + ULONG segid_col = + CDXLPhysicalRoutedDistributeMotion::Cast(motion_dxlop) + ->SegmentIdCol(); + const TargetEntry *te_sort_col = + child_context.GetTargetEntry(segid_col); motion->segidColIdx = te_sort_col->resno; break; - } default: GPOS_ASSERT(!"Unrecognized Motion operator"); @@ -2622,17 +2677,14 @@ CTranslatorDXLToPlStmt::TranslateDXLMotion // CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters // // @doc: -// Translate DXL duplicate sensitive redistribute motion node into +// Translate DXL duplicate sensitive redistribute motion node into // GPDB result node with hash filters // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create motion node Result *result = MakeNode(Result); @@ -2640,40 +2692,36 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters Plan *plan = &(result->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalMotion *motion_dxlop = CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); + CDXLPhysicalMotion *motion_dxlop = + CDXLPhysicalMotion::Cast(motion_dxlnode->GetOperator()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(motion_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(motion_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); CDXLNode *project_list_dxlnode = (*motion_dxlnode)[EdxlrmIndexProjList]; CDXLNode *filter_dxlnode = (*motion_dxlnode)[EdxlrmIndexFilter]; - CDXLNode *child_dxlnode = (*motion_dxlnode)[motion_dxlop->GetRelationChildIdx()]; + CDXLNode *child_dxlnode = + (*motion_dxlnode)[motion_dxlop->GetRelationChildIdx()]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); bool targetlist_modified = false; @@ -2682,19 +2730,23 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters if (EdxlopPhysicalMotionRedistribute == motion_dxlop->GetDXLOperator()) { - CDXLNode *hash_expr_list_dxlnode = (*motion_dxlnode)[EdxlrmIndexHashExprList]; + CDXLNode *hash_expr_list_dxlnode = + (*motion_dxlnode)[EdxlrmIndexHashExprList]; const ULONG length = hash_expr_list_dxlnode->Arity(); GPOS_ASSERT(0 < length); - + for (ULONG ul = 0; ul < length; ul++) { CDXLNode *hash_expr_dxlnode = (*hash_expr_list_dxlnode)[ul]; CDXLNode *expr_dxlnode = (*hash_expr_dxlnode)[0]; - + INT resno = gpos::int_max; - if (EdxlopScalarIdent == expr_dxlnode->GetOperator()->GetDXLOperator()) + if (EdxlopScalarIdent == + expr_dxlnode->GetOperator()->GetDXLOperator()) { - ULONG colid = CDXLScalarIdent::Cast(expr_dxlnode->GetOperator())->GetDXLColRef()->Id(); + ULONG colid = CDXLScalarIdent::Cast(expr_dxlnode->GetOperator()) + ->GetDXLColRef() + ->Id(); resno = output_context->GetTargetEntry(colid)->resno; } else @@ -2703,38 +2755,37 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters // Rather, it is an expresssion that is evaluated by the hash filter such as CAST(a) or a+b. // We therefore, create a corresponding GPDB scalar expression and add it to the project list // of the hash filter - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - NULL, // translate context for the base table - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); - - Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(expr_dxlnode, &colid_var_mapping); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt( + m_mp, + NULL, // translate context for the base table + child_contexts, output_context, + m_dxl_to_plstmt_context); + + Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + expr_dxlnode, &colid_var_mapping); GPOS_ASSERT(NULL != expr); // create a target entry for the hash filter CWStringConst str_unnamed_col(GPOS_WSZ_LIT("?column?")); - TargetEntry *target_entry = gpdb::MakeTargetEntry - ( - expr, - gpdb::ListLength(plan->targetlist) + 1, - CTranslatorUtils::CreateMultiByteCharStringFromWCString(str_unnamed_col.GetBuffer()), - false /* resjunk */ - ); - plan->targetlist = gpdb::LAppend(plan->targetlist, target_entry); + TargetEntry *target_entry = gpdb::MakeTargetEntry( + expr, gpdb::ListLength(plan->targetlist) + 1, + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str_unnamed_col.GetBuffer()), + false /* resjunk */ + ); + plan->targetlist = + gpdb::LAppend(plan->targetlist, target_entry); resno = target_entry->resno; targetlist_modified = true; } GPOS_ASSERT(gpos::int_max != resno); - + result->hashList = gpdb::LAppendInt(result->hashList, resno); } } - + // cleanup child_contexts->Release(); @@ -2771,7 +2822,7 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters plan->targetlist = NIL; ListCell *lc = NULL; ULONG ul = 0; - ForEach (lc, child_result->targetlist) + ForEach(lc, child_result->targetlist) { if (ul++ >= project_list_dxlnode->Arity()) { @@ -2782,15 +2833,12 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters } TargetEntry *te = (TargetEntry *) lfirst(lc); - Var *var = gpdb::MakeVar(OUTER, - te->resno, - gpdb::ExprType((Node *) te->expr), - gpdb::ExprTypeMod((Node *) te->expr), - 0 /* varlevelsup */); - TargetEntry *new_te = gpdb::MakeTargetEntry((Expr *) var, - ul, /* resno */ - te->resname, - te->resjunk); + Var *var = gpdb::MakeVar( + OUTER, te->resno, gpdb::ExprType((Node *) te->expr), + gpdb::ExprTypeMod((Node *) te->expr), 0 /* varlevelsup */); + TargetEntry *new_te = + gpdb::MakeTargetEntry((Expr *) var, ul, /* resno */ + te->resname, te->resjunk); plan->targetlist = gpdb::LAppend(plan->targetlist, new_te); } @@ -2815,12 +2863,9 @@ CTranslatorDXLToPlStmt::TranslateDXLRedistributeMotionToResultHashFilters // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLAgg - ( - const CDXLNode *agg_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLAgg( + const CDXLNode *agg_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create aggregate plan node Agg *agg = MakeNode(Agg); @@ -2828,17 +2873,15 @@ CTranslatorDXLToPlStmt::TranslateDXLAgg Plan *plan = &(agg->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalAgg *dxl_phy_agg_dxlop = CDXLPhysicalAgg::Cast(agg_dxlnode->GetOperator()); + CDXLPhysicalAgg *dxl_phy_agg_dxlop = + CDXLPhysicalAgg::Cast(agg_dxlnode->GetOperator()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(agg_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(agg_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); // translate agg child CDXLNode *child_dxlnode = (*agg_dxlnode)[EdxlaggIndexChild]; @@ -2846,24 +2889,21 @@ CTranslatorDXLToPlStmt::TranslateDXLAgg CDXLNode *project_list_dxlnode = (*agg_dxlnode)[EdxlaggIndexProjList]; CDXLNode *filter_dxlnode = (*agg_dxlnode)[EdxlaggIndexFilter]; - CDXLTranslateContext child_context(m_mp, true, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, true, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, // pdxltrctxRight, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, // pdxltrctxRight, + &plan->targetlist, &plan->qual, output_context); plan->lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; @@ -2887,11 +2927,13 @@ CTranslatorDXLToPlStmt::TranslateDXLAgg agg->streaming = dxl_phy_agg_dxlop->IsStreamSafe(); // translate grouping cols - const ULongPtrArray *grouping_colid_array = dxl_phy_agg_dxlop->GetGroupingColidArray(); + const ULongPtrArray *grouping_colid_array = + dxl_phy_agg_dxlop->GetGroupingColidArray(); agg->numCols = grouping_colid_array->Size(); if (agg->numCols > 0) { - agg->grpColIdx = (AttrNumber *) gpdb::GPDBAlloc(agg->numCols * sizeof(AttrNumber)); + agg->grpColIdx = + (AttrNumber *) gpdb::GPDBAlloc(agg->numCols * sizeof(AttrNumber)); agg->grpOperators = (Oid *) gpdb::GPDBAlloc(agg->numCols * sizeof(Oid)); } else @@ -2904,10 +2946,12 @@ CTranslatorDXLToPlStmt::TranslateDXLAgg for (ULONG ul = 0; ul < length; ul++) { ULONG grouping_colid = *((*grouping_colid_array)[ul]); - const TargetEntry *target_entry_grouping_col = child_context.GetTargetEntry(grouping_colid); - if (NULL == target_entry_grouping_col) + const TargetEntry *target_entry_grouping_col = + child_context.GetTargetEntry(grouping_colid); + if (NULL == target_entry_grouping_col) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, grouping_colid); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + grouping_colid); } agg->grpColIdx[ul] = target_entry_grouping_col->resno; @@ -2934,12 +2978,9 @@ CTranslatorDXLToPlStmt::TranslateDXLAgg // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLWindow - ( - const CDXLNode *window_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLWindow( + const CDXLNode *window_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create a window plan node Window *window = MakeNode(Window); @@ -2947,64 +2988,64 @@ CTranslatorDXLToPlStmt::TranslateDXLWindow Plan *plan = &(window->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalWindow *window_dxlop = CDXLPhysicalWindow::Cast(window_dxlnode->GetOperator()); + CDXLPhysicalWindow *window_dxlop = + CDXLPhysicalWindow::Cast(window_dxlnode->GetOperator()); // translate the operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(window_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(window_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); // translate children CDXLNode *child_dxlnode = (*window_dxlnode)[EdxlwindowIndexChild]; CDXLNode *project_list_dxlnode = (*window_dxlnode)[EdxlwindowIndexProjList]; CDXLNode *filter_dxlnode = (*window_dxlnode)[EdxlwindowIndexFilter]; - CDXLTranslateContext child_context(m_mp, true, output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + CDXLTranslateContext child_context(m_mp, true, + output_context->GetColIdToParamIdMap()); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, // pdxltrctxRight, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, // pdxltrctxRight, + &plan->targetlist, &plan->qual, output_context); plan->lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; // translate partition columns - const ULongPtrArray *part_by_cols_array = window_dxlop->GetPartByColsArray(); + const ULongPtrArray *part_by_cols_array = + window_dxlop->GetPartByColsArray(); window->numPartCols = part_by_cols_array->Size(); window->partColIdx = NULL; window->partOperators = NULL; if (window->numPartCols > 0) { - window->partColIdx = (AttrNumber *) gpdb::GPDBAlloc(window->numPartCols * sizeof(AttrNumber)); - window->partOperators = (Oid *) gpdb::GPDBAlloc(window->numPartCols * sizeof(Oid)); + window->partColIdx = (AttrNumber *) gpdb::GPDBAlloc( + window->numPartCols * sizeof(AttrNumber)); + window->partOperators = + (Oid *) gpdb::GPDBAlloc(window->numPartCols * sizeof(Oid)); } const ULONG num_of_part_cols = part_by_cols_array->Size(); for (ULONG ul = 0; ul < num_of_part_cols; ul++) { ULONG part_colid = *((*part_by_cols_array)[ul]); - const TargetEntry *te_part_colid = child_context.GetTargetEntry(part_colid); - if (NULL == te_part_colid) + const TargetEntry *te_part_colid = + child_context.GetTargetEntry(part_colid); + if (NULL == te_part_colid) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, part_colid); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + part_colid); } window->partColIdx[ul] = te_part_colid->resno; @@ -3022,21 +3063,30 @@ CTranslatorDXLToPlStmt::TranslateDXLWindow WindowKey *windowkey = MakeNode(WindowKey); // translate the sorting columns used in the window key - const CDXLWindowKey *window_key_dxl_op = window_dxlop->GetDXLWindowKeyAt(ul); - const CDXLNode *sort_col_list_dxlnode = window_key_dxl_op->GetSortColListDXL(); + const CDXLWindowKey *window_key_dxl_op = + window_dxlop->GetDXLWindowKeyAt(ul); + const CDXLNode *sort_col_list_dxlnode = + window_key_dxl_op->GetSortColListDXL(); const ULONG num_of_cols = sort_col_list_dxlnode->Arity(); windowkey->numSortCols = num_of_cols; - windowkey->sortColIdx = (AttrNumber *) gpdb::GPDBAlloc(num_of_cols * sizeof(AttrNumber)); - windowkey->sortOperators = (Oid *) gpdb::GPDBAlloc(num_of_cols * sizeof(Oid)); - windowkey->nullsFirst = (bool *) gpdb::GPDBAlloc(num_of_cols * sizeof(bool)); - TranslateSortCols(sort_col_list_dxlnode, &child_context, windowkey->sortColIdx, windowkey->sortOperators, windowkey->nullsFirst); + windowkey->sortColIdx = + (AttrNumber *) gpdb::GPDBAlloc(num_of_cols * sizeof(AttrNumber)); + windowkey->sortOperators = + (Oid *) gpdb::GPDBAlloc(num_of_cols * sizeof(Oid)); + windowkey->nullsFirst = + (bool *) gpdb::GPDBAlloc(num_of_cols * sizeof(bool)); + TranslateSortCols(sort_col_list_dxlnode, &child_context, + windowkey->sortColIdx, windowkey->sortOperators, + windowkey->nullsFirst); // translate the window frame specified in the window key windowkey->frame = NULL; if (NULL != window_key_dxl_op->GetWindowFrame()) { - windowkey->frame = Pwindowframe(window_key_dxl_op->GetWindowFrame(), &child_context, output_context, plan); + windowkey->frame = + Pwindowframe(window_key_dxl_op->GetWindowFrame(), + &child_context, output_context, plan); } window->windowKeys = gpdb::LAppend(window->windowKeys, windowkey); } @@ -3058,13 +3108,10 @@ CTranslatorDXLToPlStmt::TranslateDXLWindow // //--------------------------------------------------------------------------- WindowFrame * -CTranslatorDXLToPlStmt::Pwindowframe - ( - const CDXLWindowFrame *pdxlwf, - const CDXLTranslateContext *pdxltrctxChild, - CDXLTranslateContext *output_context, - Plan *pplan - ) +CTranslatorDXLToPlStmt::Pwindowframe(const CDXLWindowFrame *pdxlwf, + const CDXLTranslateContext *pdxltrctxChild, + CDXLTranslateContext *output_context, + Plan *pplan) { WindowFrame *window_frame = MakeNode(WindowFrame); @@ -3078,38 +3125,44 @@ CTranslatorDXLToPlStmt::Pwindowframe } window_frame->is_between = true; - window_frame->exclude = CTranslatorUtils::Windowexclusion(pdxlwf->ParseFrameExclusionStrategy()); + window_frame->exclude = CTranslatorUtils::Windowexclusion( + pdxlwf->ParseFrameExclusionStrategy()); // translate the CDXLNodes representing the leading and trailing edge - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(pdxltrctxChild); - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - NULL, - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt( + m_mp, NULL, child_contexts, output_context, m_dxl_to_plstmt_context); CDXLNode *win_frame_leading_dxlnode = pdxlwf->PdxlnLeading(); window_frame->lead = MakeNode(WindowFrameEdge); - window_frame->lead->kind = CTranslatorUtils::Windowboundkind(CDXLScalarWindowFrameEdge::Cast(win_frame_leading_dxlnode->GetOperator())->ParseDXLFrameBoundary()); + window_frame->lead->kind = CTranslatorUtils::Windowboundkind( + CDXLScalarWindowFrameEdge::Cast( + win_frame_leading_dxlnode->GetOperator()) + ->ParseDXLFrameBoundary()); window_frame->lead->val = NULL; if (0 != win_frame_leading_dxlnode->Arity()) { - window_frame->lead->val = (Node*) m_translator_dxl_to_scalar->TranslateDXLToScalar((*win_frame_leading_dxlnode)[0], &colid_var_mapping); + window_frame->lead->val = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*win_frame_leading_dxlnode)[0], &colid_var_mapping); } CDXLNode *win_frame_trailing_dxlnode = pdxlwf->PdxlnTrailing(); window_frame->trail = MakeNode(WindowFrameEdge); - window_frame->trail->kind = CTranslatorUtils::Windowboundkind(CDXLScalarWindowFrameEdge::Cast(win_frame_trailing_dxlnode->GetOperator())->ParseDXLFrameBoundary()); + window_frame->trail->kind = CTranslatorUtils::Windowboundkind( + CDXLScalarWindowFrameEdge::Cast( + win_frame_trailing_dxlnode->GetOperator()) + ->ParseDXLFrameBoundary()); window_frame->trail->val = NULL; if (0 != win_frame_trailing_dxlnode->Arity()) { - window_frame->trail->val = (Node*) m_translator_dxl_to_scalar->TranslateDXLToScalar((*win_frame_trailing_dxlnode)[0], &colid_var_mapping); + window_frame->trail->val = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + (*win_frame_trailing_dxlnode)[0], &colid_var_mapping); } // cleanup @@ -3127,12 +3180,9 @@ CTranslatorDXLToPlStmt::Pwindowframe // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLSort - ( - const CDXLNode *sort_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLSort( + const CDXLNode *sort_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create sort plan node Sort *sort = MakeNode(Sort); @@ -3140,41 +3190,36 @@ CTranslatorDXLToPlStmt::TranslateDXLSort Plan *plan = &(sort->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalSort *sort_dxlop = CDXLPhysicalSort::Cast(sort_dxlnode->GetOperator()); + CDXLPhysicalSort *sort_dxlop = + CDXLPhysicalSort::Cast(sort_dxlnode->GetOperator()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(sort_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(sort_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); // translate sort child CDXLNode *child_dxlnode = (*sort_dxlnode)[EdxlsortIndexChild]; CDXLNode *project_list_dxlnode = (*sort_dxlnode)[EdxlsortIndexProjList]; CDXLNode *filter_dxlnode = (*sort_dxlnode)[EdxlsortIndexFilter]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); plan->lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; @@ -3184,15 +3229,18 @@ CTranslatorDXLToPlStmt::TranslateDXLSort // translate sorting columns - const CDXLNode *sort_col_list_dxl = (*sort_dxlnode)[EdxlsortIndexSortColList]; + const CDXLNode *sort_col_list_dxl = + (*sort_dxlnode)[EdxlsortIndexSortColList]; const ULONG num_of_cols = sort_col_list_dxl->Arity(); sort->numCols = num_of_cols; - sort->sortColIdx = (AttrNumber *) gpdb::GPDBAlloc(num_of_cols * sizeof(AttrNumber)); + sort->sortColIdx = + (AttrNumber *) gpdb::GPDBAlloc(num_of_cols * sizeof(AttrNumber)); sort->sortOperators = (Oid *) gpdb::GPDBAlloc(num_of_cols * sizeof(Oid)); sort->nullsFirst = (bool *) gpdb::GPDBAlloc(num_of_cols * sizeof(bool)); - TranslateSortCols(sort_col_list_dxl, &child_context, sort->sortColIdx, sort->sortOperators, sort->nullsFirst); + TranslateSortCols(sort_col_list_dxl, &child_context, sort->sortColIdx, + sort->sortOperators, sort->nullsFirst); SetParamIds(plan); @@ -3211,12 +3259,9 @@ CTranslatorDXLToPlStmt::TranslateDXLSort // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan - ( - const CDXLNode *subquery_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan( + const CDXLNode *subquery_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create sort plan node SubqueryScan *subquery_scan = MakeNode(SubqueryScan); @@ -3224,26 +3269,28 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan Plan *plan = &(subquery_scan->scan.plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalSubqueryScan *subquery_scan_dxlop = CDXLPhysicalSubqueryScan::Cast(subquery_scan_dxlnode->GetOperator()); + CDXLPhysicalSubqueryScan *subquery_scan_dxlop = + CDXLPhysicalSubqueryScan::Cast(subquery_scan_dxlnode->GetOperator()); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(subquery_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + subquery_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // translate subplan CDXLNode *child_dxlnode = (*subquery_scan_dxlnode)[EdxlsubqscanIndexChild]; - CDXLNode *project_list_dxlnode = (*subquery_scan_dxlnode)[EdxlsubqscanIndexProjList]; - CDXLNode *filter_dxlnode = (*subquery_scan_dxlnode)[EdxlsubqscanIndexFilter]; + CDXLNode *project_list_dxlnode = + (*subquery_scan_dxlnode)[EdxlsubqscanIndexProjList]; + CDXLNode *filter_dxlnode = + (*subquery_scan_dxlnode)[EdxlsubqscanIndexFilter]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); // create an rtable entry for the subquery scan RangeTblEntry *rte = MakeNode(RangeTblEntry); @@ -3253,12 +3300,14 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan alias->colnames = NIL; // get table alias - alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(subquery_scan_dxlop->MdName()->GetMDName()->GetBuffer()); + alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + subquery_scan_dxlop->MdName()->GetMDName()->GetBuffer()); // get column names from child project list CDXLTranslateContextBaseTable base_table_context(m_mp); - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; (subquery_scan->scan).scanrelid = index; base_table_context.SetRelIndex(index); @@ -3268,7 +3317,7 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan ULONG ul = 0; - ForEach (lc_tgtentry, child_plan->targetlist) + ForEach(lc_tgtentry, child_plan->targetlist) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc_tgtentry); @@ -3278,10 +3327,12 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan alias->colnames = gpdb::LAppend(alias->colnames, val_colname); // get corresponding child project element - CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast((*child_proj_list_dxlnode)[ul]->GetOperator()); + CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast( + (*child_proj_list_dxlnode)[ul]->GetOperator()); // save mapping col id -> index in translate context - (void) base_table_context.InsertMapping(sc_proj_elem_dxlop->Id(), target_entry->resno); + (void) base_table_context.InsertMapping(sc_proj_elem_dxlop->Id(), + target_entry->resno); ul++; } @@ -3291,16 +3342,10 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan m_dxl_to_plstmt_context->AddRTE(rte); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - &base_table_context, // translate context for the base table - NULL, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter( + project_list_dxlnode, filter_dxlnode, + &base_table_context, // translate context for the base table + NULL, &plan->targetlist, &plan->qual, output_context); subquery_scan->subplan = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; @@ -3318,12 +3363,9 @@ CTranslatorDXLToPlStmt::TranslateDXLSubQueryScan // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLResult - ( - const CDXLNode *result_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLResult( + const CDXLNode *result_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create result plan node Result *result = MakeNode(Result); @@ -3332,26 +3374,25 @@ CTranslatorDXLToPlStmt::TranslateDXLResult plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(result_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(result_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); plan->nMotionNodes = 0; CDXLNode *child_dxlnode = NULL; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); if (result_dxlnode->Arity() - 1 == EdxlresultIndexChild) { // translate child plan child_dxlnode = (*result_dxlnode)[EdxlresultIndexChild]; - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); GPOS_ASSERT(NULL != child_plan && "child plan cannot be NULL"); @@ -3362,33 +3403,26 @@ CTranslatorDXLToPlStmt::TranslateDXLResult CDXLNode *project_list_dxlnode = (*result_dxlnode)[EdxlresultIndexProjList]; CDXLNode *filter_dxlnode = (*result_dxlnode)[EdxlresultIndexFilter]; - CDXLNode *one_time_filter_dxlnode = (*result_dxlnode)[EdxlresultIndexOneTimeFilter]; + CDXLNode *one_time_filter_dxlnode = + (*result_dxlnode)[EdxlresultIndexOneTimeFilter]; List *quals_list = NULL; - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &quals_list, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &quals_list, + output_context); // translate one time filter - List *one_time_quals_list = TranslateDXLFilterToQual - ( - one_time_filter_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + List *one_time_quals_list = + TranslateDXLFilterToQual(one_time_filter_dxlnode, + NULL, // base table translation context + child_contexts, output_context); plan->qual = quals_list; @@ -3411,49 +3445,52 @@ CTranslatorDXLToPlStmt::TranslateDXLResult // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLPartSelector - ( +CTranslatorDXLToPlStmt::TranslateDXLPartSelector( const CDXLNode *partition_selector_dxlnode, CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { PartitionSelector *partition_selector = MakeNode(PartitionSelector); Plan *plan = &(partition_selector->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalPartitionSelector *partition_selector_dxlop = CDXLPhysicalPartitionSelector::Cast(partition_selector_dxlnode->GetOperator()); - const ULONG num_of_levels = partition_selector_dxlop->GetPartitioningLevel(); + CDXLPhysicalPartitionSelector *partition_selector_dxlop = + CDXLPhysicalPartitionSelector::Cast( + partition_selector_dxlnode->GetOperator()); + const ULONG num_of_levels = + partition_selector_dxlop->GetPartitioningLevel(); partition_selector->nLevels = num_of_levels; partition_selector->scanId = partition_selector_dxlop->ScanId(); - partition_selector->relid = CMDIdGPDB::CastMdid(partition_selector_dxlop->GetRelMdId())->Oid(); + partition_selector->relid = + CMDIdGPDB::CastMdid(partition_selector_dxlop->GetRelMdId())->Oid(); partition_selector->selectorId = m_partition_selector_counter++; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(partition_selector_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + partition_selector_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); plan->nMotionNodes = 0; CDXLNode *child_dxlnode = NULL; - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - BOOL has_childs = (EdxlpsIndexChild == partition_selector_dxlnode->Arity() - 1); + BOOL has_childs = + (EdxlpsIndexChild == partition_selector_dxlnode->Arity() - 1); if (has_childs) { // translate child plan child_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexChild]; - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); GPOS_ASSERT(NULL != child_plan && "child plan cannot be NULL"); partition_selector->plan.lefttree = child_plan; @@ -3462,33 +3499,51 @@ CTranslatorDXLToPlStmt::TranslateDXLPartSelector child_contexts->Append(&child_context); - CDXLNode *project_list_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexProjList]; - CDXLNode *eq_filters_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexEqFilters]; - CDXLNode *filters_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexFilters]; - CDXLNode *residual_filter_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexResidualFilter]; - CDXLNode *proj_expr_dxlnode = (*partition_selector_dxlnode)[EdxlpsIndexPropExpr]; + CDXLNode *project_list_dxlnode = + (*partition_selector_dxlnode)[EdxlpsIndexProjList]; + CDXLNode *eq_filters_dxlnode = + (*partition_selector_dxlnode)[EdxlpsIndexEqFilters]; + CDXLNode *filters_dxlnode = + (*partition_selector_dxlnode)[EdxlpsIndexFilters]; + CDXLNode *residual_filter_dxlnode = + (*partition_selector_dxlnode)[EdxlpsIndexResidualFilter]; + CDXLNode *proj_expr_dxlnode = + (*partition_selector_dxlnode)[EdxlpsIndexPropExpr]; // translate proj list - plan->targetlist = TranslateDXLProjList(project_list_dxlnode, NULL /*base_table_context*/, child_contexts, output_context); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, NULL /*base_table_context*/, + child_contexts, output_context); // translate filter lists GPOS_ASSERT(eq_filters_dxlnode->Arity() == num_of_levels); - partition_selector->levelEqExpressions = TranslateDXLFilterList(eq_filters_dxlnode, NULL /*base_table_context*/, child_contexts, output_context); + partition_selector->levelEqExpressions = + TranslateDXLFilterList(eq_filters_dxlnode, NULL /*base_table_context*/, + child_contexts, output_context); GPOS_ASSERT(filters_dxlnode->Arity() == num_of_levels); - partition_selector->levelExpressions = TranslateDXLFilterList(filters_dxlnode, NULL /*base_table_context*/, child_contexts, output_context); + partition_selector->levelExpressions = + TranslateDXLFilterList(filters_dxlnode, NULL /*base_table_context*/, + child_contexts, output_context); //translate residual filter - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt(m_mp, NULL /*base_table_context*/, child_contexts, output_context, m_dxl_to_plstmt_context); - if (!m_translator_dxl_to_scalar->HasConstTrue(residual_filter_dxlnode, m_md_accessor)) + CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt( + m_mp, NULL /*base_table_context*/, child_contexts, output_context, + m_dxl_to_plstmt_context); + if (!m_translator_dxl_to_scalar->HasConstTrue(residual_filter_dxlnode, + m_md_accessor)) { - partition_selector->residualPredicate = (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar(residual_filter_dxlnode, &colid_var_mapping); + partition_selector->residualPredicate = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + residual_filter_dxlnode, &colid_var_mapping); } //translate propagation expression if (!m_translator_dxl_to_scalar->HasConstNull(proj_expr_dxlnode)) { - partition_selector->propagationExpression = (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar(proj_expr_dxlnode, &colid_var_mapping); + partition_selector->propagationExpression = + (Node *) m_translator_dxl_to_scalar->TranslateDXLToScalar( + proj_expr_dxlnode, &colid_var_mapping); } // no need to translate printable filter - since it is not needed by the executor @@ -3499,7 +3554,8 @@ CTranslatorDXLToPlStmt::TranslateDXLPartSelector if (partition_selector->staticSelection) { - SelectedParts *sp = gpdb::RunStaticPartitionSelection(partition_selector); + SelectedParts *sp = + gpdb::RunStaticPartitionSelection(partition_selector); partition_selector->staticPartOids = sp->partOids; partition_selector->staticScanIds = sp->scanIds; gpdb::GPDBFree(sp); @@ -3512,7 +3568,8 @@ CTranslatorDXLToPlStmt::TranslateDXLPartSelector } // increment the number of partition selectors for the given scan id - m_dxl_to_plstmt_context->IncrementPartitionSelectors(partition_selector->scanId); + m_dxl_to_plstmt_context->IncrementPartitionSelectors( + partition_selector->scanId); SetParamIds(plan); @@ -3531,31 +3588,34 @@ CTranslatorDXLToPlStmt::TranslateDXLPartSelector // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLFilterList - ( +CTranslatorDXLToPlStmt::TranslateDXLFilterList( const CDXLNode *filter_list_dxlnode, const CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ) + CDXLTranslateContext *output_context) { - GPOS_ASSERT(EdxlopScalarOpList == filter_list_dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarOpList == + filter_list_dxlnode->GetOperator()->GetDXLOperator()); List *filters_list = NIL; - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt(m_mp, base_table_context, child_contexts, output_context, m_dxl_to_plstmt_context); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, base_table_context, child_contexts, + output_context, m_dxl_to_plstmt_context); const ULONG arity = filter_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *child_filter_dxlnode = (*filter_list_dxlnode)[ul]; - if (m_translator_dxl_to_scalar->HasConstTrue(child_filter_dxlnode, m_md_accessor)) + if (m_translator_dxl_to_scalar->HasConstTrue(child_filter_dxlnode, + m_md_accessor)) { filters_list = gpdb::LAppend(filters_list, NULL /*datum*/); continue; } - Expr *filter_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(child_filter_dxlnode, &colid_var_mapping); + Expr *filter_expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + child_filter_dxlnode, &colid_var_mapping); filters_list = gpdb::LAppend(filters_list, filter_expr); } @@ -3571,12 +3631,9 @@ CTranslatorDXLToPlStmt::TranslateDXLFilterList // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLAppend - ( - const CDXLNode *append_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLAppend( + const CDXLNode *append_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create append plan node Append *append = MakeNode(Append); @@ -3584,33 +3641,33 @@ CTranslatorDXLToPlStmt::TranslateDXLAppend Plan *plan = &(append->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalAppend *pdxlopAppend = CDXLPhysicalAppend::Cast(append_dxlnode->GetOperator()); + CDXLPhysicalAppend *pdxlopAppend = + CDXLPhysicalAppend::Cast(append_dxlnode->GetOperator()); append->isTarget = pdxlopAppend->IsUsedInUpdDel(); append->isZapped = pdxlopAppend->IsZapped(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(append_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(append_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); const ULONG arity = append_dxlnode->Arity(); GPOS_ASSERT(EdxlappendIndexFirstChild < arity); plan->nMotionNodes = 0; append->appendplans = NIL; - + // translate children - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); for (ULONG ul = EdxlappendIndexFirstChild; ul < arity; ul++) { CDXLNode *child_dxlnode = (*append_dxlnode)[ul]; - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); GPOS_ASSERT(NULL != child_plan && "child plan cannot be NULL"); @@ -3626,30 +3683,33 @@ CTranslatorDXLToPlStmt::TranslateDXLAppend for (ULONG ul = 0; ul < length; ++ul) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - GPOS_ASSERT(EdxlopScalarProjectElem == proj_elem_dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarProjectElem == + proj_elem_dxlnode->GetOperator()->GetDXLOperator()); - CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + CDXLScalarProjElem *sc_proj_elem_dxlop = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); GPOS_ASSERT(1 == proj_elem_dxlnode->Arity()); // translate proj element expression CDXLNode *expr_dxlnode = (*proj_elem_dxlnode)[0]; - CDXLScalarIdent *sc_ident_dxlop = CDXLScalarIdent::Cast(expr_dxlnode->GetOperator()); + CDXLScalarIdent *sc_ident_dxlop = + CDXLScalarIdent::Cast(expr_dxlnode->GetOperator()); Index idxVarno = OUTER; - AttrNumber attno = (AttrNumber) (ul + 1); + AttrNumber attno = (AttrNumber)(ul + 1); - Var *var = gpdb::MakeVar - ( - idxVarno, - attno, - CMDIdGPDB::CastMdid(sc_ident_dxlop->MdidType())->Oid(), - sc_ident_dxlop->TypeModifier(), - 0 // varlevelsup - ); + Var *var = gpdb::MakeVar( + idxVarno, attno, + CMDIdGPDB::CastMdid(sc_ident_dxlop->MdidType())->Oid(), + sc_ident_dxlop->TypeModifier(), + 0 // varlevelsup + ); TargetEntry *target_entry = MakeNode(TargetEntry); target_entry->expr = (Expr *) var; - target_entry->resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); + target_entry->resname = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); target_entry->resno = attno; // add column mapping to output translation context @@ -3658,17 +3718,15 @@ CTranslatorDXLToPlStmt::TranslateDXLAppend plan->targetlist = gpdb::LAppend(plan->targetlist, target_entry); } - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(output_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(output_context)); // translate filter - plan->qual = TranslateDXLFilterToQual - ( - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + plan->qual = + TranslateDXLFilterToQual(filter_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); SetParamIds(plan); @@ -3687,12 +3745,9 @@ CTranslatorDXLToPlStmt::TranslateDXLAppend // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLMaterialize - ( - const CDXLNode *materialize_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLMaterialize( + const CDXLNode *materialize_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create materialize plan node Material *materialize = MakeNode(Material); @@ -3700,44 +3755,40 @@ CTranslatorDXLToPlStmt::TranslateDXLMaterialize Plan *plan = &(materialize->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalMaterialize *materialize_dxlop = CDXLPhysicalMaterialize::Cast(materialize_dxlnode->GetOperator()); + CDXLPhysicalMaterialize *materialize_dxlop = + CDXLPhysicalMaterialize::Cast(materialize_dxlnode->GetOperator()); materialize->cdb_strict = materialize_dxlop->IsEager(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(materialize_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + materialize_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // translate materialize child CDXLNode *child_dxlnode = (*materialize_dxlnode)[EdxlmatIndexChild]; - CDXLNode *project_list_dxlnode = (*materialize_dxlnode)[EdxlmatIndexProjList]; + CDXLNode *project_list_dxlnode = + (*materialize_dxlnode)[EdxlmatIndexProjList]; CDXLNode *filter_dxlnode = (*materialize_dxlnode)[EdxlmatIndexFilter]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list and filter - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - NULL, // translate context for the base table - child_contexts, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter(project_list_dxlnode, filter_dxlnode, + NULL, // translate context for the base table + child_contexts, &plan->targetlist, &plan->qual, + output_context); plan->lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; @@ -3748,8 +3799,10 @@ CTranslatorDXLToPlStmt::TranslateDXLMaterialize materialize->share_id = materialize_dxlop->GetSpoolingOpId(); materialize->driver_slice = materialize_dxlop->GetExecutorSlice(); materialize->nsharer_xslice = materialize_dxlop->GetNumConsumerSlices(); - materialize->share_type = (0 < materialize_dxlop->GetNumConsumerSlices()) ? - SHARE_MATERIAL_XSLICE : SHARE_MATERIAL; + materialize->share_type = + (0 < materialize_dxlop->GetNumConsumerSlices()) + ? SHARE_MATERIAL_XSLICE + : SHARE_MATERIAL; } else { @@ -3773,14 +3826,12 @@ CTranslatorDXLToPlStmt::TranslateDXLMaterialize // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan - ( - const CDXLNode *cte_producer_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan( + const CDXLNode *cte_producer_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalCTEProducer *cte_prod_dxlop = CDXLPhysicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); + CDXLPhysicalCTEProducer *cte_prod_dxlop = + CDXLPhysicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); ULONG cte_id = cte_prod_dxlop->Id(); // create the shared input scan representing the CTE Producer @@ -3793,68 +3844,68 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan m_dxl_to_plstmt_context->AddCTEConsumerInfo(cte_id, shared_input_scan); // translate cost of the producer - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(cte_producer_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + cte_producer_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // translate child plan CDXLNode *project_list_dxlnode = (*cte_producer_dxlnode)[0]; CDXLNode *child_dxlnode = (*cte_producer_dxlnode)[1]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); GPOS_ASSERT(NULL != child_plan && "child plan cannot be NULL"); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&child_context); // translate proj list - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // base table translation context + child_contexts, output_context); // if the child node is neither a sort or materialize node then add a materialize node if (!IsA(child_plan, Material) && !IsA(child_plan, Sort)) { Material *materialize = MakeNode(Material); - materialize->cdb_strict = false; // eager-free + materialize->cdb_strict = false; // eager-free Plan *materialize_plan = &(materialize->plan); - materialize_plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(cte_producer_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(materialize_plan->startup_cost), - &(materialize_plan->total_cost), - &(materialize_plan->plan_rows), - &(materialize_plan->plan_width) - ); + materialize_plan->plan_node_id = + m_dxl_to_plstmt_context->GetNextPlanId(); + + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert( + cte_producer_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(materialize_plan->startup_cost), &(materialize_plan->total_cost), + &(materialize_plan->plan_rows), &(materialize_plan->plan_width)); // create a target list for the newly added materialize ListCell *lc_target_entry = NULL; materialize_plan->targetlist = NIL; - ForEach (lc_target_entry, plan->targetlist) + ForEach(lc_target_entry, plan->targetlist) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc_target_entry); Expr *expr = target_entry->expr; GPOS_ASSERT(IsA(expr, Var)); Var *var = (Var *) expr; - Var *var_new = gpdb::MakeVar(OUTER, var->varattno, var->vartype, var->vartypmod, 0 /* varlevelsup */); + Var *var_new = gpdb::MakeVar(OUTER, var->varattno, var->vartype, + var->vartypmod, 0 /* varlevelsup */); var_new->varnoold = var->varnoold; var_new->varoattno = var->varoattno; - TargetEntry *te_new = gpdb::MakeTargetEntry((Expr *) var_new, var->varattno, PStrDup(target_entry->resname), target_entry->resjunk); - materialize_plan->targetlist = gpdb::LAppend(materialize_plan->targetlist, te_new); + TargetEntry *te_new = gpdb::MakeTargetEntry( + (Expr *) var_new, var->varattno, PStrDup(target_entry->resname), + target_entry->resjunk); + materialize_plan->targetlist = + gpdb::LAppend(materialize_plan->targetlist, te_new); } materialize_plan->lefttree = child_plan; @@ -3886,18 +3937,16 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEProducerToSharedScan // (2) SIS nodes representing the producer/consumer nodes //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::InitializeSpoolingInfo - ( - Plan *plan, - ULONG share_id - ) +CTranslatorDXLToPlStmt::InitializeSpoolingInfo(Plan *plan, ULONG share_id) { - List *shared_scan_cte_consumer_list = m_dxl_to_plstmt_context->GetCTEConsumerList(share_id); + List *shared_scan_cte_consumer_list = + m_dxl_to_plstmt_context->GetCTEConsumerList(share_id); GPOS_ASSERT(NULL != shared_scan_cte_consumer_list); Flow *flow = GetFlowCTEConsumer(shared_scan_cte_consumer_list); - const ULONG num_of_shared_scan = gpdb::ListLength(shared_scan_cte_consumer_list); + const ULONG num_of_shared_scan = + gpdb::ListLength(shared_scan_cte_consumer_list); ShareType share_type = SHARE_NOTSHARED; @@ -3929,14 +3978,16 @@ CTranslatorDXLToPlStmt::InitializeSpoolingInfo // set the share type of the consumer nodes based on the producer ListCell *lc_sh_scan_cte_consumer = NULL; - ForEach (lc_sh_scan_cte_consumer, shared_scan_cte_consumer_list) + ForEach(lc_sh_scan_cte_consumer, shared_scan_cte_consumer_list) { - ShareInputScan *share_input_scan_consumer = (ShareInputScan *) lfirst(lc_sh_scan_cte_consumer); + ShareInputScan *share_input_scan_consumer = + (ShareInputScan *) lfirst(lc_sh_scan_cte_consumer); share_input_scan_consumer->share_type = share_type; - share_input_scan_consumer->driver_slice = -1; // default + share_input_scan_consumer->driver_slice = -1; // default if (NULL == (share_input_scan_consumer->scan.plan).flow) { - (share_input_scan_consumer->scan.plan).flow = (Flow *) gpdb::CopyObject(flow); + (share_input_scan_consumer->scan.plan).flow = + (Flow *) gpdb::CopyObject(flow); } } } @@ -3951,17 +4002,15 @@ CTranslatorDXLToPlStmt::InitializeSpoolingInfo // same type //--------------------------------------------------------------------------- Flow * -CTranslatorDXLToPlStmt::GetFlowCTEConsumer - ( - List *shared_scan_cte_consumer_list - ) +CTranslatorDXLToPlStmt::GetFlowCTEConsumer(List *shared_scan_cte_consumer_list) { Flow *flow = NULL; ListCell *lc_sh_scan_cte_consumer = NULL; - ForEach (lc_sh_scan_cte_consumer, shared_scan_cte_consumer_list) + ForEach(lc_sh_scan_cte_consumer, shared_scan_cte_consumer_list) { - ShareInputScan *share_input_scan_consumer = (ShareInputScan *) lfirst(lc_sh_scan_cte_consumer); + ShareInputScan *share_input_scan_consumer = + (ShareInputScan *) lfirst(lc_sh_scan_cte_consumer); Flow *flow_cte = (share_input_scan_consumer->scan.plan).flow; if (NULL != flow_cte) { @@ -3979,7 +4028,7 @@ CTranslatorDXLToPlStmt::GetFlowCTEConsumer if (NULL == flow) { flow = MakeNode(Flow); - flow->flotype = FLOW_UNDEFINED; // default flow + flow->flotype = FLOW_UNDEFINED; // default flow } return flow; @@ -3994,14 +4043,12 @@ CTranslatorDXLToPlStmt::GetFlowCTEConsumer // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan - ( - const CDXLNode *cte_consumer_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan( + const CDXLNode *cte_consumer_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalCTEConsumer *cte_consumer_dxlop = CDXLPhysicalCTEConsumer::Cast(cte_consumer_dxlnode->GetOperator()); + CDXLPhysicalCTEConsumer *cte_consumer_dxlop = + CDXLPhysicalCTEConsumer::Cast(cte_consumer_dxlnode->GetOperator()); ULONG cte_id = cte_consumer_dxlop->Id(); ShareInputScan *share_input_scan_cte_consumer = MakeNode(ShareInputScan); @@ -4011,17 +4058,15 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(cte_consumer_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + cte_consumer_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); #ifdef GPOS_DEBUG - ULongPtrArray *output_colids_array = cte_consumer_dxlop->GetOutputColIdsArray(); + ULongPtrArray *output_colids_array = + cte_consumer_dxlop->GetOutputColIdsArray(); #endif // generate the target list of the CTE Consumer @@ -4032,18 +4077,24 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan for (ULONG ul = 0; ul < num_of_proj_list_elem; ul++) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + CDXLScalarProjElem *sc_proj_elem_dxlop = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); ULONG colid = sc_proj_elem_dxlop->Id(); GPOS_ASSERT(colid == *(*output_colids_array)[ul]); CDXLNode *sc_ident_dxlnode = (*proj_elem_dxlnode)[0]; - CDXLScalarIdent *sc_ident_dxlop = CDXLScalarIdent::Cast(sc_ident_dxlnode->GetOperator()); + CDXLScalarIdent *sc_ident_dxlop = + CDXLScalarIdent::Cast(sc_ident_dxlnode->GetOperator()); OID oid_type = CMDIdGPDB::CastMdid(sc_ident_dxlop->MdidType())->Oid(); - Var *var = gpdb::MakeVar(OUTER, (AttrNumber) (ul + 1), oid_type, sc_ident_dxlop->TypeModifier(), 0 /* varlevelsup */); + Var *var = + gpdb::MakeVar(OUTER, (AttrNumber)(ul + 1), oid_type, + sc_ident_dxlop->TypeModifier(), 0 /* varlevelsup */); - CHAR *resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); - TargetEntry *target_entry = gpdb::MakeTargetEntry((Expr *) var, (AttrNumber) (ul + 1), resname, false /* resjunk */); + CHAR *resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); + TargetEntry *target_entry = gpdb::MakeTargetEntry( + (Expr *) var, (AttrNumber)(ul + 1), resname, false /* resjunk */); plan->targetlist = gpdb::LAppend(plan->targetlist, target_entry); output_context->InsertMapping(colid, target_entry); @@ -4054,7 +4105,8 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan SetParamIds(plan); // store share scan node for the translation of CTE Consumers - m_dxl_to_plstmt_context->AddCTEConsumerInfo(cte_id, share_input_scan_cte_consumer); + m_dxl_to_plstmt_context->AddCTEConsumerInfo(cte_id, + share_input_scan_cte_consumer); return (Plan *) share_input_scan_cte_consumer; } @@ -4068,12 +4120,9 @@ CTranslatorDXLToPlStmt::TranslateDXLCTEConsumerToSharedScan // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLSequence - ( - const CDXLNode *sequence_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLSequence( + const CDXLNode *sequence_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create append plan node Sequence *psequence = MakeNode(Sequence); @@ -4082,48 +4131,46 @@ CTranslatorDXLToPlStmt::TranslateDXLSequence plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(sequence_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + sequence_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); ULONG arity = sequence_dxlnode->Arity(); - + // translate last child // since last child may be a DynamicIndexScan with outer references, // we pass the context received from parent to translate outer refs here CDXLNode *last_child_dxlnode = (*sequence_dxlnode)[arity - 1]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *last_child_plan = TranslateDXLOperatorToPlan(last_child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *last_child_plan = TranslateDXLOperatorToPlan( + last_child_dxlnode, &child_context, ctxt_translation_prev_siblings); plan->nMotionNodes = last_child_plan->nMotionNodes; CDXLNode *project_list_dxlnode = (*sequence_dxlnode)[0]; - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // base table translation context - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // base table translation context + child_contexts, output_context); // translate the rest of the children for (ULONG ul = 1; ul < arity - 1; ul++) { CDXLNode *child_dxlnode = (*sequence_dxlnode)[ul]; - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); psequence->subplans = gpdb::LAppend(psequence->subplans, child_plan); plan->nMotionNodes += child_plan->nMotionNodes; @@ -4148,23 +4195,24 @@ CTranslatorDXLToPlStmt::TranslateDXLSequence // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLDynTblScan - ( - const CDXLNode *dyn_tbl_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLDynTblScan( + const CDXLNode *dyn_tbl_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translate table descriptor into a range table entry - CDXLPhysicalDynamicTableScan *dyn_tbl_scan_dxlop = CDXLPhysicalDynamicTableScan::Cast(dyn_tbl_scan_dxlnode->GetOperator()); + CDXLPhysicalDynamicTableScan *dyn_tbl_scan_dxlop = + CDXLPhysicalDynamicTableScan::Cast(dyn_tbl_scan_dxlnode->GetOperator()); // translation context for column mappings in the base relation CDXLTranslateContextBaseTable base_table_context(m_mp); // add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(dyn_tbl_scan_dxlop->GetDXLTableDescr(), NULL /*index_descr_dxl*/, index, &base_table_context); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + dyn_tbl_scan_dxlop->GetDXLTableDescr(), NULL /*index_descr_dxl*/, index, + &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= ACL_SELECT; @@ -4175,38 +4223,32 @@ CTranslatorDXLToPlStmt::TranslateDXLDynTblScan dyn_tbl_scan->scanrelid = index; dyn_tbl_scan->partIndex = dyn_tbl_scan_dxlop->GetPartIndexId(); - dyn_tbl_scan->partIndexPrintable = dyn_tbl_scan_dxlop->GetPartIndexIdPrintable(); + dyn_tbl_scan->partIndexPrintable = + dyn_tbl_scan_dxlop->GetPartIndexIdPrintable(); Plan *plan = &(dyn_tbl_scan->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(dyn_tbl_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + dyn_tbl_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); GPOS_ASSERT(2 == dyn_tbl_scan_dxlnode->Arity()); // translate proj list and filter - CDXLNode *project_list_dxlnode = (*dyn_tbl_scan_dxlnode)[EdxltsIndexProjList]; + CDXLNode *project_list_dxlnode = + (*dyn_tbl_scan_dxlnode)[EdxltsIndexProjList]; CDXLNode *filter_dxlnode = (*dyn_tbl_scan_dxlnode)[EdxltsIndexFilter]; - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - &base_table_context, // translate context for the base table - NULL, // translate_ctxt_left and pdxltrctxRight, - &plan->targetlist, - &plan->qual, - output_context - ); + TranslateProjListAndFilter( + project_list_dxlnode, filter_dxlnode, + &base_table_context, // translate context for the base table + NULL, // translate_ctxt_left and pdxltrctxRight, + &plan->targetlist, &plan->qual, output_context); SetParamIds(plan); @@ -4222,22 +4264,24 @@ CTranslatorDXLToPlStmt::TranslateDXLDynTblScan // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan - ( - const CDXLNode *dyn_idx_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan( + const CDXLNode *dyn_idx_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalDynamicIndexScan *dyn_index_scan_dxlop = CDXLPhysicalDynamicIndexScan::Cast(dyn_idx_scan_dxlnode->GetOperator()); - + CDXLPhysicalDynamicIndexScan *dyn_index_scan_dxlop = + CDXLPhysicalDynamicIndexScan::Cast(dyn_idx_scan_dxlnode->GetOperator()); + // translation context for column mappings in the base relation CDXLTranslateContextBaseTable base_table_context(m_mp); - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; - const IMDRelation *md_rel = m_md_accessor->RetrieveRel(dyn_index_scan_dxlop->GetDXLTableDescr()->MDId()); - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(dyn_index_scan_dxlop->GetDXLTableDescr(), NULL /*index_descr_dxl*/, index, &base_table_context); + const IMDRelation *md_rel = m_md_accessor->RetrieveRel( + dyn_index_scan_dxlop->GetDXLTableDescr()->MDId()); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + dyn_index_scan_dxlop->GetDXLTableDescr(), NULL /*index_descr_dxl*/, + index, &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= ACL_SELECT; m_dxl_to_plstmt_context->AddRTE(rte); @@ -4246,51 +4290,53 @@ CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan dyn_idx_scan->scan.scanrelid = index; dyn_idx_scan->scan.partIndex = dyn_index_scan_dxlop->GetPartIndexId(); - dyn_idx_scan->scan.partIndexPrintable = dyn_index_scan_dxlop->GetPartIndexIdPrintable(); + dyn_idx_scan->scan.partIndexPrintable = + dyn_index_scan_dxlop->GetPartIndexIdPrintable(); - CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid(dyn_index_scan_dxlop->GetDXLIndexDescr()->MDId()); + CMDIdGPDB *mdid_index = + CMDIdGPDB::CastMdid(dyn_index_scan_dxlop->GetDXLIndexDescr()->MDId()); const IMDIndex *md_index = m_md_accessor->RetrieveIndex(mdid_index); Oid index_oid = mdid_index->Oid(); GPOS_ASSERT(InvalidOid != index_oid); dyn_idx_scan->indexid = index_oid; - dyn_idx_scan->logicalIndexInfo = gpdb::GetLogicalIndexInfo(rte->relid, index_oid); + dyn_idx_scan->logicalIndexInfo = + gpdb::GetLogicalIndexInfo(rte->relid, index_oid); Plan *plan = &(dyn_idx_scan->scan.plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(dyn_idx_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + dyn_idx_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // an index scan node must have 3 children: projection list, filter and index condition list GPOS_ASSERT(3 == dyn_idx_scan_dxlnode->Arity()); // translate proj list and filter - CDXLNode *project_list_dxlnode = (*dyn_idx_scan_dxlnode)[CDXLPhysicalDynamicIndexScan::EdxldisIndexProjList]; - CDXLNode *filter_dxlnode = (*dyn_idx_scan_dxlnode)[CDXLPhysicalDynamicIndexScan::EdxldisIndexFilter]; - CDXLNode *index_cond_list_dxlnode = (*dyn_idx_scan_dxlnode)[CDXLPhysicalDynamicIndexScan::EdxldisIndexCondition]; + CDXLNode *project_list_dxlnode = (*dyn_idx_scan_dxlnode) + [CDXLPhysicalDynamicIndexScan::EdxldisIndexProjList]; + CDXLNode *filter_dxlnode = (*dyn_idx_scan_dxlnode) + [CDXLPhysicalDynamicIndexScan::EdxldisIndexFilter]; + CDXLNode *index_cond_list_dxlnode = (*dyn_idx_scan_dxlnode) + [CDXLPhysicalDynamicIndexScan::EdxldisIndexCondition]; // translate proj list - plan->targetlist = TranslateDXLProjList(project_list_dxlnode, &base_table_context, NULL /*child_contexts*/, output_context); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, &base_table_context, + NULL /*child_contexts*/, output_context); // translate index filter - plan->qual = TranslateDXLIndexFilter - ( - filter_dxlnode, - output_context, - &base_table_context, - ctxt_translation_prev_siblings - ); + plan->qual = TranslateDXLIndexFilter(filter_dxlnode, output_context, + &base_table_context, + ctxt_translation_prev_siblings); - dyn_idx_scan->indexorderdir = CTranslatorUtils::GetScanDirection(dyn_index_scan_dxlop->GetIndexScanDir()); + dyn_idx_scan->indexorderdir = CTranslatorUtils::GetScanDirection( + dyn_index_scan_dxlop->GetIndexScanDir()); // translate index condition list List *index_cond = NIL; @@ -4298,22 +4344,13 @@ CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan List *index_strategy_list = NIL; List *index_subtype_list = NIL; - TranslateIndexConditions - ( - index_cond_list_dxlnode, - dyn_index_scan_dxlop->GetDXLTableDescr(), - false, // is_index_only_scan - false, // is_bitmap_index_probe - md_index, - md_rel, - output_context, - &base_table_context, - ctxt_translation_prev_siblings, - &index_cond, - &index_orig_cond, - &index_strategy_list, - &index_subtype_list - ); + TranslateIndexConditions( + index_cond_list_dxlnode, dyn_index_scan_dxlop->GetDXLTableDescr(), + false, // is_index_only_scan + false, // is_bitmap_index_probe + md_index, md_rel, output_context, &base_table_context, + ctxt_translation_prev_siblings, &index_cond, &index_orig_cond, + &index_strategy_list, &index_subtype_list); dyn_idx_scan->indexqual = index_cond; @@ -4330,25 +4367,23 @@ CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan // CTranslatorDXLToPlStmt::TranslateDXLDml // // @doc: -// Translates a DXL DML node +// Translates a DXL DML node // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLDml - ( - const CDXLNode *dml_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLDml( + const CDXLNode *dml_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translate table descriptor into a range table entry - CDXLPhysicalDML *phy_dml_dxlop = CDXLPhysicalDML::Cast(dml_dxlnode->GetOperator()); + CDXLPhysicalDML *phy_dml_dxlop = + CDXLPhysicalDML::Cast(dml_dxlnode->GetOperator()); // create DML node DML *dml = MakeNode(DML); Plan *plan = &(dml->plan); AclMode acl_mode = ACL_NO_RIGHTS; - + switch (phy_dml_dxlop->GetDmlOpType()) { case gpdxl::Edxldmldelete: @@ -4372,58 +4407,64 @@ CTranslatorDXLToPlStmt::TranslateDXLDml case gpdxl::EdxldmlSentinel: default: { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, GPOS_WSZ_LIT("Unexpected error during plan generation.")); break; } } - + IMDId *mdid_target_table = phy_dml_dxlop->GetDXLTableDescr()->MDId(); - if (IMDRelation::EreldistrMasterOnly != m_md_accessor->RetrieveRel(mdid_target_table)->GetRelDistribution()) + if (IMDRelation::EreldistrMasterOnly != + m_md_accessor->RetrieveRel(mdid_target_table)->GetRelDistribution()) { m_is_tgt_tbl_distributed = true; } - + // translation context for column mappings in the base relation CDXLTranslateContextBaseTable base_table_context(m_mp); // add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; dml->scanrelid = index; - + m_result_rel_list = gpdb::LAppendInt(m_result_rel_list, index); - const IMDRelation *md_rel = m_md_accessor->RetrieveRel(phy_dml_dxlop->GetDXLTableDescr()->MDId()); + const IMDRelation *md_rel = + m_md_accessor->RetrieveRel(phy_dml_dxlop->GetDXLTableDescr()->MDId()); CDXLTableDescr *table_descr = phy_dml_dxlop->GetDXLTableDescr(); - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= acl_mode; m_dxl_to_plstmt_context->AddRTE(rte); - + CDXLNode *project_list_dxlnode = (*dml_dxlnode)[0]; CDXLNode *child_dxlnode = (*dml_dxlnode)[1]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&child_context); // translate proj list - List *dml_target_list = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); - + List *dml_target_list = + TranslateDXLProjList(project_list_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); + if (md_rel->HasDroppedColumns()) { // pad DML target list with NULLs for dropped columns for all DML operator types - List *target_list_with_dropped_cols = CreateTargetListWithNullsForDroppedCols(dml_target_list, md_rel); + List *target_list_with_dropped_cols = + CreateTargetListWithNullsForDroppedCols(dml_target_list, md_rel); gpdb::GPDBFree(dml_target_list); dml_target_list = target_list_with_dropped_cols; } @@ -4432,11 +4473,17 @@ CTranslatorDXLToPlStmt::TranslateDXLDml // target list. ORCA also includes a third similar column for // partition Oid to the target list, but we don't use it for anything // in GPDB. - dml->actionColIdx = AddTargetEntryForColId(&dml_target_list, &child_context, phy_dml_dxlop->ActionColId(), true /*is_resjunk*/); - dml->ctidColIdx = AddTargetEntryForColId(&dml_target_list, &child_context, phy_dml_dxlop->GetCtIdColId(), true /*is_resjunk*/); + dml->actionColIdx = AddTargetEntryForColId(&dml_target_list, &child_context, + phy_dml_dxlop->ActionColId(), + true /*is_resjunk*/); + dml->ctidColIdx = AddTargetEntryForColId(&dml_target_list, &child_context, + phy_dml_dxlop->GetCtIdColId(), + true /*is_resjunk*/); if (phy_dml_dxlop->IsOidsPreserved()) { - dml->tupleoidColIdx = AddTargetEntryForColId(&dml_target_list, &child_context, phy_dml_dxlop->GetTupleOid(), true /*is_resjunk*/); + dml->tupleoidColIdx = AddTargetEntryForColId( + &dml_target_list, &child_context, phy_dml_dxlop->GetTupleOid(), + true /*is_resjunk*/); } else { @@ -4446,18 +4493,19 @@ CTranslatorDXLToPlStmt::TranslateDXLDml GPOS_ASSERT(0 != dml->actionColIdx); plan->targetlist = dml_target_list; - + plan->lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); if (CMD_INSERT == m_cmd_type && 0 == plan->nMotionNodes) { - List *direct_dispatch_segids = TranslateDXLDirectDispatchInfo(phy_dml_dxlop->GetDXLDirectDispatchInfo()); + List *direct_dispatch_segids = TranslateDXLDirectDispatchInfo( + phy_dml_dxlop->GetDXLDirectDispatchInfo()); plan->directDispatch.contentIds = direct_dispatch_segids; plan->directDispatch.isDirectDispatch = (NIL != direct_dispatch_segids); } - + SetParamIds(plan); // cleanup @@ -4465,14 +4513,11 @@ CTranslatorDXLToPlStmt::TranslateDXLDml // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(dml_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(dml_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); return (Plan *) dml; } @@ -4486,19 +4531,19 @@ CTranslatorDXLToPlStmt::TranslateDXLDml // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLDirectDispatchInfo - ( - CDXLDirectDispatchInfo *dxl_direct_dispatch_info - ) +CTranslatorDXLToPlStmt::TranslateDXLDirectDispatchInfo( + CDXLDirectDispatchInfo *dxl_direct_dispatch_info) { if (!optimizer_enable_direct_dispatch || NULL == dxl_direct_dispatch_info) { return NIL; } - - CDXLDatum2dArray *dispatch_identifier_datum_arrays = dxl_direct_dispatch_info->GetDispatchIdentifierDatumArray(); - - if (dispatch_identifier_datum_arrays == NULL || 0 == dispatch_identifier_datum_arrays->Size()) + + CDXLDatum2dArray *dispatch_identifier_datum_arrays = + dxl_direct_dispatch_info->GetDispatchIdentifierDatumArray(); + + if (dispatch_identifier_datum_arrays == NULL || + 0 == dispatch_identifier_datum_arrays->Size()) { return NIL; } @@ -4508,21 +4553,23 @@ CTranslatorDXLToPlStmt::TranslateDXLDirectDispatchInfo const ULONG length = dispatch_identifier_datum_arrays->Size(); - if (dxl_direct_dispatch_info->FContainsRawValues()) { + if (dxl_direct_dispatch_info->FContainsRawValues()) + { List *segids_list = NIL; INT segid; Const *const_expr = NULL; for (ULONG ul = 0; ul < length; ul++) { - CDXLDatumArray *dispatch_identifier_datum_array = (*dispatch_identifier_datum_arrays)[ul]; + CDXLDatumArray *dispatch_identifier_datum_array = + (*dispatch_identifier_datum_arrays)[ul]; GPOS_ASSERT(1 == dispatch_identifier_datum_array->Size()); - const_expr = (Const *) m_translator_dxl_to_scalar->TranslateDXLDatumToScalar( - (*dispatch_identifier_datum_array)[0] - ); + const_expr = + (Const *) m_translator_dxl_to_scalar->TranslateDXLDatumToScalar( + (*dispatch_identifier_datum_array)[0]); segid = DatumGetInt32(const_expr->constvalue); - if (segid >= -1 && segid < (INT)m_num_of_segments) + if (segid >= -1 && segid < (INT) m_num_of_segments) { segids_list = gpdb::LAppendInt(segids_list, segid); } @@ -4548,17 +4595,19 @@ CTranslatorDXLToPlStmt::TranslateDXLDirectDispatchInfo ULONG hash_code = GetDXLDatumGPDBHash(dxl_datum_array); for (ULONG ul = 0; ul < length; ul++) { - CDXLDatumArray *dispatch_identifier_datum_array = (*dispatch_identifier_datum_arrays)[ul]; + CDXLDatumArray *dispatch_identifier_datum_array = + (*dispatch_identifier_datum_arrays)[ul]; GPOS_ASSERT(0 < dispatch_identifier_datum_array->Size()); - ULONG hash_code_new = GetDXLDatumGPDBHash(dispatch_identifier_datum_array); - + ULONG hash_code_new = + GetDXLDatumGPDBHash(dispatch_identifier_datum_array); + if (hash_code != hash_code_new) { // values don't hash to the same segment return NIL; } } - + List *segids_list = gpdb::LAppendInt(NIL, hash_code); return segids_list; } @@ -4572,27 +4621,26 @@ CTranslatorDXLToPlStmt::TranslateDXLDirectDispatchInfo // //--------------------------------------------------------------------------- ULONG -CTranslatorDXLToPlStmt::GetDXLDatumGPDBHash - ( - CDXLDatumArray *dxl_datum_array - ) +CTranslatorDXLToPlStmt::GetDXLDatumGPDBHash(CDXLDatumArray *dxl_datum_array) { List *consts_list = NIL; - + const ULONG length = dxl_datum_array->Size(); - + for (ULONG ul = 0; ul < length; ul++) { CDXLDatum *datum_dxl = (*dxl_datum_array)[ul]; - - Const *const_expr = (Const *) m_translator_dxl_to_scalar->TranslateDXLDatumToScalar(datum_dxl); + + Const *const_expr = + (Const *) m_translator_dxl_to_scalar->TranslateDXLDatumToScalar( + datum_dxl); consts_list = gpdb::LAppend(consts_list, const_expr); } ULONG hash = gpdb::CdbHashConstList(consts_list, m_num_of_segments); gpdb::ListFreeDeep(consts_list); - + return hash; } @@ -4601,67 +4649,74 @@ CTranslatorDXLToPlStmt::GetDXLDatumGPDBHash // CTranslatorDXLToPlStmt::TranslateDXLSplit // // @doc: -// Translates a DXL Split node +// Translates a DXL Split node // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLSplit - ( - const CDXLNode *split_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLSplit( + const CDXLNode *split_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalSplit *phy_split_dxlop = CDXLPhysicalSplit::Cast(split_dxlnode->GetOperator()); + CDXLPhysicalSplit *phy_split_dxlop = + CDXLPhysicalSplit::Cast(split_dxlnode->GetOperator()); // create SplitUpdate node SplitUpdate *split = MakeNode(SplitUpdate); Plan *plan = &(split->plan); - + CDXLNode *project_list_dxlnode = (*split_dxlnode)[0]; CDXLNode *child_dxlnode = (*split_dxlnode)[1]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&child_context); // translate proj list and filter - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); // translate delete and insert columns - ULongPtrArray *deletion_colid_array = phy_split_dxlop->GetDeletionColIdArray(); - ULongPtrArray *insertion_colid_array = phy_split_dxlop->GetInsertionColIdArray(); - + ULongPtrArray *deletion_colid_array = + phy_split_dxlop->GetDeletionColIdArray(); + ULongPtrArray *insertion_colid_array = + phy_split_dxlop->GetInsertionColIdArray(); + GPOS_ASSERT(insertion_colid_array->Size() == deletion_colid_array->Size()); - - split->deleteColIdx = CTranslatorUtils::ConvertColidToAttnos(deletion_colid_array, &child_context); - split->insertColIdx = CTranslatorUtils::ConvertColidToAttnos(insertion_colid_array, &child_context); - - const TargetEntry *te_action_col = output_context->GetTargetEntry(phy_split_dxlop->ActionColId()); - const TargetEntry *te_ctid_col = output_context->GetTargetEntry(phy_split_dxlop->GetCtIdColId()); - const TargetEntry *te_tuple_oid_col = output_context->GetTargetEntry(phy_split_dxlop->GetTupleOid()); - if (NULL == te_action_col) + split->deleteColIdx = CTranslatorUtils::ConvertColidToAttnos( + deletion_colid_array, &child_context); + split->insertColIdx = CTranslatorUtils::ConvertColidToAttnos( + insertion_colid_array, &child_context); + + const TargetEntry *te_action_col = + output_context->GetTargetEntry(phy_split_dxlop->ActionColId()); + const TargetEntry *te_ctid_col = + output_context->GetTargetEntry(phy_split_dxlop->GetCtIdColId()); + const TargetEntry *te_tuple_oid_col = + output_context->GetTargetEntry(phy_split_dxlop->GetTupleOid()); + + if (NULL == te_action_col) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, phy_split_dxlop->ActionColId()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + phy_split_dxlop->ActionColId()); } - if (NULL == te_ctid_col) + if (NULL == te_ctid_col) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, phy_split_dxlop->GetCtIdColId()); - } - + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + phy_split_dxlop->GetCtIdColId()); + } + split->actionColIdx = te_action_col->resno; split->ctidColIdx = te_ctid_col->resno; - + split->tupleoidColIdx = FirstLowInvalidHeapAttributeNumber; if (NULL != te_tuple_oid_col) { @@ -4678,14 +4733,11 @@ CTranslatorDXLToPlStmt::TranslateDXLSplit child_contexts->Release(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(split_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(split_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); return (Plan *) split; } @@ -4699,12 +4751,9 @@ CTranslatorDXLToPlStmt::TranslateDXLSplit // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLAssert - ( - const CDXLNode *assert_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLAssert( + const CDXLNode *assert_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // create assert plan node AssertOp *assert_node = MakeNode(AssertOp); @@ -4712,61 +4761,62 @@ CTranslatorDXLToPlStmt::TranslateDXLAssert Plan *plan = &(assert_node->plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); - CDXLPhysicalAssert *assert_dxlop = CDXLPhysicalAssert::Cast(assert_dxlnode->GetOperator()); + CDXLPhysicalAssert *assert_dxlop = + CDXLPhysicalAssert::Cast(assert_dxlnode->GetOperator()); // translate error code into the its internal GPDB representation const CHAR *error_code = assert_dxlop->GetSQLState(); GPOS_ASSERT(GPOS_SQLSTATE_LENGTH == clib::Strlen(error_code)); - - assert_node->errcode = MAKE_SQLSTATE(error_code[0], error_code[1], error_code[2], error_code[3], error_code[4]); - CDXLNode *filter_dxlnode = (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexFilter]; - assert_node->errmessage = CTranslatorUtils::GetAssertErrorMsgs(filter_dxlnode); + assert_node->errcode = + MAKE_SQLSTATE(error_code[0], error_code[1], error_code[2], + error_code[3], error_code[4]); + CDXLNode *filter_dxlnode = + (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexFilter]; + + assert_node->errmessage = + CTranslatorUtils::GetAssertErrorMsgs(filter_dxlnode); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(assert_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(assert_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); // translate child plan - CDXLNode *child_dxlnode = (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexChild]; - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + CDXLNode *child_dxlnode = + (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexChild]; + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); GPOS_ASSERT(NULL != child_plan && "child plan cannot be NULL"); assert_node->plan.lefttree = child_plan; plan->nMotionNodes = child_plan->nMotionNodes; - CDXLNode *project_list_dxlnode = (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexProjList]; + CDXLNode *project_list_dxlnode = + (*assert_dxlnode)[CDXLPhysicalAssert::EdxlassertIndexProjList]; - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - child_contexts->Append(const_cast(&child_context)); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + child_contexts->Append(const_cast(&child_context)); // translate proj list - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); // translate assert constraints - plan->qual = TranslateDXLAssertConstraints - ( - filter_dxlnode, - output_context, - child_contexts - ); - - GPOS_ASSERT(gpdb::ListLength(plan->qual) == gpdb::ListLength(assert_node->errmessage)); + plan->qual = TranslateDXLAssertConstraints(filter_dxlnode, output_context, + child_contexts); + + GPOS_ASSERT(gpdb::ListLength(plan->qual) == + gpdb::ListLength(assert_node->errmessage)); SetParamIds(plan); // cleanup @@ -4784,14 +4834,12 @@ CTranslatorDXLToPlStmt::TranslateDXLAssert // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLRowTrigger - ( - const CDXLNode *row_trigger_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLRowTrigger( + const CDXLNode *row_trigger_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalRowTrigger *phy_row_trigger_dxlop = CDXLPhysicalRowTrigger::Cast(row_trigger_dxlnode->GetOperator()); + CDXLPhysicalRowTrigger *phy_row_trigger_dxlop = + CDXLPhysicalRowTrigger::Cast(row_trigger_dxlnode->GetOperator()); // create RowTrigger node RowTrigger *row_trigger = MakeNode(RowTrigger); @@ -4800,23 +4848,24 @@ CTranslatorDXLToPlStmt::TranslateDXLRowTrigger CDXLNode *project_list_dxlnode = (*row_trigger_dxlnode)[0]; CDXLNode *child_dxlnode = (*row_trigger_dxlnode)[1]; - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); - Plan *child_plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); + Plan *child_plan = TranslateDXLOperatorToPlan( + child_dxlnode, &child_context, ctxt_translation_prev_siblings); - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&child_context); // translate proj list and filter - plan->targetlist = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // translate context for the base table - child_contexts, - output_context - ); + plan->targetlist = + TranslateDXLProjList(project_list_dxlnode, + NULL, // translate context for the base table + child_contexts, output_context); - Oid relid_oid = CMDIdGPDB::CastMdid(phy_row_trigger_dxlop->GetRelMdId())->Oid(); + Oid relid_oid = + CMDIdGPDB::CastMdid(phy_row_trigger_dxlop->GetRelMdId())->Oid(); GPOS_ASSERT(InvalidOid != relid_oid); row_trigger->relid = relid_oid; row_trigger->eventFlags = phy_row_trigger_dxlop->GetType(); @@ -4834,7 +4883,8 @@ CTranslatorDXLToPlStmt::TranslateDXLRowTrigger } else { - row_trigger->oldValuesColIdx = CTranslatorUtils::ConvertColidToAttnos(colids_old_array, &child_context); + row_trigger->oldValuesColIdx = CTranslatorUtils::ConvertColidToAttnos( + colids_old_array, &child_context); } if (NULL == colids_new_array) @@ -4843,7 +4893,8 @@ CTranslatorDXLToPlStmt::TranslateDXLRowTrigger } else { - row_trigger->newValuesColIdx = CTranslatorUtils::ConvertColidToAttnos(colids_new_array, &child_context); + row_trigger->newValuesColIdx = CTranslatorUtils::ConvertColidToAttnos( + colids_new_array, &child_context); } plan->lefttree = child_plan; @@ -4856,14 +4907,11 @@ CTranslatorDXLToPlStmt::TranslateDXLRowTrigger child_contexts->Release(); // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(row_trigger_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + row_trigger_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); return (Plan *) row_trigger; } @@ -4879,18 +4927,17 @@ CTranslatorDXLToPlStmt::TranslateDXLRowTrigger // //--------------------------------------------------------------------------- RangeTblEntry * -CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry - ( +CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry( const CDXLTableDescr *table_descr, - const CDXLIndexDescr *index_descr_dxl, // should be NULL unless we have an index-only scan - Index index, - CDXLTranslateContextBaseTable *base_table_context - ) + const CDXLIndexDescr + *index_descr_dxl, // should be NULL unless we have an index-only scan + Index index, CDXLTranslateContextBaseTable *base_table_context) { GPOS_ASSERT(NULL != table_descr); const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - const ULONG num_of_non_sys_cols = CTranslatorUtils::GetNumNonSystemColumns(md_rel); + const ULONG num_of_non_sys_cols = + CTranslatorUtils::GetNumNonSystemColumns(md_rel); RangeTblEntry *rte = MakeNode(RangeTblEntry); rte->rtekind = RTE_RELATION; @@ -4918,13 +4965,14 @@ CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry alias->colnames = NIL; // get table alias - alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(table_descr->MdName()->GetMDName()->GetBuffer()); + alias->aliasname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + table_descr->MdName()->GetMDName()->GetBuffer()); // get column names const ULONG arity = table_descr->Arity(); - + INT last_attno = 0; - + for (ULONG ul = 0; ul < arity; ++ul) { const CDXLColDescr *dxl_col_descr = table_descr->GetColumnDescrAt(ul); @@ -4938,14 +4986,18 @@ CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry { // if attno > last_attno + 1, there were dropped attributes // add those to the RTE as they are required by GPDB - for (INT dropped_col_attno = last_attno + 1; dropped_col_attno < attno; dropped_col_attno++) + for (INT dropped_col_attno = last_attno + 1; + dropped_col_attno < attno; dropped_col_attno++) { Value *val_dropped_colname = gpdb::MakeStringValue(PStrDup("")); - alias->colnames = gpdb::LAppend(alias->colnames, val_dropped_colname); + alias->colnames = + gpdb::LAppend(alias->colnames, val_dropped_colname); } - + // non-system attribute - CHAR *col_name_char_array = CTranslatorUtils::CreateMultiByteCharStringFromWCString(dxl_col_descr->MdName()->GetMDName()->GetBuffer()); + CHAR *col_name_char_array = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dxl_col_descr->MdName()->GetMDName()->GetBuffer()); Value *val_colname = gpdb::MakeStringValue(col_name_char_array); alias->colnames = gpdb::LAppend(alias->colnames, val_colname); @@ -4968,7 +5020,7 @@ CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry Value *val_dropped_colname = gpdb::MakeStringValue(PStrDup("")); alias->colnames = gpdb::LAppend(alias->colnames, val_dropped_colname); } - + rte->eref = alias; return rte; @@ -4988,13 +5040,11 @@ CTranslatorDXLToPlStmt::TranslateDXLTblDescrToRangeTblEntry // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLProjList - ( +CTranslatorDXLToPlStmt::TranslateDXLProjList( const CDXLNode *project_list_dxlnode, const CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ) + CDXLTranslateContext *output_context) { if (NULL == project_list_dxlnode) { @@ -5008,30 +5058,30 @@ CTranslatorDXLToPlStmt::TranslateDXLProjList for (ULONG ul = 0; ul < arity; ++ul) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - GPOS_ASSERT(EdxlopScalarProjectElem == proj_elem_dxlnode->GetOperator()->GetDXLOperator()); - CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + GPOS_ASSERT(EdxlopScalarProjectElem == + proj_elem_dxlnode->GetOperator()->GetDXLOperator()); + CDXLScalarProjElem *sc_proj_elem_dxlop = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); GPOS_ASSERT(1 == proj_elem_dxlnode->Arity()); // translate proj element expression CDXLNode *expr_dxlnode = (*proj_elem_dxlnode)[0]; - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - base_table_context, - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, base_table_context, child_contexts, + output_context, m_dxl_to_plstmt_context); - Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(expr_dxlnode, &colid_var_mapping); + Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + expr_dxlnode, &colid_var_mapping); GPOS_ASSERT(NULL != expr); TargetEntry *target_entry = MakeNode(TargetEntry); target_entry->expr = expr; - target_entry->resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); - target_entry->resno = (AttrNumber) (ul + 1); + target_entry->resname = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); + target_entry->resno = (AttrNumber)(ul + 1); if (IsA(expr, Var)) { @@ -5052,26 +5102,32 @@ CTranslatorDXLToPlStmt::TranslateDXLProjList GPOS_ASSERT(NULL != child_contexts); GPOS_ASSERT(0 != child_contexts->Size()); - ULONG colid = CDXLScalarIdent::Cast(expr_dxlnode->GetOperator())->GetDXLColRef()->Id(); + ULONG colid = CDXLScalarIdent::Cast(expr_dxlnode->GetOperator()) + ->GetDXLColRef() + ->Id(); - const CDXLTranslateContext *translate_ctxt_left = (*child_contexts)[0]; + const CDXLTranslateContext *translate_ctxt_left = + (*child_contexts)[0]; GPOS_ASSERT(NULL != translate_ctxt_left); - const TargetEntry *pteOriginal = translate_ctxt_left->GetTargetEntry(colid); + const TargetEntry *pteOriginal = + translate_ctxt_left->GetTargetEntry(colid); if (NULL == pteOriginal) { // variable not found on the left side GPOS_ASSERT(2 == child_contexts->Size()); - const CDXLTranslateContext *pdxltrctxRight = (*child_contexts)[1]; + const CDXLTranslateContext *pdxltrctxRight = + (*child_contexts)[1]; GPOS_ASSERT(NULL != pdxltrctxRight); pteOriginal = pdxltrctxRight->GetTargetEntry(colid); } - if (NULL == pteOriginal) + if (NULL == pteOriginal) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, colid); - } + GPOS_RAISE(gpdxl::ExmaDXL, + gpdxl::ExmiDXL2PlStmtAttributeNotFound, colid); + } target_entry->resorigtbl = pteOriginal->resorigtbl; target_entry->resorigcol = pteOriginal->resorigcol; } @@ -5096,11 +5152,8 @@ CTranslatorDXLToPlStmt::TranslateDXLProjList // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::CreateTargetListWithNullsForDroppedCols - ( - List *target_list, - const IMDRelation *md_rel - ) +CTranslatorDXLToPlStmt::CreateTargetListWithNullsForDroppedCols( + List *target_list, const IMDRelation *md_rel) { GPOS_ASSERT(NULL != target_list); GPOS_ASSERT(gpdb::ListLength(target_list) <= md_rel->ColumnCount()); @@ -5108,39 +5161,45 @@ CTranslatorDXLToPlStmt::CreateTargetListWithNullsForDroppedCols List *result_list = NIL; ULONG last_tgt_elem = 0; ULONG resno = 1; - + const ULONG num_of_rel_cols = md_rel->ColumnCount(); - + for (ULONG ul = 0; ul < num_of_rel_cols; ul++) { const IMDColumn *md_col = md_rel->GetMdCol(ul); - + if (md_col->IsSystemColumn()) { continue; } - + Expr *expr = NULL; if (md_col->IsDropped()) { // add a NULL element - OID oid_type = CMDIdGPDB::CastMdid(m_md_accessor->PtMDType()->MDId())->Oid(); + OID oid_type = CMDIdGPDB::CastMdid( + m_md_accessor->PtMDType()->MDId()) + ->Oid(); expr = (Expr *) gpdb::MakeNULLConst(oid_type); } else { - TargetEntry *target_entry = (TargetEntry *) gpdb::ListNth(target_list, last_tgt_elem); + TargetEntry *target_entry = + (TargetEntry *) gpdb::ListNth(target_list, last_tgt_elem); expr = (Expr *) gpdb::CopyObject(target_entry->expr); last_tgt_elem++; } - - CHAR *name_str = CTranslatorUtils::CreateMultiByteCharStringFromWCString(md_col->Mdname().GetMDName()->GetBuffer()); - TargetEntry *te_new = gpdb::MakeTargetEntry(expr, resno, name_str, false /*resjunk*/); + + CHAR *name_str = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + md_col->Mdname().GetMDName()->GetBuffer()); + TargetEntry *te_new = + gpdb::MakeTargetEntry(expr, resno, name_str, false /*resjunk*/); result_list = gpdb::LAppend(result_list, te_new); resno++; } - + return result_list; } @@ -5154,31 +5213,31 @@ CTranslatorDXLToPlStmt::CreateTargetListWithNullsForDroppedCols // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLProjectListToHashTargetList - ( - const CDXLNode *project_list_dxlnode, - CDXLTranslateContext *child_context, - CDXLTranslateContext *output_context - ) +CTranslatorDXLToPlStmt::TranslateDXLProjectListToHashTargetList( + const CDXLNode *project_list_dxlnode, CDXLTranslateContext *child_context, + CDXLTranslateContext *output_context) { List *target_list = NIL; const ULONG arity = project_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *proj_elem_dxlnode = (*project_list_dxlnode)[ul]; - CDXLScalarProjElem *sc_proj_elem_dxlop = CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); + CDXLScalarProjElem *sc_proj_elem_dxlop = + CDXLScalarProjElem::Cast(proj_elem_dxlnode->GetOperator()); - const TargetEntry *te_child = child_context->GetTargetEntry(sc_proj_elem_dxlop->Id()); - if (NULL == te_child) + const TargetEntry *te_child = + child_context->GetTargetEntry(sc_proj_elem_dxlop->Id()); + if (NULL == te_child) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, sc_proj_elem_dxlop->Id()); - } + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + sc_proj_elem_dxlop->Id()); + } // get type oid for project element's expression GPOS_ASSERT(1 == proj_elem_dxlnode->Arity()); // find column type - OID oid_type = gpdb::ExprType((Node*) te_child->expr); + OID oid_type = gpdb::ExprType((Node *) te_child->expr); INT type_modifier = gpdb::ExprTypeMod((Node *) te_child->expr); // find the original varno and attno for this column @@ -5187,7 +5246,7 @@ CTranslatorDXLToPlStmt::TranslateDXLProjectListToHashTargetList if (IsA(te_child->expr, Var)) { - Var *pv = (Var*) te_child->expr; + Var *pv = (Var *) te_child->expr; idx_varnoold = pv->varnoold; attno_old = pv->varoattno; } @@ -5198,28 +5257,22 @@ CTranslatorDXLToPlStmt::TranslateDXLProjectListToHashTargetList } // create a Var expression for this target list entry expression - Var *var = gpdb::MakeVar - ( - OUTER, - te_child->resno, - oid_type, - type_modifier, - 0 // varlevelsup - ); + Var *var = + gpdb::MakeVar(OUTER, te_child->resno, oid_type, type_modifier, + 0 // varlevelsup + ); // set old varno and varattno since makeVar does not set them var->varnoold = idx_varnoold; var->varoattno = attno_old; - CHAR *resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); + CHAR *resname = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + sc_proj_elem_dxlop->GetMdNameAlias()->GetMDName()->GetBuffer()); - TargetEntry *target_entry = gpdb::MakeTargetEntry - ( - (Expr *) var, - (AttrNumber) (ul + 1), - resname, - false // resjunk - ); + TargetEntry *target_entry = + gpdb::MakeTargetEntry((Expr *) var, (AttrNumber)(ul + 1), resname, + false // resjunk + ); target_list = gpdb::LAppend(target_list, target_entry); output_context->InsertMapping(sc_proj_elem_dxlop->Id(), target_entry); @@ -5237,13 +5290,11 @@ CTranslatorDXLToPlStmt::TranslateDXLProjectListToHashTargetList // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLFilterToQual - ( - const CDXLNode * filter_dxlnode, +CTranslatorDXLToPlStmt::TranslateDXLFilterToQual( + const CDXLNode *filter_dxlnode, const CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ) + CDXLTranslateContext *output_context) { const ULONG arity = filter_dxlnode->Arity(); if (0 == arity) @@ -5254,9 +5305,11 @@ CTranslatorDXLToPlStmt::TranslateDXLFilterToQual GPOS_ASSERT(1 == arity); CDXLNode *filter_cond_dxlnode = (*filter_dxlnode)[0]; - GPOS_ASSERT(CTranslatorDXLToScalar::HasBoolResult(filter_cond_dxlnode, m_md_accessor)); + GPOS_ASSERT(CTranslatorDXLToScalar::HasBoolResult(filter_cond_dxlnode, + m_md_accessor)); - return TranslateDXLScCondToQual(filter_cond_dxlnode, base_table_context, child_contexts, output_context); + return TranslateDXLScCondToQual(filter_cond_dxlnode, base_table_context, + child_contexts, output_context); } //--------------------------------------------------------------------------- @@ -5268,32 +5321,23 @@ CTranslatorDXLToPlStmt::TranslateDXLFilterToQual // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLScCondToQual - ( +CTranslatorDXLToPlStmt::TranslateDXLScCondToQual( const CDXLNode *condition_dxlnode, const CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ) + CDXLTranslateContext *output_context) { List *quals_list = NIL; - GPOS_ASSERT(CTranslatorDXLToScalar::HasBoolResult(const_cast(condition_dxlnode), m_md_accessor)); + GPOS_ASSERT(CTranslatorDXLToScalar::HasBoolResult( + const_cast(condition_dxlnode), m_md_accessor)); - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - base_table_context, - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, base_table_context, child_contexts, + output_context, m_dxl_to_plstmt_context); - Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar - ( - condition_dxlnode, - &colid_var_mapping - ); + Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + condition_dxlnode, &colid_var_mapping); quals_list = gpdb::LAppend(quals_list, expr); @@ -5309,19 +5353,15 @@ CTranslatorDXLToPlStmt::TranslateDXLScCondToQual // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::TranslatePlanCosts - ( - const CDXLOperatorCost *dxl_operator_cost, - Cost *startup_cost_out, - Cost *total_cost_out, - Cost *cost_rows_out, - INT * width_out - ) +CTranslatorDXLToPlStmt::TranslatePlanCosts( + const CDXLOperatorCost *dxl_operator_cost, Cost *startup_cost_out, + Cost *total_cost_out, Cost *cost_rows_out, INT *width_out) { *startup_cost_out = CostFromStr(dxl_operator_cost->GetStartUpCostStr()); *total_cost_out = CostFromStr(dxl_operator_cost->GetTotalCostStr()); *cost_rows_out = CostFromStr(dxl_operator_cost->GetRowsOutStr()); - *width_out = CTranslatorUtils::GetIntFromStr(dxl_operator_cost->GetWidthStr()); + *width_out = + CTranslatorUtils::GetIntFromStr(dxl_operator_cost->GetWidthStr()); } //--------------------------------------------------------------------------- @@ -5334,34 +5374,23 @@ CTranslatorDXLToPlStmt::TranslatePlanCosts // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::TranslateProjListAndFilter - ( - const CDXLNode *project_list_dxlnode, - const CDXLNode *filter_dxlnode, +CTranslatorDXLToPlStmt::TranslateProjListAndFilter( + const CDXLNode *project_list_dxlnode, const CDXLNode *filter_dxlnode, const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - List **targetlist_out, - List **qual_out, - CDXLTranslateContext *output_context - ) + CDXLTranslationContextArray *child_contexts, List **targetlist_out, + List **qual_out, CDXLTranslateContext *output_context) { // translate proj list - *targetlist_out = TranslateDXLProjList - ( - project_list_dxlnode, - base_table_context, // base table translation context - child_contexts, - output_context - ); + *targetlist_out = TranslateDXLProjList( + project_list_dxlnode, + base_table_context, // base table translation context + child_contexts, output_context); // translate filter - *qual_out = TranslateDXLFilterToQual - ( - filter_dxlnode, - base_table_context, // base table translation context - child_contexts, - output_context - ); + *qual_out = TranslateDXLFilterToQual( + filter_dxlnode, + base_table_context, // base table translation context + child_contexts, output_context); } @@ -5375,14 +5404,10 @@ CTranslatorDXLToPlStmt::TranslateProjListAndFilter // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::TranslateHashExprList - ( +CTranslatorDXLToPlStmt::TranslateHashExprList( const CDXLNode *hash_expr_list_dxlnode, - const CDXLTranslateContext *child_context, - List **hash_expr_out_list, - List **hash_expr_types_out_list, - CDXLTranslateContext *output_context - ) + const CDXLTranslateContext *child_context, List **hash_expr_out_list, + List **hash_expr_types_out_list, CDXLTranslateContext *output_context) { GPOS_ASSERT(NIL == *hash_expr_out_list); GPOS_ASSERT(NIL == *hash_expr_types_out_list); @@ -5390,37 +5415,38 @@ CTranslatorDXLToPlStmt::TranslateHashExprList List *hash_expr_list = NIL; List *hash_expr_types_list = NIL; - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(child_context); const ULONG arity = hash_expr_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *hash_expr_dxlnode = (*hash_expr_list_dxlnode)[ul]; - CDXLScalarHashExpr *hash_expr_dxlop = CDXLScalarHashExpr::Cast(hash_expr_dxlnode->GetOperator()); + CDXLScalarHashExpr *hash_expr_dxlop = + CDXLScalarHashExpr::Cast(hash_expr_dxlnode->GetOperator()); - // the type of the hash expression in GPDB is computed as the left operand + // the type of the hash expression in GPDB is computed as the left operand // of the equality operator of the actual hash expression type - const IMDType *md_type = m_md_accessor->RetrieveType(hash_expr_dxlop->MdidType()); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(md_type->GetMdidForCmpType(IMDType::EcmptEq)); - + const IMDType *md_type = + m_md_accessor->RetrieveType(hash_expr_dxlop->MdidType()); + const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp( + md_type->GetMdidForCmpType(IMDType::EcmptEq)); + const IMDId *mdid_hash_type = md_scalar_op->GetLeftMdid(); - - hash_expr_types_list = gpdb::LAppendOid(hash_expr_types_list, CMDIdGPDB::CastMdid(mdid_hash_type)->Oid()); + + hash_expr_types_list = gpdb::LAppendOid( + hash_expr_types_list, CMDIdGPDB::CastMdid(mdid_hash_type)->Oid()); GPOS_ASSERT(1 == hash_expr_dxlnode->Arity()); CDXLNode *expr_dxlnode = (*hash_expr_dxlnode)[0]; - CMappingColIdVarPlStmt colid_var_mapping = CMappingColIdVarPlStmt - ( - m_mp, - NULL, - child_contexts, - output_context, - m_dxl_to_plstmt_context - ); + CMappingColIdVarPlStmt colid_var_mapping = + CMappingColIdVarPlStmt(m_mp, NULL, child_contexts, output_context, + m_dxl_to_plstmt_context); - Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar(expr_dxlnode, &colid_var_mapping); + Expr *expr = m_translator_dxl_to_scalar->TranslateDXLToScalar( + expr_dxlnode, &colid_var_mapping); hash_expr_list = gpdb::LAppend(hash_expr_list, expr); @@ -5446,30 +5472,30 @@ CTranslatorDXLToPlStmt::TranslateHashExprList // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::TranslateSortCols - ( +CTranslatorDXLToPlStmt::TranslateSortCols( const CDXLNode *sort_col_list_dxl, - const CDXLTranslateContext *child_context, - AttrNumber *att_no_sort_colids, - Oid *sort_op_oids, - bool *is_nulls_first - ) + const CDXLTranslateContext *child_context, AttrNumber *att_no_sort_colids, + Oid *sort_op_oids, bool *is_nulls_first) { const ULONG arity = sort_col_list_dxl->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *sort_col_dxlnode = (*sort_col_list_dxl)[ul]; - CDXLScalarSortCol *sc_sort_col_dxlop = CDXLScalarSortCol::Cast(sort_col_dxlnode->GetOperator()); + CDXLScalarSortCol *sc_sort_col_dxlop = + CDXLScalarSortCol::Cast(sort_col_dxlnode->GetOperator()); ULONG sort_colid = sc_sort_col_dxlop->GetColId(); - const TargetEntry *te_sort_col = child_context->GetTargetEntry(sort_colid); - if (NULL == te_sort_col) + const TargetEntry *te_sort_col = + child_context->GetTargetEntry(sort_colid); + if (NULL == te_sort_col) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, sort_colid); - } + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + sort_colid); + } att_no_sort_colids[ul] = te_sort_col->resno; - sort_op_oids[ul] = CMDIdGPDB::CastMdid(sc_sort_col_dxlop->GetMdIdSortOp())->Oid(); + sort_op_oids[ul] = + CMDIdGPDB::CastMdid(sc_sort_col_dxlop->GetMdIdSortOp())->Oid(); is_nulls_first[ul] = sc_sort_col_dxlop->IsSortedNullsFirst(); } } @@ -5483,12 +5509,10 @@ CTranslatorDXLToPlStmt::TranslateSortCols // //--------------------------------------------------------------------------- Cost -CTranslatorDXLToPlStmt::CostFromStr - ( - const CWStringBase *str - ) +CTranslatorDXLToPlStmt::CostFromStr(const CWStringBase *str) { - CHAR *sz = CTranslatorUtils::CreateMultiByteCharStringFromWCString(str->GetBuffer()); + CHAR *sz = CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str->GetBuffer()); return gpos::clib::Strtod(sz); } @@ -5502,10 +5526,7 @@ CTranslatorDXLToPlStmt::CostFromStr // //--------------------------------------------------------------------------- BOOL -CTranslatorDXLToPlStmt::IsTgtTblDistributed - ( - CDXLOperator *dxlop - ) +CTranslatorDXLToPlStmt::IsTgtTblDistributed(CDXLOperator *dxlop) { if (EdxlopPhysicalDML != dxlop->GetDXLOperator()) { @@ -5515,7 +5536,8 @@ CTranslatorDXLToPlStmt::IsTgtTblDistributed CDXLPhysicalDML *phy_dml_dxlop = CDXLPhysicalDML::Cast(dxlop); IMDId *mdid = phy_dml_dxlop->GetDXLTableDescr()->MDId(); - return IMDRelation::EreldistrMasterOnly != m_md_accessor->RetrieveRel(mdid)->GetRelDistribution(); + return IMDRelation::EreldistrMasterOnly != + m_md_accessor->RetrieveRel(mdid)->GetRelDistribution(); } //--------------------------------------------------------------------------- @@ -5528,41 +5550,34 @@ CTranslatorDXLToPlStmt::IsTgtTblDistributed // //--------------------------------------------------------------------------- ULONG -CTranslatorDXLToPlStmt::AddTargetEntryForColId - ( - List **target_list, - CDXLTranslateContext *dxl_translate_ctxt, - ULONG colid, - BOOL is_resjunk - ) +CTranslatorDXLToPlStmt::AddTargetEntryForColId( + List **target_list, CDXLTranslateContext *dxl_translate_ctxt, ULONG colid, + BOOL is_resjunk) { GPOS_ASSERT(NULL != target_list); - + const TargetEntry *target_entry = dxl_translate_ctxt->GetTargetEntry(colid); - + if (NULL == target_entry) { // colid not found in translate context return 0; } - + // TODO: Oct 29, 2012; see if entry already exists in the target list - - OID expr_oid = gpdb::ExprType((Node*) target_entry->expr); + + OID expr_oid = gpdb::ExprType((Node *) target_entry->expr); INT type_modifier = gpdb::ExprTypeMod((Node *) target_entry->expr); - Var *var = gpdb::MakeVar - ( - OUTER, - target_entry->resno, - expr_oid, - type_modifier, - 0 // varlevelsup - ); + Var *var = + gpdb::MakeVar(OUTER, target_entry->resno, expr_oid, type_modifier, + 0 // varlevelsup + ); ULONG resno = gpdb::ListLength(*target_list) + 1; CHAR *resname_str = PStrDup(target_entry->resname); - TargetEntry *te_new = gpdb::MakeTargetEntry((Expr*) var, resno, resname_str, is_resjunk); + TargetEntry *te_new = + gpdb::MakeTargetEntry((Expr *) var, resno, resname_str, is_resjunk); *target_list = gpdb::LAppend(*target_list, te_new); - + return target_entry->resno; } @@ -5575,10 +5590,7 @@ CTranslatorDXLToPlStmt::AddTargetEntryForColId // //--------------------------------------------------------------------------- JoinType -CTranslatorDXLToPlStmt::GetGPDBJoinTypeFromDXLJoinType - ( - EdxlJoinType join_type - ) +CTranslatorDXLToPlStmt::GetGPDBJoinTypeFromDXLJoinType(EdxlJoinType join_type) { GPOS_ASSERT(EdxljtSentinel > join_type); @@ -5623,11 +5635,8 @@ CTranslatorDXLToPlStmt::GetGPDBJoinTypeFromDXLJoinType // //--------------------------------------------------------------------------- void -CTranslatorDXLToPlStmt::SetVarTypMod - ( - const CDXLPhysicalCTAS *phy_ctas_dxlop, - List *target_list - ) +CTranslatorDXLToPlStmt::SetVarTypMod(const CDXLPhysicalCTAS *phy_ctas_dxlop, + List *target_list) { GPOS_ASSERT(NULL != target_list); @@ -5636,14 +5645,14 @@ CTranslatorDXLToPlStmt::SetVarTypMod ULONG ul = 0; ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); if (IsA(target_entry->expr, Var)) { - Var *var = (Var*) target_entry->expr; + Var *var = (Var *) target_entry->expr; var->vartypmod = *(*var_type_mod_array)[ul]; } ++ul; @@ -5655,40 +5664,39 @@ CTranslatorDXLToPlStmt::SetVarTypMod // CTranslatorDXLToPlStmt::TranslateDXLCtas // // @doc: -// Translates a DXL CTAS node +// Translates a DXL CTAS node // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLCtas - ( - const CDXLNode *ctas_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLCtas( + const CDXLNode *ctas_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { - CDXLPhysicalCTAS *phy_ctas_dxlop = CDXLPhysicalCTAS::Cast(ctas_dxlnode->GetOperator()); + CDXLPhysicalCTAS *phy_ctas_dxlop = + CDXLPhysicalCTAS::Cast(ctas_dxlnode->GetOperator()); CDXLNode *project_list_dxlnode = (*ctas_dxlnode)[0]; CDXLNode *child_dxlnode = (*ctas_dxlnode)[1]; - GPOS_ASSERT(NULL == phy_ctas_dxlop->GetDxlCtasStorageOption()->GetDXLCtasOptionArray()); - - CDXLTranslateContext child_context(m_mp, false, output_context->GetColIdToParamIdMap()); + GPOS_ASSERT( + NULL == + phy_ctas_dxlop->GetDxlCtasStorageOption()->GetDXLCtasOptionArray()); + + CDXLTranslateContext child_context(m_mp, false, + output_context->GetColIdToParamIdMap()); + + Plan *plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, + ctxt_translation_prev_siblings); - Plan *plan = TranslateDXLOperatorToPlan(child_dxlnode, &child_context, ctxt_translation_prev_siblings); - // fix target list to match the required column names - CDXLTranslationContextArray *child_contexts = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + CDXLTranslationContextArray *child_contexts = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); child_contexts->Append(&child_context); - - List *target_list = TranslateDXLProjList - ( - project_list_dxlnode, - NULL, // base_table_context - child_contexts, - output_context - ); + + List *target_list = TranslateDXLProjList(project_list_dxlnode, + NULL, // base_table_context + child_contexts, output_context); SetVarTypMod(phy_ctas_dxlop, target_list); - + SetParamIds(plan); // cleanup @@ -5696,23 +5704,21 @@ CTranslatorDXLToPlStmt::TranslateDXLCtas // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(ctas_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts( + CDXLPhysicalProperties::PdxlpropConvert(ctas_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), &(plan->plan_rows), + &(plan->plan_width)); IntoClause *into_clause = TranslateDXLPhyCtasToIntoClause(phy_ctas_dxlop); GpPolicy *distr_policy = TranslateDXLPhyCtasToDistrPolicy(phy_ctas_dxlop); m_dxl_to_plstmt_context->AddCtasInfo(into_clause, distr_policy); - - GPOS_ASSERT(IMDRelation::EreldistrMasterOnly != phy_ctas_dxlop->Ereldistrpolicy()); - + + GPOS_ASSERT(IMDRelation::EreldistrMasterOnly != + phy_ctas_dxlop->Ereldistrpolicy()); + m_is_tgt_tbl_distributed = true; - + // Add a result node on top with the correct projection list Result *result = MakeNode(Result); Plan *result_plan = &(result->plan); @@ -5733,50 +5739,62 @@ CTranslatorDXLToPlStmt::TranslateDXLCtas // CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToIntoClause // // @doc: -// Translates a DXL CTAS into clause +// Translates a DXL CTAS into clause // //--------------------------------------------------------------------------- IntoClause * -CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToIntoClause - ( - const CDXLPhysicalCTAS *phy_ctas_dxlop - ) +CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToIntoClause( + const CDXLPhysicalCTAS *phy_ctas_dxlop) { IntoClause *into_clause = MakeNode(IntoClause); into_clause->rel = MakeNode(RangeVar); into_clause->rel->istemp = phy_ctas_dxlop->IsTemporary(); - into_clause->rel->relname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(phy_ctas_dxlop->MdName()->GetMDName()->GetBuffer()); + into_clause->rel->relname = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + phy_ctas_dxlop->MdName()->GetMDName()->GetBuffer()); into_clause->rel->schemaname = NULL; if (NULL != phy_ctas_dxlop->GetMdNameSchema()) { - into_clause->rel->schemaname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(phy_ctas_dxlop->GetMdNameSchema()->GetMDName()->GetBuffer()); + into_clause->rel->schemaname = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + phy_ctas_dxlop->GetMdNameSchema()->GetMDName()->GetBuffer()); } - - CDXLCtasStorageOptions *dxl_ctas_storage_option = phy_ctas_dxlop->GetDxlCtasStorageOption(); + + CDXLCtasStorageOptions *dxl_ctas_storage_option = + phy_ctas_dxlop->GetDxlCtasStorageOption(); if (NULL != dxl_ctas_storage_option->GetMdNameTableSpace()) { - into_clause->tableSpaceName = CTranslatorUtils::CreateMultiByteCharStringFromWCString(phy_ctas_dxlop->GetDxlCtasStorageOption()->GetMdNameTableSpace()->GetMDName()->GetBuffer()); + into_clause->tableSpaceName = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + phy_ctas_dxlop->GetDxlCtasStorageOption() + ->GetMdNameTableSpace() + ->GetMDName() + ->GetBuffer()); } - - into_clause->onCommit = (OnCommitAction) dxl_ctas_storage_option->GetOnCommitAction(); - into_clause->options = TranslateDXLCtasStorageOptions(dxl_ctas_storage_option->GetDXLCtasOptionArray()); - + + into_clause->onCommit = + (OnCommitAction) dxl_ctas_storage_option->GetOnCommitAction(); + into_clause->options = TranslateDXLCtasStorageOptions( + dxl_ctas_storage_option->GetDXLCtasOptionArray()); + // get column names - CDXLColDescrArray *dxl_col_descr_array = phy_ctas_dxlop->GetDXLColumnDescrArray(); + CDXLColDescrArray *dxl_col_descr_array = + phy_ctas_dxlop->GetDXLColumnDescrArray(); const ULONG num_of_cols = dxl_col_descr_array->Size(); into_clause->colNames = NIL; for (ULONG ul = 0; ul < num_of_cols; ++ul) { const CDXLColDescr *dxl_col_descr = (*dxl_col_descr_array)[ul]; - CHAR *col_name_char_array = CTranslatorUtils::CreateMultiByteCharStringFromWCString(dxl_col_descr->MdName()->GetMDName()->GetBuffer()); - + CHAR *col_name_char_array = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + dxl_col_descr->MdName()->GetMDName()->GetBuffer()); + ColumnDef *col_def = MakeNode(ColumnDef); col_def->colname = col_name_char_array; col_def->is_local = true; into_clause->colNames = gpdb::LAppend(into_clause->colNames, col_def); - } return into_clause; @@ -5787,38 +5805,36 @@ CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToIntoClause // CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToDistrPolicy // // @doc: -// Translates distribution policy given by a physical CTAS operator +// Translates distribution policy given by a physical CTAS operator // //--------------------------------------------------------------------------- GpPolicy * -CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToDistrPolicy - ( - const CDXLPhysicalCTAS *dxlop - ) +CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToDistrPolicy( + const CDXLPhysicalCTAS *dxlop) { ULongPtrArray *distr_col_pos_array = dxlop->GetDistrColPosArray(); - const ULONG num_of_distr_cols = (distr_col_pos_array == NULL) ? 0 : distr_col_pos_array->Size(); + const ULONG num_of_distr_cols = + (distr_col_pos_array == NULL) ? 0 : distr_col_pos_array->Size(); ULONG num_of_distr_cols_alloc = 1; if (0 < num_of_distr_cols) { num_of_distr_cols_alloc = num_of_distr_cols; } - - GpPolicy *distr_policy = (GpPolicy *) gpdb::GPDBAlloc(sizeof(GpPolicy) + - num_of_distr_cols * sizeof(AttrNumber)); + + GpPolicy *distr_policy = (GpPolicy *) gpdb::GPDBAlloc( + sizeof(GpPolicy) + num_of_distr_cols * sizeof(AttrNumber)); GPOS_ASSERT(IMDRelation::EreldistrHash == dxlop->Ereldistrpolicy() || IMDRelation::EreldistrRandom == dxlop->Ereldistrpolicy()); - + distr_policy->ptype = POLICYTYPE_PARTITIONED; distr_policy->nattrs = 0; if (IMDRelation::EreldistrHash == dxlop->Ereldistrpolicy()) { - GPOS_ASSERT(0 < num_of_distr_cols); distr_policy->nattrs = num_of_distr_cols; - + for (ULONG ul = 0; ul < num_of_distr_cols; ul++) { ULONG col_pos_idx = *((*distr_col_pos_array)[ul]); @@ -5837,25 +5853,26 @@ CTranslatorDXLToPlStmt::TranslateDXLPhyCtasToDistrPolicy // //--------------------------------------------------------------------------- List * -CTranslatorDXLToPlStmt::TranslateDXLCtasStorageOptions - ( - CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options - ) +CTranslatorDXLToPlStmt::TranslateDXLCtasStorageOptions( + CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options) { if (NULL == ctas_storage_options) { return NIL; } - + const ULONG num_of_options = ctas_storage_options->Size(); List *options = NIL; for (ULONG ul = 0; ul < num_of_options; ul++) { - CDXLCtasStorageOptions::CDXLCtasOption *pdxlopt = (*ctas_storage_options)[ul]; + CDXLCtasStorageOptions::CDXLCtasOption *pdxlopt = + (*ctas_storage_options)[ul]; CWStringBase *str_name = pdxlopt->m_str_name; CWStringBase *str_value = pdxlopt->m_str_value; DefElem *def_elem = MakeNode(DefElem); - def_elem->defname = CTranslatorUtils::CreateMultiByteCharStringFromWCString(str_name->GetBuffer()); + def_elem->defname = + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str_name->GetBuffer()); if (!pdxlopt->m_is_null) { @@ -5864,17 +5881,20 @@ CTranslatorDXLToPlStmt::TranslateDXLCtasStorageOptions GPOS_ASSERT(T_Integer == arg_type || T_String == arg_type); if (T_Integer == arg_type) { - def_elem->arg = (Node *) gpdb::MakeIntegerValue(CTranslatorUtils::GetLongFromStr(str_value)); + def_elem->arg = (Node *) gpdb::MakeIntegerValue( + CTranslatorUtils::GetLongFromStr(str_value)); } else { - def_elem->arg = (Node *) gpdb::MakeStringValue(CTranslatorUtils::CreateMultiByteCharStringFromWCString(str_value->GetBuffer())); + def_elem->arg = (Node *) gpdb::MakeStringValue( + CTranslatorUtils::CreateMultiByteCharStringFromWCString( + str_value->GetBuffer())); } } options = gpdb::LAppend(options, def_elem); } - + return options; } @@ -5888,12 +5908,9 @@ CTranslatorDXLToPlStmt::TranslateDXLCtasStorageOptions // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan - ( - const CDXLNode *bitmapscan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan( + const CDXLNode *bitmapscan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { ULONG part_index_id = INVALID_PART_INDEX; ULONG part_idx_printable_id = INVALID_PART_INDEX; @@ -5903,17 +5920,20 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan CDXLOperator *dxl_operator = bitmapscan_dxlnode->GetOperator(); if (EdxlopPhysicalBitmapTableScan == dxl_operator->GetDXLOperator()) { - table_descr = CDXLPhysicalBitmapTableScan::Cast(dxl_operator)->GetDXLTableDescr(); + table_descr = + CDXLPhysicalBitmapTableScan::Cast(dxl_operator)->GetDXLTableDescr(); } else { - GPOS_ASSERT(EdxlopPhysicalDynamicBitmapTableScan == dxl_operator->GetDXLOperator()); + GPOS_ASSERT(EdxlopPhysicalDynamicBitmapTableScan == + dxl_operator->GetDXLOperator()); CDXLPhysicalDynamicBitmapTableScan *phy_dyn_bitmap_tblscan_dxlop = - CDXLPhysicalDynamicBitmapTableScan::Cast(dxl_operator); + CDXLPhysicalDynamicBitmapTableScan::Cast(dxl_operator); table_descr = phy_dyn_bitmap_tblscan_dxlop->GetDXLTableDescr(); part_index_id = phy_dyn_bitmap_tblscan_dxlop->GetPartIndexId(); - part_idx_printable_id = phy_dyn_bitmap_tblscan_dxlop->GetPartIndexIdPrintable(); + part_idx_printable_id = + phy_dyn_bitmap_tblscan_dxlop->GetPartIndexIdPrintable(); is_dynamic = true; } @@ -5921,11 +5941,13 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan CDXLTranslateContextBaseTable base_table_context(m_mp); // add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); + RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry( + table_descr, NULL /*index_descr_dxl*/, index, &base_table_context); GPOS_ASSERT(NULL != rte); rte->requiredPerms |= ACL_SELECT; @@ -5941,14 +5963,11 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(bitmapscan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + bitmapscan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); GPOS_ASSERT(4 == bitmapscan_dxlnode->Arity()); @@ -5959,36 +5978,20 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan CDXLNode *bitmap_access_path_dxlnode = (*bitmapscan_dxlnode)[3]; List *quals_list = NULL; - TranslateProjListAndFilter - ( - project_list_dxlnode, - filter_dxlnode, - &base_table_context, // translate context for the base table - ctxt_translation_prev_siblings, - &plan->targetlist, - &quals_list, - output_context - ); + TranslateProjListAndFilter( + project_list_dxlnode, filter_dxlnode, + &base_table_context, // translate context for the base table + ctxt_translation_prev_siblings, &plan->targetlist, &quals_list, + output_context); plan->qual = quals_list; - bitmap_tbl_scan->bitmapqualorig = TranslateDXLFilterToQual - ( - recheck_cond_dxlnode, - &base_table_context, - ctxt_translation_prev_siblings, - output_context - ); - - bitmap_tbl_scan->scan.plan.lefttree = TranslateDXLBitmapAccessPath - ( - bitmap_access_path_dxlnode, - output_context, - md_rel, - table_descr, - &base_table_context, - ctxt_translation_prev_siblings, - bitmap_tbl_scan - ); + bitmap_tbl_scan->bitmapqualorig = TranslateDXLFilterToQual( + recheck_cond_dxlnode, &base_table_context, + ctxt_translation_prev_siblings, output_context); + + bitmap_tbl_scan->scan.plan.lefttree = TranslateDXLBitmapAccessPath( + bitmap_access_path_dxlnode, output_context, md_rel, table_descr, + &base_table_context, ctxt_translation_prev_siblings, bitmap_tbl_scan); SetParamIds(plan); return (Plan *) bitmap_tbl_scan; @@ -6004,43 +6007,28 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLBitmapAccessPath - ( +CTranslatorDXLToPlStmt::TranslateDXLBitmapAccessPath( const CDXLNode *bitmap_access_path_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, + CDXLTranslateContext *output_context, const IMDRelation *md_rel, const CDXLTableDescr *table_descr, CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ) + BitmapTableScan *bitmap_tbl_scan) { - Edxlopid dxl_op_id = bitmap_access_path_dxlnode->GetOperator()->GetDXLOperator(); + Edxlopid dxl_op_id = + bitmap_access_path_dxlnode->GetOperator()->GetDXLOperator(); if (EdxlopScalarBitmapIndexProbe == dxl_op_id) { - return TranslateDXLBitmapIndexProbe - ( - bitmap_access_path_dxlnode, - output_context, - md_rel, - table_descr, - base_table_context, - ctxt_translation_prev_siblings, - bitmap_tbl_scan - ); + return TranslateDXLBitmapIndexProbe( + bitmap_access_path_dxlnode, output_context, md_rel, table_descr, + base_table_context, ctxt_translation_prev_siblings, + bitmap_tbl_scan); } GPOS_ASSERT(EdxlopScalarBitmapBoolOp == dxl_op_id); - return TranslateDXLBitmapBoolOp - ( - bitmap_access_path_dxlnode, - output_context, - md_rel, - table_descr, - base_table_context, - ctxt_translation_prev_siblings, - bitmap_tbl_scan - ); + return TranslateDXLBitmapBoolOp( + bitmap_access_path_dxlnode, output_context, md_rel, table_descr, + base_table_context, ctxt_translation_prev_siblings, bitmap_tbl_scan); } //--------------------------------------------------------------------------- @@ -6048,54 +6036,39 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapAccessPath // CTranslatorDXLToScalar::TranslateDXLBitmapBoolOp // // @doc: -// Translates a DML bitmap bool op expression +// Translates a DML bitmap bool op expression // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLBitmapBoolOp - ( - const CDXLNode *bitmap_boolop_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, - const CDXLTableDescr *table_descr, +CTranslatorDXLToPlStmt::TranslateDXLBitmapBoolOp( + const CDXLNode *bitmap_boolop_dxlnode, CDXLTranslateContext *output_context, + const IMDRelation *md_rel, const CDXLTableDescr *table_descr, CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ) + BitmapTableScan *bitmap_tbl_scan) { GPOS_ASSERT(NULL != bitmap_boolop_dxlnode); - GPOS_ASSERT(EdxlopScalarBitmapBoolOp == bitmap_boolop_dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarBitmapBoolOp == + bitmap_boolop_dxlnode->GetOperator()->GetDXLOperator()); + + CDXLScalarBitmapBoolOp *sc_bitmap_boolop_dxlop = + CDXLScalarBitmapBoolOp::Cast(bitmap_boolop_dxlnode->GetOperator()); - CDXLScalarBitmapBoolOp *sc_bitmap_boolop_dxlop = CDXLScalarBitmapBoolOp::Cast(bitmap_boolop_dxlnode->GetOperator()); - CDXLNode *left_tree_dxlnode = (*bitmap_boolop_dxlnode)[0]; CDXLNode *right_tree_dxlnode = (*bitmap_boolop_dxlnode)[1]; - - Plan *left_plan = TranslateDXLBitmapAccessPath - ( - left_tree_dxlnode, - output_context, - md_rel, - table_descr, - base_table_context, - ctxt_translation_prev_siblings, - bitmap_tbl_scan - ); - Plan *right_plan = TranslateDXLBitmapAccessPath - ( - right_tree_dxlnode, - output_context, - md_rel, - table_descr, - base_table_context, - ctxt_translation_prev_siblings, - bitmap_tbl_scan - ); + + Plan *left_plan = TranslateDXLBitmapAccessPath( + left_tree_dxlnode, output_context, md_rel, table_descr, + base_table_context, ctxt_translation_prev_siblings, bitmap_tbl_scan); + Plan *right_plan = TranslateDXLBitmapAccessPath( + right_tree_dxlnode, output_context, md_rel, table_descr, + base_table_context, ctxt_translation_prev_siblings, bitmap_tbl_scan); List *child_plan_list = ListMake2(left_plan, right_plan); Plan *plan = NULL; - - if (CDXLScalarBitmapBoolOp::EdxlbitmapAnd == sc_bitmap_boolop_dxlop->GetDXLBitmapOpType()) + + if (CDXLScalarBitmapBoolOp::EdxlbitmapAnd == + sc_bitmap_boolop_dxlop->GetDXLBitmapOpType()) { BitmapAnd *bitmapand = MakeNode(BitmapAnd); bitmapand->bitmapplans = child_plan_list; @@ -6111,8 +6084,8 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapBoolOp bitmapor->plan.qual = NULL; plan = (Plan *) bitmapor; } - - + + return plan; } @@ -6125,32 +6098,32 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapBoolOp // //--------------------------------------------------------------------------- Plan * -CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe - ( +CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe( const CDXLNode *bitmap_index_probe_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, + CDXLTranslateContext *output_context, const IMDRelation *md_rel, const CDXLTableDescr *table_descr, CDXLTranslateContextBaseTable *base_table_context, CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ) + BitmapTableScan *bitmap_tbl_scan) { CDXLScalarBitmapIndexProbe *sc_bitmap_idx_probe_dxlop = - CDXLScalarBitmapIndexProbe::Cast(bitmap_index_probe_dxlnode->GetOperator()); + CDXLScalarBitmapIndexProbe::Cast( + bitmap_index_probe_dxlnode->GetOperator()); BitmapIndexScan *bitmap_idx_scan = MakeNode(BitmapIndexScan); bitmap_idx_scan->scan.scanrelid = bitmap_tbl_scan->scan.scanrelid; bitmap_idx_scan->scan.partIndex = bitmap_tbl_scan->scan.partIndex; - CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid(sc_bitmap_idx_probe_dxlop->GetDXLIndexDescr()->MDId()); + CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid( + sc_bitmap_idx_probe_dxlop->GetDXLIndexDescr()->MDId()); const IMDIndex *index = m_md_accessor->RetrieveIndex(mdid_index); Oid index_oid = mdid_index->Oid(); GPOS_ASSERT(InvalidOid != index_oid); bitmap_idx_scan->indexid = index_oid; OID rel_oid = CMDIdGPDB::CastMdid(table_descr->MDId())->Oid(); - bitmap_idx_scan->logicalIndexInfo = gpdb::GetLogicalIndexInfo(rel_oid, index_oid); + bitmap_idx_scan->logicalIndexInfo = + gpdb::GetLogicalIndexInfo(rel_oid, index_oid); Plan *plan = &(bitmap_idx_scan->scan.plan); plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId(); plan->nMotionNodes = 0; @@ -6162,22 +6135,11 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe List *index_strategy_list = NIL; List *index_subtype_list = NIL; - TranslateIndexConditions - ( - index_cond_list_dxlnode, - table_descr, - false /*is_index_only_scan*/, - true /*is_bitmap_index_probe*/, - index, - md_rel, - output_context, - base_table_context, - ctxt_translation_prev_siblings, - &index_cond, - &index_orig_cond, - &index_strategy_list, - &index_subtype_list - ); + TranslateIndexConditions( + index_cond_list_dxlnode, table_descr, false /*is_index_only_scan*/, + true /*is_bitmap_index_probe*/, index, md_rel, output_context, + base_table_context, ctxt_translation_prev_siblings, &index_cond, + &index_orig_cond, &index_strategy_list, &index_subtype_list); bitmap_idx_scan->indexqual = index_cond; bitmap_idx_scan->indexqualorig = index_orig_cond; @@ -6190,18 +6152,16 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe // translates a DXL Value Scan node into a GPDB Value scan node Plan * -CTranslatorDXLToPlStmt::TranslateDXLValueScan - ( - const CDXLNode *value_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ) +CTranslatorDXLToPlStmt::TranslateDXLValueScan( + const CDXLNode *value_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings) { // translation context for column mappings CDXLTranslateContextBaseTable base_table_context(m_mp); // we will add the new range table entry as the last element of the range table - Index index = gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; + Index index = + gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1; base_table_context.SetRelIndex(index); @@ -6210,10 +6170,11 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScan value_scan->scan.scanrelid = index; Plan *plan = &(value_scan->scan.plan); - RangeTblEntry *rte = TranslateDXLValueScanToRangeTblEntry(value_scan_dxlnode, output_context, &base_table_context); + RangeTblEntry *rte = TranslateDXLValueScanToRangeTblEntry( + value_scan_dxlnode, output_context, &base_table_context); GPOS_ASSERT(NULL != rte); - value_scan->values_lists = (List *)gpdb::CopyObject(rte->values_lists); + value_scan->values_lists = (List *) gpdb::CopyObject(rte->values_lists); m_dxl_to_plstmt_context->AddRTE(rte); @@ -6221,14 +6182,11 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScan plan->nMotionNodes = 0; // translate operator costs - TranslatePlanCosts - ( - CDXLPhysicalProperties::PdxlpropConvert(value_scan_dxlnode->GetProperties())->GetDXLOperatorCost(), - &(plan->startup_cost), - &(plan->total_cost), - &(plan->plan_rows), - &(plan->plan_width) - ); + TranslatePlanCosts(CDXLPhysicalProperties::PdxlpropConvert( + value_scan_dxlnode->GetProperties()) + ->GetDXLOperatorCost(), + &(plan->startup_cost), &(plan->total_cost), + &(plan->plan_rows), &(plan->plan_width)); // a table scan node must have at least 2 children: projection list and at least 1 value list GPOS_ASSERT(2 <= value_scan_dxlnode->Arity()); @@ -6236,13 +6194,8 @@ CTranslatorDXLToPlStmt::TranslateDXLValueScan CDXLNode *project_list_dxlnode = (*value_scan_dxlnode)[EdxltsIndexProjList]; // translate proj list - List *target_list = TranslateDXLProjList - ( - project_list_dxlnode, - &base_table_context, - NULL, - output_context - ); + List *target_list = TranslateDXLProjList( + project_list_dxlnode, &base_table_context, NULL, output_context); plan->targetlist = target_list; diff --git a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp index f98ad0f905..41e9134dca 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp @@ -57,17 +57,13 @@ using namespace gpopt; // @doc: // Constructor //--------------------------------------------------------------------------- -CTranslatorDXLToScalar::CTranslatorDXLToScalar - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - ULONG num_segments - ) - : - m_mp(mp), - m_md_accessor(md_accessor), - m_has_subqueries(false), - m_num_of_segments(num_segments) +CTranslatorDXLToScalar::CTranslatorDXLToScalar(CMemoryPool *mp, + CMDAccessor *md_accessor, + ULONG num_segments) + : m_mp(mp), + m_md_accessor(md_accessor), + m_has_subqueries(false), + m_num_of_segments(num_segments) { } @@ -79,46 +75,74 @@ CTranslatorDXLToScalar::CTranslatorDXLToScalar // Translates a DXL scalar expression into a GPDB Expression node //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLToScalar - ( - const CDXLNode *dxlnode, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLToScalar(const CDXLNode *dxlnode, + CMappingColIdVar *colid_var) { - static const STranslatorElem translators[] = - { - {EdxlopScalarIdent, &CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar}, - {EdxlopScalarCmp, &CTranslatorDXLToScalar::TranslateDXLScalarCmpToScalar}, - {EdxlopScalarDistinct, &CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar}, - {EdxlopScalarOpExpr, &CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar}, - {EdxlopScalarArrayComp, &CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar}, - {EdxlopScalarCoalesce, &CTranslatorDXLToScalar::TranslateDXLScalarCoalesceToScalar}, - {EdxlopScalarMinMax, &CTranslatorDXLToScalar::TranslateDXLScalarMinMaxToScalar}, - {EdxlopScalarConstValue, &CTranslatorDXLToScalar::TranslateDXLScalarConstToScalar}, - {EdxlopScalarBoolExpr, &CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar}, - {EdxlopScalarBooleanTest, &CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar}, - {EdxlopScalarNullTest, &CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar}, - {EdxlopScalarNullIf, &CTranslatorDXLToScalar::TranslateDXLScalarNullIfToScalar}, - {EdxlopScalarIfStmt, &CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar}, - {EdxlopScalarSwitch, &CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar}, - {EdxlopScalarCaseTest, &CTranslatorDXLToScalar::TranslateDXLScalarCaseTestToScalar}, - {EdxlopScalarFuncExpr, &CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar}, - {EdxlopScalarAggref, &CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar}, - {EdxlopScalarWindowRef, &CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar}, - {EdxlopScalarCast, &CTranslatorDXLToScalar::TranslateDXLScalarCastToScalar}, - {EdxlopScalarCoerceToDomain, &CTranslatorDXLToScalar::TranslateDXLScalarCoerceToDomainToScalar}, - {EdxlopScalarCoerceViaIO, &CTranslatorDXLToScalar::TranslateDXLScalarCoerceViaIOToScalar}, - {EdxlopScalarArrayCoerceExpr, &CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar}, - {EdxlopScalarSubPlan, &CTranslatorDXLToScalar::TranslateDXLScalarSubplanToScalar}, - {EdxlopScalarArray, &CTranslatorDXLToScalar::TranslateDXLScalarArrayToScalar}, - {EdxlopScalarArrayRef, &CTranslatorDXLToScalar::TranslateDXLScalarArrayRefToScalar}, - {EdxlopScalarDMLAction, &CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar}, - {EdxlopScalarPartDefault, &CTranslatorDXLToScalar::TranslateDXLScalarPartDefaultToScalar}, - {EdxlopScalarPartBound, &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundToScalar}, - {EdxlopScalarPartBoundInclusion, &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundInclusionToScalar}, - {EdxlopScalarPartBoundOpen, &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundOpenToScalar}, - {EdxlopScalarPartListValues, &CTranslatorDXLToScalar::TranslateDXLScalarPartListValuesToScalar}, - {EdxlopScalarPartListNullTest, &CTranslatorDXLToScalar::TranslateDXLScalarPartListNullTestToScalar}, + static const STranslatorElem translators[] = { + {EdxlopScalarIdent, + &CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar}, + {EdxlopScalarCmp, + &CTranslatorDXLToScalar::TranslateDXLScalarCmpToScalar}, + {EdxlopScalarDistinct, + &CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar}, + {EdxlopScalarOpExpr, + &CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar}, + {EdxlopScalarArrayComp, + &CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar}, + {EdxlopScalarCoalesce, + &CTranslatorDXLToScalar::TranslateDXLScalarCoalesceToScalar}, + {EdxlopScalarMinMax, + &CTranslatorDXLToScalar::TranslateDXLScalarMinMaxToScalar}, + {EdxlopScalarConstValue, + &CTranslatorDXLToScalar::TranslateDXLScalarConstToScalar}, + {EdxlopScalarBoolExpr, + &CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar}, + {EdxlopScalarBooleanTest, + &CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar}, + {EdxlopScalarNullTest, + &CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar}, + {EdxlopScalarNullIf, + &CTranslatorDXLToScalar::TranslateDXLScalarNullIfToScalar}, + {EdxlopScalarIfStmt, + &CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar}, + {EdxlopScalarSwitch, + &CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar}, + {EdxlopScalarCaseTest, + &CTranslatorDXLToScalar::TranslateDXLScalarCaseTestToScalar}, + {EdxlopScalarFuncExpr, + &CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar}, + {EdxlopScalarAggref, + &CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar}, + {EdxlopScalarWindowRef, + &CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar}, + {EdxlopScalarCast, + &CTranslatorDXLToScalar::TranslateDXLScalarCastToScalar}, + {EdxlopScalarCoerceToDomain, + &CTranslatorDXLToScalar::TranslateDXLScalarCoerceToDomainToScalar}, + {EdxlopScalarCoerceViaIO, + &CTranslatorDXLToScalar::TranslateDXLScalarCoerceViaIOToScalar}, + {EdxlopScalarArrayCoerceExpr, + &CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar}, + {EdxlopScalarSubPlan, + &CTranslatorDXLToScalar::TranslateDXLScalarSubplanToScalar}, + {EdxlopScalarArray, + &CTranslatorDXLToScalar::TranslateDXLScalarArrayToScalar}, + {EdxlopScalarArrayRef, + &CTranslatorDXLToScalar::TranslateDXLScalarArrayRefToScalar}, + {EdxlopScalarDMLAction, + &CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar}, + {EdxlopScalarPartDefault, + &CTranslatorDXLToScalar::TranslateDXLScalarPartDefaultToScalar}, + {EdxlopScalarPartBound, + &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundToScalar}, + {EdxlopScalarPartBoundInclusion, + &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundInclusionToScalar}, + {EdxlopScalarPartBoundOpen, + &CTranslatorDXLToScalar::TranslateDXLScalarPartBoundOpenToScalar}, + {EdxlopScalarPartListValues, + &CTranslatorDXLToScalar::TranslateDXLScalarPartListValuesToScalar}, + {EdxlopScalarPartListNullTest, + &CTranslatorDXLToScalar::TranslateDXLScalarPartListNullTestToScalar}, }; const ULONG num_translators = GPOS_ARRAY_SIZE(translators); @@ -140,7 +164,8 @@ CTranslatorDXLToScalar::TranslateDXLToScalar if (NULL == translate_func) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, dxlnode->GetOperator()->GetOpNameStr()->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + dxlnode->GetOperator()->GetOpNameStr()->GetBuffer()); } return (this->*translate_func)(dxlnode, colid_var); @@ -154,19 +179,18 @@ CTranslatorDXLToScalar::TranslateDXLToScalar // Translates a DXL scalar if stmt into a GPDB CaseExpr node //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar - ( - const CDXLNode *scalar_if_stmt_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar( + const CDXLNode *scalar_if_stmt_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_if_stmt_node); - CDXLScalarIfStmt *scalar_if_stmt_dxl = CDXLScalarIfStmt::Cast(scalar_if_stmt_node->GetOperator()); + CDXLScalarIfStmt *scalar_if_stmt_dxl = + CDXLScalarIfStmt::Cast(scalar_if_stmt_node->GetOperator()); CaseExpr *case_expr = MakeNode(CaseExpr); - case_expr->casetype = CMDIdGPDB::CastMdid(scalar_if_stmt_dxl->GetResultTypeMdId())->Oid(); + case_expr->casetype = + CMDIdGPDB::CastMdid(scalar_if_stmt_dxl->GetResultTypeMdId())->Oid(); - CDXLNode *curr_node = const_cast(scalar_if_stmt_node); + CDXLNode *curr_node = const_cast(scalar_if_stmt_node); Expr *else_expr = NULL; // An If statement is of the format: IF @@ -175,14 +199,9 @@ CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar while (!is_leaf_else_stmt) { - if (3 != curr_node->Arity()) { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiDXLIncorrectNumberOfChildren - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXLIncorrectNumberOfChildren); return NULL; } @@ -192,9 +211,10 @@ CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar CaseWhen *case_when = MakeNode(CaseWhen); case_when->expr = when_expr; case_when->result = then_expr; - case_expr->args = gpdb::LAppend(case_expr->args,case_when); + case_expr->args = gpdb::LAppend(case_expr->args, case_when); - if (EdxlopScalarIfStmt == (*curr_node)[2]->GetOperator()->GetDXLOperator()) + if (EdxlopScalarIfStmt == + (*curr_node)[2]->GetOperator()->GetDXLOperator()) { curr_node = (*curr_node)[2]; } @@ -207,7 +227,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar case_expr->defresult = else_expr; - return (Expr *)case_expr; + return (Expr *) case_expr; } //--------------------------------------------------------------------------- @@ -218,14 +238,12 @@ CTranslatorDXLToScalar::TranslateDXLScalarIfStmtToScalar // Translates a DXL scalar switch into a GPDB CaseExpr node //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar - ( - const CDXLNode *scalar_switch_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar( + const CDXLNode *scalar_switch_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_switch_node); - CDXLScalarSwitch *dxlop = CDXLScalarSwitch::Cast(scalar_switch_node->GetOperator()); + CDXLScalarSwitch *dxlop = + CDXLScalarSwitch::Cast(scalar_switch_node->GetOperator()); CaseExpr *case_expr = MakeNode(CaseExpr); case_expr->casetype = CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(); @@ -240,22 +258,25 @@ CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar { const CDXLNode *child_dxl = (*scalar_switch_node)[ul]; - if (EdxlopScalarSwitchCase == child_dxl->GetOperator()->GetDXLOperator()) + if (EdxlopScalarSwitchCase == + child_dxl->GetOperator()->GetDXLOperator()) { CaseWhen *case_when = MakeNode(CaseWhen); case_when->expr = TranslateDXLToScalar((*child_dxl)[0], colid_var); - case_when->result = TranslateDXLToScalar((*child_dxl)[1], colid_var); + case_when->result = + TranslateDXLToScalar((*child_dxl)[1], colid_var); case_expr->args = gpdb::LAppend(case_expr->args, case_when); } else { // default return value GPOS_ASSERT(ul == arity - 1); - case_expr->defresult = TranslateDXLToScalar((*scalar_switch_node)[ul], colid_var); + case_expr->defresult = + TranslateDXLToScalar((*scalar_switch_node)[ul], colid_var); } } - return (Expr *)case_expr; + return (Expr *) case_expr; } //--------------------------------------------------------------------------- @@ -266,20 +287,20 @@ CTranslatorDXLToScalar::TranslateDXLScalarSwitchToScalar // Translates a DXL scalar case test into a GPDB CaseTestExpr node //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCaseTestToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarCaseTestToScalar( const CDXLNode *scalar_case_test_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { GPOS_ASSERT(NULL != scalar_case_test_node); - CDXLScalarCaseTest *dxlop = CDXLScalarCaseTest::Cast(scalar_case_test_node->GetOperator()); + CDXLScalarCaseTest *dxlop = + CDXLScalarCaseTest::Cast(scalar_case_test_node->GetOperator()); CaseTestExpr *case_test_expr = MakeNode(CaseTestExpr); case_test_expr->typeId = CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(); case_test_expr->typeMod = -1; - return (Expr *)case_test_expr; + return (Expr *) case_test_expr; } //--------------------------------------------------------------------------- @@ -290,19 +311,18 @@ CTranslatorDXLToScalar::TranslateDXLScalarCaseTestToScalar // Translates a DXL scalar opexpr into a GPDB OpExpr node //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar - ( - const CDXLNode *scalar_op_expr_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar( + const CDXLNode *scalar_op_expr_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_op_expr_node); - CDXLScalarOpExpr *scalar_op_expr_dxl = CDXLScalarOpExpr::Cast(scalar_op_expr_node->GetOperator()); + CDXLScalarOpExpr *scalar_op_expr_dxl = + CDXLScalarOpExpr::Cast(scalar_op_expr_node->GetOperator()); OpExpr *op_expr = MakeNode(OpExpr); op_expr->opno = CMDIdGPDB::CastMdid(scalar_op_expr_dxl->MDId())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(scalar_op_expr_dxl->MDId()); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(scalar_op_expr_dxl->MDId()); op_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); IMDId *return_type_mdid = scalar_op_expr_dxl->GetReturnTypeMdId(); @@ -310,20 +330,24 @@ CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar { op_expr->opresulttype = CMDIdGPDB::CastMdid(return_type_mdid)->Oid(); } - else + else { - op_expr->opresulttype = GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); + op_expr->opresulttype = + GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); } - const IMDFunction *md_func = m_md_accessor->RetrieveFunc(md_scalar_op->FuncMdId()); + const IMDFunction *md_func = + m_md_accessor->RetrieveFunc(md_scalar_op->FuncMdId()); op_expr->opretset = md_func->ReturnsSet(); - GPOS_ASSERT(1 == scalar_op_expr_node->Arity() || 2 == scalar_op_expr_node->Arity()); + GPOS_ASSERT(1 == scalar_op_expr_node->Arity() || + 2 == scalar_op_expr_node->Arity()); // translate children - op_expr->args = TranslateScalarChildren(op_expr->args, scalar_op_expr_node, colid_var); + op_expr->args = + TranslateScalarChildren(op_expr->args, scalar_op_expr_node, colid_var); - return (Expr *)op_expr; + return (Expr *) op_expr; } //--------------------------------------------------------------------------- @@ -335,37 +359,35 @@ CTranslatorDXLToScalar::TranslateDXLScalarOpExprToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar - ( - const CDXLNode *scalar_array_comp_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar( + const CDXLNode *scalar_array_comp_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_array_comp_node); - CDXLScalarArrayComp *array_comp_dxl = CDXLScalarArrayComp::Cast(scalar_array_comp_node->GetOperator()); + CDXLScalarArrayComp *array_comp_dxl = + CDXLScalarArrayComp::Cast(scalar_array_comp_node->GetOperator()); ScalarArrayOpExpr *array_op_expr = MakeNode(ScalarArrayOpExpr); array_op_expr->opno = CMDIdGPDB::CastMdid(array_comp_dxl->MDId())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(array_comp_dxl->MDId()); - array_op_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(array_comp_dxl->MDId()); + array_op_expr->opfuncid = + CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); - switch(array_comp_dxl->GetDXLArrayCmpType()) + switch (array_comp_dxl->GetDXLArrayCmpType()) { case Edxlarraycomptypeany: - array_op_expr->useOr = true; - break; + array_op_expr->useOr = true; + break; case Edxlarraycomptypeall: - array_op_expr->useOr = false; - break; + array_op_expr->useOr = false; + break; default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Scalar Array Comparison: Specified operator type is invalid") - ); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT( + "Scalar Array Comparison: Specified operator type is invalid")); } // translate left and right child @@ -380,7 +402,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar array_op_expr->args = ListMake2(left_expr, right_expr); - return (Expr *)array_op_expr; + return (Expr *) array_op_expr; } //--------------------------------------------------------------------------- @@ -392,22 +414,22 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayCompToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar - ( - const CDXLNode *scalar_distinct_cmp_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar( + const CDXLNode *scalar_distinct_cmp_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_distinct_cmp_node); - CDXLScalarDistinctComp *dxlop = CDXLScalarDistinctComp::Cast(scalar_distinct_cmp_node->GetOperator()); + CDXLScalarDistinctComp *dxlop = + CDXLScalarDistinctComp::Cast(scalar_distinct_cmp_node->GetOperator()); DistinctExpr *dist_expr = MakeNode(DistinctExpr); dist_expr->opno = CMDIdGPDB::CastMdid(dxlop->MDId())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(dxlop->MDId()); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(dxlop->MDId()); dist_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); - dist_expr->opresulttype = GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); + dist_expr->opresulttype = + GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); // translate left and right child GPOS_ASSERT(2 == scalar_distinct_cmp_node->Arity()); @@ -419,7 +441,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar dist_expr->args = ListMake2(left_expr, right_expr); - return (Expr *)dist_expr; + return (Expr *) dist_expr; } //--------------------------------------------------------------------------- @@ -431,14 +453,12 @@ CTranslatorDXLToScalar::TranslateDXLScalarDistinctToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar - ( - const CDXLNode *aggref_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar( + const CDXLNode *aggref_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != aggref_node); - CDXLScalarAggref *dxlop = CDXLScalarAggref::Cast(aggref_node->GetOperator()); + CDXLScalarAggref *dxlop = + CDXLScalarAggref::Cast(aggref_node->GetOperator()); Aggref *aggref = MakeNode(Aggref); aggref->aggfnoid = CMDIdGPDB::CastMdid(dxlop->GetDXLAggFuncMDid())->Oid(); @@ -454,44 +474,46 @@ CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar if (NULL != dxlop->GetDXLResolvedRetTypeMDid()) { // use resolved type - aggref->aggtype = CMDIdGPDB::CastMdid(dxlop->GetDXLResolvedRetTypeMDid())->Oid(); + aggref->aggtype = + CMDIdGPDB::CastMdid(dxlop->GetDXLResolvedRetTypeMDid())->Oid(); } - else if (EdxlaggstageIntermediate == edxlaggstage || EdxlaggstagePartial == edxlaggstage) + else if (EdxlaggstageIntermediate == edxlaggstage || + EdxlaggstagePartial == edxlaggstage) { - aggref->aggtype = CMDIdGPDB::CastMdid(pmdagg->GetIntermediateResultTypeMdid())->Oid(); + aggref->aggtype = + CMDIdGPDB::CastMdid(pmdagg->GetIntermediateResultTypeMdid())->Oid(); } else { - aggref->aggtype = CMDIdGPDB::CastMdid(pmdagg->GetResultTypeMdid())->Oid(); + aggref->aggtype = + CMDIdGPDB::CastMdid(pmdagg->GetResultTypeMdid())->Oid(); } - switch(dxlop->GetDXLAggStage()) + switch (dxlop->GetDXLAggStage()) { case EdxlaggstageNormal: - aggref->aggstage = AGGSTAGE_NORMAL; - break; + aggref->aggstage = AGGSTAGE_NORMAL; + break; case EdxlaggstagePartial: - aggref->aggstage = AGGSTAGE_PARTIAL; - break; + aggref->aggstage = AGGSTAGE_PARTIAL; + break; case EdxlaggstageIntermediate: - aggref->aggstage = AGGSTAGE_INTERMEDIATE; - break; + aggref->aggstage = AGGSTAGE_INTERMEDIATE; + break; case EdxlaggstageFinal: - aggref->aggstage = AGGSTAGE_FINAL; - break; + aggref->aggstage = AGGSTAGE_FINAL; + break; default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("AGGREF: Specified AggStage value is invalid") - ); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("AGGREF: Specified AggStage value is invalid")); } // translate each DXL argument - aggref->args = TranslateScalarChildren(aggref->args, aggref_node, colid_var); + aggref->args = + TranslateScalarChildren(aggref->args, aggref_node, colid_var); - return (Expr *)aggref; + return (Expr *) aggref; } //--------------------------------------------------------------------------- @@ -503,14 +525,12 @@ CTranslatorDXLToScalar::TranslateDXLScalarAggrefToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar - ( - const CDXLNode *scalar_winref_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar( + const CDXLNode *scalar_winref_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_winref_node); - CDXLScalarWindowRef *dxlop = CDXLScalarWindowRef::Cast(scalar_winref_node->GetOperator()); + CDXLScalarWindowRef *dxlop = + CDXLScalarWindowRef::Cast(scalar_winref_node->GetOperator()); WindowRef *pwindowref = MakeNode(WindowRef); pwindowref->winfnoid = CMDIdGPDB::CastMdid(dxlop->FuncMdId())->Oid(); @@ -523,12 +543,11 @@ CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar EdxlWinStage dxl_win_stage = dxlop->GetDxlWinStage(); GPOS_ASSERT(dxl_win_stage != EdxlwinstageSentinel); - ULONG mapping[][2] = - { - {WINSTAGE_IMMEDIATE, EdxlwinstageImmediate}, - {WINSTAGE_PRELIMINARY, EdxlwinstagePreliminary}, - {WINSTAGE_ROWKEY, EdxlwinstageRowKey}, - }; + ULONG mapping[][2] = { + {WINSTAGE_IMMEDIATE, EdxlwinstageImmediate}, + {WINSTAGE_PRELIMINARY, EdxlwinstagePreliminary}, + {WINSTAGE_ROWKEY, EdxlwinstageRowKey}, + }; const ULONG arity = GPOS_ARRAY_SIZE(mapping); for (ULONG ul = 0; ul < arity; ul++) @@ -542,7 +561,8 @@ CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar } // translate the arguments of the window function - pwindowref->args = TranslateScalarChildren(pwindowref->args, scalar_winref_node, colid_var); + pwindowref->args = TranslateScalarChildren(pwindowref->args, + scalar_winref_node, colid_var); return (Expr *) pwindowref; } @@ -556,21 +576,21 @@ CTranslatorDXLToScalar::TranslateDXLScalarWindowRefToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar - ( - const CDXLNode *scalar_func_expr_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar( + const CDXLNode *scalar_func_expr_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_func_expr_node); - CDXLScalarFuncExpr *dxlop = CDXLScalarFuncExpr::Cast(scalar_func_expr_node->GetOperator()); + CDXLScalarFuncExpr *dxlop = + CDXLScalarFuncExpr::Cast(scalar_func_expr_node->GetOperator()); FuncExpr *func_expr = MakeNode(FuncExpr); func_expr->funcid = CMDIdGPDB::CastMdid(dxlop->FuncMdId())->Oid(); func_expr->funcretset = dxlop->ReturnsSet(); func_expr->funcformat = COERCE_DONTCARE; - func_expr->funcresulttype = CMDIdGPDB::CastMdid(dxlop->ReturnTypeMdId())->Oid(); - func_expr->args = TranslateScalarChildren(func_expr->args, scalar_func_expr_node, colid_var); + func_expr->funcresulttype = + CMDIdGPDB::CastMdid(dxlop->ReturnTypeMdId())->Oid(); + func_expr->args = TranslateScalarChildren(func_expr->args, + scalar_func_expr_node, colid_var); return (Expr *) func_expr; } @@ -584,30 +604,35 @@ CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarSubplanToScalar - ( - const CDXLNode *scalar_subplan_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarSubplanToScalar( + const CDXLNode *scalar_subplan_node, CMappingColIdVar *colid_var) { - CDXLTranslateContext *output_context = (dynamic_cast(colid_var))->GetOutputContext(); + CDXLTranslateContext *output_context = + (dynamic_cast(colid_var))->GetOutputContext(); - CContextDXLToPlStmt *dxl_to_plstmt_ctxt = (dynamic_cast(colid_var))->GetDXLToPlStmtContext(); + CContextDXLToPlStmt *dxl_to_plstmt_ctxt = + (dynamic_cast(colid_var)) + ->GetDXLToPlStmtContext(); - CDXLScalarSubPlan *dxlop = CDXLScalarSubPlan::Cast(scalar_subplan_node->GetOperator()); + CDXLScalarSubPlan *dxlop = + CDXLScalarSubPlan::Cast(scalar_subplan_node->GetOperator()); // translate subplan test expression List *param_ids = NIL; - SubLinkType slink = CTranslatorUtils::MapDXLSubplanToSublinkType(dxlop->GetDxlSubplanType()); - Expr *test_expr = TranslateDXLSubplanTestExprToScalar(dxlop->GetDxlTestExpr(), slink, colid_var, ¶m_ids); + SubLinkType slink = CTranslatorUtils::MapDXLSubplanToSublinkType( + dxlop->GetDxlSubplanType()); + Expr *test_expr = TranslateDXLSubplanTestExprToScalar( + dxlop->GetDxlTestExpr(), slink, colid_var, ¶m_ids); - const CDXLColRefArray *outer_refs= dxlop->GetDxlOuterColRefsArray(); + const CDXLColRefArray *outer_refs = dxlop->GetDxlOuterColRefsArray(); const ULONG len = outer_refs->Size(); // Translate a copy of the translate context: the param mappings from the outer scope get copied in the constructor - CDXLTranslateContext subplan_translate_ctxt(m_mp, output_context->IsParentAggNode(), output_context->GetColIdToParamIdMap()); + CDXLTranslateContext subplan_translate_ctxt( + m_mp, output_context->IsParentAggNode(), + output_context->GetColIdToParamIdMap()); // insert new outer ref mappings in the subplan translate context for (ULONG ul = 0; ul < len; ul++) @@ -620,72 +645,90 @@ CTranslatorDXLToScalar::TranslateDXLScalarSubplanToScalar if (NULL == subplan_translate_ctxt.GetParamIdMappingElement(colid)) { // keep outer reference mapping to the original column for subsequent subplans - CMappingElementColIdParamId *colid_to_param_id_map = GPOS_NEW(m_mp) CMappingElementColIdParamId(colid, dxl_to_plstmt_ctxt->GetNextParamId(), mdid, type_modifier); + CMappingElementColIdParamId *colid_to_param_id_map = + GPOS_NEW(m_mp) CMappingElementColIdParamId( + colid, dxl_to_plstmt_ctxt->GetNextParamId(), mdid, + type_modifier); #ifdef GPOS_DEBUG BOOL is_inserted = #endif - subplan_translate_ctxt.FInsertParamMapping(colid, colid_to_param_id_map); + subplan_translate_ctxt.FInsertParamMapping( + colid, colid_to_param_id_map); GPOS_ASSERT(is_inserted); } } CDXLNode *child_dxl = (*scalar_subplan_node)[0]; - GPOS_ASSERT(EdxloptypePhysical == child_dxl->GetOperator()->GetDXLOperatorType()); + GPOS_ASSERT(EdxloptypePhysical == + child_dxl->GetOperator()->GetDXLOperatorType()); GPOS_ASSERT(NULL != scalar_subplan_node); - GPOS_ASSERT(EdxlopScalarSubPlan == scalar_subplan_node->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarSubPlan == + scalar_subplan_node->GetOperator()->GetDXLOperator()); GPOS_ASSERT(1 == scalar_subplan_node->Arity()); // generate the child plan, // Translate DXL->PlStmt translator to handle subplan's relational children - CTranslatorDXLToPlStmt dxl_to_plstmt_translator - ( - m_mp, - m_md_accessor, - (dynamic_cast(colid_var))->GetDXLToPlStmtContext(), - m_num_of_segments - ); - CDXLTranslationContextArray *prev_siblings_ctxt_arr = GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); - Plan *plan_child = dxl_to_plstmt_translator.TranslateDXLOperatorToPlan(child_dxl, &subplan_translate_ctxt, prev_siblings_ctxt_arr); + CTranslatorDXLToPlStmt dxl_to_plstmt_translator( + m_mp, m_md_accessor, + (dynamic_cast(colid_var)) + ->GetDXLToPlStmtContext(), + m_num_of_segments); + CDXLTranslationContextArray *prev_siblings_ctxt_arr = + GPOS_NEW(m_mp) CDXLTranslationContextArray(m_mp); + Plan *plan_child = dxl_to_plstmt_translator.TranslateDXLOperatorToPlan( + child_dxl, &subplan_translate_ctxt, prev_siblings_ctxt_arr); prev_siblings_ctxt_arr->Release(); - GPOS_ASSERT(NULL != plan_child->targetlist && 1 <= gpdb::ListLength(plan_child->targetlist)); + GPOS_ASSERT(NULL != plan_child->targetlist && + 1 <= gpdb::ListLength(plan_child->targetlist)); // translate subplan and set test expression - SubPlan *subplan = TranslateSubplanFromChildPlan(plan_child, slink, dxl_to_plstmt_ctxt); + SubPlan *subplan = + TranslateSubplanFromChildPlan(plan_child, slink, dxl_to_plstmt_ctxt); subplan->testexpr = (Node *) test_expr; subplan->paramIds = param_ids; // translate other subplan params - TranslateSubplanParams(subplan, &subplan_translate_ctxt, outer_refs, colid_var); + TranslateSubplanParams(subplan, &subplan_translate_ctxt, outer_refs, + colid_var); - return (Expr *)subplan; + return (Expr *) subplan; } -inline BOOL FDXLCastedId(CDXLNode *dxl_node) +inline BOOL +FDXLCastedId(CDXLNode *dxl_node) { return EdxlopScalarCast == dxl_node->GetOperator()->GetDXLOperator() && - dxl_node->Arity() > 0 && EdxlopScalarIdent == (*dxl_node)[0]->GetOperator()->GetDXLOperator(); + dxl_node->Arity() > 0 && + EdxlopScalarIdent == (*dxl_node)[0]->GetOperator()->GetDXLOperator(); } -inline CTranslatorDXLToScalar::STypeOidAndTypeModifier OidParamOidFromDXLIdentOrDXLCastIdent(CDXLNode *ident_or_cast_ident_node) +inline CTranslatorDXLToScalar::STypeOidAndTypeModifier +OidParamOidFromDXLIdentOrDXLCastIdent(CDXLNode *ident_or_cast_ident_node) { - GPOS_ASSERT(EdxlopScalarIdent == ident_or_cast_ident_node->GetOperator()->GetDXLOperator() || FDXLCastedId(ident_or_cast_ident_node)); + GPOS_ASSERT(EdxlopScalarIdent == + ident_or_cast_ident_node->GetOperator()->GetDXLOperator() || + FDXLCastedId(ident_or_cast_ident_node)); CDXLScalarIdent *inner_ident; - if (EdxlopScalarIdent == ident_or_cast_ident_node->GetOperator()->GetDXLOperator()) + if (EdxlopScalarIdent == + ident_or_cast_ident_node->GetOperator()->GetDXLOperator()) { - inner_ident = CDXLScalarIdent::Cast(ident_or_cast_ident_node->GetOperator()); + inner_ident = + CDXLScalarIdent::Cast(ident_or_cast_ident_node->GetOperator()); } else { - inner_ident = CDXLScalarIdent::Cast((*ident_or_cast_ident_node)[0]->GetOperator()); + inner_ident = CDXLScalarIdent::Cast( + (*ident_or_cast_ident_node)[0]->GetOperator()); } Oid inner_type_oid = CMDIdGPDB::CastMdid(inner_ident->MdidType())->Oid(); INT type_modifier = inner_ident->TypeModifier(); - CTranslatorDXLToScalar::STypeOidAndTypeModifier modifier = { inner_type_oid, type_modifier}; + CTranslatorDXLToScalar::STypeOidAndTypeModifier modifier = {inner_type_oid, + type_modifier}; return modifier; } @@ -698,15 +741,12 @@ inline CTranslatorDXLToScalar::STypeOidAndTypeModifier OidParamOidFromDXLIdentOr // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar - ( - CDXLNode *test_expr_node, - SubLinkType slink, - CMappingColIdVar *colid_var, - List **param_ids - ) +CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar( + CDXLNode *test_expr_node, SubLinkType slink, CMappingColIdVar *colid_var, + List **param_ids) { - if (EXPR_SUBLINK == slink || EXISTS_SUBLINK == slink || NOT_EXISTS_SUBLINK == slink) + if (EXPR_SUBLINK == slink || EXISTS_SUBLINK == slink || + NOT_EXISTS_SUBLINK == slink) { // expr/exists/not-exists sublinks have no test expression return NULL; @@ -722,7 +762,8 @@ CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar if (EdxlopScalarCmp != test_expr_node->GetOperator()->GetDXLOperator()) { // test expression is expected to be a comparison - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, GPOS_WSZ_LIT("Unexpected subplan test expression")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + GPOS_WSZ_LIT("Unexpected subplan test expression")); } GPOS_ASSERT(2 == test_expr_node->Arity()); @@ -731,39 +772,49 @@ CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar CDXLNode *outer_child_node = (*test_expr_node)[0]; CDXLNode *inner_child_node = (*test_expr_node)[1]; - if (EdxlopScalarIdent != inner_child_node->GetOperator()->GetDXLOperator() && !FDXLCastedId(inner_child_node)) + if (EdxlopScalarIdent != + inner_child_node->GetOperator()->GetDXLOperator() && + !FDXLCastedId(inner_child_node)) { - // test expression is expected to be a comparison between an outer expression + // test expression is expected to be a comparison between an outer expression // and a scalar identifier from subplan child // ORCA currently only supports PARAMs on the inner side of the form id or cast(id) // The outer side may be any non-param thing. - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, GPOS_WSZ_LIT("Unsupported subplan test expression")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + GPOS_WSZ_LIT("Unsupported subplan test expression")); } // extract type of inner column - CDXLScalarComp *scalar_cmp_dxl = CDXLScalarComp::Cast(test_expr_node->GetOperator()); + CDXLScalarComp *scalar_cmp_dxl = + CDXLScalarComp::Cast(test_expr_node->GetOperator()); - // create an OpExpr for subplan test expression - OpExpr *op_expr = MakeNode(OpExpr); - op_expr->opno = CMDIdGPDB::CastMdid(scalar_cmp_dxl->MDId())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(scalar_cmp_dxl->MDId()); - op_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); - op_expr->opresulttype = CMDIdGPDB::CastMdid(m_md_accessor->PtMDType()->MDId())->Oid(); - op_expr->opretset = false; + // create an OpExpr for subplan test expression + OpExpr *op_expr = MakeNode(OpExpr); + op_expr->opno = CMDIdGPDB::CastMdid(scalar_cmp_dxl->MDId())->Oid(); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(scalar_cmp_dxl->MDId()); + op_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); + op_expr->opresulttype = + CMDIdGPDB::CastMdid(m_md_accessor->PtMDType()->MDId()) + ->Oid(); + op_expr->opretset = false; - // translate outer expression (can be a deep scalar tree) - Expr *outer_arg_expr = TranslateDXLToScalar(outer_child_node, colid_var); + // translate outer expression (can be a deep scalar tree) + Expr *outer_arg_expr = TranslateDXLToScalar(outer_child_node, colid_var); - // add translated outer expression as first arg of OpExpr - List *args = NIL; - args = gpdb::LAppend(args, outer_arg_expr); + // add translated outer expression as first arg of OpExpr + List *args = NIL; + args = gpdb::LAppend(args, outer_arg_expr); // second arg must be an EXEC param which is replaced during query execution with subplan output Param *param = MakeNode(Param); param->paramkind = PARAM_EXEC; - CContextDXLToPlStmt *dxl_to_plstmt_ctxt = (dynamic_cast(colid_var))->GetDXLToPlStmtContext(); + CContextDXLToPlStmt *dxl_to_plstmt_ctxt = + (dynamic_cast(colid_var)) + ->GetDXLToPlStmtContext(); param->paramid = dxl_to_plstmt_ctxt->GetNextParamId(); - CTranslatorDXLToScalar::STypeOidAndTypeModifier oidAndTypeModifier = OidParamOidFromDXLIdentOrDXLCastIdent(inner_child_node); + CTranslatorDXLToScalar::STypeOidAndTypeModifier oidAndTypeModifier = + OidParamOidFromDXLIdentOrDXLCastIdent(inner_child_node); param->paramtype = oidAndTypeModifier.oid_type; param->paramtypmod = oidAndTypeModifier.type_modifier; @@ -777,10 +828,12 @@ CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar { args = gpdb::LAppend(args, param); } - else // we have a cast + else // we have a cast { - CDXLScalarCast *scalar_cast = CDXLScalarCast::Cast(inner_child_node->GetOperator()); - Expr *pexprCastParam = TranslateRelabelTypeOrFuncExprFromDXL(scalar_cast, (Expr *) param); + CDXLScalarCast *scalar_cast = + CDXLScalarCast::Cast(inner_child_node->GetOperator()); + Expr *pexprCastParam = + TranslateRelabelTypeOrFuncExprFromDXL(scalar_cast, (Expr *) param); args = gpdb::LAppend(args, pexprCastParam); } op_expr->args = args; @@ -798,13 +851,9 @@ CTranslatorDXLToScalar::TranslateDXLSubplanTestExprToScalar // //--------------------------------------------------------------------------- void -CTranslatorDXLToScalar::TranslateSubplanParams - ( - SubPlan *subplan, - CDXLTranslateContext *dxl_translator_ctxt, - const CDXLColRefArray *outer_refs, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateSubplanParams( + SubPlan *subplan, CDXLTranslateContext *dxl_translator_ctxt, + const CDXLColRefArray *outer_refs, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != subplan); GPOS_ASSERT(NULL != dxl_translator_ctxt); @@ -817,28 +866,30 @@ CTranslatorDXLToScalar::TranslateSubplanParams { CDXLColRef *dxl_colref = (*outer_refs)[ul]; dxl_colref->AddRef(); - const CMappingElementColIdParamId *colid_to_param_id_map = dxl_translator_ctxt->GetParamIdMappingElement(dxl_colref->Id()); + const CMappingElementColIdParamId *colid_to_param_id_map = + dxl_translator_ctxt->GetParamIdMappingElement(dxl_colref->Id()); // TODO: eliminate param, it's not *really* used, and it's (short-term) leaked Param *param = TranslateParamFromMapping(colid_to_param_id_map); subplan->parParam = gpdb::LAppendInt(subplan->parParam, param->paramid); - GPOS_ASSERT(colid_to_param_id_map->MdidType()->Equals(dxl_colref->MdidType())); + GPOS_ASSERT( + colid_to_param_id_map->MdidType()->Equals(dxl_colref->MdidType())); - CDXLScalarIdent *scalar_ident_dxl = GPOS_NEW(m_mp) CDXLScalarIdent(m_mp, dxl_colref); + CDXLScalarIdent *scalar_ident_dxl = + GPOS_NEW(m_mp) CDXLScalarIdent(m_mp, dxl_colref); Expr *arg = (Expr *) colid_var->VarFromDXLNodeScId(scalar_ident_dxl); // not found in mapping, it must be an external parameter if (NULL == arg) { - arg = (Expr*) TranslateParamFromMapping(colid_to_param_id_map); + arg = (Expr *) TranslateParamFromMapping(colid_to_param_id_map); GPOS_ASSERT(NULL != arg); } scalar_ident_dxl->Release(); subplan->args = gpdb::LAppend(subplan->args, arg); } - } //--------------------------------------------------------------------------- @@ -850,20 +901,18 @@ CTranslatorDXLToScalar::TranslateSubplanParams // //--------------------------------------------------------------------------- SubPlan * -CTranslatorDXLToScalar::TranslateSubplanFromChildPlan - ( - Plan *plan, - SubLinkType slink, - CContextDXLToPlStmt *dxl_to_plstmt_ctxt - ) +CTranslatorDXLToScalar::TranslateSubplanFromChildPlan( + Plan *plan, SubLinkType slink, CContextDXLToPlStmt *dxl_to_plstmt_ctxt) { dxl_to_plstmt_ctxt->AddSubplan(plan); SubPlan *subplan = MakeNode(SubPlan); - subplan->plan_id = gpdb::ListLength(dxl_to_plstmt_ctxt->GetSubplanEntriesList()); + subplan->plan_id = + gpdb::ListLength(dxl_to_plstmt_ctxt->GetSubplanEntriesList()); subplan->plan_name = GetSubplanAlias(subplan->plan_id); subplan->is_initplan = false; - subplan->firstColType = gpdb::ExprType( (Node*) ((TargetEntry*) gpdb::ListNth(plan->targetlist, 0))->expr); + subplan->firstColType = gpdb::ExprType( + (Node *) ((TargetEntry *) gpdb::ListNth(plan->targetlist, 0))->expr); subplan->firstColTypmod = -1; subplan->subLinkType = slink; subplan->is_multirow = false; @@ -881,10 +930,7 @@ CTranslatorDXLToScalar::TranslateSubplanFromChildPlan // //--------------------------------------------------------------------------- CHAR * -CTranslatorDXLToScalar::GetSubplanAlias - ( - ULONG plan_id - ) +CTranslatorDXLToScalar::GetSubplanAlias(ULONG plan_id) { CWStringDynamic *plan_name = GPOS_NEW(m_mp) CWStringDynamic(m_mp); plan_name->AppendFormat(GPOS_WSZ_LIT("SubPlan %d"), plan_id); @@ -892,7 +938,8 @@ CTranslatorDXLToScalar::GetSubplanAlias ULONG max_length = (GPOS_WSZ_LENGTH(buf) + 1) * GPOS_SIZEOF(WCHAR); CHAR *result_plan_name = (CHAR *) gpdb::GPDBAlloc(max_length); - gpos::clib::Wcstombs(result_plan_name, const_cast(buf), max_length); + gpos::clib::Wcstombs(result_plan_name, const_cast(buf), + max_length); result_plan_name[max_length - 1] = '\0'; GPOS_DELETE(plan_name); @@ -908,15 +955,14 @@ CTranslatorDXLToScalar::GetSubplanAlias // //--------------------------------------------------------------------------- Param * -CTranslatorDXLToScalar::TranslateParamFromMapping - ( - const CMappingElementColIdParamId *colid_to_param_id_map - ) +CTranslatorDXLToScalar::TranslateParamFromMapping( + const CMappingElementColIdParamId *colid_to_param_id_map) { Param *param = MakeNode(Param); param->paramid = colid_to_param_id_map->ParamId(); param->paramkind = PARAM_EXEC; - param->paramtype = CMDIdGPDB::CastMdid(colid_to_param_id_map->MdidType())->Oid(); + param->paramtype = + CMDIdGPDB::CastMdid(colid_to_param_id_map->MdidType())->Oid(); param->paramtypmod = colid_to_param_id_map->TypeModifier(); return param; @@ -932,14 +978,12 @@ CTranslatorDXLToScalar::TranslateParamFromMapping // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar - ( - const CDXLNode *scalar_bool_expr_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar( + const CDXLNode *scalar_bool_expr_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_bool_expr_node); - CDXLScalarBoolExpr *dxlop = CDXLScalarBoolExpr::Cast(scalar_bool_expr_node->GetOperator()); + CDXLScalarBoolExpr *dxlop = + CDXLScalarBoolExpr::Cast(scalar_bool_expr_node->GetOperator()); BoolExpr *scalar_bool_expr = MakeNode(BoolExpr); GPOS_ASSERT(1 <= scalar_bool_expr_node->Arity()); @@ -970,10 +1014,11 @@ CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar } } - scalar_bool_expr->args = TranslateScalarChildren(scalar_bool_expr->args, scalar_bool_expr_node, colid_var); + scalar_bool_expr->args = TranslateScalarChildren( + scalar_bool_expr->args, scalar_bool_expr_node, colid_var); scalar_bool_expr->location = -1; - return (Expr *)scalar_bool_expr; + return (Expr *) scalar_bool_expr; } //--------------------------------------------------------------------------- @@ -985,41 +1030,39 @@ CTranslatorDXLToScalar::TranslateDXLScalarBoolExprToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar - ( - const CDXLNode *scalar_boolean_test_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar( + const CDXLNode *scalar_boolean_test_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_boolean_test_node); - CDXLScalarBooleanTest *dxlop = CDXLScalarBooleanTest::Cast(scalar_boolean_test_node->GetOperator()); + CDXLScalarBooleanTest *dxlop = + CDXLScalarBooleanTest::Cast(scalar_boolean_test_node->GetOperator()); BooleanTest *scalar_boolean_test = MakeNode(BooleanTest); switch (dxlop->GetDxlBoolTypeStr()) { case EdxlbooleantestIsTrue: - scalar_boolean_test->booltesttype = IS_TRUE; - break; + scalar_boolean_test->booltesttype = IS_TRUE; + break; case EdxlbooleantestIsNotTrue: - scalar_boolean_test->booltesttype = IS_NOT_TRUE; - break; + scalar_boolean_test->booltesttype = IS_NOT_TRUE; + break; case EdxlbooleantestIsFalse: - scalar_boolean_test->booltesttype = IS_FALSE; - break; + scalar_boolean_test->booltesttype = IS_FALSE; + break; case EdxlbooleantestIsNotFalse: - scalar_boolean_test->booltesttype = IS_NOT_FALSE; - break; + scalar_boolean_test->booltesttype = IS_NOT_FALSE; + break; case EdxlbooleantestIsUnknown: - scalar_boolean_test->booltesttype = IS_UNKNOWN; - break; + scalar_boolean_test->booltesttype = IS_UNKNOWN; + break; case EdxlbooleantestIsNotUnknown: - scalar_boolean_test->booltesttype = IS_NOT_UNKNOWN; - break; + scalar_boolean_test->booltesttype = IS_NOT_UNKNOWN; + break; default: - { - GPOS_ASSERT(!"Invalid Boolean Test Operation"); - return NULL; - } + { + GPOS_ASSERT(!"Invalid Boolean Test Operation"); + return NULL; + } } GPOS_ASSERT(1 == scalar_boolean_test_node->Arity()); @@ -1028,7 +1071,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar Expr *arg_expr = TranslateDXLToScalar(dxlnode_arg, colid_var); scalar_boolean_test->arg = arg_expr; - return (Expr *)scalar_boolean_test; + return (Expr *) scalar_boolean_test; } //--------------------------------------------------------------------------- @@ -1040,14 +1083,12 @@ CTranslatorDXLToScalar::TranslateDXLScalarBooleanTestToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar - ( - const CDXLNode *scalar_null_test_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar( + const CDXLNode *scalar_null_test_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_null_test_node); - CDXLScalarNullTest *dxlop = CDXLScalarNullTest::Cast(scalar_null_test_node->GetOperator()); + CDXLScalarNullTest *dxlop = + CDXLScalarNullTest::Cast(scalar_null_test_node->GetOperator()); NullTest *null_test = MakeNode(NullTest); GPOS_ASSERT(1 == scalar_null_test_node->Arity()); @@ -1064,7 +1105,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar } null_test->arg = child_expr; - return (Expr *)null_test; + return (Expr *) null_test; } //--------------------------------------------------------------------------- @@ -1076,44 +1117,50 @@ CTranslatorDXLToScalar::TranslateDXLScalarNullTestToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarNullIfToScalar - ( - const CDXLNode *scalar_null_if_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarNullIfToScalar( + const CDXLNode *scalar_null_if_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_null_if_node); - CDXLScalarNullIf *dxlop = CDXLScalarNullIf::Cast(scalar_null_if_node->GetOperator()); + CDXLScalarNullIf *dxlop = + CDXLScalarNullIf::Cast(scalar_null_if_node->GetOperator()); NullIfExpr *scalar_null_if_expr = MakeNode(NullIfExpr); scalar_null_if_expr->opno = CMDIdGPDB::CastMdid(dxlop->MdIdOp())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(dxlop->MdIdOp()); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(dxlop->MdIdOp()); - scalar_null_if_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); - scalar_null_if_expr->opresulttype = GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); + scalar_null_if_expr->opfuncid = + CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); + scalar_null_if_expr->opresulttype = + GetFunctionReturnTypeOid(md_scalar_op->FuncMdId()); scalar_null_if_expr->opretset = false; // translate children GPOS_ASSERT(2 == scalar_null_if_node->Arity()); - scalar_null_if_expr->args = TranslateScalarChildren(scalar_null_if_expr->args, scalar_null_if_node, colid_var); + scalar_null_if_expr->args = TranslateScalarChildren( + scalar_null_if_expr->args, scalar_null_if_node, colid_var); return (Expr *) scalar_null_if_expr; } Expr * -CTranslatorDXLToScalar::TranslateRelabelTypeOrFuncExprFromDXL(const CDXLScalarCast *scalar_cast, Expr *child_expr) +CTranslatorDXLToScalar::TranslateRelabelTypeOrFuncExprFromDXL( + const CDXLScalarCast *scalar_cast, Expr *child_expr) { if (IMDId::IsValid(scalar_cast->FuncMdId())) { FuncExpr *func_expr = MakeNode(FuncExpr); func_expr->funcid = CMDIdGPDB::CastMdid(scalar_cast->FuncMdId())->Oid(); - const IMDFunction *pmdfunc = m_md_accessor->RetrieveFunc(scalar_cast->FuncMdId()); - func_expr->funcretset = pmdfunc->ReturnsSet();; + const IMDFunction *pmdfunc = + m_md_accessor->RetrieveFunc(scalar_cast->FuncMdId()); + func_expr->funcretset = pmdfunc->ReturnsSet(); + ; func_expr->funcformat = COERCE_IMPLICIT_CAST; - func_expr->funcresulttype = CMDIdGPDB::CastMdid(scalar_cast->MdidType())->Oid(); + func_expr->funcresulttype = + CMDIdGPDB::CastMdid(scalar_cast->MdidType())->Oid(); func_expr->args = NIL; func_expr->args = gpdb::LAppend(func_expr->args, child_expr); @@ -1123,7 +1170,8 @@ CTranslatorDXLToScalar::TranslateRelabelTypeOrFuncExprFromDXL(const CDXLScalarCa RelabelType *relabel_type = MakeNode(RelabelType); - relabel_type->resulttype = CMDIdGPDB::CastMdid(scalar_cast->MdidType())->Oid(); + relabel_type->resulttype = + CMDIdGPDB::CastMdid(scalar_cast->MdidType())->Oid(); relabel_type->arg = child_expr; relabel_type->resulttypmod = -1; relabel_type->location = -1; @@ -1134,14 +1182,12 @@ CTranslatorDXLToScalar::TranslateRelabelTypeOrFuncExprFromDXL(const CDXLScalarCa // Translates a DXL scalar cast into a GPDB RelabelType / FuncExpr node Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCastToScalar - ( - const CDXLNode *scalar_cast_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarCastToScalar( + const CDXLNode *scalar_cast_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_cast_node); - const CDXLScalarCast *dxlop = CDXLScalarCast::Cast(scalar_cast_node->GetOperator()); + const CDXLScalarCast *dxlop = + CDXLScalarCast::Cast(scalar_cast_node->GetOperator()); GPOS_ASSERT(1 == scalar_cast_node->Arity()); CDXLNode *child_dxl = (*scalar_cast_node)[0]; @@ -1161,30 +1207,28 @@ CTranslatorDXLToScalar::TranslateDXLScalarCastToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCoerceToDomainToScalar - ( - const CDXLNode *scalar_coerce_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarCoerceToDomainToScalar( + const CDXLNode *scalar_coerce_node, CMappingColIdVar *colid_var) { - GPOS_ASSERT(NULL != scalar_coerce_node); - CDXLScalarCoerceToDomain *dxlop = CDXLScalarCoerceToDomain::Cast(scalar_coerce_node->GetOperator()); + GPOS_ASSERT(NULL != scalar_coerce_node); + CDXLScalarCoerceToDomain *dxlop = + CDXLScalarCoerceToDomain::Cast(scalar_coerce_node->GetOperator()); - GPOS_ASSERT(1 == scalar_coerce_node->Arity()); - CDXLNode *child_dxl = (*scalar_coerce_node)[0]; + GPOS_ASSERT(1 == scalar_coerce_node->Arity()); + CDXLNode *child_dxl = (*scalar_coerce_node)[0]; - Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); + Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); - CoerceToDomain *coerce = MakeNode(CoerceToDomain); + CoerceToDomain *coerce = MakeNode(CoerceToDomain); coerce->resulttype = CMDIdGPDB::CastMdid(dxlop->GetResultTypeMdId())->Oid(); coerce->arg = child_expr; coerce->resulttypmod = dxlop->TypeModifier(); coerce->location = dxlop->GetLocation(); - coerce->coercionformat = (CoercionForm) dxlop->GetDXLCoercionForm(); + coerce->coercionformat = (CoercionForm) dxlop->GetDXLCoercionForm(); - return (Expr *) coerce; + return (Expr *) coerce; } //--------------------------------------------------------------------------- @@ -1196,28 +1240,26 @@ CTranslatorDXLToScalar::TranslateDXLScalarCoerceToDomainToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCoerceViaIOToScalar - ( - const CDXLNode *scalar_coerce_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarCoerceViaIOToScalar( + const CDXLNode *scalar_coerce_node, CMappingColIdVar *colid_var) { - GPOS_ASSERT(NULL != scalar_coerce_node); - CDXLScalarCoerceViaIO *dxlop = CDXLScalarCoerceViaIO::Cast(scalar_coerce_node->GetOperator()); + GPOS_ASSERT(NULL != scalar_coerce_node); + CDXLScalarCoerceViaIO *dxlop = + CDXLScalarCoerceViaIO::Cast(scalar_coerce_node->GetOperator()); - GPOS_ASSERT(1 == scalar_coerce_node->Arity()); - CDXLNode *child_dxl = (*scalar_coerce_node)[0]; + GPOS_ASSERT(1 == scalar_coerce_node->Arity()); + CDXLNode *child_dxl = (*scalar_coerce_node)[0]; - Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); + Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); - CoerceViaIO *coerce = MakeNode(CoerceViaIO); + CoerceViaIO *coerce = MakeNode(CoerceViaIO); coerce->resulttype = CMDIdGPDB::CastMdid(dxlop->GetResultTypeMdId())->Oid(); coerce->arg = child_expr; coerce->location = dxlop->GetLocation(); - coerce->coerceformat = (CoercionForm) dxlop->GetDXLCoercionForm(); + coerce->coerceformat = (CoercionForm) dxlop->GetDXLCoercionForm(); - return (Expr *) coerce; + return (Expr *) coerce; } //--------------------------------------------------------------------------- @@ -1229,31 +1271,29 @@ CTranslatorDXLToScalar::TranslateDXLScalarCoerceViaIOToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar - ( - const CDXLNode *scalar_coerce_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar( + const CDXLNode *scalar_coerce_node, CMappingColIdVar *colid_var) { - GPOS_ASSERT(NULL != scalar_coerce_node); - CDXLScalarArrayCoerceExpr *dxlop = CDXLScalarArrayCoerceExpr::Cast(scalar_coerce_node->GetOperator()); + GPOS_ASSERT(NULL != scalar_coerce_node); + CDXLScalarArrayCoerceExpr *dxlop = + CDXLScalarArrayCoerceExpr::Cast(scalar_coerce_node->GetOperator()); - GPOS_ASSERT(1 == scalar_coerce_node->Arity()); - CDXLNode *child_dxl = (*scalar_coerce_node)[0]; + GPOS_ASSERT(1 == scalar_coerce_node->Arity()); + CDXLNode *child_dxl = (*scalar_coerce_node)[0]; - Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); + Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); - ArrayCoerceExpr *coerce = MakeNode(ArrayCoerceExpr); + ArrayCoerceExpr *coerce = MakeNode(ArrayCoerceExpr); coerce->arg = child_expr; coerce->elemfuncid = CMDIdGPDB::CastMdid(dxlop->GetCoerceFuncMDid())->Oid(); coerce->resulttype = CMDIdGPDB::CastMdid(dxlop->GetResultTypeMdId())->Oid(); coerce->resulttypmod = dxlop->TypeModifier(); coerce->isExplicit = dxlop->IsExplicit(); - coerce->coerceformat = (CoercionForm) dxlop->GetDXLCoercionForm(); + coerce->coerceformat = (CoercionForm) dxlop->GetDXLCoercionForm(); coerce->location = dxlop->GetLocation(); - return (Expr *) coerce; + return (Expr *) coerce; } //--------------------------------------------------------------------------- @@ -1265,18 +1305,17 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCoalesceToScalar - ( - const CDXLNode *scalar_coalesce_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarCoalesceToScalar( + const CDXLNode *scalar_coalesce_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_coalesce_node); - CDXLScalarCoalesce *dxlop = CDXLScalarCoalesce::Cast(scalar_coalesce_node->GetOperator()); + CDXLScalarCoalesce *dxlop = + CDXLScalarCoalesce::Cast(scalar_coalesce_node->GetOperator()); CoalesceExpr *coalesce = MakeNode(CoalesceExpr); coalesce->coalescetype = CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(); - coalesce->args = TranslateScalarChildren(coalesce->args, scalar_coalesce_node, colid_var); + coalesce->args = TranslateScalarChildren(coalesce->args, + scalar_coalesce_node, colid_var); coalesce->location = -1; return (Expr *) coalesce; @@ -1291,18 +1330,17 @@ CTranslatorDXLToScalar::TranslateDXLScalarCoalesceToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarMinMaxToScalar - ( - const CDXLNode *scalar_min_max_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarMinMaxToScalar( + const CDXLNode *scalar_min_max_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_min_max_node); - CDXLScalarMinMax *dxlop = CDXLScalarMinMax::Cast(scalar_min_max_node->GetOperator()); + CDXLScalarMinMax *dxlop = + CDXLScalarMinMax::Cast(scalar_min_max_node->GetOperator()); MinMaxExpr *min_max_expr = MakeNode(MinMaxExpr); min_max_expr->minmaxtype = CMDIdGPDB::CastMdid(dxlop->MdidType())->Oid(); - min_max_expr->args = TranslateScalarChildren(min_max_expr->args, scalar_min_max_node, colid_var); + min_max_expr->args = TranslateScalarChildren( + min_max_expr->args, scalar_min_max_node, colid_var); min_max_expr->location = -1; CDXLScalarMinMax::EdxlMinMaxType min_max_type = dxlop->GetMinMaxType(); @@ -1328,12 +1366,9 @@ CTranslatorDXLToScalar::TranslateDXLScalarMinMaxToScalar // //--------------------------------------------------------------------------- List * -CTranslatorDXLToScalar::TranslateScalarChildren - ( - List *list, - const CDXLNode *dxlnode, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateScalarChildren(List *list, + const CDXLNode *dxlnode, + CMappingColIdVar *colid_var) { List *new_list = list; @@ -1357,15 +1392,15 @@ CTranslatorDXLToScalar::TranslateScalarChildren // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarConstToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarConstToScalar( const CDXLNode *const_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { GPOS_ASSERT(NULL != const_node); - CDXLScalarConstValue *dxlop = CDXLScalarConstValue::Cast(const_node->GetOperator()); - CDXLDatum *datum_dxl = const_cast(dxlop->GetDatumVal()); + CDXLScalarConstValue *dxlop = + CDXLScalarConstValue::Cast(const_node->GetOperator()); + CDXLDatum *datum_dxl = const_cast(dxlop->GetDatumVal()); return TranslateDXLDatumToScalar(datum_dxl); } @@ -1379,24 +1414,27 @@ CTranslatorDXLToScalar::TranslateDXLScalarConstToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLDatumToScalar - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::TranslateDXLDatumToScalar(CDXLDatum *datum_dxl) { GPOS_ASSERT(NULL != datum_dxl); - static const SDatumTranslatorElem translators[] = - { - {CDXLDatum::EdxldatumInt2 , &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt2}, - {CDXLDatum::EdxldatumInt4 , &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt4}, - {CDXLDatum::EdxldatumInt8 , &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt8}, - {CDXLDatum::EdxldatumBool , &CTranslatorDXLToScalar::ConvertDXLDatumToConstBool}, - {CDXLDatum::EdxldatumOid , &CTranslatorDXLToScalar::ConvertDXLDatumToConstOid}, - {CDXLDatum::EdxldatumGeneric, &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar}, - {CDXLDatum::EdxldatumStatsDoubleMappable, &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar}, - {CDXLDatum::EdxldatumStatsLintMappable, &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar} - }; + static const SDatumTranslatorElem translators[] = { + {CDXLDatum::EdxldatumInt2, + &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt2}, + {CDXLDatum::EdxldatumInt4, + &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt4}, + {CDXLDatum::EdxldatumInt8, + &CTranslatorDXLToScalar::ConvertDXLDatumToConstInt8}, + {CDXLDatum::EdxldatumBool, + &CTranslatorDXLToScalar::ConvertDXLDatumToConstBool}, + {CDXLDatum::EdxldatumOid, + &CTranslatorDXLToScalar::ConvertDXLDatumToConstOid}, + {CDXLDatum::EdxldatumGeneric, + &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar}, + {CDXLDatum::EdxldatumStatsDoubleMappable, + &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar}, + {CDXLDatum::EdxldatumStatsLintMappable, + &CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar}}; const ULONG num_translators = GPOS_ARRAY_SIZE(translators); CDXLDatum::EdxldatumType edxldatumtype = datum_dxl->GetDatumType(); @@ -1415,10 +1453,12 @@ CTranslatorDXLToScalar::TranslateDXLDatumToScalar if (NULL == translate_func) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, CDXLTokens::GetDXLTokenStr(EdxltokenScalarConstValue)->GetBuffer()); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion, + CDXLTokens::GetDXLTokenStr(EdxltokenScalarConstValue)->GetBuffer()); } - return (Expr*) (this->*translate_func)(datum_dxl); + return (Expr *) (this->*translate_func)(datum_dxl); } //--------------------------------------------------------------------------- @@ -1430,10 +1470,7 @@ CTranslatorDXLToScalar::TranslateDXLDatumToScalar // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::ConvertDXLDatumToConstOid - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::ConvertDXLDatumToConstOid(CDXLDatum *datum_dxl) { CDXLDatumOid *oid_datum_dxl = CDXLDatumOid::Cast(datum_dxl); @@ -1466,10 +1503,7 @@ CTranslatorDXLToScalar::ConvertDXLDatumToConstOid // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::ConvertDXLDatumToConstInt2 - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::ConvertDXLDatumToConstInt2(CDXLDatum *datum_dxl) { CDXLDatumInt2 *datum_int2_dxl = CDXLDatumInt2::Cast(datum_dxl); @@ -1502,10 +1536,7 @@ CTranslatorDXLToScalar::ConvertDXLDatumToConstInt2 // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::ConvertDXLDatumToConstInt4 - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::ConvertDXLDatumToConstInt4(CDXLDatum *datum_dxl) { CDXLDatumInt4 *datum_int4_dxl = CDXLDatumInt4::Cast(datum_dxl); @@ -1537,10 +1568,7 @@ CTranslatorDXLToScalar::ConvertDXLDatumToConstInt4 // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::ConvertDXLDatumToConstInt8 - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::ConvertDXLDatumToConstInt8(CDXLDatum *datum_dxl) { CDXLDatumInt8 *datum_int8_dxl = CDXLDatumInt8::Cast(datum_dxl); @@ -1572,10 +1600,7 @@ CTranslatorDXLToScalar::ConvertDXLDatumToConstInt8 // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::ConvertDXLDatumToConstBool - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::ConvertDXLDatumToConstBool(CDXLDatum *datum_dxl) { CDXLDatumBool *datum_bool_dxl = CDXLDatumBool::Cast(datum_dxl); @@ -1608,13 +1633,11 @@ CTranslatorDXLToScalar::ConvertDXLDatumToConstBool // //--------------------------------------------------------------------------- Const * -CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar - ( - CDXLDatum *datum_dxl - ) +CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar(CDXLDatum *datum_dxl) { CDXLDatumGeneric *datum_generic_dxl = CDXLDatumGeneric::Cast(datum_dxl); - const IMDType *type = m_md_accessor->RetrieveType(datum_generic_dxl->MDId()); + const IMDType *type = + m_md_accessor->RetrieveType(datum_generic_dxl->MDId()); Const *constant = MakeNode(Const); constant->consttype = CMDIdGPDB::CastMdid(datum_generic_dxl->MDId())->Oid(); @@ -1632,7 +1655,8 @@ CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar // if it is a by-value constant, the value is stored in the datum. GPOS_ASSERT(constant->constlen >= 0); GPOS_ASSERT((ULONG) constant->constlen <= sizeof(Datum)); - memcpy(&constant->constvalue, datum_generic_dxl->GetByteArray(), sizeof(Datum)); + memcpy(&constant->constvalue, datum_generic_dxl->GetByteArray(), + sizeof(Datum)); } else { @@ -1657,13 +1681,13 @@ CTranslatorDXLToScalar::TranslateDXLDatumGenericToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartDefaultToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartDefaultToScalar( const CDXLNode *part_default_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartDefault *dxlop = CDXLScalarPartDefault::Cast(part_default_node->GetOperator()); + CDXLScalarPartDefault *dxlop = + CDXLScalarPartDefault::Cast(part_default_node->GetOperator()); PartDefaultExpr *expr = MakeNode(PartDefaultExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1680,13 +1704,13 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartDefaultToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartBoundToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartBoundToScalar( const CDXLNode *part_bound_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartBound *dxlop = CDXLScalarPartBound::Cast(part_bound_node->GetOperator()); + CDXLScalarPartBound *dxlop = + CDXLScalarPartBound::Cast(part_bound_node->GetOperator()); PartBoundExpr *expr = MakeNode(PartBoundExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1705,13 +1729,13 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartBoundToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartBoundInclusionToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartBoundInclusionToScalar( const CDXLNode *part_bound_incl_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartBoundInclusion *dxlop = CDXLScalarPartBoundInclusion::Cast(part_bound_incl_node->GetOperator()); + CDXLScalarPartBoundInclusion *dxlop = + CDXLScalarPartBoundInclusion::Cast(part_bound_incl_node->GetOperator()); PartBoundInclusionExpr *expr = MakeNode(PartBoundInclusionExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1729,13 +1753,13 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartBoundInclusionToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartBoundOpenToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartBoundOpenToScalar( const CDXLNode *part_bound_open_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartBoundOpen *dxlop = CDXLScalarPartBoundOpen::Cast(part_bound_open_node->GetOperator()); + CDXLScalarPartBoundOpen *dxlop = + CDXLScalarPartBoundOpen::Cast(part_bound_open_node->GetOperator()); PartBoundOpenExpr *expr = MakeNode(PartBoundOpenExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1753,13 +1777,13 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartBoundOpenToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartListValuesToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartListValuesToScalar( const CDXLNode *part_list_values_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartListValues *dxlop = CDXLScalarPartListValues::Cast(part_list_values_node->GetOperator()); + CDXLScalarPartListValues *dxlop = + CDXLScalarPartListValues::Cast(part_list_values_node->GetOperator()); PartListRuleExpr *expr = MakeNode(PartListRuleExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1778,13 +1802,13 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartListValuesToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarPartListNullTestToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarPartListNullTestToScalar( const CDXLNode *part_list_null_test_node, - CMappingColIdVar * //colid_var - ) + CMappingColIdVar * //colid_var +) { - CDXLScalarPartListNullTest *dxlop = CDXLScalarPartListNullTest::Cast(part_list_null_test_node->GetOperator()); + CDXLScalarPartListNullTest *dxlop = CDXLScalarPartListNullTest::Cast( + part_list_null_test_node->GetOperator()); PartListNullTestExpr *expr = MakeNode(PartListNullTestExpr); expr->level = dxlop->GetPartitioningLevel(); @@ -1802,18 +1826,20 @@ CTranslatorDXLToScalar::TranslateDXLScalarPartListNullTestToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar - ( - const CDXLNode *scalar_id_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar( + const CDXLNode *scalar_id_node, CMappingColIdVar *colid_var) { - CMappingColIdVarPlStmt *colid_var_plstmt_map = dynamic_cast(colid_var); + CMappingColIdVarPlStmt *colid_var_plstmt_map = + dynamic_cast(colid_var); // scalar identifier - CDXLScalarIdent *dxlop = CDXLScalarIdent::Cast(scalar_id_node->GetOperator()); + CDXLScalarIdent *dxlop = + CDXLScalarIdent::Cast(scalar_id_node->GetOperator()); Expr *result_expr = NULL; - if (NULL == colid_var_plstmt_map || NULL == colid_var_plstmt_map->GetOutputContext()->GetParamIdMappingElement(dxlop->GetDXLColRef()->Id())) + if (NULL == colid_var_plstmt_map || + NULL == + colid_var_plstmt_map->GetOutputContext()->GetParamIdMappingElement( + dxlop->GetDXLColRef()->Id())) { // not an outer ref -> Translate var node result_expr = (Expr *) colid_var->VarFromDXLNodeScId(dxlop); @@ -1821,12 +1847,14 @@ CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar else { // outer ref -> Translate param node - result_expr = (Expr *) colid_var_plstmt_map->ParamFromDXLNodeScId(dxlop); + result_expr = + (Expr *) colid_var_plstmt_map->ParamFromDXLNodeScId(dxlop); } - if (NULL == result_expr) + if (NULL == result_expr) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, dxlop->GetDXLColRef()->Id()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, + dxlop->GetDXLColRef()->Id()); } return result_expr; } @@ -1840,22 +1868,23 @@ CTranslatorDXLToScalar::TranslateDXLScalarIdentToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarCmpToScalar - ( - const CDXLNode *scalar_cmp_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarCmpToScalar( + const CDXLNode *scalar_cmp_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_cmp_node); - CDXLScalarComp *dxlop = CDXLScalarComp::Cast(scalar_cmp_node->GetOperator()); + CDXLScalarComp *dxlop = + CDXLScalarComp::Cast(scalar_cmp_node->GetOperator()); OpExpr *op_expr = MakeNode(OpExpr); op_expr->opno = CMDIdGPDB::CastMdid(dxlop->MDId())->Oid(); - const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(dxlop->MDId()); + const IMDScalarOp *md_scalar_op = + m_md_accessor->RetrieveScOp(dxlop->MDId()); op_expr->opfuncid = CMDIdGPDB::CastMdid(md_scalar_op->FuncMdId())->Oid(); - op_expr->opresulttype = CMDIdGPDB::CastMdid(m_md_accessor->PtMDType()->MDId())->Oid(); + op_expr->opresulttype = + CMDIdGPDB::CastMdid(m_md_accessor->PtMDType()->MDId()) + ->Oid(); op_expr->opretset = false; // translate left and right child @@ -1881,20 +1910,19 @@ CTranslatorDXLToScalar::TranslateDXLScalarCmpToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarArrayToScalar - ( - const CDXLNode *scalar_array_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarArrayToScalar( + const CDXLNode *scalar_array_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_array_node); - CDXLScalarArray *dxlop = CDXLScalarArray::Cast(scalar_array_node->GetOperator()); + CDXLScalarArray *dxlop = + CDXLScalarArray::Cast(scalar_array_node->GetOperator()); ArrayExpr *expr = MakeNode(ArrayExpr); expr->element_typeid = CMDIdGPDB::CastMdid(dxlop->ElementTypeMDid())->Oid(); expr->array_typeid = CMDIdGPDB::CastMdid(dxlop->ArrayTypeMDid())->Oid(); expr->multidims = dxlop->IsMultiDimensional(); - expr->elements = TranslateScalarChildren(expr->elements, scalar_array_node, colid_var); + expr->elements = + TranslateScalarChildren(expr->elements, scalar_array_node, colid_var); /* * ORCA doesn't know how to construct array constants, so it will @@ -1916,31 +1944,37 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayToScalar // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarArrayRefToScalar - ( - const CDXLNode *scalar_array_ref_node, - CMappingColIdVar *colid_var - ) +CTranslatorDXLToScalar::TranslateDXLScalarArrayRefToScalar( + const CDXLNode *scalar_array_ref_node, CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != scalar_array_ref_node); - CDXLScalarArrayRef *dxlop = CDXLScalarArrayRef::Cast(scalar_array_ref_node->GetOperator()); + CDXLScalarArrayRef *dxlop = + CDXLScalarArrayRef::Cast(scalar_array_ref_node->GetOperator()); ArrayRef *array_ref = MakeNode(ArrayRef); - array_ref->refarraytype = CMDIdGPDB::CastMdid(dxlop->ArrayTypeMDid())->Oid(); - array_ref->refelemtype = CMDIdGPDB::CastMdid(dxlop->ElementTypeMDid())->Oid(); + array_ref->refarraytype = + CMDIdGPDB::CastMdid(dxlop->ArrayTypeMDid())->Oid(); + array_ref->refelemtype = + CMDIdGPDB::CastMdid(dxlop->ElementTypeMDid())->Oid(); array_ref->reftypmod = dxlop->TypeModifier(); const ULONG arity = scalar_array_ref_node->Arity(); GPOS_ASSERT(3 == arity || 4 == arity); - array_ref->reflowerindexpr = TranslateDXLArrayRefIndexListToScalar((*scalar_array_ref_node)[0], CDXLScalarArrayRefIndexList::EilbLower, colid_var); - array_ref->refupperindexpr = TranslateDXLArrayRefIndexListToScalar((*scalar_array_ref_node)[1], CDXLScalarArrayRefIndexList::EilbUpper, colid_var); + array_ref->reflowerindexpr = TranslateDXLArrayRefIndexListToScalar( + (*scalar_array_ref_node)[0], CDXLScalarArrayRefIndexList::EilbLower, + colid_var); + array_ref->refupperindexpr = TranslateDXLArrayRefIndexListToScalar( + (*scalar_array_ref_node)[1], CDXLScalarArrayRefIndexList::EilbUpper, + colid_var); - array_ref->refexpr = TranslateDXLToScalar((*scalar_array_ref_node)[2], colid_var); + array_ref->refexpr = + TranslateDXLToScalar((*scalar_array_ref_node)[2], colid_var); array_ref->refassgnexpr = NULL; if (4 == arity) { - array_ref->refassgnexpr = TranslateDXLToScalar((*scalar_array_ref_node)[3], colid_var); + array_ref->refassgnexpr = + TranslateDXLToScalar((*scalar_array_ref_node)[3], colid_var); } return (Expr *) array_ref; @@ -1955,19 +1989,19 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayRefToScalar // //--------------------------------------------------------------------------- List * -CTranslatorDXLToScalar::TranslateDXLArrayRefIndexListToScalar - ( +CTranslatorDXLToScalar::TranslateDXLArrayRefIndexListToScalar( const CDXLNode *index_list_node, CDXLScalarArrayRefIndexList::EIndexListBound #ifdef GPOS_DEBUG - index_list_bound -#endif //GPOS_DEBUG + index_list_bound +#endif //GPOS_DEBUG , - CMappingColIdVar *colid_var - ) + CMappingColIdVar *colid_var) { GPOS_ASSERT(NULL != index_list_node); - GPOS_ASSERT(index_list_bound == CDXLScalarArrayRefIndexList::Cast(index_list_node->GetOperator())->GetDXLIndexListBound()); + GPOS_ASSERT(index_list_bound == CDXLScalarArrayRefIndexList::Cast( + index_list_node->GetOperator()) + ->GetDXLIndexListBound()); List *children = NIL; children = TranslateScalarChildren(children, index_list_node, colid_var); @@ -1980,22 +2014,22 @@ CTranslatorDXLToScalar::TranslateDXLArrayRefIndexListToScalar // CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar // // @doc: -// Translates a DML action expression +// Translates a DML action expression // //--------------------------------------------------------------------------- Expr * -CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar - ( +CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar( const CDXLNode * #ifdef GPOS_DEBUG - dml_action_node + dml_action_node #endif , - CMappingColIdVar * // colid_var - ) + CMappingColIdVar * // colid_var +) { GPOS_ASSERT(NULL != dml_action_node); - GPOS_ASSERT(EdxlopScalarDMLAction == dml_action_node->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarDMLAction == + dml_action_node->GetOperator()->GetDXLOperator()); DMLActionExpr *expr = MakeNode(DMLActionExpr); @@ -2013,13 +2047,11 @@ CTranslatorDXLToScalar::TranslateDXLScalarDMLActionToScalar // //--------------------------------------------------------------------------- Oid -CTranslatorDXLToScalar::GetFunctionReturnTypeOid - ( - IMDId *mdid - ) - const +CTranslatorDXLToScalar::GetFunctionReturnTypeOid(IMDId *mdid) const { - return CMDIdGPDB::CastMdid(m_md_accessor->RetrieveFunc(mdid)->GetResultTypeMdid())->Oid(); + return CMDIdGPDB::CastMdid( + m_md_accessor->RetrieveFunc(mdid)->GetResultTypeMdid()) + ->Oid(); } //--------------------------------------------------------------------------- @@ -2031,20 +2063,17 @@ CTranslatorDXLToScalar::GetFunctionReturnTypeOid // //--------------------------------------------------------------------------- BOOL -CTranslatorDXLToScalar::HasBoolResult - ( - CDXLNode *dxlnode, - CMDAccessor *md_accessor - ) +CTranslatorDXLToScalar::HasBoolResult(CDXLNode *dxlnode, + CMDAccessor *md_accessor) { GPOS_ASSERT(NULL != dxlnode); - if(EdxloptypeScalar != dxlnode->GetOperator()->GetDXLOperatorType()) + if (EdxloptypeScalar != dxlnode->GetOperator()->GetDXLOperatorType()) { return false; } - CDXLScalar *dxlop = dynamic_cast(dxlnode->GetOperator()); + CDXLScalar *dxlop = dynamic_cast(dxlnode->GetOperator()); return dxlop->HasBoolResult(md_accessor); } @@ -2058,20 +2087,20 @@ CTranslatorDXLToScalar::HasBoolResult // //--------------------------------------------------------------------------- BOOL -CTranslatorDXLToScalar::HasConstTrue - ( - CDXLNode *dxlnode, - CMDAccessor *md_accessor - ) +CTranslatorDXLToScalar::HasConstTrue(CDXLNode *dxlnode, + CMDAccessor *md_accessor) { GPOS_ASSERT(NULL != dxlnode); - if (!HasBoolResult(dxlnode, md_accessor) || EdxlopScalarConstValue != dxlnode->GetOperator()->GetDXLOperator()) + if (!HasBoolResult(dxlnode, md_accessor) || + EdxlopScalarConstValue != dxlnode->GetOperator()->GetDXLOperator()) { return false; } - CDXLScalarConstValue *dxlop = CDXLScalarConstValue::Cast(dxlnode->GetOperator()); - CDXLDatumBool *datum_bool_dxl = CDXLDatumBool::Cast(const_cast(dxlop->GetDatumVal())); + CDXLScalarConstValue *dxlop = + CDXLScalarConstValue::Cast(dxlnode->GetOperator()); + CDXLDatumBool *datum_bool_dxl = + CDXLDatumBool::Cast(const_cast(dxlop->GetDatumVal())); return datum_bool_dxl->GetValue(); } @@ -2085,10 +2114,7 @@ CTranslatorDXLToScalar::HasConstTrue // //--------------------------------------------------------------------------- BOOL -CTranslatorDXLToScalar::HasConstNull - ( - CDXLNode *dxlnode - ) +CTranslatorDXLToScalar::HasConstNull(CDXLNode *dxlnode) { GPOS_ASSERT(NULL != dxlnode); if (EdxlopScalarConstValue != dxlnode->GetOperator()->GetDXLOperator()) @@ -2096,7 +2122,8 @@ CTranslatorDXLToScalar::HasConstNull return false; } - CDXLScalarConstValue *dxlop = CDXLScalarConstValue::Cast(dxlnode->GetOperator()); + CDXLScalarConstValue *dxlop = + CDXLScalarConstValue::Cast(dxlnode->GetOperator()); return dxlop->GetDatumVal()->IsNull(); } diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp index 9d232d8972..93ec2826c9 100644 --- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp @@ -58,65 +58,35 @@ using namespace gpopt; using namespace gpnaucrates; using namespace gpmd; -extern bool optimizer_enable_ctas; +extern bool optimizer_enable_ctas; extern bool optimizer_enable_dml; extern bool optimizer_enable_dml_triggers; extern bool optimizer_enable_dml_constraints; extern bool optimizer_enable_multiple_distinct_aggs; // OIDs of variants of LEAD window function -static const OID lead_func_oids[] = - { - 7011, 7074, 7075, 7310, 7312, - 7314, 7316, 7318, - 7320, 7322, 7324, 7326, 7328, - 7330, 7332, 7334, 7336, 7338, - 7340, 7342, 7344, 7346, 7348, - 7350, 7352, 7354, 7356, 7358, - 7360, 7362, 7364, 7366, 7368, - 7370, 7372, 7374, 7376, 7378, - 7380, 7382, 7384, 7386, 7388, - 7390, 7392, 7394, 7396, 7398, - 7400, 7402, 7404, 7406, 7408, - 7410, 7412, 7414, 7416, 7418, - 7420, 7422, 7424, 7426, 7428, - 7430, 7432, 7434, 7436, 7438, - 7440, 7442, 7444, 7446, 7448, - 7450, 7452, 7454, 7456, 7458, - 7460, 7462, 7464, 7466, 7468, - 7470, 7472, 7474, 7476, 7478, - 7480, 7482, 7484, 7486, 7488, - 7214, 7215, 7216, 7220, 7222, - 7224, 7244, 7246, 7248, 7260, - 7262, 7264 - }; +static const OID lead_func_oids[] = { + 7011, 7074, 7075, 7310, 7312, 7314, 7316, 7318, 7320, 7322, 7324, 7326, + 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, 7344, 7346, 7348, 7350, + 7352, 7354, 7356, 7358, 7360, 7362, 7364, 7366, 7368, 7370, 7372, 7374, + 7376, 7378, 7380, 7382, 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, + 7400, 7402, 7404, 7406, 7408, 7410, 7412, 7414, 7416, 7418, 7420, 7422, + 7424, 7426, 7428, 7430, 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, + 7448, 7450, 7452, 7454, 7456, 7458, 7460, 7462, 7464, 7466, 7468, 7470, + 7472, 7474, 7476, 7478, 7480, 7482, 7484, 7486, 7488, 7214, 7215, 7216, + 7220, 7222, 7224, 7244, 7246, 7248, 7260, 7262, 7264}; // OIDs of variants of LAG window function -static const OID lag_func_oids[] = - { - 7675, 7491, 7493, 7495, 7497, 7499, - 7501, 7503, 7505, 7507, 7509, - 7511, 7513, 7515, 7517, 7519, - 7521, 7523, 7525, 7527, 7529, - 7531, 7533, 7535, 7537, 7539, - 7541, 7543, 7545, 7547, 7549, - 7551, 7553, 7555, 7557, 7559, - 7561, 7563, 7565, 7567, 7569, - 7571, 7573, 7575, 7577, 7579, - 7581, 7583, 7585, 7587, 7589, - 7591, 7593, 7595, 7597, 7599, - 7601, 7603, 7605, 7607, 7609, - 7611, 7613, 7615, 7617, 7619, - 7621, 7623, 7625, 7627, 7629, - 7631, 7633, 7635, 7637, 7639, - 7641, 7643, 7645, 7647, 7649, - 7651, 7653, 7655, 7657, 7659, - 7661, 7663, 7665, 7667, 7669, - 7671, 7673, - 7211, 7212, 7213, 7226, 7228, - 7230, 7250, 7252, 7254, 7266, - 7268, 7270 - }; +static const OID lag_func_oids[] = { + 7675, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, 7507, 7509, 7511, + 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, 7531, 7533, 7535, + 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, 7555, 7557, 7559, + 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, 7579, 7581, 7583, + 7585, 7587, 7589, 7591, 7593, 7595, 7597, 7599, 7601, 7603, 7605, 7607, + 7609, 7611, 7613, 7615, 7617, 7619, 7621, 7623, 7625, 7627, 7629, 7631, + 7633, 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7653, 7655, + 7657, 7659, 7661, 7663, 7665, 7667, 7669, 7671, 7673, 7211, 7212, 7213, + 7226, 7228, 7230, 7250, 7252, 7254, 7266, 7268, 7270}; //--------------------------------------------------------------------------- // @function: @@ -126,41 +96,33 @@ static const OID lag_func_oids[] = // Ctor // //--------------------------------------------------------------------------- -CTranslatorQueryToDXL::CTranslatorQueryToDXL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *m_colid_counter, - CIdGenerator *cte_id_counter, - CMappingVarColId *var_colid_mapping, - Query *query, - ULONG query_level, - BOOL is_top_query_dml, - HMUlCTEListEntry *query_level_to_cte_map - ) - : - m_mp(mp), - m_sysid(IMDId::EmdidGPDB, GPMD_GPDB_SYSID), - m_md_accessor(md_accessor), - m_colid_counter(m_colid_counter), - m_cte_id_counter(cte_id_counter), - m_var_to_colid_map(var_colid_mapping), - m_query_level(query_level), - m_has_distributed_tables(false), - m_is_top_query_dml(is_top_query_dml), - m_is_ctas_query(false), - m_query_level_to_cte_map(NULL), - m_dxl_query_output_cols(NULL), - m_dxl_cte_producers(NULL), - m_cteid_at_current_query_level_map(NULL) +CTranslatorQueryToDXL::CTranslatorQueryToDXL( + CMemoryPool *mp, CMDAccessor *md_accessor, CIdGenerator *m_colid_counter, + CIdGenerator *cte_id_counter, CMappingVarColId *var_colid_mapping, + Query *query, ULONG query_level, BOOL is_top_query_dml, + HMUlCTEListEntry *query_level_to_cte_map) + : m_mp(mp), + m_sysid(IMDId::EmdidGPDB, GPMD_GPDB_SYSID), + m_md_accessor(md_accessor), + m_colid_counter(m_colid_counter), + m_cte_id_counter(cte_id_counter), + m_var_to_colid_map(var_colid_mapping), + m_query_level(query_level), + m_has_distributed_tables(false), + m_is_top_query_dml(is_top_query_dml), + m_is_ctas_query(false), + m_query_level_to_cte_map(NULL), + m_dxl_query_output_cols(NULL), + m_dxl_cte_producers(NULL), + m_cteid_at_current_query_level_map(NULL) { GPOS_ASSERT(NULL != query); CheckSupportedCmdType(query); - + m_query_level_to_cte_map = GPOS_NEW(m_mp) HMUlCTEListEntry(m_mp); m_dxl_cte_producers = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); m_cteid_at_current_query_level_map = GPOS_NEW(m_mp) UlongBoolHashMap(m_mp); - + if (NULL != query_level_to_cte_map) { HMIterUlCTEListEntry cte_list_hashmap_iter(query_level_to_cte_map); @@ -169,7 +131,8 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL { ULONG cte_query_level = *(cte_list_hashmap_iter.Key()); - CCTEListEntry *cte_list_entry = const_cast(cte_list_hashmap_iter.Value()); + CCTEListEntry *cte_list_entry = + const_cast(cte_list_hashmap_iter.Value()); // CTE's that have been defined before the m_query_level // should only be inserted into the hash map @@ -193,7 +156,8 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL #ifdef GPOS_DEBUG BOOL is_res = #endif - m_query_level_to_cte_map->Insert(GPOS_NEW(mp) ULONG(cte_query_level), cte_list_entry); + m_query_level_to_cte_map->Insert( + GPOS_NEW(mp) ULONG(cte_query_level), cte_list_entry); GPOS_ASSERT(is_res); } } @@ -206,25 +170,18 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL CheckSirvFuncsWithoutFromClause(query); // first normalize the query - m_query = CQueryMutators::NormalizeQuery(m_mp, m_md_accessor, query, query_level); + m_query = + CQueryMutators::NormalizeQuery(m_mp, m_md_accessor, query, query_level); if (NULL != m_query->cteList) { ConstructCTEProducerList(m_query->cteList, query_level); } - m_scalar_translator = GPOS_NEW(m_mp) CTranslatorScalarToDXL - ( - m_mp, - m_md_accessor, - m_colid_counter, - m_cte_id_counter, - m_query_level, - true, /* m_fQuery */ - m_query_level_to_cte_map, - m_dxl_cte_producers - ); - + m_scalar_translator = GPOS_NEW(m_mp) CTranslatorScalarToDXL( + m_mp, m_md_accessor, m_colid_counter, m_cte_id_counter, m_query_level, + true, /* m_fQuery */ + m_query_level_to_cte_map, m_dxl_cte_producers); } //--------------------------------------------------------------------------- @@ -236,30 +193,16 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL // //--------------------------------------------------------------------------- CTranslatorQueryToDXL * -CTranslatorQueryToDXL::QueryToDXLInstance - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *m_colid_counter, - CIdGenerator *cte_id_counter, - CMappingVarColId *var_colid_mapping, - Query *query, - ULONG query_level, - HMUlCTEListEntry *query_level_to_cte_map - ) +CTranslatorQueryToDXL::QueryToDXLInstance( + CMemoryPool *mp, CMDAccessor *md_accessor, CIdGenerator *m_colid_counter, + CIdGenerator *cte_id_counter, CMappingVarColId *var_colid_mapping, + Query *query, ULONG query_level, HMUlCTEListEntry *query_level_to_cte_map) { - return GPOS_NEW(mp) CTranslatorQueryToDXL - ( - mp, - md_accessor, - m_colid_counter, - cte_id_counter, - var_colid_mapping, - query, - query_level, - false, // is_top_query_dml - query_level_to_cte_map - ); + return GPOS_NEW(mp) + CTranslatorQueryToDXL(mp, md_accessor, m_colid_counter, cte_id_counter, + var_colid_mapping, query, query_level, + false, // is_top_query_dml + query_level_to_cte_map); } //--------------------------------------------------------------------------- @@ -290,13 +233,9 @@ CTranslatorQueryToDXL::~CTranslatorQueryToDXL() // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::CheckUnsupportedNodeTypes - ( - Query *query - ) +CTranslatorQueryToDXL::CheckUnsupportedNodeTypes(Query *query) { - static const SUnsupportedFeature unsupported_features[] = - { + static const SUnsupportedFeature unsupported_features[] = { {T_RowExpr, GPOS_WSZ_LIT("ROW EXPRESSION")}, {T_RowCompareExpr, GPOS_WSZ_LIT("ROW COMPARE")}, {T_FieldSelect, GPOS_WSZ_LIT("FIELDSELECT")}, @@ -310,7 +249,8 @@ CTranslatorQueryToDXL::CheckUnsupportedNodeTypes List *unsupported_list = NIL; for (ULONG ul = 0; ul < GPOS_ARRAY_SIZE(unsupported_features); ul++) { - unsupported_list = gpdb::LAppendInt(unsupported_list, unsupported_features[ul].node_tag); + unsupported_list = gpdb::LAppendInt(unsupported_list, + unsupported_features[ul].node_tag); } INT unsupported_node = gpdb::FindNodes((Node *) query, unsupported_list); @@ -318,7 +258,8 @@ CTranslatorQueryToDXL::CheckUnsupportedNodeTypes if (0 <= unsupported_node) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, unsupported_features[unsupported_node].m_feature_name); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + unsupported_features[unsupported_node].m_feature_name); } } @@ -332,14 +273,12 @@ CTranslatorQueryToDXL::CheckUnsupportedNodeTypes // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::CheckSirvFuncsWithoutFromClause - ( - Query *query - ) +CTranslatorQueryToDXL::CheckSirvFuncsWithoutFromClause(Query *query) { // if there is a FROM clause or if target list is empty, look no further - if ((NULL != query->jointree && 0 < gpdb::ListLength(query->jointree->fromlist)) - || NIL == query->targetList) + if ((NULL != query->jointree && + 0 < gpdb::ListLength(query->jointree->fromlist)) || + NIL == query->targetList) { return; } @@ -347,7 +286,8 @@ CTranslatorQueryToDXL::CheckSirvFuncsWithoutFromClause // see if we have SIRV functions in the target list if (HasSirvFunctions((Node *) query->targetList)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("SIRV functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("SIRV functions")); } } @@ -360,22 +300,20 @@ CTranslatorQueryToDXL::CheckSirvFuncsWithoutFromClause // //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::HasSirvFunctions - ( - Node *node - ) - const +CTranslatorQueryToDXL::HasSirvFunctions(Node *node) const { GPOS_ASSERT(NULL != node); - List *function_list = gpdb::ExtractNodesExpression(node, T_FuncExpr, true /*descendIntoSubqueries*/); + List *function_list = gpdb::ExtractNodesExpression( + node, T_FuncExpr, true /*descendIntoSubqueries*/); ListCell *lc = NULL; BOOL has_sirv = false; - ForEach (lc, function_list) + ForEach(lc, function_list) { FuncExpr *func_expr = (FuncExpr *) lfirst(lc); - if (CTranslatorUtils::IsSirvFunc(m_mp, m_md_accessor, func_expr->funcid)) + if (CTranslatorUtils::IsSirvFunc(m_mp, m_md_accessor, + func_expr->funcid)) { has_sirv = true; break; @@ -395,35 +333,38 @@ CTranslatorQueryToDXL::HasSirvFunctions // type not yet supported //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::CheckSupportedCmdType - ( - Query *query - ) +CTranslatorQueryToDXL::CheckSupportedCmdType(Query *query) { if (NULL != query->utilityStmt) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("UTILITY command")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("UTILITY command")); } if (CMD_SELECT == query->commandType) { - if (!optimizer_enable_ctas && (NULL != query->intoClause || query->isCopy)) + if (!optimizer_enable_ctas && + (NULL != query->intoClause || query->isCopy)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("CTAS. Set optimizer_enable_ctas to on to enable CTAS with GPORCA")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "CTAS. Set optimizer_enable_ctas to on to enable CTAS with GPORCA")); } if (query->isCopy) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("COPY. Copy select statement to file on segment is not supported with GPORCA")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "COPY. Copy select statement to file on segment is not supported with GPORCA")); } - + // supported: regular select or CTAS when it is enabled return; } - static const SCmdNameElem unsupported_commands[] = - { - {CMD_UTILITY, GPOS_WSZ_LIT("UTILITY command")} - }; + static const SCmdNameElem unsupported_commands[] = { + {CMD_UTILITY, GPOS_WSZ_LIT("UTILITY command")}}; const ULONG length = GPOS_ARRAY_SIZE(unsupported_commands); for (ULONG ul = 0; ul < length; ul++) @@ -431,7 +372,8 @@ CTranslatorQueryToDXL::CheckSupportedCmdType SCmdNameElem mapelem = unsupported_commands[ul]; if (mapelem.m_cmd_type == query->commandType) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, mapelem.m_cmd_name); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + mapelem.m_cmd_name); } } } @@ -484,59 +426,69 @@ CTranslatorQueryToDXL::TranslateSelectQueryToDXL() CTranslatorUtils::CheckRTEPermissions(m_query->rtable); CDXLNode *child_dxlnode = NULL; - IntToUlongMap *sort_group_attno_to_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - IntToUlongMap *output_attno_to_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); + IntToUlongMap *sort_group_attno_to_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + IntToUlongMap *output_attno_to_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); // construct CTEAnchor operators for the CTEs defined at the top level CDXLNode *dxl_cte_anchor_top = NULL; CDXLNode *dxl_cte_anchor_bottom = NULL; - ConstructCTEAnchors(m_dxl_cte_producers, &dxl_cte_anchor_top, &dxl_cte_anchor_bottom); - GPOS_ASSERT_IMP(m_dxl_cte_producers == NULL || 0 < m_dxl_cte_producers->Size(), - NULL != dxl_cte_anchor_top && NULL != dxl_cte_anchor_bottom); - - GPOS_ASSERT_IMP(NULL != m_query->setOperations, 0 == gpdb::ListLength(m_query->windowClause)); + ConstructCTEAnchors(m_dxl_cte_producers, &dxl_cte_anchor_top, + &dxl_cte_anchor_bottom); + GPOS_ASSERT_IMP( + m_dxl_cte_producers == NULL || 0 < m_dxl_cte_producers->Size(), + NULL != dxl_cte_anchor_top && NULL != dxl_cte_anchor_bottom); + + GPOS_ASSERT_IMP(NULL != m_query->setOperations, + 0 == gpdb::ListLength(m_query->windowClause)); if (NULL != m_query->setOperations) { List *target_list = m_query->targetList; // translate set operations - child_dxlnode = TranslateSetOpToDXL(m_query->setOperations, target_list, output_attno_to_colid_mapping); + child_dxlnode = TranslateSetOpToDXL(m_query->setOperations, target_list, + output_attno_to_colid_mapping); - CDXLLogicalSetOp *dxlop = CDXLLogicalSetOp::Cast(child_dxlnode->GetOperator()); - const CDXLColDescrArray *dxl_col_descr_array = dxlop->GetDXLColumnDescrArray(); + CDXLLogicalSetOp *dxlop = + CDXLLogicalSetOp::Cast(child_dxlnode->GetOperator()); + const CDXLColDescrArray *dxl_col_descr_array = + dxlop->GetDXLColumnDescrArray(); ListCell *lc = NULL; ULONG resno = 1; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); if (0 < target_entry->ressortgroupref) { ULONG colid = ((*dxl_col_descr_array)[resno - 1])->Id(); - AddSortingGroupingColumn(target_entry, sort_group_attno_to_colid_mapping, colid); + AddSortingGroupingColumn( + target_entry, sort_group_attno_to_colid_mapping, colid); } resno++; } } - else if (0 != gpdb::ListLength(m_query->windowClause)) // translate window clauses + else if (0 != gpdb::ListLength( + m_query->windowClause)) // translate window clauses { CDXLNode *dxlnode = TranslateFromExprToDXL(m_query->jointree); GPOS_ASSERT(NULL == m_query->groupClause); - child_dxlnode = TranslateWindowToDXL - ( - dxlnode, - m_query->targetList, - m_query->windowClause, - m_query->sortClause, - sort_group_attno_to_colid_mapping, - output_attno_to_colid_mapping - ); + child_dxlnode = TranslateWindowToDXL( + dxlnode, m_query->targetList, m_query->windowClause, + m_query->sortClause, sort_group_attno_to_colid_mapping, + output_attno_to_colid_mapping); } else { - child_dxlnode = TranslateGroupingSets(m_query->jointree, m_query->targetList, m_query->groupClause, m_query->hasAggs, sort_group_attno_to_colid_mapping, output_attno_to_colid_mapping); + child_dxlnode = TranslateGroupingSets( + m_query->jointree, m_query->targetList, m_query->groupClause, + m_query->hasAggs, sort_group_attno_to_colid_mapping, + output_attno_to_colid_mapping); } // translate limit clause - CDXLNode *limit_dxlnode = TranslateLimitToDXLGroupBy(m_query->sortClause, m_query->limitCount, m_query->limitOffset, child_dxlnode, sort_group_attno_to_colid_mapping); + CDXLNode *limit_dxlnode = TranslateLimitToDXLGroupBy( + m_query->sortClause, m_query->limitCount, m_query->limitOffset, + child_dxlnode, sort_group_attno_to_colid_mapping); if (NULL == m_query->targetList) @@ -545,24 +497,25 @@ CTranslatorQueryToDXL::TranslateSelectQueryToDXL() } else { - m_dxl_query_output_cols = CreateDXLOutputCols(m_query->targetList, output_attno_to_colid_mapping); + m_dxl_query_output_cols = CreateDXLOutputCols( + m_query->targetList, output_attno_to_colid_mapping); } // cleanup CRefCount::SafeRelease(sort_group_attno_to_colid_mapping); output_attno_to_colid_mapping->Release(); - + // add CTE anchors if needed CDXLNode *result_dxlnode = limit_dxlnode; - + if (NULL != dxl_cte_anchor_top) { GPOS_ASSERT(NULL != dxl_cte_anchor_bottom); dxl_cte_anchor_bottom->AddChild(result_dxlnode); result_dxlnode = dxl_cte_anchor_top; } - + return result_dxlnode; } @@ -575,19 +528,17 @@ CTranslatorQueryToDXL::TranslateSelectQueryToDXL() // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateSelectProjectJoinToDXL - ( - List *target_list, - FromExpr *from_expr, +CTranslatorQueryToDXL::TranslateSelectProjectJoinToDXL( + List *target_list, FromExpr *from_expr, IntToUlongMap *sort_group_attno_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping, - List *group_clause - ) + IntToUlongMap *output_attno_to_colid_mapping, List *group_clause) { CDXLNode *join_tree_dxlnode = TranslateFromExprToDXL(from_expr); // translate target list entries into a logical project - return TranslateTargetListToDXLProject(target_list, join_tree_dxlnode, sort_group_attno_to_colid_mapping, output_attno_to_colid_mapping, group_clause); + return TranslateTargetListToDXLProject( + target_list, join_tree_dxlnode, sort_group_attno_to_colid_mapping, + output_attno_to_colid_mapping, group_clause); } //--------------------------------------------------------------------------- @@ -600,19 +551,18 @@ CTranslatorQueryToDXL::TranslateSelectProjectJoinToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateSelectProjectJoinForGrpSetsToDXL - ( - List *target_list, - FromExpr *from_expr, +CTranslatorQueryToDXL::TranslateSelectProjectJoinForGrpSetsToDXL( + List *target_list, FromExpr *from_expr, IntToUlongMap *sort_group_attno_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping, - List *group_clause - ) + IntToUlongMap *output_attno_to_colid_mapping, List *group_clause) { CDXLNode *join_tree_dxlnode = TranslateFromExprToDXL(from_expr); // translate target list entries into a logical project - return TranslateTargetListToDXLProject(target_list, join_tree_dxlnode, sort_group_attno_to_colid_mapping, output_attno_to_colid_mapping, group_clause, true /*is_expand_aggref_expr*/); + return TranslateTargetListToDXLProject( + target_list, join_tree_dxlnode, sort_group_attno_to_colid_mapping, + output_attno_to_colid_mapping, group_clause, + true /*is_expand_aggref_expr*/); } //--------------------------------------------------------------------------- @@ -626,7 +576,8 @@ CTranslatorQueryToDXL::TranslateSelectProjectJoinForGrpSetsToDXL CDXLNode * CTranslatorQueryToDXL::TranslateQueryToDXL() { - CAutoTimer at("\n[OPT]: Query To DXL Translation Time", GPOS_FTRACE(EopttracePrintOptimizationStatistics)); + CAutoTimer at("\n[OPT]: Query To DXL Translation Time", + GPOS_FTRACE(EopttracePrintOptimizationStatistics)); switch (m_query->commandType) { @@ -669,38 +620,48 @@ CTranslatorQueryToDXL::TranslateInsertQueryToDXL() if (!optimizer_enable_dml) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("DML not enabled")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("DML not enabled")); } CDXLNode *query_dxlnode = TranslateSelectQueryToDXL(); - const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, m_query->resultRelation - 1); + const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth( + m_query->rtable, m_query->resultRelation - 1); - CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr(m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); + CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr( + m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - if (!optimizer_enable_dml_triggers && CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, Edxldmlinsert)) + if (!optimizer_enable_dml_triggers && + CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, + Edxldmlinsert)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("INSERT with triggers")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("INSERT with triggers")); } BOOL rel_has_constraints = CTranslatorUtils::RelHasConstraints(md_rel); if (!optimizer_enable_dml_constraints && rel_has_constraints) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("INSERT with constraints")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("INSERT with constraints")); } - - const ULONG num_table_columns = CTranslatorUtils::GetNumNonSystemColumns(md_rel); + + const ULONG num_table_columns = + CTranslatorUtils::GetNumNonSystemColumns(md_rel); const ULONG target_list_length = gpdb::ListLength(m_query->targetList); GPOS_ASSERT(num_table_columns >= target_list_length); GPOS_ASSERT(target_list_length == m_dxl_query_output_cols->Size()); CDXLNode *project_list_dxlnode = NULL; - + const ULONG num_system_cols = md_rel->ColumnCount() - num_table_columns; - const ULONG num_non_dropped_cols = md_rel->NonDroppedColsCount() - num_system_cols; + const ULONG num_non_dropped_cols = + md_rel->NonDroppedColsCount() - num_system_cols; if (num_non_dropped_cols > target_list_length) { // missing target list entries - project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + project_list_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); } ULongPtrArray *source_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); @@ -710,24 +671,28 @@ CTranslatorQueryToDXL::TranslateInsertQueryToDXL() { const IMDColumn *mdcol = md_rel->GetMdCol(ul); GPOS_ASSERT(!mdcol->IsSystemColumn()); - + if (mdcol->IsDropped()) { continue; } - + if (target_list_pos < target_list_length) { INT attno = mdcol->AttrNum(); - - TargetEntry *target_entry = (TargetEntry *) gpdb::ListNth(m_query->targetList, target_list_pos); + + TargetEntry *target_entry = (TargetEntry *) gpdb::ListNth( + m_query->targetList, target_list_pos); AttrNumber resno = target_entry->resno; if (attno == resno) { - CDXLNode *dxl_column = (*m_dxl_query_output_cols)[target_list_pos]; - CDXLScalarIdent *dxl_ident = CDXLScalarIdent::Cast(dxl_column->GetOperator()); - source_array->Append(GPOS_NEW(m_mp) ULONG(dxl_ident->GetDXLColRef()->Id())); + CDXLNode *dxl_column = + (*m_dxl_query_output_cols)[target_list_pos]; + CDXLScalarIdent *dxl_ident = + CDXLScalarIdent::Cast(dxl_column->GetOperator()); + source_array->Append( + GPOS_NEW(m_mp) ULONG(dxl_ident->GetDXLColRef()->Id())); target_list_pos++; continue; } @@ -735,19 +700,24 @@ CTranslatorQueryToDXL::TranslateInsertQueryToDXL() // target entry corresponding to the tables column not found, therefore // add a project element with null value scalar child - CDXLNode *project_elem_dxlnode = CTranslatorUtils::CreateDXLProjElemConstNULL(m_mp, m_md_accessor, m_colid_counter, mdcol); - ULONG colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); + CDXLNode *project_elem_dxlnode = + CTranslatorUtils::CreateDXLProjElemConstNULL( + m_mp, m_md_accessor, m_colid_counter, mdcol); + ULONG colid = + CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); project_list_dxlnode->AddChild(project_elem_dxlnode); - source_array->Append(GPOS_NEW(m_mp) ULONG(colid)); + source_array->Append(GPOS_NEW(m_mp) ULONG(colid)); } - CDXLLogicalInsert *insert_dxlnode = GPOS_NEW(m_mp) CDXLLogicalInsert(m_mp, table_descr, source_array); + CDXLLogicalInsert *insert_dxlnode = + GPOS_NEW(m_mp) CDXLLogicalInsert(m_mp, table_descr, source_array); if (NULL != project_list_dxlnode) { GPOS_ASSERT(0 < project_list_dxlnode->Arity()); - - CDXLNode *project_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + + CDXLNode *project_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); project_dxlnode->AddChild(project_list_dxlnode); project_dxlnode->AddChild(query_dxlnode); query_dxlnode = project_dxlnode; @@ -775,65 +745,68 @@ CTranslatorQueryToDXL::TranslateCTASToDXL() IntoClause *into_clause = m_query->intoClause; - CMDName *md_relname = CDXLUtils::CreateMDNameFromCharArray(m_mp, into_clause->rel->relname); - - CDXLColDescrArray *dxl_col_descr_array = GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); - + CMDName *md_relname = + CDXLUtils::CreateMDNameFromCharArray(m_mp, into_clause->rel->relname); + + CDXLColDescrArray *dxl_col_descr_array = + GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); + const ULONG num_columns = gpdb::ListLength(m_query->targetList); ULongPtrArray *source_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); - IntPtrArray* var_typmods = GPOS_NEW(m_mp) IntPtrArray(m_mp); - + IntPtrArray *var_typmods = GPOS_NEW(m_mp) IntPtrArray(m_mp); + List *col_names = into_clause->colNames; for (ULONG ul = 0; ul < num_columns; ul++) { - TargetEntry *target_entry = (TargetEntry *) gpdb::ListNth(m_query->targetList, ul); + TargetEntry *target_entry = + (TargetEntry *) gpdb::ListNth(m_query->targetList, ul); if (target_entry->resjunk) { continue; } AttrNumber resno = target_entry->resno; - int var_typmod = gpdb::ExprTypeMod((Node*)target_entry->expr); + int var_typmod = gpdb::ExprTypeMod((Node *) target_entry->expr); var_typmods->Append(GPOS_NEW(m_mp) INT(var_typmod)); CDXLNode *dxl_column = (*m_dxl_query_output_cols)[ul]; - CDXLScalarIdent *dxl_ident = CDXLScalarIdent::Cast(dxl_column->GetOperator()); - source_array->Append(GPOS_NEW(m_mp) ULONG(dxl_ident->GetDXLColRef()->Id())); - + CDXLScalarIdent *dxl_ident = + CDXLScalarIdent::Cast(dxl_column->GetOperator()); + source_array->Append(GPOS_NEW(m_mp) + ULONG(dxl_ident->GetDXLColRef()->Id())); + CMDName *md_colname = NULL; if (NULL != col_names && ul < gpdb::ListLength(col_names)) { ColumnDef *col_def = (ColumnDef *) gpdb::ListNth(col_names, ul); - md_colname = CDXLUtils::CreateMDNameFromCharArray(m_mp, col_def->colname); + md_colname = + CDXLUtils::CreateMDNameFromCharArray(m_mp, col_def->colname); } else { - md_colname = GPOS_NEW(m_mp) CMDName(m_mp, dxl_ident->GetDXLColRef()->MdName()->GetMDName()); + md_colname = GPOS_NEW(m_mp) + CMDName(m_mp, dxl_ident->GetDXLColRef()->MdName()->GetMDName()); } - + GPOS_ASSERT(NULL != md_colname); IMDId *mdid = dxl_ident->MdidType(); mdid->AddRef(); - CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr - ( - m_mp, - md_colname, - m_colid_counter->next_id(), - resno /* attno */, - mdid, - dxl_ident->TypeModifier(), - false /* is_dropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr( + m_mp, md_colname, m_colid_counter->next_id(), resno /* attno */, + mdid, dxl_ident->TypeModifier(), false /* is_dropped */ + ); dxl_col_descr_array->Append(dxl_col_descr); } - IMDRelation::Ereldistrpolicy rel_distr_policy = IMDRelation::EreldistrRandom; + IMDRelation::Ereldistrpolicy rel_distr_policy = + IMDRelation::EreldistrRandom; ULongPtrArray *distribution_colids = NULL; - + if (NULL != m_query->intoPolicy) { - rel_distr_policy = CTranslatorRelcacheToDXL::GetRelDistribution(m_query->intoPolicy); - + rel_distr_policy = + CTranslatorRelcacheToDXL::GetRelDistribution(m_query->intoPolicy); + if (IMDRelation::EreldistrHash == rel_distr_policy) { distribution_colids = GPOS_NEW(m_mp) ULongPtrArray(m_mp); @@ -848,53 +821,48 @@ CTranslatorQueryToDXL::TranslateCTASToDXL() } else { - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - NOTICE, - "Table doesn't have 'DISTRIBUTED BY' clause. Creating a NULL policy entry.", - NULL); + GpdbEreport( + ERRCODE_SUCCESSFUL_COMPLETION, NOTICE, + "Table doesn't have 'DISTRIBUTED BY' clause. Creating a NULL policy entry.", + NULL); } - + GPOS_ASSERT(IMDRelation::EreldistrMasterOnly != rel_distr_policy); m_has_distributed_tables = true; // TODO: Mar 5, 2014; reserve an OID OID oid = 1; CMDIdGPDB *mdid = GPOS_NEW(m_mp) CMDIdGPDBCtas(oid); - + CMDName *md_tablespace_name = NULL; if (NULL != into_clause->tableSpaceName) { - md_tablespace_name = CDXLUtils::CreateMDNameFromCharArray(m_mp, into_clause->tableSpaceName); + md_tablespace_name = CDXLUtils::CreateMDNameFromCharArray( + m_mp, into_clause->tableSpaceName); } - + CMDName *md_schema_name = NULL; if (NULL != into_clause->rel->schemaname) { - md_schema_name = CDXLUtils::CreateMDNameFromCharArray(m_mp, into_clause->rel->schemaname); + md_schema_name = CDXLUtils::CreateMDNameFromCharArray( + m_mp, into_clause->rel->schemaname); } - - CDXLCtasStorageOptions::ECtasOnCommitAction ctas_commit_action = (CDXLCtasStorageOptions::ECtasOnCommitAction) into_clause->onCommit; - IMDRelation::Erelstoragetype rel_storage_type = IMDRelation::ErelstorageHeap; - CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options = GetDXLCtasOptionArray(into_clause->options, &rel_storage_type); + CDXLCtasStorageOptions::ECtasOnCommitAction ctas_commit_action = + (CDXLCtasStorageOptions::ECtasOnCommitAction) into_clause->onCommit; + + IMDRelation::Erelstoragetype rel_storage_type = + IMDRelation::ErelstorageHeap; + CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options = + GetDXLCtasOptionArray(into_clause->options, &rel_storage_type); BOOL has_oids = gpdb::InterpretOidsOption(into_clause->options); - CDXLLogicalCTAS *ctas_dxlop = GPOS_NEW(m_mp) CDXLLogicalCTAS - ( - m_mp, - mdid, - md_schema_name, - md_relname, - dxl_col_descr_array, - GPOS_NEW(m_mp) CDXLCtasStorageOptions(md_tablespace_name, ctas_commit_action, ctas_storage_options), - rel_distr_policy, - distribution_colids, - into_clause->rel->istemp, - has_oids, - rel_storage_type, - source_array, - var_typmods - ); + CDXLLogicalCTAS *ctas_dxlop = GPOS_NEW(m_mp) CDXLLogicalCTAS( + m_mp, mdid, md_schema_name, md_relname, dxl_col_descr_array, + GPOS_NEW(m_mp) CDXLCtasStorageOptions( + md_tablespace_name, ctas_commit_action, ctas_storage_options), + rel_distr_policy, distribution_colids, into_clause->rel->istemp, + has_oids, rel_storage_type, source_array, var_typmods); return GPOS_NEW(m_mp) CDXLNode(m_mp, ctas_dxlop, query_dxlnode); } @@ -908,11 +876,11 @@ CTranslatorQueryToDXL::TranslateCTASToDXL() // //--------------------------------------------------------------------------- CDXLCtasStorageOptions::CDXLCtasOptionArray * -CTranslatorQueryToDXL::GetDXLCtasOptionArray - ( +CTranslatorQueryToDXL::GetDXLCtasOptionArray( List *options, - IMDRelation::Erelstoragetype *storage_type // output parameter: storage type - ) + IMDRelation::Erelstoragetype + *storage_type // output parameter: storage type +) { if (NULL == options) { @@ -920,24 +888,26 @@ CTranslatorQueryToDXL::GetDXLCtasOptionArray } GPOS_ASSERT(NULL != storage_type); - - CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options = GPOS_NEW(m_mp) CDXLCtasStorageOptions::CDXLCtasOptionArray(m_mp); + + CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options = + GPOS_NEW(m_mp) CDXLCtasStorageOptions::CDXLCtasOptionArray(m_mp); ListCell *lc = NULL; BOOL is_ao_table = false; BOOL is_AOCO = false; BOOL is_parquet = false; - + CWStringConst str_append_only(GPOS_WSZ_LIT("appendonly")); CWStringConst str_orientation(GPOS_WSZ_LIT("orientation")); CWStringConst str_orientation_parquet(GPOS_WSZ_LIT("parquet")); CWStringConst str_orientation_column(GPOS_WSZ_LIT("column")); - - ForEach (lc, options) + + ForEach(lc, options) { DefElem *def_elem = (DefElem *) lfirst(lc); - CWStringDynamic *name_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, def_elem->defname); + CWStringDynamic *name_str = CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, def_elem->defname); CWStringDynamic *value_str = NULL; - + BOOL is_null_arg = (NULL == def_elem->arg); // def_elem->arg is NULL for queries of the form "create table t with (oids) as ... " @@ -950,18 +920,21 @@ CTranslatorQueryToDXL::GetDXLCtasOptionArray { value_str = ExtractStorageOptionStr(def_elem); - if (name_str->Equals(&str_append_only) && value_str->Equals(CDXLTokens::GetDXLTokenStr(EdxltokenTrue))) + if (name_str->Equals(&str_append_only) && + value_str->Equals(CDXLTokens::GetDXLTokenStr(EdxltokenTrue))) { is_ao_table = true; } - - if (name_str->Equals(&str_orientation) && value_str->Equals(&str_orientation_column)) + + if (name_str->Equals(&str_orientation) && + value_str->Equals(&str_orientation_column)) { GPOS_ASSERT(!is_parquet); is_AOCO = true; } - if (name_str->Equals(&str_orientation) && value_str->Equals(&str_orientation_parquet)) + if (name_str->Equals(&str_orientation) && + value_str->Equals(&str_orientation_parquet)) { GPOS_ASSERT(!is_AOCO); is_parquet = true; @@ -975,7 +948,8 @@ CTranslatorQueryToDXL::GetDXLCtasOptionArray } CDXLCtasStorageOptions::CDXLCtasOption *dxl_ctas_storage_option = - GPOS_NEW(m_mp) CDXLCtasStorageOptions::CDXLCtasOption(arg_type, name_str, value_str, is_null_arg); + GPOS_NEW(m_mp) CDXLCtasStorageOptions::CDXLCtasOption( + arg_type, name_str, value_str, is_null_arg); ctas_storage_options->Append(dxl_ctas_storage_option); } if (is_AOCO) @@ -990,7 +964,7 @@ CTranslatorQueryToDXL::GetDXLCtasOptionArray { *storage_type = IMDRelation::ErelstorageAppendOnlyParquet; } - + return ctas_storage_options; } @@ -1003,17 +977,15 @@ CTranslatorQueryToDXL::GetDXLCtasOptionArray // //--------------------------------------------------------------------------- CWStringDynamic * -CTranslatorQueryToDXL::ExtractStorageOptionStr - ( - DefElem *def_elem - ) +CTranslatorQueryToDXL::ExtractStorageOptionStr(DefElem *def_elem) { GPOS_ASSERT(NULL != def_elem); CHAR *value = gpdb::DefGetString(def_elem); - CWStringDynamic *result_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, value); - + CWStringDynamic *result_str = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, value); + return result_str; } @@ -1027,20 +999,21 @@ CTranslatorQueryToDXL::ExtractStorageOptionStr // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::GetCtidAndSegmentId - ( - ULONG *ctid, - ULONG *segment_id - ) +CTranslatorQueryToDXL::GetCtidAndSegmentId(ULONG *ctid, ULONG *segment_id) { // ctid column id - IMDId *mdid = CTranslatorUtils::GetSystemColType(m_mp, SelfItemPointerAttributeNumber); - *ctid = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, SelfItemPointerAttributeNumber, mdid, m_var_to_colid_map); + IMDId *mdid = CTranslatorUtils::GetSystemColType( + m_mp, SelfItemPointerAttributeNumber); + *ctid = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, + SelfItemPointerAttributeNumber, mdid, + m_var_to_colid_map); mdid->Release(); // segmentid column id mdid = CTranslatorUtils::GetSystemColType(m_mp, GpSegmentIdAttributeNumber); - *segment_id = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, GpSegmentIdAttributeNumber, mdid, m_var_to_colid_map); + *segment_id = CTranslatorUtils::GetColId( + m_query_level, m_query->resultRelation, GpSegmentIdAttributeNumber, + mdid, m_var_to_colid_map); mdid->Release(); } @@ -1056,8 +1029,11 @@ CTranslatorQueryToDXL::GetCtidAndSegmentId ULONG CTranslatorQueryToDXL::GetTupleOidColId() { - IMDId *mdid = CTranslatorUtils::GetSystemColType(m_mp, ObjectIdAttributeNumber); - ULONG tuple_oid_colid = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, ObjectIdAttributeNumber, mdid, m_var_to_colid_map); + IMDId *mdid = + CTranslatorUtils::GetSystemColType(m_mp, ObjectIdAttributeNumber); + ULONG tuple_oid_colid = CTranslatorUtils::GetColId( + m_query_level, m_query->resultRelation, ObjectIdAttributeNumber, mdid, + m_var_to_colid_map); mdid->Release(); return tuple_oid_colid; } @@ -1078,17 +1054,23 @@ CTranslatorQueryToDXL::TranslateDeleteQueryToDXL() if (!optimizer_enable_dml) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("DML not enabled")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("DML not enabled")); } CDXLNode *query_dxlnode = TranslateSelectQueryToDXL(); - const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, m_query->resultRelation - 1); + const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth( + m_query->rtable, m_query->resultRelation - 1); - CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr(m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); + CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr( + m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - if (!optimizer_enable_dml_triggers && CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, Edxldmldelete)) + if (!optimizer_enable_dml_triggers && + CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, + Edxldmldelete)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("DELETE with triggers")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("DELETE with triggers")); } ULONG ctid_colid = 0; @@ -1106,11 +1088,14 @@ CTranslatorQueryToDXL::TranslateDeleteQueryToDXL() continue; } - ULONG colid = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, mdcol->AttrNum(), mdcol->MdidType(), m_var_to_colid_map); + ULONG colid = CTranslatorUtils::GetColId( + m_query_level, m_query->resultRelation, mdcol->AttrNum(), + mdcol->MdidType(), m_var_to_colid_map); delete_colid_array->Append(GPOS_NEW(m_mp) ULONG(colid)); } - CDXLLogicalDelete *delete_dxlop = GPOS_NEW(m_mp) CDXLLogicalDelete(m_mp, table_descr, ctid_colid, segid_colid, delete_colid_array); + CDXLLogicalDelete *delete_dxlop = GPOS_NEW(m_mp) CDXLLogicalDelete( + m_mp, table_descr, ctid_colid, segid_colid, delete_colid_array); return GPOS_NEW(m_mp) CDXLNode(m_mp, delete_dxlop, query_dxlnode); } @@ -1132,31 +1117,39 @@ CTranslatorQueryToDXL::TranslateUpdateQueryToDXL() if (!optimizer_enable_dml) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("DML not enabled")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("DML not enabled")); } CDXLNode *query_dxlnode = TranslateSelectQueryToDXL(); - const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, m_query->resultRelation - 1); + const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth( + m_query->rtable, m_query->resultRelation - 1); - CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr(m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); + CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr( + m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - if (!optimizer_enable_dml_triggers && CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, Edxldmlupdate)) + if (!optimizer_enable_dml_triggers && + CTranslatorUtils::RelHasTriggers(m_mp, m_md_accessor, md_rel, + Edxldmlupdate)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("UPDATE with triggers")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("UPDATE with triggers")); } - - if (!optimizer_enable_dml_constraints && CTranslatorUtils::RelHasConstraints(md_rel)) + + if (!optimizer_enable_dml_constraints && + CTranslatorUtils::RelHasConstraints(md_rel)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("UPDATE with constraints")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("UPDATE with constraints")); } - + ULONG ctid_colid = 0; ULONG segmentid_colid = 0; GetCtidAndSegmentId(&ctid_colid, &segmentid_colid); - + ULONG tuple_oid_colid = 0; - + BOOL has_oids = md_rel->HasOids(); if (has_oids) @@ -1182,7 +1175,9 @@ CTranslatorQueryToDXL::TranslateUpdateQueryToDXL() INT attno = mdcol->AttrNum(); ULONG *updated_colid = update_column_map->Find(&attno); - ULONG colid = CTranslatorUtils::GetColId(m_query_level, m_query->resultRelation, attno, mdcol->MdidType(), m_var_to_colid_map); + ULONG colid = CTranslatorUtils::GetColId( + m_query_level, m_query->resultRelation, attno, mdcol->MdidType(), + m_var_to_colid_map); // if the column is in the query outputs then use it // otherwise get the column id created by the child query @@ -1199,7 +1194,9 @@ CTranslatorQueryToDXL::TranslateUpdateQueryToDXL() } update_column_map->Release(); - CDXLLogicalUpdate *pdxlopupdate = GPOS_NEW(m_mp) CDXLLogicalUpdate(m_mp, table_descr, ctid_colid, segmentid_colid, delete_colid_array, insert_colid_array, has_oids, tuple_oid_colid); + CDXLLogicalUpdate *pdxlopupdate = GPOS_NEW(m_mp) CDXLLogicalUpdate( + m_mp, table_descr, ctid_colid, segmentid_colid, delete_colid_array, + insert_colid_array, has_oids, tuple_oid_colid); return GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopupdate, query_dxlnode); } @@ -1215,12 +1212,13 @@ CTranslatorQueryToDXL::TranslateUpdateQueryToDXL() IntToUlongMap * CTranslatorQueryToDXL::UpdatedColumnMapping() { - GPOS_ASSERT(gpdb::ListLength(m_query->targetList) == m_dxl_query_output_cols->Size()); + GPOS_ASSERT(gpdb::ListLength(m_query->targetList) == + m_dxl_query_output_cols->Size()); IntToUlongMap *update_column_map = GPOS_NEW(m_mp) IntToUlongMap(m_mp); ListCell *lc = NULL; ULONG ul = 0; - ForEach (lc, m_query->targetList) + ForEach(lc, m_query->targetList) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); @@ -1228,7 +1226,8 @@ CTranslatorQueryToDXL::UpdatedColumnMapping() GPOS_ASSERT(0 < resno); CDXLNode *dxl_column = (*m_dxl_query_output_cols)[ul]; - CDXLScalarIdent *dxl_ident = CDXLScalarIdent::Cast(dxl_column->GetOperator()); + CDXLScalarIdent *dxl_ident = + CDXLScalarIdent::Cast(dxl_column->GetOperator()); ULONG colid = dxl_ident->GetDXLColRef()->Id(); StoreAttnoColIdMapping(update_column_map, resno, colid); @@ -1247,12 +1246,7 @@ CTranslatorQueryToDXL::UpdatedColumnMapping() // //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::OIDFound - ( - OID oid, - const OID oids[], - ULONG size - ) +CTranslatorQueryToDXL::OIDFound(OID oid, const OID oids[], ULONG size) { BOOL found = false; for (ULONG ul = 0; !found && ul < size; ul++) @@ -1273,18 +1267,17 @@ CTranslatorQueryToDXL::OIDFound // //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::IsLeadWindowFunc - ( - CDXLOperator *dxlop - ) +CTranslatorQueryToDXL::IsLeadWindowFunc(CDXLOperator *dxlop) { BOOL is_lead_func = false; if (EdxlopScalarWindowRef == dxlop->GetDXLOperator()) { CDXLScalarWindowRef *winref_dxlop = CDXLScalarWindowRef::Cast(dxlop); - const CMDIdGPDB *mdid_gpdb = CMDIdGPDB::CastMdid(winref_dxlop->FuncMdId()); + const CMDIdGPDB *mdid_gpdb = + CMDIdGPDB::CastMdid(winref_dxlop->FuncMdId()); OID oid = mdid_gpdb->Oid(); - is_lead_func = OIDFound(oid, lead_func_oids, GPOS_ARRAY_SIZE(lead_func_oids)); + is_lead_func = + OIDFound(oid, lead_func_oids, GPOS_ARRAY_SIZE(lead_func_oids)); } return is_lead_func; @@ -1300,18 +1293,16 @@ CTranslatorQueryToDXL::IsLeadWindowFunc // //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::IsLagWindowFunc - ( - CDXLOperator *dxlop - ) +CTranslatorQueryToDXL::IsLagWindowFunc(CDXLOperator *dxlop) { BOOL is_lag = false; if (EdxlopScalarWindowRef == dxlop->GetDXLOperator()) { CDXLScalarWindowRef *winref_dxlop = CDXLScalarWindowRef::Cast(dxlop); - const CMDIdGPDB *mdid_gpdb = CMDIdGPDB::CastMdid(winref_dxlop->FuncMdId()); + const CMDIdGPDB *mdid_gpdb = + CMDIdGPDB::CastMdid(winref_dxlop->FuncMdId()); OID oid = mdid_gpdb->Oid(); - is_lag = OIDFound(oid, lag_func_oids, GPOS_ARRAY_SIZE(lag_func_oids)); + is_lag = OIDFound(oid, lag_func_oids, GPOS_ARRAY_SIZE(lag_func_oids)); } return is_lag; @@ -1327,12 +1318,8 @@ CTranslatorQueryToDXL::IsLagWindowFunc // //--------------------------------------------------------------------------- CDXLWindowFrame * -CTranslatorQueryToDXL::CreateWindowFramForLeadLag - ( - BOOL is_lead_func, - CDXLNode *dxl_offset - ) - const +CTranslatorQueryToDXL::CreateWindowFramForLeadLag(BOOL is_lead_func, + CDXLNode *dxl_offset) const { EdxlFrameBoundary dxl_frame_lead = EdxlfbBoundedFollowing; EdxlFrameBoundary dxl_frame_trail = EdxlfbBoundedFollowing; @@ -1346,16 +1333,25 @@ CTranslatorQueryToDXL::CreateWindowFramForLeadLag CDXLNode *dxl_trail_edge = NULL; if (NULL == dxl_offset) { - dxl_lead_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, true /* fLeading */, dxl_frame_lead)); - dxl_trail_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, false /* fLeading */, dxl_frame_trail)); + dxl_lead_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, true /* fLeading */, dxl_frame_lead)); + dxl_trail_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, false /* fLeading */, dxl_frame_trail)); - dxl_lead_edge->AddChild(CTranslatorUtils::CreateDXLProjElemFromInt8Const(m_mp, m_md_accessor, 1 /*iVal*/)); - dxl_trail_edge->AddChild(CTranslatorUtils::CreateDXLProjElemFromInt8Const(m_mp, m_md_accessor, 1 /*iVal*/)); + dxl_lead_edge->AddChild( + CTranslatorUtils::CreateDXLProjElemFromInt8Const( + m_mp, m_md_accessor, 1 /*iVal*/)); + dxl_trail_edge->AddChild( + CTranslatorUtils::CreateDXLProjElemFromInt8Const( + m_mp, m_md_accessor, 1 /*iVal*/)); } else { // overwrite frame edge types based on specified offset type - if (EdxlopScalarConstValue != dxl_offset->GetOperator()->GetDXLOperator()) + if (EdxlopScalarConstValue != + dxl_offset->GetOperator()->GetDXLOperator()) { if (is_lead_func) { @@ -1368,8 +1364,12 @@ CTranslatorQueryToDXL::CreateWindowFramForLeadLag dxl_frame_trail = EdxlfbDelayedBoundedPreceding; } } - dxl_lead_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, true /* fLeading */, dxl_frame_lead)); - dxl_trail_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, false /* fLeading */, dxl_frame_trail)); + dxl_lead_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, true /* fLeading */, dxl_frame_lead)); + dxl_trail_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, false /* fLeading */, dxl_frame_trail)); dxl_offset->AddRef(); dxl_lead_edge->AddChild(dxl_offset); @@ -1378,14 +1378,11 @@ CTranslatorQueryToDXL::CreateWindowFramForLeadLag } // manufacture a frame for LEAD/LAG function - return GPOS_NEW(m_mp) CDXLWindowFrame - ( - m_mp, - EdxlfsRow, // frame specification - EdxlfesNulls, // frame exclusion strategy is set to exclude NULLs in GPDB - dxl_lead_edge, - dxl_trail_edge - ); + return GPOS_NEW(m_mp) CDXLWindowFrame( + m_mp, + EdxlfsRow, // frame specification + EdxlfesNulls, // frame exclusion strategy is set to exclude NULLs in GPDB + dxl_lead_edge, dxl_trail_edge); } @@ -1403,12 +1400,10 @@ CTranslatorQueryToDXL::CreateWindowFramForLeadLag // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::UpdateLeadLagWinSpecPos - ( - CDXLNode *project_list_dxlnode, // project list holding WinRef nodes - CDXLWindowSpecArray *window_spec_array // original list of window spec - ) - const +CTranslatorQueryToDXL::UpdateLeadLagWinSpecPos( + CDXLNode *project_list_dxlnode, // project list holding WinRef nodes + CDXLWindowSpecArray *window_spec_array // original list of window spec +) const { GPOS_ASSERT(NULL != project_list_dxlnode); GPOS_ASSERT(NULL != window_spec_array); @@ -1422,12 +1417,15 @@ CTranslatorQueryToDXL::UpdateLeadLagWinSpecPos BOOL is_lag = IsLagWindowFunc(dxlop); if (is_lead_func || is_lag) { - CDXLScalarWindowRef *winref_dxlop = CDXLScalarWindowRef::Cast(dxlop); - CDXLWindowSpec *window_spec_dxlnode = (*window_spec_array)[winref_dxlop->GetWindSpecPos()]; + CDXLScalarWindowRef *winref_dxlop = + CDXLScalarWindowRef::Cast(dxlop); + CDXLWindowSpec *window_spec_dxlnode = + (*window_spec_array)[winref_dxlop->GetWindSpecPos()]; CMDName *mdname = NULL; if (NULL != window_spec_dxlnode->MdName()) { - mdname = GPOS_NEW(m_mp) CMDName(m_mp, window_spec_dxlnode->MdName()->GetMDName()); + mdname = GPOS_NEW(m_mp) + CMDName(m_mp, window_spec_dxlnode->MdName()->GetMDName()); } // find if an offset is specified @@ -1438,20 +1436,15 @@ CTranslatorQueryToDXL::UpdateLeadLagWinSpecPos } // create LEAD/LAG frame - CDXLWindowFrame *window_frame = CreateWindowFramForLeadLag(is_lead_func, dxl_offset); + CDXLWindowFrame *window_frame = + CreateWindowFramForLeadLag(is_lead_func, dxl_offset); // create new window spec object window_spec_dxlnode->GetPartitionByColIdArray()->AddRef(); window_spec_dxlnode->GetSortColListDXL()->AddRef(); - CDXLWindowSpec *pdxlwsNew = - GPOS_NEW(m_mp) CDXLWindowSpec - ( - m_mp, - window_spec_dxlnode->GetPartitionByColIdArray(), - mdname, - window_spec_dxlnode->GetSortColListDXL(), - window_frame - ); + CDXLWindowSpec *pdxlwsNew = GPOS_NEW(m_mp) CDXLWindowSpec( + m_mp, window_spec_dxlnode->GetPartitionByColIdArray(), mdname, + window_spec_dxlnode->GetSortColListDXL(), window_frame); window_spec_array->Append(pdxlwsNew); // update win spec pos of LEAD/LAG function @@ -1470,25 +1463,24 @@ CTranslatorQueryToDXL::UpdateLeadLagWinSpecPos // //--------------------------------------------------------------------------- CDXLWindowSpecArray * -CTranslatorQueryToDXL::TranslateWindowSpecToDXL - ( - List *window_clause, - IntToUlongMap *sort_col_attno_to_colid_mapping, - CDXLNode *project_list_dxlnode_node - ) +CTranslatorQueryToDXL::TranslateWindowSpecToDXL( + List *window_clause, IntToUlongMap *sort_col_attno_to_colid_mapping, + CDXLNode *project_list_dxlnode_node) { GPOS_ASSERT(NULL != window_clause); GPOS_ASSERT(NULL != sort_col_attno_to_colid_mapping); GPOS_ASSERT(NULL != project_list_dxlnode_node); - CDXLWindowSpecArray *window_spec_array = GPOS_NEW(m_mp) CDXLWindowSpecArray(m_mp); + CDXLWindowSpecArray *window_spec_array = + GPOS_NEW(m_mp) CDXLWindowSpecArray(m_mp); // translate window specification ListCell *lc = NULL; - ForEach (lc, window_clause) + ForEach(lc, window_clause) { WindowSpec *pwindowspec = (WindowSpec *) lfirst(lc); - ULongPtrArray *part_columns = TranslatePartColumns(pwindowspec->partition, sort_col_attno_to_colid_mapping); + ULongPtrArray *part_columns = TranslatePartColumns( + pwindowspec->partition, sort_col_attno_to_colid_mapping); CDXLNode *sort_col_list_dxl = NULL; CMDName *mdname = NULL; @@ -1496,7 +1488,9 @@ CTranslatorQueryToDXL::TranslateWindowSpecToDXL if (NULL != pwindowspec->name) { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, pwindowspec->name); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, + pwindowspec->name); mdname = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); } @@ -1504,9 +1498,11 @@ CTranslatorQueryToDXL::TranslateWindowSpecToDXL if (0 < gpdb::ListLength(pwindowspec->order)) { // create a sorting col list - sort_col_list_dxl = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSortColList(m_mp)); + sort_col_list_dxl = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSortColList(m_mp)); - CDXLNodeArray *dxl_sort_cols = TranslateSortColumnsToDXL(pwindowspec->order, sort_col_attno_to_colid_mapping); + CDXLNodeArray *dxl_sort_cols = TranslateSortColumnsToDXL( + pwindowspec->order, sort_col_attno_to_colid_mapping); const ULONG size = dxl_sort_cols->Size(); for (ULONG ul = 0; ul < size; ul++) { @@ -1519,10 +1515,13 @@ CTranslatorQueryToDXL::TranslateWindowSpecToDXL if (NULL != pwindowspec->frame) { - window_frame = m_scalar_translator->GetWindowFrame((Expr *) pwindowspec->frame, m_var_to_colid_map, project_list_dxlnode_node, &m_has_distributed_tables); + window_frame = m_scalar_translator->GetWindowFrame( + (Expr *) pwindowspec->frame, m_var_to_colid_map, + project_list_dxlnode_node, &m_has_distributed_tables); } - CDXLWindowSpec *window_spec_dxlnode = GPOS_NEW(m_mp) CDXLWindowSpec(m_mp, part_columns, mdname, sort_col_list_dxl, window_frame); + CDXLWindowSpec *window_spec_dxlnode = GPOS_NEW(m_mp) CDXLWindowSpec( + m_mp, part_columns, mdname, sort_col_list_dxl, window_frame); window_spec_array->Append(window_spec_dxlnode); } @@ -1539,15 +1538,10 @@ CTranslatorQueryToDXL::TranslateWindowSpecToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateWindowToDXL - ( - CDXLNode *child_dxlnode, - List *target_list, - List *window_clause, - List *sort_clause, - IntToUlongMap *sort_col_attno_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping - ) +CTranslatorQueryToDXL::TranslateWindowToDXL( + CDXLNode *child_dxlnode, List *target_list, List *window_clause, + List *sort_clause, IntToUlongMap *sort_col_attno_to_colid_mapping, + IntToUlongMap *output_attno_to_colid_mapping) { if (0 == gpdb::ListLength(window_clause)) { @@ -1555,41 +1549,49 @@ CTranslatorQueryToDXL::TranslateWindowToDXL } // translate target list entries - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); - CDXLNode *new_child_project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *new_child_project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); ListCell *lc = NULL; ULONG resno = 1; - // target entries that are result of flattening join alias and + // target entries that are result of flattening join alias and // are equivalent to a defined Window specs target entry List *omitted_target_entries = NIL; List *resno_list = NIL; - - ForEach (lc, target_list) + + ForEach(lc, target_list) { BOOL insert_sort_info = true; TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); // create the DXL node holding the target list entry - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject(target_entry->expr, target_entry->resname); - ULONG colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + target_entry->expr, target_entry->resname); + ULONG colid = + CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); if (IsA(target_entry->expr, WindowRef)) { - CTranslatorUtils::CheckAggregateWindowFn((Node*) target_entry->expr); + CTranslatorUtils::CheckAggregateWindowFn( + (Node *) target_entry->expr); } if (!target_entry->resjunk) { - if (IsA(target_entry->expr, Var) || IsA(target_entry->expr, WindowRef)) + if (IsA(target_entry->expr, Var) || + IsA(target_entry->expr, WindowRef)) { // add window functions and non-computed columns to the project list of the window operator project_list_dxlnode->AddChild(project_elem_dxlnode); - StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); + StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, + colid); } - else if (CTranslatorUtils::IsWindowSpec(target_entry, window_clause)) + else if (CTranslatorUtils::IsWindowSpec(target_entry, + window_clause)) { // add computed column used in window specification needed in the output columns // to the child's project list @@ -1597,41 +1599,39 @@ CTranslatorQueryToDXL::TranslateWindowToDXL // construct a scalar identifier that points to the computed column and // add it to the project list of the window operator - CMDName *mdname_alias = GPOS_NEW(m_mp) CMDName - ( - m_mp, - CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->GetMdNameAlias()->GetMDName() - ); - CDXLNode *new_project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, colid, mdname_alias) - ); - CDXLNode *project_elem_new_child_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarIdent - ( - m_mp, - GPOS_NEW(m_mp) CDXLColRef - ( - m_mp, - GPOS_NEW(m_mp) CMDName(m_mp, mdname_alias->GetMDName()), - colid, - GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType((Node*) target_entry->expr)), - gpdb::ExprTypeMod((Node*) target_entry->expr) - ) - ) - ); - new_project_elem_dxlnode->AddChild(project_elem_new_child_dxlnode); + CMDName *mdname_alias = GPOS_NEW(m_mp) + CMDName(m_mp, CDXLScalarProjElem::Cast( + project_elem_dxlnode->GetOperator()) + ->GetMdNameAlias() + ->GetMDName()); + CDXLNode *new_project_elem_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem( + m_mp, colid, mdname_alias)); + CDXLNode *project_elem_new_child_dxlnode = + GPOS_NEW(m_mp) CDXLNode( + m_mp, + GPOS_NEW(m_mp) CDXLScalarIdent( + m_mp, GPOS_NEW(m_mp) CDXLColRef( + m_mp, + GPOS_NEW(m_mp) CMDName( + m_mp, mdname_alias->GetMDName()), + colid, + GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType( + (Node *) target_entry->expr)), + gpdb::ExprTypeMod( + (Node *) target_entry->expr)))); + new_project_elem_dxlnode->AddChild( + project_elem_new_child_dxlnode); project_list_dxlnode->AddChild(new_project_elem_dxlnode); - StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); + StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, + colid); } else { insert_sort_info = false; - omitted_target_entries = gpdb::LAppend(omitted_target_entries, target_entry); + omitted_target_entries = + gpdb::LAppend(omitted_target_entries, target_entry); resno_list = gpdb::LAppendInt(resno_list, resno); project_elem_dxlnode->Release(); @@ -1644,7 +1644,8 @@ CTranslatorQueryToDXL::TranslateWindowToDXL } else if (!IsA(target_entry->expr, Var)) { - GPOS_ASSERT(CTranslatorUtils::IsWindowSpec(target_entry, window_clause)); + GPOS_ASSERT( + CTranslatorUtils::IsWindowSpec(target_entry, window_clause)); // computed columns used in the window specification new_child_project_list_dxlnode->AddChild(project_elem_dxlnode); } @@ -1655,7 +1656,8 @@ CTranslatorQueryToDXL::TranslateWindowToDXL if (insert_sort_info) { - AddSortingGroupingColumn(target_entry, sort_col_attno_to_colid_mapping, colid); + AddSortingGroupingColumn(target_entry, + sort_col_attno_to_colid_mapping, colid); } resno++; @@ -1665,18 +1667,22 @@ CTranslatorQueryToDXL::TranslateWindowToDXL // process target entries that are a result of flattening join alias ListCell *lc_resno = NULL; - ForBoth (lc, omitted_target_entries, - lc_resno, resno_list) + ForBoth(lc, omitted_target_entries, lc_resno, resno_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); INT resno = (INT) lfirst_int(lc_resno); - TargetEntry *te_window_spec = CTranslatorUtils::GetWindowSpecTargetEntry( (Node*) target_entry->expr, window_clause, target_list); + TargetEntry *te_window_spec = + CTranslatorUtils::GetWindowSpecTargetEntry( + (Node *) target_entry->expr, window_clause, target_list); if (NULL != te_window_spec) { - const ULONG colid = CTranslatorUtils::GetColId( (INT) te_window_spec->ressortgroupref, sort_col_attno_to_colid_mapping); + const ULONG colid = CTranslatorUtils::GetColId( + (INT) te_window_spec->ressortgroupref, + sort_col_attno_to_colid_mapping); StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); - AddSortingGroupingColumn(target_entry, sort_col_attno_to_colid_mapping, colid); + AddSortingGroupingColumn(target_entry, + sort_col_attno_to_colid_mapping, colid); } } if (NIL != omitted_target_entries) @@ -1685,14 +1691,17 @@ CTranslatorQueryToDXL::TranslateWindowToDXL } // translate window spec - CDXLWindowSpecArray *window_spec_array = TranslateWindowSpecToDXL(window_clause, sort_col_attno_to_colid_mapping, new_child_project_list_dxlnode); + CDXLWindowSpecArray *window_spec_array = + TranslateWindowSpecToDXL(window_clause, sort_col_attno_to_colid_mapping, + new_child_project_list_dxlnode); CDXLNode *new_child_dxlnode = NULL; if (0 < new_child_project_list_dxlnode->Arity()) { // create a project list for the computed columns used in the window specification - new_child_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + new_child_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); new_child_dxlnode->AddChild(new_child_project_list_dxlnode); new_child_dxlnode->AddChild(child_dxlnode); child_dxlnode = new_child_dxlnode; @@ -1703,7 +1712,8 @@ CTranslatorQueryToDXL::TranslateWindowToDXL new_child_project_list_dxlnode->Release(); } - if (!CTranslatorUtils::HasProjElem(project_list_dxlnode, EdxlopScalarWindowRef)) + if (!CTranslatorUtils::HasProjElem(project_list_dxlnode, + EdxlopScalarWindowRef)) { project_list_dxlnode->Release(); window_spec_array->Release(); @@ -1714,7 +1724,8 @@ CTranslatorQueryToDXL::TranslateWindowToDXL // update window spec positions of LEAD/LAG functions UpdateLeadLagWinSpecPos(project_list_dxlnode, window_spec_array); - CDXLLogicalWindow *window_dxlop = GPOS_NEW(m_mp) CDXLLogicalWindow(m_mp, window_spec_array); + CDXLLogicalWindow *window_dxlop = + GPOS_NEW(m_mp) CDXLLogicalWindow(m_mp, window_spec_array); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, window_dxlop); dxlnode->AddChild(project_list_dxlnode); @@ -1732,26 +1743,23 @@ CTranslatorQueryToDXL::TranslateWindowToDXL // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorQueryToDXL::TranslatePartColumns - ( - List *partition_by_clause, - IntToUlongMap *col_attno_colid_mapping - ) - const +CTranslatorQueryToDXL::TranslatePartColumns( + List *partition_by_clause, IntToUlongMap *col_attno_colid_mapping) const { ULongPtrArray *part_cols = GPOS_NEW(m_mp) ULongPtrArray(m_mp); ListCell *lc = NULL; - ForEach (lc, partition_by_clause) + ForEach(lc, partition_by_clause) { - Node *partition_clause = (Node*) lfirst(lc); + Node *partition_clause = (Node *) lfirst(lc); GPOS_ASSERT(NULL != partition_clause); GPOS_ASSERT(IsA(partition_clause, SortClause)); - SortClause *sort_group_clause = (SortClause*) partition_clause; + SortClause *sort_group_clause = (SortClause *) partition_clause; // get the colid of the partition-by column - ULONG colid = CTranslatorUtils::GetColId((INT) sort_group_clause->tleSortGroupRef, col_attno_colid_mapping); + ULONG colid = CTranslatorUtils::GetColId( + (INT) sort_group_clause->tleSortGroupRef, col_attno_colid_mapping); part_cols->Append(GPOS_NEW(m_mp) ULONG(colid)); } @@ -1768,19 +1776,15 @@ CTranslatorQueryToDXL::TranslatePartColumns // //--------------------------------------------------------------------------- CDXLNodeArray * -CTranslatorQueryToDXL::TranslateSortColumnsToDXL - ( - List *sort_clause, - IntToUlongMap *col_attno_colid_mapping - ) - const +CTranslatorQueryToDXL::TranslateSortColumnsToDXL( + List *sort_clause, IntToUlongMap *col_attno_colid_mapping) const { CDXLNodeArray *dxlnodes = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); ListCell *lc = NULL; - ForEach (lc, sort_clause) + ForEach(lc, sort_clause) { - Node *node_sort_clause = (Node*) lfirst(lc); + Node *node_sort_clause = (Node *) lfirst(lc); GPOS_ASSERT(NULL != node_sort_clause); GPOS_ASSERT(IsA(node_sort_clause, SortClause)); @@ -1788,7 +1792,8 @@ CTranslatorQueryToDXL::TranslateSortColumnsToDXL SortClause *sort_group_clause = (SortClause *) node_sort_clause; // get the colid of the sorting column - const ULONG colid = CTranslatorUtils::GetColId((INT) sort_group_clause->tleSortGroupRef, col_attno_colid_mapping); + const ULONG colid = CTranslatorUtils::GetColId( + (INT) sort_group_clause->tleSortGroupRef, col_attno_colid_mapping); OID oid = sort_group_clause->sortop; @@ -1799,17 +1804,14 @@ CTranslatorQueryToDXL::TranslateSortColumnsToDXL const CWStringConst *str = md_scalar_op->Mdname().GetMDName(); GPOS_ASSERT(NULL != str); - CDXLScalarSortCol *sc_sort_col_dxlop = GPOS_NEW(m_mp) CDXLScalarSortCol - ( - m_mp, - colid, - op_mdid, - GPOS_NEW(m_mp) CWStringConst(str->GetBuffer()), - sort_group_clause->nulls_first - ); + CDXLScalarSortCol *sc_sort_col_dxlop = GPOS_NEW(m_mp) + CDXLScalarSortCol(m_mp, colid, op_mdid, + GPOS_NEW(m_mp) CWStringConst(str->GetBuffer()), + sort_group_clause->nulls_first); // create the DXL node holding the sorting col - CDXLNode *sort_col_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, sc_sort_col_dxlop); + CDXLNode *sort_col_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, sc_sort_col_dxlop); dxlnodes->Append(sort_col_dxlnode); } @@ -1827,30 +1829,29 @@ CTranslatorQueryToDXL::TranslateSortColumnsToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateLimitToDXLGroupBy - ( - List *sort_clause, - Node *limit_count, - Node *limit_offset_node, - CDXLNode *child_dxlnode, - IntToUlongMap *grpcols_to_colid_mapping - ) +CTranslatorQueryToDXL::TranslateLimitToDXLGroupBy( + List *sort_clause, Node *limit_count, Node *limit_offset_node, + CDXLNode *child_dxlnode, IntToUlongMap *grpcols_to_colid_mapping) { - if (0 == gpdb::ListLength(sort_clause) && NULL == limit_count && NULL == limit_offset_node) + if (0 == gpdb::ListLength(sort_clause) && NULL == limit_count && + NULL == limit_offset_node) { return child_dxlnode; } // do not remove limit if it is immediately under a DML (JIRA: GPSQL-2669) // otherwise we may increase the storage size because there are less opportunities for compression - BOOL is_limit_top_level = (m_is_top_query_dml && 1 == m_query_level) || (m_is_ctas_query && 0 == m_query_level); - CDXLNode *limit_dxlnode = - GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalLimit(m_mp, is_limit_top_level)); + BOOL is_limit_top_level = (m_is_top_query_dml && 1 == m_query_level) || + (m_is_ctas_query && 0 == m_query_level); + CDXLNode *limit_dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLLogicalLimit(m_mp, is_limit_top_level)); // create a sorting col list - CDXLNode *sort_col_list_dxl = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSortColList(m_mp)); + CDXLNode *sort_col_list_dxl = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSortColList(m_mp)); - CDXLNodeArray *dxl_sort_cols = TranslateSortColumnsToDXL(sort_clause, grpcols_to_colid_mapping); + CDXLNodeArray *dxl_sort_cols = + TranslateSortColumnsToDXL(sort_clause, grpcols_to_colid_mapping); const ULONG size = dxl_sort_cols->Size(); for (ULONG ul = 0; ul < size; ul++) { @@ -1861,27 +1862,22 @@ CTranslatorQueryToDXL::TranslateLimitToDXLGroupBy dxl_sort_cols->Release(); // create limit count - CDXLNode *limit_count_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarLimitCount(m_mp) - ); + CDXLNode *limit_count_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarLimitCount(m_mp)); if (NULL != limit_count) { - limit_count_dxlnode->AddChild(TranslateExprToDXL((Expr*) limit_count)); + limit_count_dxlnode->AddChild(TranslateExprToDXL((Expr *) limit_count)); } // create limit offset - CDXLNode *limit_offset_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarLimitOffset(m_mp) - ); + CDXLNode *limit_offset_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarLimitOffset(m_mp)); if (NULL != limit_offset_node) { - limit_offset_dxlnode->AddChild(TranslateExprToDXL((Expr*) limit_offset_node)); + limit_offset_dxlnode->AddChild( + TranslateExprToDXL((Expr *) limit_offset_node)); } limit_dxlnode->AddChild(sort_col_list_dxl); @@ -1901,13 +1897,9 @@ CTranslatorQueryToDXL::TranslateLimitToDXLGroupBy // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::AddSortingGroupingColumn - ( - TargetEntry *target_entry, - IntToUlongMap *sort_grpref_to_colid_mapping, - ULONG colid - ) - const +CTranslatorQueryToDXL::AddSortingGroupingColumn( + TargetEntry *target_entry, IntToUlongMap *sort_grpref_to_colid_mapping, + ULONG colid) const { if (0 < target_entry->ressortgroupref) { @@ -1917,8 +1909,8 @@ CTranslatorQueryToDXL::AddSortingGroupingColumn // insert idx-colid mapping in the hash map #ifdef GPOS_DEBUG BOOL is_res = -#endif // GPOS_DEBUG - sort_grpref_to_colid_mapping->Insert(key, value); +#endif // GPOS_DEBUG + sort_grpref_to_colid_mapping->Insert(key, value); GPOS_ASSERT(is_res); } @@ -1933,33 +1925,29 @@ CTranslatorQueryToDXL::AddSortingGroupingColumn // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::CreateSimpleGroupBy - ( - List *target_list, - List *group_clause, - CBitSet *grpby_cols_bitset, - BOOL has_aggs, - BOOL has_grouping_sets, - CDXLNode *child_dxlnode, +CTranslatorQueryToDXL::CreateSimpleGroupBy( + List *target_list, List *group_clause, CBitSet *grpby_cols_bitset, + BOOL has_aggs, BOOL has_grouping_sets, CDXLNode *child_dxlnode, IntToUlongMap *sort_grpref_to_colid_mapping, IntToUlongMap *child_attno_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping - ) + IntToUlongMap *output_attno_to_colid_mapping) { if (NULL == grpby_cols_bitset) - { + { GPOS_ASSERT(!has_aggs); if (!has_grouping_sets) { - // no group by needed and not part of a grouping sets query: + // no group by needed and not part of a grouping sets query: // propagate child columns to output columns IntUlongHashmapIter mi(child_attno_colid_mapping); while (mi.Advance()) { - #ifdef GPOS_DEBUG +#ifdef GPOS_DEBUG BOOL result = - #endif // GPOS_DEBUG - output_attno_to_colid_mapping->Insert(GPOS_NEW(m_mp) INT(*(mi.Key())), GPOS_NEW(m_mp) ULONG(*(mi.Value()))); +#endif // GPOS_DEBUG + output_attno_to_colid_mapping->Insert( + GPOS_NEW(m_mp) INT(*(mi.Key())), + GPOS_NEW(m_mp) ULONG(*(mi.Value()))); GPOS_ASSERT(result); } } @@ -1973,48 +1961,65 @@ CTranslatorQueryToDXL::CreateSimpleGroupBy List *dqa_list = NIL; // construct the project list of the group-by operator - CDXLNode *project_list_grpby_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_grpby_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); ListCell *lc = NULL; ULONG num_dqa = 0; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); GPOS_ASSERT(0 < target_entry->resno); ULONG resno = target_entry->resno; - TargetEntry *te_equivalent = CTranslatorUtils::GetGroupingColumnTargetEntry( (Node *) target_entry->expr, group_clause, target_list); + TargetEntry *te_equivalent = + CTranslatorUtils::GetGroupingColumnTargetEntry( + (Node *) target_entry->expr, group_clause, target_list); - BOOL is_grouping_col = grpby_cols_bitset->Get(target_entry->ressortgroupref) || (NULL != te_equivalent && grpby_cols_bitset->Get(te_equivalent->ressortgroupref)); + BOOL is_grouping_col = + grpby_cols_bitset->Get(target_entry->ressortgroupref) || + (NULL != te_equivalent && + grpby_cols_bitset->Get(te_equivalent->ressortgroupref)); ULONG colid = 0; if (is_grouping_col) { // find colid for grouping column - colid = CTranslatorUtils::GetColId(resno, child_attno_colid_mapping); + colid = + CTranslatorUtils::GetColId(resno, child_attno_colid_mapping); } - else if (IsA(target_entry->expr, Aggref) || IsA(target_entry->expr, PercentileExpr)) + else if (IsA(target_entry->expr, Aggref) || + IsA(target_entry->expr, PercentileExpr)) { - if (IsA(target_entry->expr, Aggref) && ((Aggref *) target_entry->expr)->aggdistinct && !IsDuplicateDqaArg(dqa_list, (Aggref *) target_entry->expr)) + if (IsA(target_entry->expr, Aggref) && + ((Aggref *) target_entry->expr)->aggdistinct && + !IsDuplicateDqaArg(dqa_list, (Aggref *) target_entry->expr)) { - dqa_list = gpdb::LAppend(dqa_list, gpdb::CopyObject(target_entry->expr)); + dqa_list = gpdb::LAppend(dqa_list, + gpdb::CopyObject(target_entry->expr)); num_dqa++; } // create a project element for aggregate - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject(target_entry->expr, target_entry->resname); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + target_entry->expr, target_entry->resname); project_list_grpby_dxlnode->AddChild(project_elem_dxlnode); - colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); - AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, colid); + colid = + CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator()) + ->Id(); + AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, + colid); } - if (is_grouping_col || IsA(target_entry->expr, Aggref) || IsA(target_entry->expr, PercentileExpr)) + if (is_grouping_col || IsA(target_entry->expr, Aggref) || + IsA(target_entry->expr, PercentileExpr)) { // add to the list of output columns StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); } - else if (0 == grpby_cols_bitset->Size() && !has_grouping_sets && !has_aggs) + else if (0 == grpby_cols_bitset->Size() && !has_grouping_sets && + !has_aggs) { StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); } @@ -2022,11 +2027,15 @@ CTranslatorQueryToDXL::CreateSimpleGroupBy if (1 < num_dqa && !optimizer_enable_multiple_distinct_aggs) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Multiple Distinct Qualified Aggregates are disabled in the optimizer")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "Multiple Distinct Qualified Aggregates are disabled in the optimizer")); } // initialize the array of grouping columns - ULongPtrArray *grouping_cols = CTranslatorUtils::GetGroupingColidArray(m_mp, grpby_cols_bitset, sort_grpref_to_colid_mapping); + ULongPtrArray *grouping_cols = CTranslatorUtils::GetGroupingColidArray( + m_mp, grpby_cols_bitset, sort_grpref_to_colid_mapping); // clean up if (NIL != dqa_list) @@ -2034,13 +2043,9 @@ CTranslatorQueryToDXL::CreateSimpleGroupBy gpdb::ListFree(dqa_list); } - return GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLLogicalGroupBy(m_mp, grouping_cols), - project_list_grpby_dxlnode, - child_dxlnode - ); + return GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalGroupBy(m_mp, grouping_cols), + project_list_grpby_dxlnode, child_dxlnode); } @@ -2052,11 +2057,7 @@ CTranslatorQueryToDXL::CreateSimpleGroupBy // Check if the argument of a DQA has already being used by another DQA //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::IsDuplicateDqaArg - ( - List *dqa_list, - Aggref *aggref - ) +CTranslatorQueryToDXL::IsDuplicateDqaArg(List *dqa_list, Aggref *aggref) { GPOS_ASSERT(NULL != aggref); @@ -2066,7 +2067,7 @@ CTranslatorQueryToDXL::IsDuplicateDqaArg } ListCell *lc = NULL; - ForEach (lc, dqa_list) + ForEach(lc, dqa_list) { Node *node = (Node *) lfirst(lc); GPOS_ASSERT(IsA(node, Aggref)); @@ -2089,43 +2090,34 @@ CTranslatorQueryToDXL::IsDuplicateDqaArg // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateGroupingSets - ( - FromExpr *from_expr, - List *target_list, - List *group_clause, - BOOL has_aggs, +CTranslatorQueryToDXL::TranslateGroupingSets( + FromExpr *from_expr, List *target_list, List *group_clause, BOOL has_aggs, IntToUlongMap *sort_grpref_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping - ) + IntToUlongMap *output_attno_to_colid_mapping) { const ULONG num_of_cols = gpdb::ListLength(target_list) + 1; if (NULL == group_clause) { - IntToUlongMap *child_attno_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); + IntToUlongMap *child_attno_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); - CDXLNode *select_project_join_dxlnode = TranslateSelectProjectJoinToDXL(target_list, from_expr, sort_grpref_to_colid_mapping, child_attno_colid_mapping, group_clause); + CDXLNode *select_project_join_dxlnode = TranslateSelectProjectJoinToDXL( + target_list, from_expr, sort_grpref_to_colid_mapping, + child_attno_colid_mapping, group_clause); CBitSet *bitset = NULL; if (has_aggs) - { + { bitset = GPOS_NEW(m_mp) CBitSet(m_mp); } - + // in case of aggregates, construct a group by operator - CDXLNode *result_dxlnode = CreateSimpleGroupBy - ( - target_list, - group_clause, - bitset, - has_aggs, - false, // has_grouping_sets - select_project_join_dxlnode, - sort_grpref_to_colid_mapping, - child_attno_colid_mapping, - output_attno_to_colid_mapping - ); + CDXLNode *result_dxlnode = CreateSimpleGroupBy( + target_list, group_clause, bitset, has_aggs, + false, // has_grouping_sets + select_project_join_dxlnode, sort_grpref_to_colid_mapping, + child_attno_colid_mapping, output_attno_to_colid_mapping); // cleanup child_attno_colid_mapping->Release(); @@ -2135,68 +2127,54 @@ CTranslatorQueryToDXL::TranslateGroupingSets // grouping functions refer to grouping col positions, so construct a map pos->grouping column // while processing the grouping clause - UlongToUlongMap *grpcol_index_to_colid_mapping = GPOS_NEW(m_mp) UlongToUlongMap(m_mp); + UlongToUlongMap *grpcol_index_to_colid_mapping = + GPOS_NEW(m_mp) UlongToUlongMap(m_mp); CBitSet *unique_grp_cols_bitset = GPOS_NEW(m_mp) CBitSet(m_mp, num_of_cols); - CBitSetArray *bitset_array = CTranslatorUtils::GetColumnAttnosForGroupBy(m_mp, group_clause, num_of_cols, grpcol_index_to_colid_mapping, unique_grp_cols_bitset); + CBitSetArray *bitset_array = CTranslatorUtils::GetColumnAttnosForGroupBy( + m_mp, group_clause, num_of_cols, grpcol_index_to_colid_mapping, + unique_grp_cols_bitset); const ULONG num_of_grouping_sets = bitset_array->Size(); if (1 == num_of_grouping_sets) { // simple group by - IntToUlongMap *child_attno_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - CDXLNode *select_project_join_dxlnode = TranslateSelectProjectJoinToDXL(target_list, from_expr, sort_grpref_to_colid_mapping, child_attno_colid_mapping, group_clause); + IntToUlongMap *child_attno_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + CDXLNode *select_project_join_dxlnode = TranslateSelectProjectJoinToDXL( + target_list, from_expr, sort_grpref_to_colid_mapping, + child_attno_colid_mapping, group_clause); // translate the groupby clauses into a logical group by operator CBitSet *bitset = (*bitset_array)[0]; - CDXLNode *groupby_dxlnode = CreateSimpleGroupBy - ( - target_list, - group_clause, - bitset, - has_aggs, - false, // has_grouping_sets - select_project_join_dxlnode, - sort_grpref_to_colid_mapping, - child_attno_colid_mapping, - output_attno_to_colid_mapping - ); - - CDXLNode *result_dxlnode = CreateDXLProjectGroupingFuncs - ( - target_list, - groupby_dxlnode, - bitset, - output_attno_to_colid_mapping, - grpcol_index_to_colid_mapping, - sort_grpref_to_colid_mapping - ); + CDXLNode *groupby_dxlnode = CreateSimpleGroupBy( + target_list, group_clause, bitset, has_aggs, + false, // has_grouping_sets + select_project_join_dxlnode, sort_grpref_to_colid_mapping, + child_attno_colid_mapping, output_attno_to_colid_mapping); + + CDXLNode *result_dxlnode = CreateDXLProjectGroupingFuncs( + target_list, groupby_dxlnode, bitset, output_attno_to_colid_mapping, + grpcol_index_to_colid_mapping, sort_grpref_to_colid_mapping); child_attno_colid_mapping->Release(); bitset_array->Release(); unique_grp_cols_bitset->Release(); grpcol_index_to_colid_mapping->Release(); - + return result_dxlnode; } - - CDXLNode *result_dxlnode = CreateDXLUnionAllForGroupingSets - ( - from_expr, - target_list, - group_clause, - has_aggs, - bitset_array, - sort_grpref_to_colid_mapping, - output_attno_to_colid_mapping, - grpcol_index_to_colid_mapping - ); + + CDXLNode *result_dxlnode = CreateDXLUnionAllForGroupingSets( + from_expr, target_list, group_clause, has_aggs, bitset_array, + sort_grpref_to_colid_mapping, output_attno_to_colid_mapping, + grpcol_index_to_colid_mapping); unique_grp_cols_bitset->Release(); grpcol_index_to_colid_mapping->Release(); - + return result_dxlnode; } @@ -2209,17 +2187,13 @@ CTranslatorQueryToDXL::TranslateGroupingSets // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets - ( - FromExpr *from_expr, - List *target_list, - List *group_clause, - BOOL has_aggs, - CBitSetArray *bitset_array, - IntToUlongMap *sort_grpref_to_colid_mapping, +CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets( + FromExpr *from_expr, List *target_list, List *group_clause, BOOL has_aggs, + CBitSetArray *bitset_array, IntToUlongMap *sort_grpref_to_colid_mapping, IntToUlongMap *output_attno_to_colid_mapping, - UlongToUlongMap *grpcol_index_to_colid_mapping // mapping pos->unique grouping columns for grouping func arguments - ) + UlongToUlongMap * + grpcol_index_to_colid_mapping // mapping pos->unique grouping columns for grouping func arguments +) { GPOS_ASSERT(NULL != bitset_array); GPOS_ASSERT(1 < bitset_array->Size()); @@ -2229,71 +2203,95 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets ULongPtrArray *colid_array_inner = NULL; const ULONG cte_id = m_cte_id_counter->next_id(); - + // construct a CTE producer on top of the SPJ query - IntToUlongMap *spj_output_attno_to_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - IntToUlongMap *sort_groupref_to_colid_producer_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - CDXLNode *select_project_join_dxlnode = TranslateSelectProjectJoinForGrpSetsToDXL(target_list, from_expr, sort_groupref_to_colid_producer_mapping, spj_output_attno_to_colid_mapping, group_clause); + IntToUlongMap *spj_output_attno_to_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + IntToUlongMap *sort_groupref_to_colid_producer_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + CDXLNode *select_project_join_dxlnode = + TranslateSelectProjectJoinForGrpSetsToDXL( + target_list, from_expr, sort_groupref_to_colid_producer_mapping, + spj_output_attno_to_colid_mapping, group_clause); // construct output colids - ULongPtrArray *op_colid_array_cte_producer = ExtractColIds(m_mp, spj_output_attno_to_colid_mapping); + ULongPtrArray *op_colid_array_cte_producer = + ExtractColIds(m_mp, spj_output_attno_to_colid_mapping); + + GPOS_ASSERT(NULL != m_dxl_cte_producers); - GPOS_ASSERT (NULL != m_dxl_cte_producers); - - CDXLLogicalCTEProducer *cte_prod_dxlop = GPOS_NEW(m_mp) CDXLLogicalCTEProducer(m_mp, cte_id, op_colid_array_cte_producer); - CDXLNode *cte_producer_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, cte_prod_dxlop, select_project_join_dxlnode); + CDXLLogicalCTEProducer *cte_prod_dxlop = GPOS_NEW(m_mp) + CDXLLogicalCTEProducer(m_mp, cte_id, op_colid_array_cte_producer); + CDXLNode *cte_producer_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, cte_prod_dxlop, select_project_join_dxlnode); m_dxl_cte_producers->Append(cte_producer_dxlnode); - - CMappingVarColId *var_colid_orig_mapping = m_var_to_colid_map->CopyMapColId(m_mp); - + + CMappingVarColId *var_colid_orig_mapping = + m_var_to_colid_map->CopyMapColId(m_mp); + for (ULONG ul = 0; ul < num_of_grouping_sets; ul++) { CBitSet *grouping_set_bitset = (*bitset_array)[ul]; // remap columns - ULongPtrArray *colid_array_cte_consumer = GenerateColIds(m_mp, op_colid_array_cte_producer->Size()); - + ULongPtrArray *colid_array_cte_consumer = + GenerateColIds(m_mp, op_colid_array_cte_producer->Size()); + // reset col mapping with new consumer columns GPOS_DELETE(m_var_to_colid_map); - m_var_to_colid_map = var_colid_orig_mapping->CopyRemapColId(m_mp, op_colid_array_cte_producer, colid_array_cte_consumer); - - IntToUlongMap *spj_consumer_output_attno_to_colid_mapping = RemapColIds(m_mp, spj_output_attno_to_colid_mapping, op_colid_array_cte_producer, colid_array_cte_consumer); - IntToUlongMap *phmiulSortgrouprefColIdConsumer = RemapColIds(m_mp, sort_groupref_to_colid_producer_mapping, op_colid_array_cte_producer, colid_array_cte_consumer); + m_var_to_colid_map = var_colid_orig_mapping->CopyRemapColId( + m_mp, op_colid_array_cte_producer, colid_array_cte_consumer); + + IntToUlongMap *spj_consumer_output_attno_to_colid_mapping = + RemapColIds(m_mp, spj_output_attno_to_colid_mapping, + op_colid_array_cte_producer, colid_array_cte_consumer); + IntToUlongMap *phmiulSortgrouprefColIdConsumer = + RemapColIds(m_mp, sort_groupref_to_colid_producer_mapping, + op_colid_array_cte_producer, colid_array_cte_consumer); // construct a CTE consumer - CDXLNode *cte_consumer_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEConsumer(m_mp, cte_id, colid_array_cte_consumer)); - - IntToUlongMap *groupby_attno_to_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - CDXLNode *groupby_dxlnode = CreateSimpleGroupBy - ( - target_list, - group_clause, - grouping_set_bitset, - has_aggs, - true, // has_grouping_sets - cte_consumer_dxlnode, - phmiulSortgrouprefColIdConsumer, - spj_consumer_output_attno_to_colid_mapping, - groupby_attno_to_colid_mapping - ); + CDXLNode *cte_consumer_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEConsumer( + m_mp, cte_id, colid_array_cte_consumer)); + + IntToUlongMap *groupby_attno_to_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + CDXLNode *groupby_dxlnode = CreateSimpleGroupBy( + target_list, group_clause, grouping_set_bitset, has_aggs, + true, // has_grouping_sets + cte_consumer_dxlnode, phmiulSortgrouprefColIdConsumer, + spj_consumer_output_attno_to_colid_mapping, + groupby_attno_to_colid_mapping); // add a project list for the NULL values - CDXLNode *project_dxlnode = CreateDXLProjectNullsForGroupingSets(target_list, groupby_dxlnode, grouping_set_bitset, phmiulSortgrouprefColIdConsumer, groupby_attno_to_colid_mapping, grpcol_index_to_colid_mapping); - - ULongPtrArray *colids_outer_array = CTranslatorUtils::GetOutputColIdsArray(m_mp, target_list, groupby_attno_to_colid_mapping); + CDXLNode *project_dxlnode = CreateDXLProjectNullsForGroupingSets( + target_list, groupby_dxlnode, grouping_set_bitset, + phmiulSortgrouprefColIdConsumer, groupby_attno_to_colid_mapping, + grpcol_index_to_colid_mapping); + + ULongPtrArray *colids_outer_array = + CTranslatorUtils::GetOutputColIdsArray( + m_mp, target_list, groupby_attno_to_colid_mapping); if (NULL != unionall_dxlnode) { GPOS_ASSERT(NULL != colid_array_inner); - CDXLColDescrArray *dxl_col_descr_array = CTranslatorUtils::GetDXLColumnDescrArray(m_mp, target_list, colids_outer_array, true /* keep_res_junked */); + CDXLColDescrArray *dxl_col_descr_array = + CTranslatorUtils::GetDXLColumnDescrArray( + m_mp, target_list, colids_outer_array, + true /* keep_res_junked */); colids_outer_array->AddRef(); - ULongPtr2dArray *input_colids = GPOS_NEW(m_mp) ULongPtr2dArray(m_mp); + ULongPtr2dArray *input_colids = + GPOS_NEW(m_mp) ULongPtr2dArray(m_mp); input_colids->Append(colids_outer_array); input_colids->Append(colid_array_inner); - CDXLLogicalSetOp *dxl_setop = GPOS_NEW(m_mp) CDXLLogicalSetOp(m_mp, EdxlsetopUnionAll, dxl_col_descr_array, input_colids, false); - unionall_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_setop, project_dxlnode, unionall_dxlnode); + CDXLLogicalSetOp *dxl_setop = GPOS_NEW(m_mp) + CDXLLogicalSetOp(m_mp, EdxlsetopUnionAll, dxl_col_descr_array, + input_colids, false); + unionall_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, dxl_setop, project_dxlnode, unionall_dxlnode); } else { @@ -2301,21 +2299,25 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets } colid_array_inner = colids_outer_array; - + if (ul == num_of_grouping_sets - 1) { // add the sortgroup columns to output map of the last column ULONG te_pos = 0; ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); - INT sortgroupref = INT (target_entry->ressortgroupref); - if (0 < sortgroupref && NULL != phmiulSortgrouprefColIdConsumer->Find(&sortgroupref)) + INT sortgroupref = INT(target_entry->ressortgroupref); + if (0 < sortgroupref && + NULL != + phmiulSortgrouprefColIdConsumer->Find(&sortgroupref)) { // add the mapping information for sorting columns - AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, *(*colid_array_inner)[te_pos]); + AddSortingGroupingColumn(target_entry, + sort_grpref_to_colid_mapping, + *(*colid_array_inner)[te_pos]); } te_pos++; @@ -2335,11 +2337,12 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets colid_array_inner->Release(); // compute output columns - CDXLLogicalSetOp *union_dxlop = CDXLLogicalSetOp::Cast(unionall_dxlnode->GetOperator()); + CDXLLogicalSetOp *union_dxlop = + CDXLLogicalSetOp::Cast(unionall_dxlnode->GetOperator()); ListCell *lc = NULL; ULONG output_col_idx = 0; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); @@ -2348,7 +2351,8 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets // note that all target list entries are kept in union all's output column // this is achieved by the keep_res_junked flag in CTranslatorUtils::GetDXLColumnDescrArray - const CDXLColDescr *dxl_col_descr = union_dxlop->GetColumnDescrAt(output_col_idx); + const CDXLColDescr *dxl_col_descr = + union_dxlop->GetColumnDescrAt(output_col_idx); const ULONG colid = dxl_col_descr->Id(); output_col_idx++; @@ -2363,7 +2367,9 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets bitset_array->Release(); // construct a CTE anchor operator on top of the union all - return GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEAnchor(m_mp, cte_id), unionall_dxlnode); + return GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEAnchor(m_mp, cte_id), + unionall_dxlnode); } //--------------------------------------------------------------------------- @@ -2377,42 +2383,41 @@ CTranslatorQueryToDXL::CreateDXLUnionAllForGroupingSets CDXLNode * CTranslatorQueryToDXL::DXLDummyConstTableGet() const { - // construct the schema of the const table - CDXLColDescrArray *dxl_col_descr_array = GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); + CDXLColDescrArray *dxl_col_descr_array = + GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); - const CMDTypeBoolGPDB *md_type_bool = dynamic_cast(m_md_accessor->PtMDType(m_sysid)); + const CMDTypeBoolGPDB *md_type_bool = dynamic_cast( + m_md_accessor->PtMDType(m_sysid)); const CMDIdGPDB *mdid = CMDIdGPDB::CastMdid(md_type_bool->MDId()); // empty column name CWStringConst str_unnamed_col(GPOS_WSZ_LIT("")); CMDName *mdname = GPOS_NEW(m_mp) CMDName(m_mp, &str_unnamed_col); - CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr - ( - m_mp, - mdname, - m_colid_counter->next_id(), - 1 /* attno */, - GPOS_NEW(m_mp) CMDIdGPDB(mdid->Oid()), - default_type_modifier, - false /* is_dropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) + CDXLColDescr(m_mp, mdname, m_colid_counter->next_id(), 1 /* attno */, + GPOS_NEW(m_mp) CMDIdGPDB(mdid->Oid()), + default_type_modifier, false /* is_dropped */ + ); dxl_col_descr_array->Append(dxl_col_descr); // create the array of datum arrays - CDXLDatum2dArray *dispatch_identifier_datum_arrays = GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); - + CDXLDatum2dArray *dispatch_identifier_datum_arrays = + GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); + // create a datum array CDXLDatumArray *dxl_datum_array = GPOS_NEW(m_mp) CDXLDatumArray(m_mp); - Const *const_expr = (Const*) gpdb::MakeBoolConst(true /*value*/, false /*isnull*/); + Const *const_expr = + (Const *) gpdb::MakeBoolConst(true /*value*/, false /*isnull*/); CDXLDatum *datum_dxl = m_scalar_translator->TranslateConstToDXL(const_expr); gpdb::GPDBFree(const_expr); dxl_datum_array->Append(datum_dxl); dispatch_identifier_datum_arrays->Append(dxl_datum_array); - CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable(m_mp, dxl_col_descr_array, dispatch_identifier_datum_arrays); + CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable( + m_mp, dxl_col_descr_array, dispatch_identifier_datum_arrays); return GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); } @@ -2426,18 +2431,16 @@ CTranslatorQueryToDXL::DXLDummyConstTableGet() const // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateSetOpToDXL - ( - Node *setop_node, - List *target_list, - IntToUlongMap *output_attno_to_colid_mapping - ) +CTranslatorQueryToDXL::TranslateSetOpToDXL( + Node *setop_node, List *target_list, + IntToUlongMap *output_attno_to_colid_mapping) { GPOS_ASSERT(IsA(setop_node, SetOperationStmt)); - SetOperationStmt *psetopstmt = (SetOperationStmt*) setop_node; + SetOperationStmt *psetopstmt = (SetOperationStmt *) setop_node; GPOS_ASSERT(SETOP_NONE != psetopstmt->op); - EdxlSetOpType setop_type = CTranslatorUtils::GetSetOpType(psetopstmt->op, psetopstmt->all); + EdxlSetOpType setop_type = + CTranslatorUtils::GetSetOpType(psetopstmt->op, psetopstmt->all); // translate the left and right child ULongPtrArray *leftchild_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); @@ -2445,8 +2448,10 @@ CTranslatorQueryToDXL::TranslateSetOpToDXL IMdIdArray *mdid_array_leftchild = GPOS_NEW(m_mp) IMdIdArray(m_mp); IMdIdArray *mdid_array_rightchild = GPOS_NEW(m_mp) IMdIdArray(m_mp); - CDXLNode *left_child_dxlnode = TranslateSetOpChild(psetopstmt->larg, leftchild_array, mdid_array_leftchild, target_list); - CDXLNode *right_child_dxlnode = TranslateSetOpChild(psetopstmt->rarg, rightchild_array, mdid_array_rightchild, target_list); + CDXLNode *left_child_dxlnode = TranslateSetOpChild( + psetopstmt->larg, leftchild_array, mdid_array_leftchild, target_list); + CDXLNode *right_child_dxlnode = TranslateSetOpChild( + psetopstmt->rarg, rightchild_array, mdid_array_rightchild, target_list); // mark outer references in input columns from left child ULONG *colid = GPOS_NEW_ARRAY(m_mp, ULONG, leftchild_array->Size()); @@ -2454,52 +2459,44 @@ CTranslatorQueryToDXL::TranslateSetOpToDXL const ULONG size = leftchild_array->Size(); for (ULONG ul = 0; ul < size; ul++) { - colid[ul] = *(*leftchild_array)[ul]; + colid[ul] = *(*leftchild_array)[ul]; outer_ref_array[ul] = true; } - CTranslatorUtils::MarkOuterRefs(colid, outer_ref_array, size, left_child_dxlnode); + CTranslatorUtils::MarkOuterRefs(colid, outer_ref_array, size, + left_child_dxlnode); ULongPtr2dArray *input_colids = GPOS_NEW(m_mp) ULongPtr2dArray(m_mp); input_colids->Append(leftchild_array); input_colids->Append(rightchild_array); - - ULongPtrArray *output_colids = CTranslatorUtils::GenerateColIds - ( - m_mp, - target_list, - mdid_array_leftchild, - leftchild_array, - outer_ref_array, - m_colid_counter - ); - GPOS_ASSERT(output_colids->Size() == leftchild_array->Size()); - - GPOS_DELETE_ARRAY(colid); - GPOS_DELETE_ARRAY(outer_ref_array); - - BOOL is_cast_across_input = SetOpNeedsCast(target_list, mdid_array_leftchild) || SetOpNeedsCast(target_list, mdid_array_rightchild); - - CDXLNodeArray *children_dxlnodes = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); + + ULongPtrArray *output_colids = CTranslatorUtils::GenerateColIds( + m_mp, target_list, mdid_array_leftchild, leftchild_array, + outer_ref_array, m_colid_counter); + GPOS_ASSERT(output_colids->Size() == leftchild_array->Size()); + + GPOS_DELETE_ARRAY(colid); + GPOS_DELETE_ARRAY(outer_ref_array); + + BOOL is_cast_across_input = + SetOpNeedsCast(target_list, mdid_array_leftchild) || + SetOpNeedsCast(target_list, mdid_array_rightchild); + + CDXLNodeArray *children_dxlnodes = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); children_dxlnodes->Append(left_child_dxlnode); children_dxlnodes->Append(right_child_dxlnode); - CDXLNode *dxlnode = CreateDXLSetOpFromColumns - ( - setop_type, - target_list, - output_colids, - input_colids, - children_dxlnodes, - is_cast_across_input, - false /* keep_res_junked */ - ); + CDXLNode *dxlnode = CreateDXLSetOpFromColumns( + setop_type, target_list, output_colids, input_colids, children_dxlnodes, + is_cast_across_input, false /* keep_res_junked */ + ); CDXLLogicalSetOp *dxlop = CDXLLogicalSetOp::Cast(dxlnode->GetOperator()); - const CDXLColDescrArray *dxl_col_descr_array = dxlop->GetDXLColumnDescrArray(); + const CDXLColDescrArray *dxl_col_descr_array = + dxlop->GetDXLColumnDescrArray(); ULONG output_col_idx = 0; ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); @@ -2508,7 +2505,8 @@ CTranslatorQueryToDXL::TranslateSetOpToDXL if (!target_entry->resjunk) { - const CDXLColDescr *dxl_col_descr_new = (*dxl_col_descr_array)[output_col_idx]; + const CDXLColDescr *dxl_col_descr_new = + (*dxl_col_descr_array)[output_col_idx]; ULONG colid = dxl_col_descr_new->Id(); StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); output_col_idx++; @@ -2531,17 +2529,11 @@ CTranslatorQueryToDXL::TranslateSetOpToDXL // Create a set op after adding dummy cast on input columns where needed //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::CreateDXLSetOpFromColumns - ( - EdxlSetOpType setop_type, - List *output_target_list, - ULongPtrArray *output_colids, - ULongPtr2dArray *input_colids, - CDXLNodeArray *children_dxlnodes, - BOOL is_cast_across_input, - BOOL keep_res_junked - ) - const +CTranslatorQueryToDXL::CreateDXLSetOpFromColumns( + EdxlSetOpType setop_type, List *output_target_list, + ULongPtrArray *output_colids, ULongPtr2dArray *input_colids, + CDXLNodeArray *children_dxlnodes, BOOL is_cast_across_input, + BOOL keep_res_junked) const { GPOS_ASSERT(NULL != output_target_list); GPOS_ASSERT(NULL != output_colids); @@ -2551,7 +2543,8 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns GPOS_ASSERT(1 < children_dxlnodes->Size()); // positions of output columns in the target list - ULongPtrArray *output_col_pos = CTranslatorUtils::GetPosInTargetList(m_mp, output_target_list, keep_res_junked); + ULongPtrArray *output_col_pos = CTranslatorUtils::GetPosInTargetList( + m_mp, output_target_list, keep_res_junked); const ULONG num_of_cols = output_colids->Size(); ULongPtrArray *input_first_child_array = (*input_colids)[0]; @@ -2561,10 +2554,13 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns CBitSet *bitset = GPOS_NEW(m_mp) CBitSet(m_mp); // project list to maintain the casting of the duplicate input columns - CDXLNode *new_child_project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *new_child_project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); - ULongPtrArray *input_first_child_new_array = GPOS_NEW(m_mp) ULongPtrArray (m_mp); - CDXLColDescrArray *output_col_descrs = GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); + ULongPtrArray *input_first_child_new_array = + GPOS_NEW(m_mp) ULongPtrArray(m_mp); + CDXLColDescrArray *output_col_descrs = + GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); for (ULONG ul = 0; ul < num_of_cols; ul++) { ULONG colid_output = *(*output_colids)[ul]; @@ -2574,22 +2570,26 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns BOOL is_casted_col = (colid_output != colid_input); ULONG target_list_pos = *(*output_col_pos)[ul]; - TargetEntry *target_entry = (TargetEntry*) gpdb::ListNth(output_target_list, target_list_pos); + TargetEntry *target_entry = + (TargetEntry *) gpdb::ListNth(output_target_list, target_list_pos); GPOS_ASSERT(NULL != target_entry); CDXLColDescr *output_col_descr = NULL; if (!is_col_exists) { bitset->ExchangeSet(colid_input); - input_first_child_new_array->Append(GPOS_NEW(m_mp) ULONG(colid_input)); + input_first_child_new_array->Append(GPOS_NEW(m_mp) + ULONG(colid_input)); - output_col_descr = CTranslatorUtils::GetColumnDescrAt(m_mp, target_entry, colid_output, ul + 1); + output_col_descr = CTranslatorUtils::GetColumnDescrAt( + m_mp, target_entry, colid_output, ul + 1); } else { // we add a dummy-cast to distinguish between the output columns of the union ULONG colid_new = m_colid_counter->next_id(); - input_first_child_new_array->Append(GPOS_NEW(m_mp) ULONG(colid_new)); + input_first_child_new_array->Append(GPOS_NEW(m_mp) + ULONG(colid_new)); ULONG colid_union_output = colid_new; if (is_casted_col) @@ -2598,8 +2598,11 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns colid_union_output = m_colid_counter->next_id(); } - output_col_descr = CTranslatorUtils::GetColumnDescrAt(m_mp, target_entry, colid_union_output, ul + 1); - CDXLNode *project_elem_dxlnode = CTranslatorUtils::CreateDummyProjectElem(m_mp, colid_input, colid_new, output_col_descr); + output_col_descr = CTranslatorUtils::GetColumnDescrAt( + m_mp, target_entry, colid_union_output, ul + 1); + CDXLNode *project_elem_dxlnode = + CTranslatorUtils::CreateDummyProjectElem( + m_mp, colid_input, colid_new, output_col_descr); new_child_project_list_dxlnode->AddChild(project_elem_dxlnode); } @@ -2614,7 +2617,8 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns // create a project node for the dummy casted columns CDXLNode *first_child_dxlnode = (*children_dxlnodes)[0]; first_child_dxlnode->AddRef(); - CDXLNode *new_child_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + CDXLNode *new_child_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); new_child_dxlnode->AddChild(new_child_project_list_dxlnode); new_child_dxlnode->AddChild(first_child_dxlnode); @@ -2625,14 +2629,9 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns new_child_project_list_dxlnode->Release(); } - CDXLLogicalSetOp *dxlop = GPOS_NEW(m_mp) CDXLLogicalSetOp - ( - m_mp, - setop_type, - output_col_descrs, - input_colids, - is_cast_across_input - ); + CDXLLogicalSetOp *dxlop = + GPOS_NEW(m_mp) CDXLLogicalSetOp(m_mp, setop_type, output_col_descrs, + input_colids, is_cast_across_input); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop, children_dxlnodes); bitset->Release(); @@ -2650,23 +2649,21 @@ CTranslatorQueryToDXL::CreateDXLSetOpFromColumns // //--------------------------------------------------------------------------- BOOL -CTranslatorQueryToDXL::SetOpNeedsCast - ( - List *target_list, - IMdIdArray *input_col_mdids - ) - const +CTranslatorQueryToDXL::SetOpNeedsCast(List *target_list, + IMdIdArray *input_col_mdids) const { GPOS_ASSERT(NULL != input_col_mdids); GPOS_ASSERT(NULL != target_list); - GPOS_ASSERT(input_col_mdids->Size() <= gpdb::ListLength(target_list)); // there may be resjunked columns + GPOS_ASSERT( + input_col_mdids->Size() <= + gpdb::ListLength(target_list)); // there may be resjunked columns ULONG col_pos_idx = 0; ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); - OID expr_type_oid = gpdb::ExprType((Node*) target_entry->expr); + OID expr_type_oid = gpdb::ExprType((Node *) target_entry->expr); if (!target_entry->resjunk) { IMDId *mdid = (*input_col_mdids)[col_pos_idx]; @@ -2690,59 +2687,58 @@ CTranslatorQueryToDXL::SetOpNeedsCast // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateSetOpChild - ( - Node *child_node, - ULongPtrArray *colids, - IMdIdArray *input_col_mdids, - List *target_list - ) +CTranslatorQueryToDXL::TranslateSetOpChild(Node *child_node, + ULongPtrArray *colids, + IMdIdArray *input_col_mdids, + List *target_list) { GPOS_ASSERT(NULL != colids); GPOS_ASSERT(NULL != input_col_mdids); if (IsA(child_node, RangeTblRef)) { - RangeTblRef *range_tbl_ref = (RangeTblRef*) child_node; + RangeTblRef *range_tbl_ref = (RangeTblRef *) child_node; const ULONG rt_index = range_tbl_ref->rtindex; - const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rt_index - 1); + const RangeTblEntry *rte = + (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rt_index - 1); if (RTE_SUBQUERY == rte->rtekind) { - Query *query_derived_tbl = CTranslatorUtils::FixUnknownTypeConstant(rte->subquery, target_list); + Query *query_derived_tbl = CTranslatorUtils::FixUnknownTypeConstant( + rte->subquery, target_list); GPOS_ASSERT(NULL != query_derived_tbl); - CMappingVarColId *var_colid_mapping = m_var_to_colid_map->CopyMapColId(m_mp); - CTranslatorQueryToDXL query_to_dxl_translator - ( - m_mp, - m_md_accessor, - m_colid_counter, - m_cte_id_counter, - var_colid_mapping, - query_derived_tbl, - m_query_level + 1, - IsDMLQuery(), - m_query_level_to_cte_map - ); + CMappingVarColId *var_colid_mapping = + m_var_to_colid_map->CopyMapColId(m_mp); + CTranslatorQueryToDXL query_to_dxl_translator( + m_mp, m_md_accessor, m_colid_counter, m_cte_id_counter, + var_colid_mapping, query_derived_tbl, m_query_level + 1, + IsDMLQuery(), m_query_level_to_cte_map); // translate query representing the derived table to its DXL representation - CDXLNode *query_dxlnode = query_to_dxl_translator.TranslateSelectQueryToDXL(); + CDXLNode *query_dxlnode = + query_to_dxl_translator.TranslateSelectQueryToDXL(); GPOS_ASSERT(NULL != query_dxlnode); - CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator.GetCTEs(); + CDXLNodeArray *cte_dxlnode_array = + query_to_dxl_translator.GetCTEs(); CUtils::AddRefAppend(m_dxl_cte_producers, cte_dxlnode_array); - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator.HasDistributedTables(); + m_has_distributed_tables = + m_has_distributed_tables || + query_to_dxl_translator.HasDistributedTables(); // get the output columns of the derived table - CDXLNodeArray *dxlnodes = query_to_dxl_translator.GetQueryOutputCols(); + CDXLNodeArray *dxlnodes = + query_to_dxl_translator.GetQueryOutputCols(); GPOS_ASSERT(dxlnodes != NULL); const ULONG length = dxlnodes->Size(); for (ULONG ul = 0; ul < length; ul++) { CDXLNode *current_dxlnode = (*dxlnodes)[ul]; - CDXLScalarIdent *dxl_scalar_ident = CDXLScalarIdent::Cast(current_dxlnode->GetOperator()); - ULONG *colid = GPOS_NEW(m_mp) ULONG(dxl_scalar_ident->GetDXLColRef()->Id()); + CDXLScalarIdent *dxl_scalar_ident = + CDXLScalarIdent::Cast(current_dxlnode->GetOperator()); + ULONG *colid = GPOS_NEW(m_mp) + ULONG(dxl_scalar_ident->GetDXLColRef()->Id()); colids->Append(colid); IMDId *mdid_col = dxl_scalar_ident->MdidType(); @@ -2756,13 +2752,17 @@ CTranslatorQueryToDXL::TranslateSetOpChild } else if (IsA(child_node, SetOperationStmt)) { - IntToUlongMap *output_attno_to_colid_mapping = GPOS_NEW(m_mp) IntToUlongMap(m_mp); - CDXLNode *dxlnode = TranslateSetOpToDXL(child_node, target_list, output_attno_to_colid_mapping); + IntToUlongMap *output_attno_to_colid_mapping = + GPOS_NEW(m_mp) IntToUlongMap(m_mp); + CDXLNode *dxlnode = TranslateSetOpToDXL(child_node, target_list, + output_attno_to_colid_mapping); // cleanup output_attno_to_colid_mapping->Release(); - const CDXLColDescrArray *dxl_col_descr_array = CDXLLogicalSetOp::Cast(dxlnode->GetOperator())->GetDXLColumnDescrArray(); + const CDXLColDescrArray *dxl_col_descr_array = + CDXLLogicalSetOp::Cast(dxlnode->GetOperator()) + ->GetDXLColumnDescrArray(); GPOS_ASSERT(NULL != dxl_col_descr_array); const ULONG length = dxl_col_descr_array->Size(); for (ULONG ul = 0; ul < length; ul++) @@ -2780,10 +2780,13 @@ CTranslatorQueryToDXL::TranslateSetOpChild return dxlnode; } - CHAR *temp_str = (CHAR*) gpdb::NodeToString(const_cast(child_node)); - CWStringDynamic *str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, temp_str); + CHAR *temp_str = + (CHAR *) gpdb::NodeToString(const_cast(child_node)); + CWStringDynamic *str = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, temp_str); - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, str->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + str->GetBuffer()); return NULL; } @@ -2797,10 +2800,7 @@ CTranslatorQueryToDXL::TranslateSetOpChild // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateFromExprToDXL - ( - FromExpr *from_expr - ) +CTranslatorQueryToDXL::TranslateFromExprToDXL(FromExpr *from_expr) { CDXLNode *dxlnode = NULL; @@ -2812,7 +2812,7 @@ CTranslatorQueryToDXL::TranslateFromExprToDXL { if (1 == gpdb::ListLength(from_expr->fromlist)) { - Node *node = (Node*) gpdb::ListNth(from_expr->fromlist, 0); + Node *node = (Node *) gpdb::ListNth(from_expr->fromlist, 0); GPOS_ASSERT(NULL != node); dxlnode = TranslateFromClauseToDXL(node); } @@ -2822,12 +2822,13 @@ CTranslatorQueryToDXL::TranslateFromExprToDXL // The join conditions represented in the FromExpr->quals is translated // into a CDXLLogicalSelect on top of the CDXLLogicalJoin - dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalJoin(m_mp, EdxljtInner)); + dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLLogicalJoin(m_mp, EdxljtInner)); ListCell *lc = NULL; - ForEach (lc, from_expr->fromlist) + ForEach(lc, from_expr->fromlist) { - Node *node = (Node*) lfirst(lc); + Node *node = (Node *) lfirst(lc); CDXLNode *child_dxlnode = TranslateFromClauseToDXL(node); dxlnode->AddChild(child_dxlnode); } @@ -2839,21 +2840,22 @@ CTranslatorQueryToDXL::TranslateFromExprToDXL CDXLNode *condition_dxlnode = NULL; if (NULL != qual_node) { - condition_dxlnode = TranslateExprToDXL( (Expr*) qual_node); + condition_dxlnode = TranslateExprToDXL((Expr *) qual_node); } if (1 >= gpdb::ListLength(from_expr->fromlist)) { if (NULL != condition_dxlnode) { - CDXLNode *select_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalSelect(m_mp)); + CDXLNode *select_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalSelect(m_mp)); select_dxlnode->AddChild(condition_dxlnode); select_dxlnode->AddChild(dxlnode); dxlnode = select_dxlnode; } } - else //n-ary joins + else //n-ary joins { if (NULL == condition_dxlnode) { @@ -2877,36 +2879,35 @@ CTranslatorQueryToDXL::TranslateFromExprToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateFromClauseToDXL - ( - Node *node - ) +CTranslatorQueryToDXL::TranslateFromClauseToDXL(Node *node) { GPOS_ASSERT(NULL != node); if (IsA(node, RangeTblRef)) { RangeTblRef *range_tbl_ref = (RangeTblRef *) node; - ULONG rt_index = range_tbl_ref->rtindex ; - const RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rt_index - 1); + ULONG rt_index = range_tbl_ref->rtindex; + const RangeTblEntry *rte = + (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rt_index - 1); GPOS_ASSERT(NULL != rte); if (rte->forceDistRandom) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("gp_dist_random")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("gp_dist_random")); } - static const SRTETranslator dxlop_translator_func_mapping_array[] = - { + static const SRTETranslator dxlop_translator_func_mapping_array[] = { {RTE_RELATION, &CTranslatorQueryToDXL::TranslateRTEToDXLLogicalGet}, {RTE_VALUES, &CTranslatorQueryToDXL::TranslateValueScanRTEToDXL}, {RTE_CTE, &CTranslatorQueryToDXL::TranslateCTEToDXL}, {RTE_SUBQUERY, &CTranslatorQueryToDXL::TranslateDerivedTablesToDXL}, {RTE_FUNCTION, &CTranslatorQueryToDXL::TranslateTVFToDXL}, }; - - const ULONG num_of_translators = GPOS_ARRAY_SIZE(dxlop_translator_func_mapping_array); - + + const ULONG num_of_translators = + GPOS_ARRAY_SIZE(dxlop_translator_func_mapping_array); + // find translator for the rtekind DXLNodeToLogicalFunc dxlnode_to_logical_funct = NULL; for (ULONG ul = 0; ul < num_of_translators; ul++) @@ -2918,26 +2919,28 @@ CTranslatorQueryToDXL::TranslateFromClauseToDXL break; } } - + if (NULL == dxlnode_to_logical_funct) { UnsupportedRTEKind(rte->rtekind); return NULL; } - + return (this->*dxlnode_to_logical_funct)(rte, rt_index, m_query_level); } if (IsA(node, JoinExpr)) { - return TranslateJoinExprInFromToDXL((JoinExpr*) node); + return TranslateJoinExprInFromToDXL((JoinExpr *) node); } - CHAR *sz = (CHAR*) gpdb::NodeToString(const_cast(node)); - CWStringDynamic *str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, sz); + CHAR *sz = (CHAR *) gpdb::NodeToString(const_cast(node)); + CWStringDynamic *str = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, sz); - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, str->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + str->GetBuffer()); return NULL; } @@ -2950,23 +2953,18 @@ CTranslatorQueryToDXL::TranslateFromClauseToDXL // Raise exception for unsupported RangeTblEntries of a particular kind //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::UnsupportedRTEKind - ( - RTEKind rtekind - ) - const +CTranslatorQueryToDXL::UnsupportedRTEKind(RTEKind rtekind) const { - GPOS_ASSERT(!(RTE_RELATION == rtekind || RTE_CTE == rtekind - || RTE_FUNCTION == rtekind || RTE_SUBQUERY == rtekind - || RTE_VALUES == rtekind)); + GPOS_ASSERT(!(RTE_RELATION == rtekind || RTE_CTE == rtekind || + RTE_FUNCTION == rtekind || RTE_SUBQUERY == rtekind || + RTE_VALUES == rtekind)); - static const SRTENameElem rte_name_map[] = - { + static const SRTENameElem rte_name_map[] = { {RTE_JOIN, GPOS_WSZ_LIT("RangeTableEntry of type Join")}, {RTE_SPECIAL, GPOS_WSZ_LIT("RangeTableEntry of type Special")}, {RTE_VOID, GPOS_WSZ_LIT("RangeTableEntry of type Void")}, - {RTE_TABLEFUNCTION, GPOS_WSZ_LIT("RangeTableEntry of type Table Function")} - }; + {RTE_TABLEFUNCTION, + GPOS_WSZ_LIT("RangeTableEntry of type Table Function")}}; const ULONG length = GPOS_ARRAY_SIZE(rte_name_map); for (ULONG ul = 0; ul < length; ul++) @@ -2975,7 +2973,8 @@ CTranslatorQueryToDXL::UnsupportedRTEKind if (mapelem.m_rtekind == rtekind) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, mapelem.m_rte_name); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + mapelem.m_rte_name); } } @@ -2991,25 +2990,26 @@ CTranslatorQueryToDXL::UnsupportedRTEKind // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateRTEToDXLLogicalGet - ( - const RangeTblEntry *rte, - ULONG rt_index, - ULONG //current_query_level - ) +CTranslatorQueryToDXL::TranslateRTEToDXLLogicalGet(const RangeTblEntry *rte, + ULONG rt_index, + ULONG //current_query_level +) { - CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr(m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); + CDXLTableDescr *table_descr = CTranslatorUtils::GetTableDescr( + m_mp, m_md_accessor, m_colid_counter, rte, &m_has_distributed_tables); CDXLLogicalGet *dxlop = NULL; const IMDRelation *md_rel = m_md_accessor->RetrieveRel(table_descr->MDId()); - if (false == rte->inh && IMDRelation::ErelstorageExternal != md_rel->RetrieveRelStorageType()) + if (false == rte->inh && + IMDRelation::ErelstorageExternal != md_rel->RetrieveRelStorageType()) { GPOS_ASSERT(RTE_RELATION == rte->rtekind); // RangeTblEntry::inh is set to false iff there is ONLY in the FROM // clause. c.f. transformTableEntry, called from transformFromClauseItem - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("ONLY in the FROM clause")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("ONLY in the FROM clause")); } // construct table descriptor for the scan node from the range table entry @@ -3039,12 +3039,9 @@ CTranslatorQueryToDXL::TranslateRTEToDXLLogicalGet // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateValueScanRTEToDXL - ( - const RangeTblEntry *rte, - ULONG rt_index, - ULONG current_query_level - ) +CTranslatorQueryToDXL::TranslateValueScanRTEToDXL(const RangeTblEntry *rte, + ULONG rt_index, + ULONG current_query_level) { List *tuples_list = rte->values_lists; GPOS_ASSERT(NULL != tuples_list); @@ -3056,13 +3053,15 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL CDXLNodeArray *dxlnodes = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); // array of datum arrays for Values - CDXLDatum2dArray *dxl_values_datum_array = GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); + CDXLDatum2dArray *dxl_values_datum_array = + GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); // array of input colid arrays ULongPtr2dArray *input_colids = GPOS_NEW(m_mp) ULongPtr2dArray(m_mp); // array of column descriptor for the UNION ALL operator - CDXLColDescrArray *dxl_col_descr_array = GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); + CDXLColDescrArray *dxl_col_descr_array = + GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); // translate the tuples in the value scan ULONG tuple_pos = 0; @@ -3071,59 +3070,61 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL // flag for checking value list has only constants. For all constants --> VALUESCAN operator else retain UnionAll BOOL fAllConstant = true; - ForEach (lc_tuple, tuples_list) + ForEach(lc_tuple, tuples_list) { List *tuple_list = (List *) lfirst(lc_tuple); GPOS_ASSERT(IsA(tuple_list, List)); - // array of column colids + // array of column colids ULongPtrArray *colid_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); // array of project elements (for expression elements) - CDXLNodeArray *project_elem_dxlnode_array = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); + CDXLNodeArray *project_elem_dxlnode_array = + GPOS_NEW(m_mp) CDXLNodeArray(m_mp); // array of datum (for datum constant values) CDXLDatumArray *dxl_datum_array = GPOS_NEW(m_mp) CDXLDatumArray(m_mp); // array of column descriptors for the CTG containing the datum array - CDXLColDescrArray *dxl_column_descriptors = GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); + CDXLColDescrArray *dxl_column_descriptors = + GPOS_NEW(m_mp) CDXLColDescrArray(m_mp); List *col_names = rte->eref->colnames; GPOS_ASSERT(NULL != col_names); - GPOS_ASSERT(gpdb::ListLength(tuple_list) == gpdb::ListLength(col_names)); + GPOS_ASSERT(gpdb::ListLength(tuple_list) == + gpdb::ListLength(col_names)); // translate the columns ULONG col_pos_idx = 0; ListCell *lc_column = NULL; - ForEach (lc_column, tuple_list) + ForEach(lc_column, tuple_list) { Expr *expr = (Expr *) lfirst(lc_column); - CHAR *col_name_char_array = (CHAR *) strVal(gpdb::ListNth(col_names, col_pos_idx)); + CHAR *col_name_char_array = + (CHAR *) strVal(gpdb::ListNth(col_names, col_pos_idx)); ULONG colid = gpos::ulong_max; if (IsA(expr, Const)) { // extract the datum Const *const_expr = (Const *) expr; - CDXLDatum *datum_dxl = m_scalar_translator->TranslateConstToDXL(const_expr); + CDXLDatum *datum_dxl = + m_scalar_translator->TranslateConstToDXL(const_expr); dxl_datum_array->Append(datum_dxl); colid = m_colid_counter->next_id(); - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, col_name_char_array); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, col_name_char_array); CMDName *mdname = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); - CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr - ( - m_mp, - mdname, - colid, - col_pos_idx + 1 /* attno */, - GPOS_NEW(m_mp) CMDIdGPDB(const_expr->consttype), - const_expr->consttypmod, - false /* is_dropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr( + m_mp, mdname, colid, col_pos_idx + 1 /* attno */, + GPOS_NEW(m_mp) CMDIdGPDB(const_expr->consttype), + const_expr->consttypmod, false /* is_dropped */ + ); if (0 == tuple_pos) { @@ -3136,26 +3137,26 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL { fAllConstant = false; // translate the scalar expression into a project element - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject(expr, col_name_char_array, true /* insist_new_colids */ ); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + expr, col_name_char_array, true /* insist_new_colids */); project_elem_dxlnode_array->Append(project_elem_dxlnode); - colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); + colid = CDXLScalarProjElem::Cast( + project_elem_dxlnode->GetOperator()) + ->Id(); if (0 == tuple_pos) { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, col_name_char_array); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, col_name_char_array); CMDName *mdname = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); - CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr - ( - m_mp, - mdname, - colid, - col_pos_idx + 1 /* attno */, - GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType((Node*) expr)), - gpdb::ExprTypeMod((Node*) expr), - false /* is_dropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(m_mp) CDXLColDescr( + m_mp, mdname, colid, col_pos_idx + 1 /* attno */, + GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType((Node *) expr)), + gpdb::ExprTypeMod((Node *) expr), false /* is_dropped */ + ); dxl_col_descr_array->Append(dxl_col_descr); } } @@ -3166,7 +3167,9 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL col_pos_idx++; } - dxlnodes->Append(TranslateColumnValuesToDXL(dxl_datum_array, dxl_column_descriptors, project_elem_dxlnode_array)); + dxlnodes->Append( + TranslateColumnValuesToDXL(dxl_datum_array, dxl_column_descriptors, + project_elem_dxlnode_array)); if (fAllConstant) { dxl_datum_array->AddRef(); @@ -3187,11 +3190,13 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL if (fAllConstant) { // create Const Table DXL Node - CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable(m_mp, dxl_col_descr_array, dxl_values_datum_array); + CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable( + m_mp, dxl_col_descr_array, dxl_values_datum_array); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); // make note of new columns from Value Scan - m_var_to_colid_map->LoadColumns(m_query_level, rt_index, dxlop->GetDXLColumnDescrArray()); + m_var_to_colid_map->LoadColumns(m_query_level, rt_index, + dxlop->GetDXLColumnDescrArray()); // cleanup dxlnodes->Release(); @@ -3202,11 +3207,13 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL else if (1 < num_of_tuples) { // create a UNION ALL operator - CDXLLogicalSetOp *dxlop = GPOS_NEW(m_mp) CDXLLogicalSetOp(m_mp, EdxlsetopUnionAll, dxl_col_descr_array, input_colids, false); + CDXLLogicalSetOp *dxlop = GPOS_NEW(m_mp) CDXLLogicalSetOp( + m_mp, EdxlsetopUnionAll, dxl_col_descr_array, input_colids, false); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop, dxlnodes); // make note of new columns from UNION ALL - m_var_to_colid_map->LoadColumns(m_query_level, rt_index, dxlop->GetDXLColumnDescrArray()); + m_var_to_colid_map->LoadColumns(m_query_level, rt_index, + dxlop->GetDXLColumnDescrArray()); dxl_values_datum_array->Release(); return dxlnode; @@ -3218,7 +3225,8 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL dxlnode->AddRef(); // make note of new columns - m_var_to_colid_map->LoadColumns(m_query_level, rt_index, dxl_col_descr_array); + m_var_to_colid_map->LoadColumns(m_query_level, rt_index, + dxl_col_descr_array); //cleanup dxl_values_datum_array->Release(); @@ -3234,39 +3242,38 @@ CTranslatorQueryToDXL::TranslateValueScanRTEToDXL // CTranslatorQueryToDXL::TranslateColumnValuesToDXL // // @doc: -// Generate a DXL node from column values, where each column value is +// Generate a DXL node from column values, where each column value is // either a datum or scalar expression represented as project element. // Each datum is associated with a column descriptors used by the CTG //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateColumnValuesToDXL - ( +CTranslatorQueryToDXL::TranslateColumnValuesToDXL( CDXLDatumArray *dxl_datum_array_const_tbl_get, CDXLColDescrArray *dxl_column_descriptors, - CDXLNodeArray *project_elem_dxlnode_array - ) - const + CDXLNodeArray *project_elem_dxlnode_array) const { GPOS_ASSERT(NULL != dxl_datum_array_const_tbl_get); GPOS_ASSERT(NULL != project_elem_dxlnode_array); - + CDXLNode *const_tbl_get_dxlnode = NULL; if (0 == dxl_datum_array_const_tbl_get->Size()) { // add a dummy CTG const_tbl_get_dxlnode = DXLDummyConstTableGet(); } - else + else { // create the array of datum arrays - CDXLDatum2dArray *dxl_datum_arrays_const_tbl_get = GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); - + CDXLDatum2dArray *dxl_datum_arrays_const_tbl_get = + GPOS_NEW(m_mp) CDXLDatum2dArray(m_mp); + dxl_datum_array_const_tbl_get->AddRef(); dxl_datum_arrays_const_tbl_get->Append(dxl_datum_array_const_tbl_get); - + dxl_column_descriptors->AddRef(); - CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable(m_mp, dxl_column_descriptors, dxl_datum_arrays_const_tbl_get); - + CDXLLogicalConstTable *dxlop = GPOS_NEW(m_mp) CDXLLogicalConstTable( + m_mp, dxl_column_descriptors, dxl_datum_arrays_const_tbl_get); + const_tbl_get_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); } @@ -3277,20 +3284,13 @@ CTranslatorQueryToDXL::TranslateColumnValuesToDXL // create a project node for the list of project elements project_elem_dxlnode_array->AddRef(); - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarProjList(m_mp), - project_elem_dxlnode_array - ); - - CDXLNode *project_dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), - project_list_dxlnode, - const_tbl_get_dxlnode - ); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp), + project_elem_dxlnode_array); + + CDXLNode *project_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), + project_list_dxlnode, const_tbl_get_dxlnode); return project_dxlnode; } @@ -3303,12 +3303,10 @@ CTranslatorQueryToDXL::TranslateColumnValuesToDXL // Returns a CDXLNode representing a from relation range table entry //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateTVFToDXL - ( - const RangeTblEntry *rte, - ULONG rt_index, - ULONG //current_query_level - ) +CTranslatorQueryToDXL::TranslateTVFToDXL(const RangeTblEntry *rte, + ULONG rt_index, + ULONG //current_query_level +) { GPOS_ASSERT(NULL != rte->funcexpr); @@ -3317,25 +3315,32 @@ CTranslatorQueryToDXL::TranslateTVFToDXL { CDXLNode *const_tbl_get_dxlnode = DXLDummyConstTableGet(); - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject((Expr *) rte->funcexpr, rte->eref->aliasname, true /* insist_new_colids */); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + (Expr *) rte->funcexpr, rte->eref->aliasname, + true /* insist_new_colids */); project_list_dxlnode->AddChild(project_elem_dxlnode); - CDXLNode *project_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + CDXLNode *project_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); project_dxlnode->AddChild(project_list_dxlnode); project_dxlnode->AddChild(const_tbl_get_dxlnode); - m_var_to_colid_map->LoadProjectElements(m_query_level, rt_index, project_list_dxlnode); + m_var_to_colid_map->LoadProjectElements(m_query_level, rt_index, + project_list_dxlnode); return project_dxlnode; } - CDXLLogicalTVF *tvf_dxlop = CTranslatorUtils::ConvertToCDXLLogicalTVF(m_mp, m_md_accessor, m_colid_counter, rte); + CDXLLogicalTVF *tvf_dxlop = CTranslatorUtils::ConvertToCDXLLogicalTVF( + m_mp, m_md_accessor, m_colid_counter, rte); CDXLNode *tvf_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, tvf_dxlop); // make note of new columns from function - m_var_to_colid_map->LoadColumns(m_query_level, rt_index, tvf_dxlop->GetDXLColumnDescrArray()); + m_var_to_colid_map->LoadColumns(m_query_level, rt_index, + tvf_dxlop->GetDXLColumnDescrArray()); FuncExpr *func_expr = (FuncExpr *) rte->funcexpr; BOOL is_subquery_in_args = false; @@ -3343,25 +3348,32 @@ CTranslatorQueryToDXL::TranslateTVFToDXL // check if arguments contain SIRV functions if (NIL != func_expr->args && HasSirvFunctions((Node *) func_expr->args)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("SIRV functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("SIRV functions")); } ListCell *lc = NULL; - ForEach (lc, func_expr->args) + ForEach(lc, func_expr->args) { Node *arg_node = (Node *) lfirst(lc); - is_subquery_in_args = is_subquery_in_args || CTranslatorUtils::HasSubquery(arg_node); + is_subquery_in_args = + is_subquery_in_args || CTranslatorUtils::HasSubquery(arg_node); CDXLNode *func_expr_arg_dxlnode = - m_scalar_translator->TranslateScalarToDXL((Expr *) arg_node, m_var_to_colid_map, &m_has_distributed_tables); + m_scalar_translator->TranslateScalarToDXL( + (Expr *) arg_node, m_var_to_colid_map, + &m_has_distributed_tables); GPOS_ASSERT(NULL != func_expr_arg_dxlnode); tvf_dxlnode->AddChild(func_expr_arg_dxlnode); } CMDIdGPDB *mdid_func = GPOS_NEW(m_mp) CMDIdGPDB(func_expr->funcid); const IMDFunction *pmdfunc = m_md_accessor->RetrieveFunc(mdid_func); - if (is_subquery_in_args && IMDFunction::EfsVolatile == pmdfunc->GetFuncStability()) + if (is_subquery_in_args && + IMDFunction::EfsVolatile == pmdfunc->GetFuncStability()) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Volatile functions with subqueries in arguments")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Volatile functions with subqueries in arguments")); } mdid_func->Release(); @@ -3377,42 +3389,45 @@ CTranslatorQueryToDXL::TranslateTVFToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateCTEToDXL - ( - const RangeTblEntry *rte, - ULONG rt_index, - ULONG current_query_level - ) +CTranslatorQueryToDXL::TranslateCTEToDXL(const RangeTblEntry *rte, + ULONG rt_index, + ULONG current_query_level) { const ULONG cte_query_level = current_query_level - rte->ctelevelsup; - const CCTEListEntry *cte_list_entry = m_query_level_to_cte_map->Find(&cte_query_level); + const CCTEListEntry *cte_list_entry = + m_query_level_to_cte_map->Find(&cte_query_level); if (NULL == cte_list_entry) { // TODO: Sept 09 2013, remove temporary fix (revert exception to assert) to avoid crash during algebrization - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiQuery2DXLError, - GPOS_WSZ_LIT("No CTE") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, + GPOS_WSZ_LIT("No CTE")); } - const CDXLNode *cte_producer_dxlnode = cte_list_entry->GetCTEProducer(rte->ctename); - const List *cte_producer_target_list = cte_list_entry->GetCTEProducerTargetList(rte->ctename); - - GPOS_ASSERT(NULL != cte_producer_dxlnode && NULL != cte_producer_target_list); + const CDXLNode *cte_producer_dxlnode = + cte_list_entry->GetCTEProducer(rte->ctename); + const List *cte_producer_target_list = + cte_list_entry->GetCTEProducerTargetList(rte->ctename); + + GPOS_ASSERT(NULL != cte_producer_dxlnode && + NULL != cte_producer_target_list); - CDXLLogicalCTEProducer *cte_producer_dxlop = CDXLLogicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); + CDXLLogicalCTEProducer *cte_producer_dxlop = + CDXLLogicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); ULONG cte_id = cte_producer_dxlop->Id(); - ULongPtrArray *op_colid_array_cte_producer = cte_producer_dxlop->GetOutputColIdsArray(); - + ULongPtrArray *op_colid_array_cte_producer = + cte_producer_dxlop->GetOutputColIdsArray(); + // construct output column array - ULongPtrArray *colid_array_cte_consumer = GenerateColIds(m_mp, op_colid_array_cte_producer->Size()); - + ULongPtrArray *colid_array_cte_consumer = + GenerateColIds(m_mp, op_colid_array_cte_producer->Size()); + // load the new columns from the CTE - m_var_to_colid_map->LoadCTEColumns(current_query_level, rt_index, colid_array_cte_consumer, const_cast(cte_producer_target_list)); + m_var_to_colid_map->LoadCTEColumns( + current_query_level, rt_index, colid_array_cte_consumer, + const_cast(cte_producer_target_list)); - CDXLLogicalCTEConsumer *cte_consumer_dxlop = GPOS_NEW(m_mp) CDXLLogicalCTEConsumer(m_mp, cte_id, colid_array_cte_consumer); + CDXLLogicalCTEConsumer *cte_consumer_dxlop = GPOS_NEW(m_mp) + CDXLLogicalCTEConsumer(m_mp, cte_id, colid_array_cte_consumer); CDXLNode *cte_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, cte_consumer_dxlop); return cte_dxlnode; @@ -3427,44 +3442,39 @@ CTranslatorQueryToDXL::TranslateCTEToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateDerivedTablesToDXL - ( - const RangeTblEntry *rte, - ULONG rt_index, - ULONG current_query_level - ) +CTranslatorQueryToDXL::TranslateDerivedTablesToDXL(const RangeTblEntry *rte, + ULONG rt_index, + ULONG current_query_level) { CMappingVarColId *var_to_colid_map = m_var_to_colid_map->CopyMapColId(m_mp); Query *query_derived_tbl = rte->subquery; GPOS_ASSERT(NULL != query_derived_tbl); - CTranslatorQueryToDXL query_to_dxl_translator - ( - m_mp, - m_md_accessor, - m_colid_counter, - m_cte_id_counter, - var_to_colid_map, - query_derived_tbl, - m_query_level + 1, - IsDMLQuery(), - m_query_level_to_cte_map - ); + CTranslatorQueryToDXL query_to_dxl_translator( + m_mp, m_md_accessor, m_colid_counter, m_cte_id_counter, + var_to_colid_map, query_derived_tbl, m_query_level + 1, IsDMLQuery(), + m_query_level_to_cte_map); // translate query representing the derived table to its DXL representation - CDXLNode *derived_tbl_dxlnode = query_to_dxl_translator.TranslateSelectQueryToDXL(); + CDXLNode *derived_tbl_dxlnode = + query_to_dxl_translator.TranslateSelectQueryToDXL(); // get the output columns of the derived table - CDXLNodeArray *query_output_cols_dxlnode_array = query_to_dxl_translator.GetQueryOutputCols(); + CDXLNodeArray *query_output_cols_dxlnode_array = + query_to_dxl_translator.GetQueryOutputCols(); CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator.GetCTEs(); - GPOS_ASSERT(NULL != derived_tbl_dxlnode && query_output_cols_dxlnode_array != NULL); + GPOS_ASSERT(NULL != derived_tbl_dxlnode && + query_output_cols_dxlnode_array != NULL); CUtils::AddRefAppend(m_dxl_cte_producers, cte_dxlnode_array); - - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator.HasDistributedTables(); + + m_has_distributed_tables = m_has_distributed_tables || + query_to_dxl_translator.HasDistributedTables(); // make note of new columns from derived table - m_var_to_colid_map->LoadDerivedTblColumns(current_query_level, rt_index, query_output_cols_dxlnode_array, query_to_dxl_translator.Pquery()->targetList); + m_var_to_colid_map->LoadDerivedTblColumns( + current_query_level, rt_index, query_output_cols_dxlnode_array, + query_to_dxl_translator.Pquery()->targetList); return derived_tbl_dxlnode; } @@ -3478,12 +3488,10 @@ CTranslatorQueryToDXL::TranslateDerivedTablesToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateExprToDXL - ( - Expr *expr - ) +CTranslatorQueryToDXL::TranslateExprToDXL(Expr *expr) { - CDXLNode *scalar_dxlnode = m_scalar_translator->TranslateScalarToDXL(expr, m_var_to_colid_map, &m_has_distributed_tables); + CDXLNode *scalar_dxlnode = m_scalar_translator->TranslateScalarToDXL( + expr, m_var_to_colid_map, &m_has_distributed_tables); GPOS_ASSERT(NULL != scalar_dxlnode); return scalar_dxlnode; @@ -3498,29 +3506,28 @@ CTranslatorQueryToDXL::TranslateExprToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL - ( - JoinExpr *join_expr - ) +CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL(JoinExpr *join_expr) { GPOS_ASSERT(NULL != join_expr); CDXLNode *left_child_dxlnode = TranslateFromClauseToDXL(join_expr->larg); CDXLNode *right_child_dxlnode = TranslateFromClauseToDXL(join_expr->rarg); - EdxlJoinType join_type = CTranslatorUtils::ConvertToDXLJoinType(join_expr->jointype); - CDXLNode *join_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalJoin(m_mp, join_type)); + EdxlJoinType join_type = + CTranslatorUtils::ConvertToDXLJoinType(join_expr->jointype); + CDXLNode *join_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalJoin(m_mp, join_type)); GPOS_ASSERT(NULL != left_child_dxlnode && NULL != right_child_dxlnode); join_dxlnode->AddChild(left_child_dxlnode); join_dxlnode->AddChild(right_child_dxlnode); - Node* node = join_expr->quals; + Node *node = join_expr->quals; // translate the join condition if (NULL != node) { - join_dxlnode->AddChild(TranslateExprToDXL( (Expr*) node)); + join_dxlnode->AddChild(TranslateExprToDXL((Expr *) node)); } else { @@ -3533,30 +3540,36 @@ CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL // 2. Generate a project list for the join expr and maintain it in our hash map const ULONG rtindex = join_expr->rtindex; - RangeTblEntry *rte = (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rtindex - 1); + RangeTblEntry *rte = + (RangeTblEntry *) gpdb::ListNth(m_query->rtable, rtindex - 1); GPOS_ASSERT(NULL != rte); Alias *alias = rte->eref; GPOS_ASSERT(NULL != alias); - GPOS_ASSERT(NULL != alias->colnames && 0 < gpdb::ListLength(alias->colnames)); - GPOS_ASSERT(gpdb::ListLength(rte->joinaliasvars) == gpdb::ListLength(alias->colnames)); + GPOS_ASSERT(NULL != alias->colnames && + 0 < gpdb::ListLength(alias->colnames)); + GPOS_ASSERT(gpdb::ListLength(rte->joinaliasvars) == + gpdb::ListLength(alias->colnames)); - CDXLNode *project_list_computed_cols_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_computed_cols_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); // construct a proj element node for each entry in the joinaliasvars ListCell *lc_node = NULL; ListCell *lc_col_name = NULL; - ForBoth (lc_node, rte->joinaliasvars, - lc_col_name, alias->colnames) + ForBoth(lc_node, rte->joinaliasvars, lc_col_name, alias->colnames) { Node *join_alias_node = (Node *) lfirst(lc_node); - GPOS_ASSERT(IsA(join_alias_node, Var) || IsA(join_alias_node, CoalesceExpr)); + GPOS_ASSERT(IsA(join_alias_node, Var) || + IsA(join_alias_node, CoalesceExpr)); Value *value = (Value *) lfirst(lc_col_name); CHAR *col_name_char_array = strVal(value); // create the DXL node holding the target list entry and add it to proj list - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( (Expr*) join_alias_node, col_name_char_array); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + (Expr *) join_alias_node, col_name_char_array); project_list_dxlnode->AddChild(project_elem_dxlnode); if (IsA(join_alias_node, CoalesceExpr)) @@ -3566,7 +3579,8 @@ CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL project_list_computed_cols_dxlnode->AddChild(project_elem_dxlnode); } } - m_var_to_colid_map->LoadProjectElements(m_query_level, rtindex, project_list_dxlnode); + m_var_to_colid_map->LoadProjectElements(m_query_level, rtindex, + project_list_dxlnode); project_list_dxlnode->Release(); if (0 == project_list_computed_cols_dxlnode->Arity()) @@ -3575,7 +3589,8 @@ CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL return join_dxlnode; } - CDXLNode *project_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + CDXLNode *project_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); project_dxlnode->AddChild(project_list_computed_cols_dxlnode); project_dxlnode->AddChild(join_dxlnode); @@ -3592,23 +3607,21 @@ CTranslatorQueryToDXL::TranslateJoinExprInFromToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateTargetListToDXLProject - ( - List *target_list, - CDXLNode *child_dxlnode, +CTranslatorQueryToDXL::TranslateTargetListToDXLProject( + List *target_list, CDXLNode *child_dxlnode, IntToUlongMap *sort_grpref_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping, - List *plgrpcl, - BOOL is_expand_aggref_expr - ) + IntToUlongMap *output_attno_to_colid_mapping, List *plgrpcl, + BOOL is_expand_aggref_expr) { - BOOL is_groupby = (0 != gpdb::ListLength(m_query->groupClause) || m_query->hasAggs); + BOOL is_groupby = + (0 != gpdb::ListLength(m_query->groupClause) || m_query->hasAggs); - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); // construct a proj element node for each entry in the target list ListCell *lc = NULL; - + // target entries that are result of flattening join alias // and are equivalent to a defined grouping column target entry List *omitted_te_list = NIL; @@ -3623,7 +3636,8 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject GPOS_ASSERT(0 < target_entry->resno); resno = target_entry->resno; - BOOL is_grouping_col = CTranslatorUtils::IsGroupingColumn(target_entry, plgrpcl); + BOOL is_grouping_col = + CTranslatorUtils::IsGroupingColumn(target_entry, plgrpcl); if (!is_groupby || (is_groupby && is_grouping_col)) { // Insist projection for any outer refs to ensure any decorelation of a @@ -3631,13 +3645,19 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject // instead of the outer ref directly. // TODO: Remove is_grouping_col from this check once const projections in // subqueries no longer prevent decorrelation - BOOL insist_proj = (IsA(target_entry->expr, Var) && + BOOL insist_proj = + (IsA(target_entry->expr, Var) && ((Var *) (target_entry->expr))->varlevelsup > 0 && !is_grouping_col); - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject(target_entry->expr, target_entry->resname, insist_proj /* insist_new_colids */); - ULONG colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); + CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject( + target_entry->expr, target_entry->resname, + insist_proj /* insist_new_colids */); + ULONG colid = + CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator()) + ->Id(); - AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, colid); + AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, + colid); // add column to the list of output columns of the query StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); @@ -3654,7 +3674,10 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject } else if (is_expand_aggref_expr && IsA(target_entry->expr, Aggref)) { - vars_list = gpdb::ListConcat(vars_list, gpdb::ExtractNodesExpression((Node *) target_entry->expr, T_Var, false /*descendIntoSubqueries*/)); + vars_list = gpdb::ListConcat( + vars_list, + gpdb::ExtractNodesExpression((Node *) target_entry->expr, T_Var, + false /*descendIntoSubqueries*/)); } else if (!IsA(target_entry->expr, Aggref)) { @@ -3669,14 +3692,21 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject TargetEntry *target_entry = (TargetEntry *) lfirst(lc); INT sort_group_ref = (INT) target_entry->ressortgroupref; - TargetEntry *te_grouping_col = CTranslatorUtils::GetGroupingColumnTargetEntry( (Node*) target_entry->expr, plgrpcl, target_list); + TargetEntry *te_grouping_col = + CTranslatorUtils::GetGroupingColumnTargetEntry( + (Node *) target_entry->expr, plgrpcl, target_list); if (NULL != te_grouping_col) { - const ULONG colid = CTranslatorUtils::GetColId((INT) te_grouping_col->ressortgroupref, sort_grpref_to_colid_mapping); - StoreAttnoColIdMapping(output_attno_to_colid_mapping, target_entry->resno, colid); - if (0 < sort_group_ref && 0 < colid && NULL == sort_grpref_to_colid_mapping->Find(&sort_group_ref)) + const ULONG colid = CTranslatorUtils::GetColId( + (INT) te_grouping_col->ressortgroupref, + sort_grpref_to_colid_mapping); + StoreAttnoColIdMapping(output_attno_to_colid_mapping, + target_entry->resno, colid); + if (0 < sort_group_ref && 0 < colid && + NULL == sort_grpref_to_colid_mapping->Find(&sort_group_ref)) { - AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, colid); + AddSortingGroupingColumn(target_entry, + sort_grpref_to_colid_mapping, colid); } } } @@ -3686,30 +3716,33 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject } GPOS_ASSERT_IMP(!is_expand_aggref_expr, NULL == vars_list); - + // process all additional vars in aggref expressions ListCell *lc_var = NULL; - ForEach (lc_var, vars_list) + ForEach(lc_var, vars_list) { resno++; Var *var = (Var *) lfirst(lc_var); // TODO: Dec 28, 2012; figure out column's name - CDXLNode *project_elem_dxlnode = TranslateExprToDXLProject((Expr*) var, "?col?"); - - ULONG colid = CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); + CDXLNode *project_elem_dxlnode = + TranslateExprToDXLProject((Expr *) var, "?col?"); + + ULONG colid = + CDXLScalarProjElem::Cast(project_elem_dxlnode->GetOperator())->Id(); // add column to the list of output columns of the query StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); - + project_elem_dxlnode->Release(); } - + if (0 < project_list_dxlnode->Arity()) { // create a node with the CDXLLogicalProject operator and add as its children: // the CDXLProjectList node and the node representing the input to the project node - CDXLNode *project_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); + CDXLNode *project_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp)); project_dxlnode->AddChild(project_list_dxlnode); project_dxlnode->AddChild(child_dxlnode); GPOS_ASSERT(NULL != project_dxlnode); @@ -3730,23 +3763,23 @@ CTranslatorQueryToDXL::TranslateTargetListToDXLProject // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets - ( - List *target_list, - CDXLNode *child_dxlnode, - CBitSet *bitset, // group by columns - IntToUlongMap *sort_grouping_col_mapping, // mapping of sorting and grouping columns - IntToUlongMap *output_attno_to_colid_mapping, // mapping of output columns - UlongToUlongMap *grpcol_index_to_colid_mapping // mapping of unique grouping col positions - ) - const +CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets( + List *target_list, CDXLNode *child_dxlnode, + CBitSet *bitset, // group by columns + IntToUlongMap + *sort_grouping_col_mapping, // mapping of sorting and grouping columns + IntToUlongMap *output_attno_to_colid_mapping, // mapping of output columns + UlongToUlongMap * + grpcol_index_to_colid_mapping // mapping of unique grouping col positions +) const { - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); // construct a proj element node for those non-aggregate entries in the target list which // are not included in the grouping set ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); @@ -3755,11 +3788,12 @@ CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets ULONG resno = target_entry->resno; ULONG colid = 0; - + if (IsA(target_entry->expr, GroupingFunc)) { colid = m_colid_counter->next_id(); - CDXLNode *grouping_func_dxlnode = TranslateGroupingFuncToDXL(target_entry->expr, bitset, grpcol_index_to_colid_mapping); + CDXLNode *grouping_func_dxlnode = TranslateGroupingFuncToDXL( + target_entry->expr, bitset, grpcol_index_to_colid_mapping); CMDName *mdname_alias = NULL; if (NULL == target_entry->resname) @@ -3769,11 +3803,16 @@ CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets } else { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, target_entry->resname); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, target_entry->resname); mdname_alias = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); } - CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, colid, mdname_alias), grouping_func_dxlnode); + CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, + GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, colid, mdname_alias), + grouping_func_dxlnode); project_list_dxlnode->AddChild(project_elem_dxlnode); StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); } @@ -3784,20 +3823,27 @@ CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets colid = m_colid_counter->next_id(); CMDIdGPDB *mdid = GPOS_NEW(m_mp) CMDIdGPDB(oid_type); - CDXLNode *project_elem_dxlnode = CTranslatorUtils::CreateDXLProjElemConstNULL(m_mp, m_md_accessor, mdid, colid, target_entry->resname); + CDXLNode *project_elem_dxlnode = + CTranslatorUtils::CreateDXLProjElemConstNULL( + m_mp, m_md_accessor, mdid, colid, target_entry->resname); mdid->Release(); - + project_list_dxlnode->AddChild(project_elem_dxlnode); StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); } - - INT sort_group_ref = INT (target_entry->ressortgroupref); - - GPOS_ASSERT_IMP(0 == sort_grouping_col_mapping, NULL != sort_grouping_col_mapping->Find(&sort_group_ref) && "Grouping column with no mapping"); - - if (0 < sort_group_ref && 0 < colid && NULL == sort_grouping_col_mapping->Find(&sort_group_ref)) + + INT sort_group_ref = INT(target_entry->ressortgroupref); + + GPOS_ASSERT_IMP( + 0 == sort_grouping_col_mapping, + NULL != sort_grouping_col_mapping->Find(&sort_group_ref) && + "Grouping column with no mapping"); + + if (0 < sort_group_ref && 0 < colid && + NULL == sort_grouping_col_mapping->Find(&sort_group_ref)) { - AddSortingGroupingColumn(target_entry, sort_grouping_col_mapping, colid); + AddSortingGroupingColumn(target_entry, sort_grouping_col_mapping, + colid); } } @@ -3808,7 +3854,9 @@ CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets return child_dxlnode; } - return GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), project_list_dxlnode, child_dxlnode); + return GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), + project_list_dxlnode, child_dxlnode); } //--------------------------------------------------------------------------- @@ -3817,27 +3865,23 @@ CTranslatorQueryToDXL::CreateDXLProjectNullsForGroupingSets // // @doc: // Construct a DXL project node projecting values for the grouping funcs in -// the target list +// the target list // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs - ( - List *target_list, - CDXLNode *child_dxlnode, - CBitSet *bitset, +CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs( + List *target_list, CDXLNode *child_dxlnode, CBitSet *bitset, IntToUlongMap *output_attno_to_colid_mapping, UlongToUlongMap *grpcol_index_to_colid_mapping, - IntToUlongMap *sort_grpref_to_colid_mapping - ) - const + IntToUlongMap *sort_grpref_to_colid_mapping) const { - CDXLNode *project_list_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); + CDXLNode *project_list_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjList(m_mp)); // construct a proj element node for those non-aggregate entries in the target list which // are not included in the grouping set ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(IsA(target_entry, TargetEntry)); @@ -3847,7 +3891,8 @@ CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs if (IsA(target_entry->expr, GroupingFunc)) { ULONG colid = m_colid_counter->next_id(); - CDXLNode *grouping_func_dxlnode = TranslateGroupingFuncToDXL(target_entry->expr, bitset, grpcol_index_to_colid_mapping); + CDXLNode *grouping_func_dxlnode = TranslateGroupingFuncToDXL( + target_entry->expr, bitset, grpcol_index_to_colid_mapping); CMDName *mdname_alias = NULL; if (NULL == target_entry->resname) @@ -3857,14 +3902,20 @@ CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs } else { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, target_entry->resname); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, target_entry->resname); mdname_alias = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); } - CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, colid, mdname_alias), grouping_func_dxlnode); + CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, + GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, colid, mdname_alias), + grouping_func_dxlnode); project_list_dxlnode->AddChild(project_elem_dxlnode); StoreAttnoColIdMapping(output_attno_to_colid_mapping, resno, colid); - AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, colid); + AddSortingGroupingColumn(target_entry, sort_grpref_to_colid_mapping, + colid); } } @@ -3875,7 +3926,9 @@ CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs return child_dxlnode; } - return GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), project_list_dxlnode, child_dxlnode); + return GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalProject(m_mp), + project_list_dxlnode, child_dxlnode); } //--------------------------------------------------------------------------- @@ -3887,20 +3940,16 @@ CTranslatorQueryToDXL::CreateDXLProjectGroupingFuncs // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::StoreAttnoColIdMapping - ( - IntToUlongMap *attno_to_colid_mapping, - INT attno, - ULONG colid - ) - const +CTranslatorQueryToDXL::StoreAttnoColIdMapping( + IntToUlongMap *attno_to_colid_mapping, INT attno, ULONG colid) const { GPOS_ASSERT(NULL != attno_to_colid_mapping); #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - attno_to_colid_mapping->Insert(GPOS_NEW(m_mp) INT(attno), GPOS_NEW(m_mp) ULONG(colid)); +#endif // GPOS_DEBUG + attno_to_colid_mapping->Insert(GPOS_NEW(m_mp) INT(attno), + GPOS_NEW(m_mp) ULONG(colid)); GPOS_ASSERT(result); } @@ -3914,12 +3963,8 @@ CTranslatorQueryToDXL::StoreAttnoColIdMapping // //--------------------------------------------------------------------------- CDXLNodeArray * -CTranslatorQueryToDXL::CreateDXLOutputCols - ( - List *target_list, - IntToUlongMap *attno_to_colid_mapping - ) - const +CTranslatorQueryToDXL::CreateDXLOutputCols( + List *target_list, IntToUlongMap *attno_to_colid_mapping) const { GPOS_ASSERT(NULL != target_list); GPOS_ASSERT(NULL != attno_to_colid_mapping); @@ -3927,7 +3972,7 @@ CTranslatorQueryToDXL::CreateDXLOutputCols CDXLNodeArray *dxlnodes = GPOS_NEW(m_mp) CDXLNodeArray(m_mp); ListCell *lc = NULL; - ForEach (lc, target_list) + ForEach(lc, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(lc); GPOS_ASSERT(0 < target_entry->resno); @@ -3947,23 +3992,25 @@ CTranslatorQueryToDXL::CreateDXLOutputCols } else { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, target_entry->resname); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray( + m_mp, target_entry->resname); mdname = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); // CName constructor copies string GPOS_DELETE(alias_str); } - const ULONG colid = CTranslatorUtils::GetColId(resno, attno_to_colid_mapping); + const ULONG colid = + CTranslatorUtils::GetColId(resno, attno_to_colid_mapping); // create a column reference - IMDId *mdid_type = GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType( (Node*) target_entry->expr)); - INT type_modifier = gpdb::ExprTypeMod((Node*) target_entry->expr); - CDXLColRef *dxl_colref = GPOS_NEW(m_mp) CDXLColRef(m_mp, mdname, colid, mdid_type, type_modifier); - CDXLScalarIdent *dxl_ident = GPOS_NEW(m_mp) CDXLScalarIdent - ( - m_mp, - dxl_colref - ); + IMDId *mdid_type = GPOS_NEW(m_mp) + CMDIdGPDB(gpdb::ExprType((Node *) target_entry->expr)); + INT type_modifier = gpdb::ExprTypeMod((Node *) target_entry->expr); + CDXLColRef *dxl_colref = GPOS_NEW(m_mp) + CDXLColRef(m_mp, mdname, colid, mdid_type, type_modifier); + CDXLScalarIdent *dxl_ident = + GPOS_NEW(m_mp) CDXLScalarIdent(m_mp, dxl_colref); // create the DXL node holding the scalar ident operator CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_ident); @@ -3984,12 +4031,9 @@ CTranslatorQueryToDXL::CreateDXLOutputCols // is responsible for freeing it. //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateExprToDXLProject - ( - Expr *expr, - const CHAR *alias_name, - BOOL insist_new_colids - ) +CTranslatorQueryToDXL::TranslateExprToDXLProject(Expr *expr, + const CHAR *alias_name, + BOOL insist_new_colids) { GPOS_ASSERT(NULL != expr); @@ -4007,7 +4051,8 @@ CTranslatorQueryToDXL::TranslateExprToDXLProject } else { - CWStringDynamic *alias_str = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, alias_name); + CWStringDynamic *alias_str = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, alias_name); mdname_alias = GPOS_NEW(m_mp) CMDName(m_mp, alias_str); GPOS_DELETE(alias_str); } @@ -4015,8 +4060,10 @@ CTranslatorQueryToDXL::TranslateExprToDXLProject if (IsA(expr, Var) && !insist_new_colids) { // project elem is a a reference to a column - use the colref id - GPOS_ASSERT(EdxlopScalarIdent == child_dxlnode->GetOperator()->GetDXLOperator()); - CDXLScalarIdent *dxl_ident = (CDXLScalarIdent *) child_dxlnode->GetOperator(); + GPOS_ASSERT(EdxlopScalarIdent == + child_dxlnode->GetOperator()->GetDXLOperator()); + CDXLScalarIdent *dxl_ident = + (CDXLScalarIdent *) child_dxlnode->GetOperator(); project_elem_id = dxl_ident->GetDXLColRef()->Id(); } else @@ -4025,7 +4072,9 @@ CTranslatorQueryToDXL::TranslateExprToDXLProject project_elem_id = m_colid_counter->next_id(); } - CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, project_elem_id, mdname_alias)); + CDXLNode *project_elem_dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, + GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, project_elem_id, mdname_alias)); project_elem_dxlnode->AddChild(child_dxlnode); return project_elem_dxlnode; @@ -4041,8 +4090,9 @@ CTranslatorQueryToDXL::TranslateExprToDXLProject CDXLNode * CTranslatorQueryToDXL::CreateDXLConstValueTrue() { - Const *const_expr = (Const*) gpdb::MakeBoolConst(true /*value*/, false /*isnull*/); - CDXLNode *dxlnode = TranslateExprToDXL((Expr*) const_expr); + Const *const_expr = + (Const *) gpdb::MakeBoolConst(true /*value*/, false /*isnull*/); + CDXLNode *dxlnode = TranslateExprToDXL((Expr *) const_expr); gpdb::GPDBFree(const_expr); return dxlnode; @@ -4057,13 +4107,9 @@ CTranslatorQueryToDXL::CreateDXLConstValueTrue() // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorQueryToDXL::TranslateGroupingFuncToDXL - ( - const Expr *expr, - CBitSet *bitset, - UlongToUlongMap *grpcol_index_to_colid_mapping - ) - const +CTranslatorQueryToDXL::TranslateGroupingFuncToDXL( + const Expr *expr, CBitSet *bitset, + UlongToUlongMap *grpcol_index_to_colid_mapping) const { GPOS_ASSERT(IsA(expr, GroupingFunc)); GPOS_ASSERT(NULL != grpcol_index_to_colid_mapping); @@ -4072,17 +4118,18 @@ CTranslatorQueryToDXL::TranslateGroupingFuncToDXL if (1 < gpdb::ListLength(grouping_func->args)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Grouping function with multiple arguments")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Grouping function with multiple arguments")); } - + Node *node = (Node *) gpdb::ListNth(grouping_func->args, 0); ULONG grouping_idx = gpdb::GetIntFromValue(node); - + // generate a constant value for the result of the grouping function as follows: // if the grouping function argument is a group-by column, result is 0 - // otherwise, the result is 1 + // otherwise, the result is 1 LINT l_value = 0; - + ULONG *sort_group_ref = grpcol_index_to_colid_mapping->Find(&grouping_idx); GPOS_ASSERT(NULL != sort_group_ref); BOOL is_grouping_col = bitset->Get(*sort_group_ref); @@ -4095,9 +4142,11 @@ CTranslatorQueryToDXL::TranslateGroupingFuncToDXL const IMDType *md_type = m_md_accessor->PtMDType(m_sysid); CMDIdGPDB *mdid_cast = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(m_mp) CMDIdGPDB(*mdid_cast); - - CDXLDatum *datum_dxl = GPOS_NEW(m_mp) CDXLDatumInt8(m_mp, mdid, false /* is_null */, l_value); - CDXLScalarConstValue *dxlop = GPOS_NEW(m_mp) CDXLScalarConstValue(m_mp, datum_dxl); + + CDXLDatum *datum_dxl = + GPOS_NEW(m_mp) CDXLDatumInt8(m_mp, mdid, false /* is_null */, l_value); + CDXLScalarConstValue *dxlop = + GPOS_NEW(m_mp) CDXLScalarConstValue(m_mp, datum_dxl); return GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); } @@ -4110,92 +4159,103 @@ CTranslatorQueryToDXL::TranslateGroupingFuncToDXL // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::ConstructCTEProducerList - ( - List *cte_list, - ULONG cte_query_level - ) +CTranslatorQueryToDXL::ConstructCTEProducerList(List *cte_list, + ULONG cte_query_level) { - GPOS_ASSERT(NULL != m_dxl_cte_producers && "CTE Producer list not initialized"); - + GPOS_ASSERT(NULL != m_dxl_cte_producers && + "CTE Producer list not initialized"); + if (NULL == cte_list) { return; } - + ListCell *lc = NULL; - - ForEach (lc, cte_list) + + ForEach(lc, cte_list) { CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); GPOS_ASSERT(IsA(cte->ctequery, Query)); - + if (cte->cterecursive) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("WITH RECURSIVE")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("WITH RECURSIVE")); } - Query *cte_query = CQueryMutators::NormalizeQuery(m_mp, m_md_accessor, (Query *) cte->ctequery, cte_query_level + 1); - + Query *cte_query = CQueryMutators::NormalizeQuery( + m_mp, m_md_accessor, (Query *) cte->ctequery, cte_query_level + 1); + // the query representing the cte can only access variables defined in the current level as well as // those defined at prior query levels - CMappingVarColId *var_colid_mapping = m_var_to_colid_map->CopyMapColId(cte_query_level); - - CTranslatorQueryToDXL query_to_dxl_translator - ( - m_mp, - m_md_accessor, - m_colid_counter, - m_cte_id_counter, - var_colid_mapping, - cte_query, - cte_query_level + 1, - IsDMLQuery(), - m_query_level_to_cte_map - ); + CMappingVarColId *var_colid_mapping = + m_var_to_colid_map->CopyMapColId(cte_query_level); + + CTranslatorQueryToDXL query_to_dxl_translator( + m_mp, m_md_accessor, m_colid_counter, m_cte_id_counter, + var_colid_mapping, cte_query, cte_query_level + 1, IsDMLQuery(), + m_query_level_to_cte_map); // translate query representing the cte table to its DXL representation - CDXLNode *cte_child_dxlnode = query_to_dxl_translator.TranslateSelectQueryToDXL(); + CDXLNode *cte_child_dxlnode = + query_to_dxl_translator.TranslateSelectQueryToDXL(); // get the output columns of the cte table - CDXLNodeArray *cte_query_output_colds_dxlnode_array = query_to_dxl_translator.GetQueryOutputCols(); + CDXLNodeArray *cte_query_output_colds_dxlnode_array = + query_to_dxl_translator.GetQueryOutputCols(); CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator.GetCTEs(); - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator.HasDistributedTables(); + m_has_distributed_tables = + m_has_distributed_tables || + query_to_dxl_translator.HasDistributedTables(); + + GPOS_ASSERT(NULL != cte_child_dxlnode && + NULL != cte_query_output_colds_dxlnode_array && + NULL != cte_dxlnode_array); - GPOS_ASSERT(NULL != cte_child_dxlnode && NULL != cte_query_output_colds_dxlnode_array && NULL != cte_dxlnode_array); - // append any nested CTE CUtils::AddRefAppend(m_dxl_cte_producers, cte_dxlnode_array); - + ULongPtrArray *colid_array = GPOS_NEW(m_mp) ULongPtrArray(m_mp); - - const ULONG output_columns = cte_query_output_colds_dxlnode_array->Size(); + + const ULONG output_columns = + cte_query_output_colds_dxlnode_array->Size(); for (ULONG ul = 0; ul < output_columns; ul++) { - CDXLNode *output_col_dxlnode = (*cte_query_output_colds_dxlnode_array)[ul]; - CDXLScalarIdent *dxl_scalar_ident = CDXLScalarIdent::Cast(output_col_dxlnode->GetOperator()); - colid_array->Append(GPOS_NEW(m_mp) ULONG(dxl_scalar_ident->GetDXLColRef()->Id())); + CDXLNode *output_col_dxlnode = + (*cte_query_output_colds_dxlnode_array)[ul]; + CDXLScalarIdent *dxl_scalar_ident = + CDXLScalarIdent::Cast(output_col_dxlnode->GetOperator()); + colid_array->Append( + GPOS_NEW(m_mp) ULONG(dxl_scalar_ident->GetDXLColRef()->Id())); } - - CDXLLogicalCTEProducer *lg_cte_prod_dxlop = GPOS_NEW(m_mp) CDXLLogicalCTEProducer(m_mp, m_cte_id_counter->next_id(), colid_array); - CDXLNode *cte_producer_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, lg_cte_prod_dxlop, cte_child_dxlnode); - + + CDXLLogicalCTEProducer *lg_cte_prod_dxlop = + GPOS_NEW(m_mp) CDXLLogicalCTEProducer( + m_mp, m_cte_id_counter->next_id(), colid_array); + CDXLNode *cte_producer_dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, lg_cte_prod_dxlop, cte_child_dxlnode); + m_dxl_cte_producers->Append(cte_producer_dxlnode); #ifdef GPOS_DEBUG BOOL result = #endif - m_cteid_at_current_query_level_map->Insert(GPOS_NEW(m_mp) ULONG(lg_cte_prod_dxlop->Id()), GPOS_NEW(m_mp) BOOL(true)); + m_cteid_at_current_query_level_map->Insert( + GPOS_NEW(m_mp) ULONG(lg_cte_prod_dxlop->Id()), + GPOS_NEW(m_mp) BOOL(true)); GPOS_ASSERT(result); - + // update CTE producer mappings - CCTEListEntry *cte_list_entry = m_query_level_to_cte_map->Find(&cte_query_level); + CCTEListEntry *cte_list_entry = + m_query_level_to_cte_map->Find(&cte_query_level); if (NULL == cte_list_entry) { - cte_list_entry = GPOS_NEW(m_mp) CCTEListEntry (m_mp, cte_query_level, cte, cte_producer_dxlnode); + cte_list_entry = GPOS_NEW(m_mp) + CCTEListEntry(m_mp, cte_query_level, cte, cte_producer_dxlnode); #ifdef GPOS_DEBUG - BOOL is_res = + BOOL is_res = #endif - m_query_level_to_cte_map->Insert(GPOS_NEW(m_mp) ULONG(cte_query_level), cte_list_entry); + m_query_level_to_cte_map->Insert( + GPOS_NEW(m_mp) ULONG(cte_query_level), cte_list_entry); GPOS_ASSERT(is_res); } else @@ -4214,12 +4274,9 @@ CTranslatorQueryToDXL::ConstructCTEProducerList // //--------------------------------------------------------------------------- void -CTranslatorQueryToDXL::ConstructCTEAnchors - ( - CDXLNodeArray *dxlnodes, - CDXLNode **dxl_cte_anchor_top, - CDXLNode **dxl_cte_anchor_bottom - ) +CTranslatorQueryToDXL::ConstructCTEAnchors(CDXLNodeArray *dxlnodes, + CDXLNode **dxl_cte_anchor_top, + CDXLNode **dxl_cte_anchor_bottom) { GPOS_ASSERT(NULL == *dxl_cte_anchor_top); GPOS_ASSERT(NULL == *dxl_cte_anchor_bottom); @@ -4228,24 +4285,26 @@ CTranslatorQueryToDXL::ConstructCTEAnchors { return; } - + const ULONG num_of_ctes = dxlnodes->Size(); - + for (ULONG ul = num_of_ctes; ul > 0; ul--) { // construct a new CTE anchor on top of the previous one - CDXLNode *cte_producer_dxlnode = (*dxlnodes)[ul-1]; - CDXLLogicalCTEProducer *cte_prod_dxlop = CDXLLogicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); + CDXLNode *cte_producer_dxlnode = (*dxlnodes)[ul - 1]; + CDXLLogicalCTEProducer *cte_prod_dxlop = + CDXLLogicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator()); ULONG cte_producer_id = cte_prod_dxlop->Id(); - + if (NULL == m_cteid_at_current_query_level_map->Find(&cte_producer_id)) { // cte not defined at this level: CTE anchor was already added continue; } - - CDXLNode *cte_anchor_new_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEAnchor(m_mp, cte_producer_id)); - + + CDXLNode *cte_anchor_new_dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLLogicalCTEAnchor(m_mp, cte_producer_id)); + if (NULL == *dxl_cte_anchor_bottom) { *dxl_cte_anchor_bottom = cte_anchor_new_dxlnode; @@ -4268,20 +4327,15 @@ CTranslatorQueryToDXL::ConstructCTEAnchors // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorQueryToDXL::GenerateColIds - ( - CMemoryPool *mp, - ULONG size - ) - const +CTranslatorQueryToDXL::GenerateColIds(CMemoryPool *mp, ULONG size) const { ULongPtrArray *colid_array = GPOS_NEW(mp) ULongPtrArray(mp); - + for (ULONG ul = 0; ul < size; ul++) { colid_array->Append(GPOS_NEW(mp) ULONG(m_colid_counter->next_id())); } - + return colid_array; } @@ -4294,30 +4348,27 @@ CTranslatorQueryToDXL::GenerateColIds // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorQueryToDXL::ExtractColIds - ( - CMemoryPool *mp, - IntToUlongMap *attno_to_colid_mapping - ) - const +CTranslatorQueryToDXL::ExtractColIds( + CMemoryPool *mp, IntToUlongMap *attno_to_colid_mapping) const { UlongToUlongMap *old_new_col_mapping = GPOS_NEW(mp) UlongToUlongMap(mp); - + ULongPtrArray *colid_array = GPOS_NEW(mp) ULongPtrArray(mp); - + IntUlongHashmapIter att_iter(attno_to_colid_mapping); while (att_iter.Advance()) { ULONG colid = *(att_iter.Value()); - + // do not insert colid if already inserted if (NULL == old_new_col_mapping->Find(&colid)) { colid_array->Append(GPOS_NEW(m_mp) ULONG(colid)); - old_new_col_mapping->Insert(GPOS_NEW(m_mp) ULONG(colid), GPOS_NEW(m_mp) ULONG(colid)); + old_new_col_mapping->Insert(GPOS_NEW(m_mp) ULONG(colid), + GPOS_NEW(m_mp) ULONG(colid)); } } - + old_new_col_mapping->Release(); return colid_array; } @@ -4332,19 +4383,15 @@ CTranslatorQueryToDXL::ExtractColIds // //--------------------------------------------------------------------------- IntToUlongMap * -CTranslatorQueryToDXL::RemapColIds - ( - CMemoryPool *mp, - IntToUlongMap *attno_to_colid_mapping, - ULongPtrArray *from_list_colids, - ULongPtrArray *to_list_colids - ) - const +CTranslatorQueryToDXL::RemapColIds(CMemoryPool *mp, + IntToUlongMap *attno_to_colid_mapping, + ULongPtrArray *from_list_colids, + ULongPtrArray *to_list_colids) const { GPOS_ASSERT(NULL != attno_to_colid_mapping); GPOS_ASSERT(NULL != from_list_colids && NULL != to_list_colids); GPOS_ASSERT(from_list_colids->Size() == to_list_colids->Size()); - + // compute a map of the positions in the from array UlongToUlongMap *old_new_col_mapping = GPOS_NEW(mp) UlongToUlongMap(mp); const ULONG size = from_list_colids->Size(); @@ -4352,25 +4399,29 @@ CTranslatorQueryToDXL::RemapColIds { #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - old_new_col_mapping->Insert(GPOS_NEW(mp) ULONG(*((*from_list_colids)[ul])), GPOS_NEW(mp) ULONG(*((*to_list_colids)[ul]))); +#endif // GPOS_DEBUG + old_new_col_mapping->Insert( + GPOS_NEW(mp) ULONG(*((*from_list_colids)[ul])), + GPOS_NEW(mp) ULONG(*((*to_list_colids)[ul]))); GPOS_ASSERT(result); } - IntToUlongMap *result_attno_to_colid_mapping = GPOS_NEW(mp) IntToUlongMap(mp); + IntToUlongMap *result_attno_to_colid_mapping = + GPOS_NEW(mp) IntToUlongMap(mp); IntUlongHashmapIter mi(attno_to_colid_mapping); while (mi.Advance()) { INT *key = GPOS_NEW(mp) INT(*(mi.Key())); const ULONG *value = mi.Value(); GPOS_ASSERT(NULL != value); - - ULONG *remapped_value = GPOS_NEW(mp) ULONG(*(old_new_col_mapping->Find(value))); + + ULONG *remapped_value = + GPOS_NEW(mp) ULONG(*(old_new_col_mapping->Find(value))); result_attno_to_colid_mapping->Insert(key, remapped_value); } - + old_new_col_mapping->Release(); - + return result_attno_to_colid_mapping; } diff --git a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp index e8f0923287..9b7e33507e 100644 --- a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp @@ -75,16 +75,10 @@ using namespace gpdxl; using namespace gpopt; -static -const ULONG cmp_type_mappings[][2] = -{ - {IMDType::EcmptEq, CmptEq}, - {IMDType::EcmptNEq, CmptNEq}, - {IMDType::EcmptL, CmptLT}, - {IMDType::EcmptG, CmptGT}, - {IMDType::EcmptGEq, CmptGEq}, - {IMDType::EcmptLEq, CmptLEq} -}; +static const ULONG cmp_type_mappings[][2] = { + {IMDType::EcmptEq, CmptEq}, {IMDType::EcmptNEq, CmptNEq}, + {IMDType::EcmptL, CmptLT}, {IMDType::EcmptG, CmptGT}, + {IMDType::EcmptGEq, CmptGEq}, {IMDType::EcmptLEq, CmptLEq}}; //--------------------------------------------------------------------------- // @function: @@ -95,42 +89,38 @@ const ULONG cmp_type_mappings[][2] = // //--------------------------------------------------------------------------- IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveObject - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveObject(CMemoryPool *mp, + CMDAccessor *md_accessor, IMDId *mdid) { IMDCacheObject *md_obj = NULL; GPOS_ASSERT(NULL != md_accessor); #ifdef FAULT_INJECTOR gpdb::InjectFaultInOptTasks(OptRelcacheTranslatorCatalogAccess); -#endif // FAULT_INJECTOR +#endif // FAULT_INJECTOR - switch(mdid->MdidType()) + switch (mdid->MdidType()) { case IMDId::EmdidGPDB: md_obj = RetrieveObjectGPDB(mp, md_accessor, mdid); break; - + case IMDId::EmdidRelStats: md_obj = RetrieveRelStats(mp, mdid); break; - + case IMDId::EmdidColStats: md_obj = RetrieveColStats(mp, md_accessor, mdid); break; - + case IMDId::EmdidCastFunc: md_obj = RetrieveCast(mp, mdid); break; - + case IMDId::EmdidScCmp: md_obj = RetrieveScCmp(mp, mdid); break; - + default: break; } @@ -138,7 +128,8 @@ CTranslatorRelcacheToDXL::RetrieveObject if (NULL == md_obj) { // no match found - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } return md_obj; @@ -153,12 +144,9 @@ CTranslatorRelcacheToDXL::RetrieveObject // //--------------------------------------------------------------------------- IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveObjectGPDB - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveObjectGPDB(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid) { GPOS_ASSERT(mdid->MdidType() == CMDIdGPDB::EmdidGPDB); @@ -210,7 +198,6 @@ CTranslatorRelcacheToDXL::RetrieveObjectGPDB // no match found return NULL; - } //--------------------------------------------------------------------------- @@ -222,15 +209,12 @@ CTranslatorRelcacheToDXL::RetrieveObjectGPDB // //--------------------------------------------------------------------------- CMDName * -CTranslatorRelcacheToDXL::GetRelName - ( - CMemoryPool *mp, - Relation rel - ) +CTranslatorRelcacheToDXL::GetRelName(CMemoryPool *mp, Relation rel) { GPOS_ASSERT(NULL != rel); CHAR *relname = NameStr(rel->rd_rel->relname); - CWStringDynamic *relname_str = CDXLUtils::CreateDynamicStringFromCharArray(mp, relname); + CWStringDynamic *relname_str = + CDXLUtils::CreateDynamicStringFromCharArray(mp, relname); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, relname_str); GPOS_DELETE(relname_str); return mdname; @@ -245,11 +229,7 @@ CTranslatorRelcacheToDXL::GetRelName // //--------------------------------------------------------------------------- CMDIndexInfoArray * -CTranslatorRelcacheToDXL::RetrieveRelIndexInfo - ( - CMemoryPool *mp, - Relation rel - ) +CTranslatorRelcacheToDXL::RetrieveRelIndexInfo(CMemoryPool *mp, Relation rel) { GPOS_ASSERT(NULL != rel); @@ -261,21 +241,19 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfo { return RetrieveRelIndexInfoForPartTable(mp, rel); } - else + else { // interior partition: do not consider indexes - CMDIndexInfoArray *md_index_info_array = GPOS_NEW(mp) CMDIndexInfoArray(mp); + CMDIndexInfoArray *md_index_info_array = + GPOS_NEW(mp) CMDIndexInfoArray(mp); return md_index_info_array; } } // return index info list of indexes defined on a partitioned table CMDIndexInfoArray * -CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable - ( - CMemoryPool *mp, - Relation root_rel - ) +CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable(CMemoryPool *mp, + Relation root_rel) { CMDIndexInfoArray *md_index_info_array = GPOS_NEW(mp) CMDIndexInfoArray(mp); @@ -284,7 +262,7 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable ListCell *lc = NULL; - ForEach (lc, plLogicalIndexInfo) + ForEach(lc, plLogicalIndexInfo) { LogicalIndexInfo *logicalIndexInfo = (LogicalIndexInfo *) lfirst(lc); OID index_oid = logicalIndexInfo->logicalIndexOid; @@ -298,7 +276,8 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable CWStringStatic str(wstr, 1024); COstreamString oss(&str); oss << (ULONG) index_oid; - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, str.GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + str.GetBuffer()); } GPOS_ASSERT(NULL != index_rel->rd_indextuple); @@ -308,8 +287,10 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable if (IsIndexSupported(index_rel)) { CMDIdGPDB *mdid_index = GPOS_NEW(mp) CMDIdGPDB(index_oid); - BOOL is_partial = (NULL != logicalIndexInfo->partCons) || (NIL != logicalIndexInfo->defaultLevels); - CMDIndexInfo *md_index_info = GPOS_NEW(mp) CMDIndexInfo(mdid_index, is_partial); + BOOL is_partial = (NULL != logicalIndexInfo->partCons) || + (NIL != logicalIndexInfo->defaultLevels); + CMDIndexInfo *md_index_info = + GPOS_NEW(mp) CMDIndexInfo(mdid_index, is_partial); md_index_info_array->Append(md_index_info); } @@ -327,11 +308,8 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForPartTable // return index info list of indexes defined on regular, external tables or leaf partitions CMDIndexInfoArray * -CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable - ( - CMemoryPool *mp, - Relation rel - ) +CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable(CMemoryPool *mp, + Relation rel) { CMDIndexInfoArray *md_index_info_array = GPOS_NEW(mp) CMDIndexInfoArray(mp); @@ -340,7 +318,7 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable ListCell *lc = NULL; - ForEach (lc, index_oids) + ForEach(lc, index_oids) { OID index_oid = lfirst_oid(lc); @@ -353,7 +331,8 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable CWStringStatic str(wstr, 1024); COstreamString oss(&str); oss << (ULONG) index_oid; - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, str.GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + str.GetBuffer()); } GPOS_ASSERT(NULL != index_rel->rd_indextuple); @@ -364,7 +343,8 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable { CMDIdGPDB *mdid_index = GPOS_NEW(mp) CMDIdGPDB(index_oid); // for a regular table, external table or leaf partition, an index is always complete - CMDIndexInfo *md_index_info = GPOS_NEW(mp) CMDIndexInfo(mdid_index, false /* is_partial */); + CMDIndexInfo *md_index_info = GPOS_NEW(mp) + CMDIndexInfo(mdid_index, false /* is_partial */); md_index_info_array->Append(md_index_info); } @@ -390,13 +370,10 @@ CTranslatorRelcacheToDXL::RetrieveRelIndexInfoForNonPartTable // //--------------------------------------------------------------------------- List * -CTranslatorRelcacheToDXL::RetrievePartTableIndexInfo - ( - Relation rel - ) +CTranslatorRelcacheToDXL::RetrievePartTableIndexInfo(Relation rel) { List *index_info_list = NIL; - + LogicalIndexes *logical_indexes = gpdb::GetLogicalPartIndexes(rel->rd_id); if (NULL == logical_indexes) @@ -405,16 +382,16 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndexInfo } GPOS_ASSERT(NULL != logical_indexes); GPOS_ASSERT(0 <= logical_indexes->numLogicalIndexes); - + const ULONG num_indexes = (ULONG) logical_indexes->numLogicalIndexes; for (ULONG ul = 0; ul < num_indexes; ul++) { LogicalIndexInfo *index_info = (logical_indexes->logicalIndexInfo)[ul]; index_info_list = gpdb::LAppend(index_info_list, index_info); } - + gpdb::GPDBFree(logical_indexes); - + return index_info_list; } @@ -427,11 +404,7 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndexInfo // //--------------------------------------------------------------------------- IMdIdArray * -CTranslatorRelcacheToDXL::RetrieveRelTriggers - ( - CMemoryPool *mp, - Relation rel - ) +CTranslatorRelcacheToDXL::RetrieveRelTriggers(CMemoryPool *mp, Relation rel) { GPOS_ASSERT(NULL != rel); if (0 < rel->rd_rel->reltriggers && NULL == rel->trigdesc) @@ -446,13 +419,12 @@ CTranslatorRelcacheToDXL::RetrieveRelTriggers IMdIdArray *mdid_triggers_array = GPOS_NEW(mp) IMdIdArray(mp); const ULONG ulTriggers = rel->rd_rel->reltriggers; - for (ULONG ul = 0; ul < ulTriggers; ul++) - { - Trigger trigger = rel->trigdesc->triggers[ul]; - OID trigger_oid = trigger.tgoid; - CMDIdGPDB *mdid_trigger = GPOS_NEW(mp) CMDIdGPDB(trigger_oid); - mdid_triggers_array->Append(mdid_trigger); - + for (ULONG ul = 0; ul < ulTriggers; ul++) + { + Trigger trigger = rel->trigdesc->triggers[ul]; + OID trigger_oid = trigger.tgoid; + CMDIdGPDB *mdid_trigger = GPOS_NEW(mp) CMDIdGPDB(trigger_oid); + mdid_triggers_array->Append(mdid_trigger); } return mdid_triggers_array; @@ -467,21 +439,18 @@ CTranslatorRelcacheToDXL::RetrieveRelTriggers // //--------------------------------------------------------------------------- IMdIdArray * -CTranslatorRelcacheToDXL::RetrieveRelCheckConstraints - ( - CMemoryPool *mp, - OID oid - ) +CTranslatorRelcacheToDXL::RetrieveRelCheckConstraints(CMemoryPool *mp, OID oid) { IMdIdArray *check_constraint_mdids = GPOS_NEW(mp) IMdIdArray(mp); List *check_constraints = gpdb::GetCheckConstraintOids(oid); ListCell *lc = NULL; - ForEach (lc, check_constraints) + ForEach(lc, check_constraints) { OID check_constraint_oid = lfirst_oid(lc); GPOS_ASSERT(0 != check_constraint_oid); - CMDIdGPDB *mdid_check_constraint = GPOS_NEW(mp) CMDIdGPDB(check_constraint_oid); + CMDIdGPDB *mdid_check_constraint = + GPOS_NEW(mp) CMDIdGPDB(check_constraint_oid); check_constraint_mdids->Append(mdid_check_constraint); } @@ -497,14 +466,12 @@ CTranslatorRelcacheToDXL::RetrieveRelCheckConstraints // //--------------------------------------------------------------------------- void -CTranslatorRelcacheToDXL::CheckUnsupportedRelation - ( - OID rel_oid - ) +CTranslatorRelcacheToDXL::CheckUnsupportedRelation(OID rel_oid) { if (gpdb::RelPartIsInterior(rel_oid)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Query on intermediate partition")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Query on intermediate partition")); } List *part_keys = gpdb::GetPartitionAttrs(rel_oid); @@ -512,19 +479,24 @@ CTranslatorRelcacheToDXL::CheckUnsupportedRelation if (0 == num_of_levels && gpdb::FHasSubclass(rel_oid)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Inherited tables")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Inherited tables")); } if (1 < num_of_levels) { if (!optimizer_multilevel_partitioning) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Multi-level partitioned tables")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Multi-level partitioned tables")); } if (!gpdb::IsMultilevelPartitionUniform(rel_oid)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Multi-level partitioned tables with non-uniform partitioning structure")); + GPOS_RAISE( + gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT( + "Multi-level partitioned tables with non-uniform partitioning structure")); } } } @@ -538,12 +510,8 @@ CTranslatorRelcacheToDXL::CheckUnsupportedRelation // //--------------------------------------------------------------------------- IMDRelation * -CTranslatorRelcacheToDXL::RetrieveRel - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveRel(CMemoryPool *mp, CMDAccessor *md_accessor, + IMDId *mdid) { OID oid = CMDIdGPDB::CastMdid(mdid)->Oid(); GPOS_ASSERT(InvalidOid != oid); @@ -554,11 +522,13 @@ CTranslatorRelcacheToDXL::RetrieveRel if (NULL == rel) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } CMDName *mdname = NULL; - IMDRelation::Erelstoragetype rel_storage_type = IMDRelation::ErelstorageSentinel; + IMDRelation::Erelstoragetype rel_storage_type = + IMDRelation::ErelstorageSentinel; CMDColumnArray *mdcol_array = NULL; IMDRelation::Ereldistrpolicy dist = IMDRelation::EreldistrSentinel; ULongPtrArray *distr_cols = NULL; @@ -585,8 +555,10 @@ CTranslatorRelcacheToDXL::RetrieveRel rel_storage_type = RetrieveRelStorageType(rel->rd_rel->relstorage); // get relation columns - mdcol_array = RetrieveRelColumns(mp, md_accessor, rel, rel_storage_type); - const ULONG max_cols = GPDXL_SYSTEM_COLUMNS + (ULONG) rel->rd_att->natts + 1; + mdcol_array = + RetrieveRelColumns(mp, md_accessor, rel, rel_storage_type); + const ULONG max_cols = + GPDXL_SYSTEM_COLUMNS + (ULONG) rel->rd_att->natts + 1; ULONG *attno_mapping = ConstructAttnoMapping(mp, mdcol_array, max_cols); // get distribution policy @@ -596,7 +568,8 @@ CTranslatorRelcacheToDXL::RetrieveRel // get distribution columns if (IMDRelation::EreldistrHash == dist) { - distr_cols = RetrieveRelDistrbutionCols(mp, gp_policy, mdcol_array, max_cols); + distr_cols = RetrieveRelDistrbutionCols(mp, gp_policy, mdcol_array, + max_cols); } convert_hash_to_random = gpdb::IsChildPartDistributionMismatched(rel); @@ -614,7 +587,9 @@ CTranslatorRelcacheToDXL::RetrieveRel } is_partitioned = (NULL != part_keys && 0 < part_keys->Size()); - if (is_partitioned && IMDRelation::ErelstorageAppendOnlyParquet != rel_storage_type && IMDRelation::ErelstorageExternal != rel_storage_type) + if (is_partitioned && + IMDRelation::ErelstorageAppendOnlyParquet != rel_storage_type && + IMDRelation::ErelstorageExternal != rel_storage_type) { // mark relation as Parquet if one of its children is parquet if (gpdb::HasParquetChildren(oid)) @@ -630,15 +605,17 @@ CTranslatorRelcacheToDXL::RetrieveRel } // get key sets - BOOL should_add_default_keys = RelHasSystemColumns(rel->rd_rel->relkind); - keyset_array = RetrieveRelKeysets(mp, oid, should_add_default_keys, is_partitioned, attno_mapping); + BOOL should_add_default_keys = + RelHasSystemColumns(rel->rd_rel->relkind); + keyset_array = RetrieveRelKeysets(mp, oid, should_add_default_keys, + is_partitioned, attno_mapping); // collect all check constraints check_constraint_mdids = RetrieveRelCheckConstraints(mp, oid); is_temporary = rel->rd_istemp; has_oids = rel->rd_rel->relhasoids; - + GPOS_DELETE_ARRAY(attno_mapping); gpdb::CloseRelation(rel); } @@ -665,23 +642,11 @@ CTranslatorRelcacheToDXL::RetrieveRel pmdidFmtErrTbl = GPOS_NEW(mp) CMDIdGPDB(extentry->fmterrtbl); } - md_rel = GPOS_NEW(mp) CMDRelationExternalGPDB - ( - mp, - mdid, - mdname, - dist, - mdcol_array, - distr_cols, - convert_hash_to_random, - keyset_array, - md_index_info_array, - mdid_triggers_array, - check_constraint_mdids, - extentry->rejectlimit, - ('r' == extentry->rejectlimittype), - pmdidFmtErrTbl - ); + md_rel = GPOS_NEW(mp) CMDRelationExternalGPDB( + mp, mdid, mdname, dist, mdcol_array, distr_cols, + convert_hash_to_random, keyset_array, md_index_info_array, + mdid_triggers_array, check_constraint_mdids, extentry->rejectlimit, + ('r' == extentry->rejectlimittype), pmdidFmtErrTbl); } else { @@ -689,29 +654,16 @@ CTranslatorRelcacheToDXL::RetrieveRel // retrieve the part constraints if relation is partitioned if (is_partitioned) - mdpart_constraint = RetrievePartConstraintForRel(mp, md_accessor, oid, mdcol_array, md_index_info_array->Size() > 0 /*has_index*/); - - md_rel = GPOS_NEW(mp) CMDRelationGPDB - ( - mp, - mdid, - mdname, - is_temporary, - rel_storage_type, - dist, - mdcol_array, - distr_cols, - part_keys, - part_types, - num_leaf_partitions, - convert_hash_to_random, - keyset_array, - md_index_info_array, - mdid_triggers_array, - check_constraint_mdids, - mdpart_constraint, - has_oids - ); + mdpart_constraint = RetrievePartConstraintForRel( + mp, md_accessor, oid, mdcol_array, + md_index_info_array->Size() > 0 /*has_index*/); + + md_rel = GPOS_NEW(mp) CMDRelationGPDB( + mp, mdid, mdname, is_temporary, rel_storage_type, dist, mdcol_array, + distr_cols, part_keys, part_types, num_leaf_partitions, + convert_hash_to_random, keyset_array, md_index_info_array, + mdid_triggers_array, check_constraint_mdids, mdpart_constraint, + has_oids); } return md_rel; @@ -726,32 +678,30 @@ CTranslatorRelcacheToDXL::RetrieveRel // //--------------------------------------------------------------------------- CMDColumnArray * -CTranslatorRelcacheToDXL::RetrieveRelColumns - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - Relation rel, - IMDRelation::Erelstoragetype rel_storage_type - ) +CTranslatorRelcacheToDXL::RetrieveRelColumns( + CMemoryPool *mp, CMDAccessor *md_accessor, Relation rel, + IMDRelation::Erelstoragetype rel_storage_type) { CMDColumnArray *mdcol_array = GPOS_NEW(mp) CMDColumnArray(mp); - for (ULONG ul = 0; ul < (ULONG) rel->rd_att->natts; ul++) + for (ULONG ul = 0; ul < (ULONG) rel->rd_att->natts; ul++) { Form_pg_attribute att = rel->rd_att->attrs[ul]; - CMDName *md_colname = CDXLUtils::CreateMDNameFromCharArray(mp, NameStr(att->attname)); - + CMDName *md_colname = + CDXLUtils::CreateMDNameFromCharArray(mp, NameStr(att->attname)); + // translate the default column value CDXLNode *dxl_default_col_val = NULL; - + if (!att->attisdropped) { - dxl_default_col_val = GetDefaultColumnValue(mp, md_accessor, rel->rd_att, att->attnum); + dxl_default_col_val = GetDefaultColumnValue( + mp, md_accessor, rel->rd_att, att->attnum); } ULONG col_len = gpos::ulong_max; CMDIdGPDB *mdid_col = GPOS_NEW(mp) CMDIdGPDB(att->atttypid); - HeapTuple stats_tup = gpdb::GetAttStats(rel->rd_id, ul+1); + HeapTuple stats_tup = gpdb::GetAttStats(rel->rd_id, ul + 1); // Column width priority: // 1. If there is average width kept in the stats for that column, pick that value. @@ -760,15 +710,18 @@ CTranslatorRelcacheToDXL::RetrieveRelColumns // 3. Else if it not dropped and a fixed length type such as int4, assign the fixed // length. // 4. Otherwise, assign it to default column width which is 8. - if(HeapTupleIsValid(stats_tup)) + if (HeapTupleIsValid(stats_tup)) { - Form_pg_statistic form_pg_stats = (Form_pg_statistic) GETSTRUCT(stats_tup); + Form_pg_statistic form_pg_stats = + (Form_pg_statistic) GETSTRUCT(stats_tup); // column width col_len = form_pg_stats->stawidth; gpdb::FreeHeapTuple(stats_tup); } - else if ((mdid_col->Equals(&CMDIdGPDB::m_mdid_bpchar) || mdid_col->Equals(&CMDIdGPDB::m_mdid_varchar)) && (VARHDRSZ < att->atttypmod)) + else if ((mdid_col->Equals(&CMDIdGPDB::m_mdid_bpchar) || + mdid_col->Equals(&CMDIdGPDB::m_mdid_varchar)) && + (VARHDRSZ < att->atttypmod)) { col_len = (ULONG) att->atttypmod - VARHDRSZ; } @@ -779,8 +732,9 @@ CTranslatorRelcacheToDXL::RetrieveRelColumns if (!att->attisdropped) { - IMDType *md_type = CTranslatorRelcacheToDXL::RetrieveType(mp, mdid_col); - if(md_type->IsFixedLength()) + IMDType *md_type = + CTranslatorRelcacheToDXL::RetrieveType(mp, mdid_col); + if (md_type->IsFixedLength()) { col_len = md_type->Length(); } @@ -788,17 +742,10 @@ CTranslatorRelcacheToDXL::RetrieveRelColumns } } - CMDColumn *md_col = GPOS_NEW(mp) CMDColumn - ( - md_colname, - att->attnum, - mdid_col, - att->atttypmod, - !att->attnotnull, - att->attisdropped, - dxl_default_col_val /* default value */, - col_len - ); + CMDColumn *md_col = GPOS_NEW(mp) + CMDColumn(md_colname, att->attnum, mdid_col, att->atttypmod, + !att->attnotnull, att->attisdropped, + dxl_default_col_val /* default value */, col_len); mdcol_array->Append(md_col); } @@ -806,8 +753,9 @@ CTranslatorRelcacheToDXL::RetrieveRelColumns // add system columns if (RelHasSystemColumns(rel->rd_rel->relkind)) { - BOOL is_ao_table = IMDRelation::ErelstorageAppendOnlyRows == rel_storage_type || - IMDRelation::ErelstorageAppendOnlyCols == rel_storage_type; + BOOL is_ao_table = + IMDRelation::ErelstorageAppendOnlyRows == rel_storage_type || + IMDRelation::ErelstorageAppendOnlyCols == rel_storage_type; AddSystemColumns(mp, mdcol_array, rel, is_ao_table); } @@ -823,13 +771,10 @@ CTranslatorRelcacheToDXL::RetrieveRelColumns // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorRelcacheToDXL::GetDefaultColumnValue - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - TupleDesc rd_att, - AttrNumber attno - ) +CTranslatorRelcacheToDXL::GetDefaultColumnValue(CMemoryPool *mp, + CMDAccessor *md_accessor, + TupleDesc rd_att, + AttrNumber attno) { GPOS_ASSERT(attno > 0); @@ -839,7 +784,7 @@ CTranslatorRelcacheToDXL::GetDefaultColumnValue if (NULL != rd_att->constr && 0 < rd_att->constr->num_defval) { AttrDefault *defval = rd_att->constr->defval; - INT num_def = rd_att->constr->num_defval; + INT num_def = rd_att->constr->num_defval; GPOS_ASSERT(NULL != defval); for (ULONG ul = 0; ul < (ULONG) num_def; ul++) @@ -866,23 +811,19 @@ CTranslatorRelcacheToDXL::GetDefaultColumnValue } // translate the default value expression - CTranslatorScalarToDXL scalar_translator - ( - mp, - md_accessor, - NULL, /* pulidgtorCol */ - NULL, /* pulidgtorCTE */ - 0, /* query_level */ - true, /* m_fQuery */ - NULL, /* query_level_to_cte_map */ - NULL /* cte_dxlnode_array */ - ); - - return scalar_translator.TranslateScalarToDXL - ( - (Expr *) node, - NULL /* var_colid_mapping --- subquery or external variable are not supported in default expression */ - ); + CTranslatorScalarToDXL scalar_translator(mp, md_accessor, + NULL, /* pulidgtorCol */ + NULL, /* pulidgtorCTE */ + 0, /* query_level */ + true, /* m_fQuery */ + NULL, /* query_level_to_cte_map */ + NULL /* cte_dxlnode_array */ + ); + + return scalar_translator.TranslateScalarToDXL( + (Expr *) node, + NULL /* var_colid_mapping --- subquery or external variable are not supported in default expression */ + ); } //--------------------------------------------------------------------------- @@ -894,10 +835,7 @@ CTranslatorRelcacheToDXL::GetDefaultColumnValue // //--------------------------------------------------------------------------- IMDRelation::Ereldistrpolicy -CTranslatorRelcacheToDXL::GetRelDistribution - ( - GpPolicy *gp_policy - ) +CTranslatorRelcacheToDXL::GetRelDistribution(GpPolicy *gp_policy) { if (NULL == gp_policy) { @@ -932,22 +870,18 @@ CTranslatorRelcacheToDXL::GetRelDistribution // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorRelcacheToDXL::RetrieveRelDistrbutionCols - ( - CMemoryPool *mp, - GpPolicy *gp_policy, - CMDColumnArray *mdcol_array, - ULONG size - ) +CTranslatorRelcacheToDXL::RetrieveRelDistrbutionCols( + CMemoryPool *mp, GpPolicy *gp_policy, CMDColumnArray *mdcol_array, + ULONG size) { - ULONG *attno_mapping = GPOS_NEW_ARRAY(mp , ULONG, size); + ULONG *attno_mapping = GPOS_NEW_ARRAY(mp, ULONG, size); - for (ULONG ul = 0; ul < mdcol_array->Size(); ul++) + for (ULONG ul = 0; ul < mdcol_array->Size(); ul++) { const IMDColumn *md_col = (*mdcol_array)[ul]; INT attno = md_col->AttrNum(); - ULONG idx = (ULONG) (GPDXL_SYSTEM_COLUMNS + attno); + ULONG idx = (ULONG)(GPDXL_SYSTEM_COLUMNS + attno); attno_mapping[idx] = ul; } @@ -956,7 +890,8 @@ CTranslatorRelcacheToDXL::RetrieveRelDistrbutionCols for (ULONG ul = 0; ul < (ULONG) gp_policy->nattrs; ul++) { AttrNumber attno = gp_policy->attrs[ul]; - distr_cols->Append(GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); + distr_cols->Append( + GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); } GPOS_DELETE_ARRAY(attno_mapping); @@ -972,18 +907,15 @@ CTranslatorRelcacheToDXL::RetrieveRelDistrbutionCols // //--------------------------------------------------------------------------- void -CTranslatorRelcacheToDXL::AddSystemColumns - ( - CMemoryPool *mp, - CMDColumnArray *mdcol_array, - Relation rel, - BOOL is_ao_table - ) +CTranslatorRelcacheToDXL::AddSystemColumns(CMemoryPool *mp, + CMDColumnArray *mdcol_array, + Relation rel, BOOL is_ao_table) { BOOL has_oids = rel->rd_att->tdhasoid; is_ao_table = is_ao_table || gpdb::IsAppendOnlyPartitionTable(rel->rd_id); - for (INT i= SelfItemPointerAttributeNumber; i > FirstLowInvalidHeapAttributeNumber; i--) + for (INT i = SelfItemPointerAttributeNumber; + i > FirstLowInvalidHeapAttributeNumber; i--) { AttrNumber attno = AttrNumber(i); GPOS_ASSERT(0 != attno); @@ -1000,23 +932,20 @@ CTranslatorRelcacheToDXL::AddSystemColumns } // get system name for that attribute - const CWStringConst *sys_colname = CTranslatorUtils::GetSystemColName(attno); + const CWStringConst *sys_colname = + CTranslatorUtils::GetSystemColName(attno); GPOS_ASSERT(NULL != sys_colname); // copy string into column name CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, sys_colname); - CMDColumn *md_col = GPOS_NEW(mp) CMDColumn - ( - md_colname, - attno, - CTranslatorUtils::GetSystemColType(mp, attno), - default_type_modifier, - false, // is_nullable - false, // is_dropped - NULL, // default value - CTranslatorUtils::GetSystemColLength(attno) - ); + CMDColumn *md_col = GPOS_NEW(mp) CMDColumn( + md_colname, attno, CTranslatorUtils::GetSystemColType(mp, attno), + default_type_modifier, + false, // is_nullable + false, // is_dropped + NULL, // default value + CTranslatorUtils::GetSystemColLength(attno)); mdcol_array->Append(md_col); } @@ -1027,18 +956,17 @@ CTranslatorRelcacheToDXL::AddSystemColumns // CTranslatorRelcacheToDXL::IsTransactionVisibilityAttribute // // @doc: -// Check if attribute number is one of the system attributes related to +// Check if attribute number is one of the system attributes related to // transaction visibility such as xmin, xmax, cmin, cmax // //--------------------------------------------------------------------------- BOOL -CTranslatorRelcacheToDXL::IsTransactionVisibilityAttribute - ( - INT attno - ) +CTranslatorRelcacheToDXL::IsTransactionVisibilityAttribute(INT attno) { - return attno == MinTransactionIdAttributeNumber || attno == MaxTransactionIdAttributeNumber || - attno == MinCommandIdAttributeNumber || attno == MaxCommandIdAttributeNumber; + return attno == MinTransactionIdAttributeNumber || + attno == MaxTransactionIdAttributeNumber || + attno == MinCommandIdAttributeNumber || + attno == MaxCommandIdAttributeNumber; } //--------------------------------------------------------------------------- @@ -1050,12 +978,9 @@ CTranslatorRelcacheToDXL::IsTransactionVisibilityAttribute // //--------------------------------------------------------------------------- IMDIndex * -CTranslatorRelcacheToDXL::RetrieveIndex - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid_index - ) +CTranslatorRelcacheToDXL::RetrieveIndex(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid_index) { OID index_oid = CMDIdGPDB::CastMdid(mdid_index)->Oid(); GPOS_ASSERT(0 != index_oid); @@ -1063,7 +988,8 @@ CTranslatorRelcacheToDXL::RetrieveIndex if (NULL == index_rel) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid_index->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid_index->GetBuffer()); } const IMDRelation *md_rel = NULL; @@ -1079,11 +1005,12 @@ CTranslatorRelcacheToDXL::RetrieveIndex { if (!IsIndexSupported(index_rel)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Index type")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Index type")); } form_pg_index = index_rel->rd_index; - GPOS_ASSERT (NULL != form_pg_index); + GPOS_ASSERT(NULL != form_pg_index); index_clustered = form_pg_index->indisclustered; OID rel_oid = form_pg_index->indrelid; @@ -1096,13 +1023,15 @@ CTranslatorRelcacheToDXL::RetrieveIndex CMDIdGPDB *mdid_rel = GPOS_NEW(mp) CMDIdGPDB(rel_oid); md_rel = md_accessor->RetrieveRel(mdid_rel); - + if (md_rel->IsPartitioned()) { - LogicalIndexes *logical_indexes = gpdb::GetLogicalPartIndexes(rel_oid); + LogicalIndexes *logical_indexes = + gpdb::GetLogicalPartIndexes(rel_oid); GPOS_ASSERT(NULL != logical_indexes); - IMDIndex *index = RetrievePartTableIndex(mp, md_accessor, mdid_index, md_rel, logical_indexes); + IMDIndex *index = RetrievePartTableIndex( + mp, md_accessor, mdid_index, md_rel, logical_indexes); // cleanup gpdb::GPDBFree(logical_indexes); @@ -1114,7 +1043,7 @@ CTranslatorRelcacheToDXL::RetrieveIndex return index; } } - + index_type = IMDIndex::EmdindBtree; mdid_item_type = GPOS_NEW(mp) CMDIdGPDB(GPDB_ANY); if (GIST_AM_OID == index_rel->rd_rel->relam) @@ -1128,13 +1057,15 @@ CTranslatorRelcacheToDXL::RetrieveIndex // get the index name CHAR *index_name = NameStr(index_rel->rd_rel->relname); - CWStringDynamic *str_name = CDXLUtils::CreateDynamicStringFromCharArray(mp, index_name); + CWStringDynamic *str_name = + CDXLUtils::CreateDynamicStringFromCharArray(mp, index_name); mdname = GPOS_NEW(mp) CMDName(mp, str_name); GPOS_DELETE(str_name); - Relation table = gpdb::GetRelation(CMDIdGPDB::CastMdid(md_rel->MDId())->Oid()); + Relation table = + gpdb::GetRelation(CMDIdGPDB::CastMdid(md_rel->MDId())->Oid()); ULONG size = GPDXL_SYSTEM_COLUMNS + (ULONG) table->rd_att->natts + 1; - gpdb::CloseRelation(table); // close relation as early as possible + gpdb::CloseRelation(table); // close relation as early as possible attno_mapping = PopulateAttnoPositionMap(mp, md_rel, size); @@ -1146,7 +1077,8 @@ CTranslatorRelcacheToDXL::RetrieveIndex INT attno = form_pg_index->indkey.values[i]; GPOS_ASSERT(0 != attno && "Index expressions not supported"); - index_key_cols_array->Append(GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); + index_key_cols_array->Append( + GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); } mdid_rel->Release(); gpdb::CloseRelation(index_rel); @@ -1162,19 +1094,11 @@ CTranslatorRelcacheToDXL::RetrieveIndex mdid_index->AddRef(); IMdIdArray *op_families_mdids = RetrieveIndexOpFamilies(mp, mdid_index); - CMDIndexGPDB *index = GPOS_NEW(mp) CMDIndexGPDB - ( - mp, - mdid_index, - mdname, - index_clustered, - index_type, - mdid_item_type, - index_key_cols_array, - included_cols, - op_families_mdids, - NULL // mdpart_constraint - ); + CMDIndexGPDB *index = GPOS_NEW(mp) CMDIndexGPDB( + mp, mdid_index, mdname, index_clustered, index_type, mdid_item_type, + index_key_cols_array, included_cols, op_families_mdids, + NULL // mdpart_constraint + ); GPOS_DELETE_ARRAY(attno_mapping); return index; @@ -1185,32 +1109,28 @@ CTranslatorRelcacheToDXL::RetrieveIndex // CTranslatorRelcacheToDXL::RetrievePartTableIndex // // @doc: -// Retrieve an index over a partitioned table from the relcache given its +// Retrieve an index over a partitioned table from the relcache given its // mdid // //--------------------------------------------------------------------------- IMDIndex * -CTranslatorRelcacheToDXL::RetrievePartTableIndex - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid_index, - const IMDRelation *md_rel, - LogicalIndexes *logical_indexes - ) +CTranslatorRelcacheToDXL::RetrievePartTableIndex( + CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid_index, + const IMDRelation *md_rel, LogicalIndexes *logical_indexes) { GPOS_ASSERT(NULL != logical_indexes); GPOS_ASSERT(0 < logical_indexes->numLogicalIndexes); - + OID oid = CMDIdGPDB::CastMdid(mdid_index)->Oid(); - + LogicalIndexInfo *index_info = LookupLogicalIndexById(logical_indexes, oid); if (NULL == index_info) { - return NULL; + return NULL; } - - return RetrievePartTableIndex(mp, md_accessor, index_info, mdid_index, md_rel); + + return RetrievePartTableIndex(mp, md_accessor, index_info, mdid_index, + md_rel); } //--------------------------------------------------------------------------- @@ -1222,26 +1142,24 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex // //--------------------------------------------------------------------------- LogicalIndexInfo * -CTranslatorRelcacheToDXL::LookupLogicalIndexById - ( - LogicalIndexes *logical_indexes, - OID oid - ) +CTranslatorRelcacheToDXL::LookupLogicalIndexById( + LogicalIndexes *logical_indexes, OID oid) { - GPOS_ASSERT(NULL != logical_indexes && 0 <= logical_indexes->numLogicalIndexes); - + GPOS_ASSERT(NULL != logical_indexes && + 0 <= logical_indexes->numLogicalIndexes); + const ULONG num_index = logical_indexes->numLogicalIndexes; - + for (ULONG ul = 0; ul < num_index; ul++) { LogicalIndexInfo *index_info = (logical_indexes->logicalIndexInfo)[ul]; - + if (oid == index_info->logicalIndexOid) { return index_info; } } - + return NULL; } @@ -1254,34 +1172,33 @@ CTranslatorRelcacheToDXL::LookupLogicalIndexById // //--------------------------------------------------------------------------- IMDIndex * -CTranslatorRelcacheToDXL::RetrievePartTableIndex - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - LogicalIndexInfo *index_info, - IMDId *mdid_index, - const IMDRelation *md_rel - ) +CTranslatorRelcacheToDXL::RetrievePartTableIndex(CMemoryPool *mp, + CMDAccessor *md_accessor, + LogicalIndexInfo *index_info, + IMDId *mdid_index, + const IMDRelation *md_rel) { OID index_oid = index_info->logicalIndexOid; - + Relation index_rel = gpdb::GetRelation(index_oid); if (NULL == index_rel) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid_index->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid_index->GetBuffer()); } if (!IsIndexSupported(index_rel)) { gpdb::CloseRelation(index_rel); - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Index type")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Index type")); } - + // get the index name GPOS_ASSERT(NULL != index_rel->rd_index); Form_pg_index form_pg_index = index_rel->rd_index; - + CHAR *index_name = NameStr(index_rel->rd_rel->relname); CMDName *mdname = CDXLUtils::CreateMDNameFromCharArray(mp, index_name); gpdb::CloseRelation(index_rel); @@ -1303,16 +1220,17 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex INT attno = index_info->indexKeys[i]; GPOS_ASSERT(0 != attno && "Index expressions not supported"); - index_key_cols_array->Append(GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); + index_key_cols_array->Append( + GPOS_NEW(mp) ULONG(GetAttributePosition(attno, attno_mapping))); } - + /* * If an index exists only on a leaf part, part_constraint refers to the expression * identifying the path to reach the partition holding the index. For indexes * available on all parts it is set to NULL. */ Node *part_constraint = index_info->partCons; - + /* * If an index exists all on the parts including default, the logical index * info created marks defaultLevels as NIL. However, if an index exists only on @@ -1320,7 +1238,7 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex * reaching to the leaf part from root. */ List *default_levels = index_info->defaultLevels; - + // get number of partitioning levels List *part_keys = gpdb::GetPartitionAttrs(rel_oid); const ULONG num_of_levels = gpdb::ListLength(part_keys); @@ -1331,12 +1249,14 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex * for the partitioned table */ List *default_levels_rel = NIL; - Node *part_constraints_rel = gpdb::GetRelationPartContraints(rel_oid, &default_levels_rel); + Node *part_constraints_rel = + gpdb::GetRelationPartContraints(rel_oid, &default_levels_rel); BOOL is_unbounded = (NULL == part_constraint) && (NIL == default_levels); for (ULONG ul = 0; ul < num_of_levels; ul++) { - is_unbounded = is_unbounded && LevelHasDefaultPartition(default_levels_rel, ul); + is_unbounded = + is_unbounded && LevelHasDefaultPartition(default_levels_rel, ul); } /* @@ -1351,11 +1271,12 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex default_levels_derived_list = default_levels_rel; else default_levels_derived_list = default_levels; - + ULongPtrArray *default_levels_derived = GPOS_NEW(mp) ULongPtrArray(mp); for (ULONG ul = 0; ul < num_of_levels; ul++) { - if (is_unbounded || LevelHasDefaultPartition(default_levels_derived_list, ul)) + if (is_unbounded || + LevelHasDefaultPartition(default_levels_derived_list, ul)) { default_levels_derived->Append(GPOS_NEW(mp) ULONG(ul)); } @@ -1371,19 +1292,25 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex } else { - part_constraint = gpdb::MakeBoolConst(false /*value*/, false /*isull*/); + part_constraint = + gpdb::MakeBoolConst(false /*value*/, false /*isull*/); } } - - CMDPartConstraintGPDB *mdpart_constraint = RetrievePartConstraintForIndex(mp, md_accessor, md_rel, part_constraint, default_levels_derived, is_unbounded); + + CMDPartConstraintGPDB *mdpart_constraint = + RetrievePartConstraintForIndex(mp, md_accessor, md_rel, part_constraint, + default_levels_derived, is_unbounded); default_levels_derived->Release(); mdid_index->AddRef(); - - GPOS_ASSERT(INDTYPE_BITMAP == index_info->indType || INDTYPE_BTREE == index_info->indType || INDTYPE_GIST == index_info->indType); - + + GPOS_ASSERT(INDTYPE_BITMAP == index_info->indType || + INDTYPE_BTREE == index_info->indType || + INDTYPE_GIST == index_info->indType); + IMDIndex::EmdindexType index_type = IMDIndex::EmdindBtree; - IMDId *mdid_item_type = GPOS_NEW(mp) CMDIdGPDB(GPDB_ANY);; + IMDId *mdid_item_type = GPOS_NEW(mp) CMDIdGPDB(GPDB_ANY); + ; if (INDTYPE_BITMAP == index_info->indType) { index_type = IMDIndex::EmdindBitmap; @@ -1392,25 +1319,16 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex { index_type = IMDIndex::EmdindGist; } - + IMdIdArray *pdrgpmdidOpFamilies = RetrieveIndexOpFamilies(mp, mdid_index); - - CMDIndexGPDB *index = GPOS_NEW(mp) CMDIndexGPDB - ( - mp, - mdid_index, - mdname, - form_pg_index->indisclustered, - index_type, - mdid_item_type, - index_key_cols_array, - included_cols, - pdrgpmdidOpFamilies, - mdpart_constraint - ); - + + CMDIndexGPDB *index = GPOS_NEW(mp) + CMDIndexGPDB(mp, mdid_index, mdname, form_pg_index->indisclustered, + index_type, mdid_item_type, index_key_cols_array, + included_cols, pdrgpmdidOpFamilies, mdpart_constraint); + GPOS_DELETE_ARRAY(attno_mapping); - + return index; } @@ -1423,19 +1341,16 @@ CTranslatorRelcacheToDXL::RetrievePartTableIndex // //--------------------------------------------------------------------------- BOOL -CTranslatorRelcacheToDXL::LevelHasDefaultPartition - ( - List *default_levels, - ULONG level - ) +CTranslatorRelcacheToDXL::LevelHasDefaultPartition(List *default_levels, + ULONG level) { if (NIL == default_levels) { return false; } - + ListCell *lc = NULL; - ForEach (lc, default_levels) + ForEach(lc, default_levels) { ULONG default_level = (ULONG) lfirst_int(lc); if (level == default_level) @@ -1443,7 +1358,7 @@ CTranslatorRelcacheToDXL::LevelHasDefaultPartition return true; } } - + return false; } @@ -1456,25 +1371,22 @@ CTranslatorRelcacheToDXL::LevelHasDefaultPartition // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorRelcacheToDXL::ComputeIncludedCols - ( - CMemoryPool *mp, - const IMDRelation *md_rel - ) +CTranslatorRelcacheToDXL::ComputeIncludedCols(CMemoryPool *mp, + const IMDRelation *md_rel) { // TODO: 3/19/2012; currently we assume that all the columns // in the table are available from the index. ULongPtrArray *included_cols = GPOS_NEW(mp) ULongPtrArray(mp); const ULONG num_included_cols = md_rel->ColumnCount(); - for (ULONG ul = 0; ul < num_included_cols; ul++) + for (ULONG ul = 0; ul < num_included_cols; ul++) { if (!md_rel->GetMdCol(ul)->IsDropped()) { included_cols->Append(GPOS_NEW(mp) ULONG(ul)); } } - + return included_cols; } @@ -1488,13 +1400,10 @@ CTranslatorRelcacheToDXL::ComputeIncludedCols // //--------------------------------------------------------------------------- ULONG -CTranslatorRelcacheToDXL::GetAttributePosition - ( - INT attno, - ULONG *GetAttributePosition - ) +CTranslatorRelcacheToDXL::GetAttributePosition(INT attno, + ULONG *GetAttributePosition) { - ULONG idx = (ULONG) (GPDXL_SYSTEM_COLUMNS + attno); + ULONG idx = (ULONG)(GPDXL_SYSTEM_COLUMNS + attno); ULONG pos = GetAttributePosition[idx]; GPOS_ASSERT(gpos::ulong_max != pos); @@ -1510,31 +1419,28 @@ CTranslatorRelcacheToDXL::GetAttributePosition // //--------------------------------------------------------------------------- ULONG * -CTranslatorRelcacheToDXL::PopulateAttnoPositionMap - ( - CMemoryPool *mp, - const IMDRelation *md_rel, - ULONG size - ) +CTranslatorRelcacheToDXL::PopulateAttnoPositionMap(CMemoryPool *mp, + const IMDRelation *md_rel, + ULONG size) { GPOS_ASSERT(NULL != md_rel); const ULONG num_included_cols = md_rel->ColumnCount(); GPOS_ASSERT(num_included_cols <= size); - ULONG *attno_mapping = GPOS_NEW_ARRAY(mp , ULONG, size); + ULONG *attno_mapping = GPOS_NEW_ARRAY(mp, ULONG, size); for (ULONG ul = 0; ul < size; ul++) { attno_mapping[ul] = gpos::ulong_max; } - for (ULONG ul = 0; ul < num_included_cols; ul++) + for (ULONG ul = 0; ul < num_included_cols; ul++) { const IMDColumn *md_col = md_rel->GetMdCol(ul); INT attno = md_col->AttrNum(); - ULONG idx = (ULONG) (GPDXL_SYSTEM_COLUMNS + attno); + ULONG idx = (ULONG)(GPDXL_SYSTEM_COLUMNS + attno); GPOS_ASSERT(size > idx); attno_mapping[idx] = ul; } @@ -1552,15 +1458,11 @@ CTranslatorRelcacheToDXL::PopulateAttnoPositionMap // //--------------------------------------------------------------------------- IMDType * -CTranslatorRelcacheToDXL::RetrieveType - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveType(CMemoryPool *mp, IMDId *mdid) { OID oid_type = CMDIdGPDB::CastMdid(mdid)->Oid(); GPOS_ASSERT(InvalidOid != oid_type); - + // check for supported base types switch (oid_type) { @@ -1582,7 +1484,8 @@ CTranslatorRelcacheToDXL::RetrieveType // continue to construct a generic type INT iFlags = TYPECACHE_EQ_OPR | TYPECACHE_LT_OPR | TYPECACHE_GT_OPR | - TYPECACHE_CMP_PROC | TYPECACHE_EQ_OPR_FINFO | TYPECACHE_CMP_PROC_FINFO | TYPECACHE_TUPDESC; + TYPECACHE_CMP_PROC | TYPECACHE_EQ_OPR_FINFO | + TYPECACHE_CMP_PROC_FINFO | TYPECACHE_TUPDESC; TypeCacheEntry *ptce = gpdb::LookupTypeCache(oid_type, iFlags); @@ -1602,11 +1505,14 @@ CTranslatorRelcacheToDXL::RetrieveType // collect ids of different comparison operators for types CMDIdGPDB *mdid_op_eq = GPOS_NEW(mp) CMDIdGPDB(ptce->eq_opr); - CMDIdGPDB *mdid_op_neq = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->eq_opr)); + CMDIdGPDB *mdid_op_neq = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->eq_opr)); CMDIdGPDB *mdid_op_lt = GPOS_NEW(mp) CMDIdGPDB(ptce->lt_opr); - CMDIdGPDB *mdid_op_leq = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->gt_opr)); + CMDIdGPDB *mdid_op_leq = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->gt_opr)); CMDIdGPDB *mdid_op_gt = GPOS_NEW(mp) CMDIdGPDB(ptce->gt_opr); - CMDIdGPDB *mdid_op_geq = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->lt_opr)); + CMDIdGPDB *mdid_op_geq = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetInverseOp(ptce->lt_opr)); CMDIdGPDB *mdid_op_cmp = GPOS_NEW(mp) CMDIdGPDB(ptce->cmp_proc); BOOL is_hashable = gpdb::IsOpHashJoinable(ptce->eq_opr); BOOL is_merge_joinable = gpdb::IsOpMergeJoinable(ptce->eq_opr); @@ -1614,14 +1520,18 @@ CTranslatorRelcacheToDXL::RetrieveType BOOL is_text_related_type = gpdb::IsTextRelatedType(oid_type); // get standard aggregates - CMDIdGPDB *mdid_min = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("min", oid_type)); - CMDIdGPDB *mdid_max = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("max", oid_type)); - CMDIdGPDB *mdid_avg = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("avg", oid_type)); - CMDIdGPDB *mdid_sum = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("sum", oid_type)); - + CMDIdGPDB *mdid_min = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("min", oid_type)); + CMDIdGPDB *mdid_max = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("max", oid_type)); + CMDIdGPDB *mdid_avg = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("avg", oid_type)); + CMDIdGPDB *mdid_sum = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetAggregate("sum", oid_type)); + // count aggregate is the same for all types CMDIdGPDB *mdid_count = GPOS_NEW(mp) CMDIdGPDB(COUNT_ANY_OID); - + // check if type is composite CMDIdGPDB *mdid_type_relid = NULL; if (is_composite_type) @@ -1630,41 +1540,19 @@ CTranslatorRelcacheToDXL::RetrieveType } // get array type mdid - CMDIdGPDB *mdid_type_array = GPOS_NEW(mp) CMDIdGPDB(gpdb::GetArrayType(oid_type)); + CMDIdGPDB *mdid_type_array = + GPOS_NEW(mp) CMDIdGPDB(gpdb::GetArrayType(oid_type)); BOOL is_redistributable = gpdb::IsGreenplumDbHashable(oid_type); mdid->AddRef(); - return GPOS_NEW(mp) CMDTypeGenericGPDB - ( - mp, - mdid, - mdname, - is_redistributable, - is_fixed_length, - length, - is_passed_by_value, - mdid_op_eq, - mdid_op_neq, - mdid_op_lt, - mdid_op_leq, - mdid_op_gt, - mdid_op_geq, - mdid_op_cmp, - mdid_min, - mdid_max, - mdid_avg, - mdid_sum, - mdid_count, - is_hashable, - is_merge_joinable, - is_composite_type, - is_text_related_type, - mdid_type_relid, - mdid_type_array, - ptce->typlen - ); + return GPOS_NEW(mp) CMDTypeGenericGPDB( + mp, mdid, mdname, is_redistributable, is_fixed_length, length, + is_passed_by_value, mdid_op_eq, mdid_op_neq, mdid_op_lt, mdid_op_leq, + mdid_op_gt, mdid_op_geq, mdid_op_cmp, mdid_min, mdid_max, mdid_avg, + mdid_sum, mdid_count, is_hashable, is_merge_joinable, is_composite_type, + is_text_related_type, mdid_type_relid, mdid_type_array, ptce->typlen); } @@ -1677,11 +1565,7 @@ CTranslatorRelcacheToDXL::RetrieveType // //--------------------------------------------------------------------------- CMDScalarOpGPDB * -CTranslatorRelcacheToDXL::RetrieveScOp - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveScOp(CMemoryPool *mp, IMDId *mdid) { OID op_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -1692,11 +1576,12 @@ CTranslatorRelcacheToDXL::RetrieveScOp if (NULL == name) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } CMDName *mdname = CDXLUtils::CreateMDNameFromCharArray(mp, name); - + OID left_oid = InvalidOid; OID right_oid = InvalidOid; @@ -1717,9 +1602,10 @@ CTranslatorRelcacheToDXL::RetrieveScOp } // get comparison type - CmpType cmpt = (CmpType) gpdb::GetComparisonType(op_oid, left_oid, right_oid); + CmpType cmpt = + (CmpType) gpdb::GetComparisonType(op_oid, left_oid, right_oid); IMDType::ECmpType cmp_type = ParseCmpType(cmpt); - + // get func oid OID func_oid = gpdb::GetOpFunc(op_oid); GPOS_ASSERT(InvalidOid != func_oid); @@ -1738,7 +1624,7 @@ CTranslatorRelcacheToDXL::RetrieveScOp OID commute_oid = gpdb::GetCommutatorOp(op_oid); - if(InvalidOid != commute_oid) + if (InvalidOid != commute_oid) { mdid_commute_opr = GPOS_NEW(mp) CMDIdGPDB(commute_oid); } @@ -1747,7 +1633,7 @@ CTranslatorRelcacheToDXL::RetrieveScOp OID inverse_oid = gpdb::GetInverseOp(op_oid); - if(InvalidOid != inverse_oid) + if (InvalidOid != inverse_oid) { m_mdid_inverse_opr = GPOS_NEW(mp) CMDIdGPDB(inverse_oid); } @@ -1756,22 +1642,11 @@ CTranslatorRelcacheToDXL::RetrieveScOp BOOL is_ndv_preserving = gpdb::IsOpNDVPreserving(op_oid); mdid->AddRef(); - CMDScalarOpGPDB *md_scalar_op = GPOS_NEW(mp) CMDScalarOpGPDB - ( - mp, - mdid, - mdname, - mdid_type_left, - mdid_type_right, - result_type_mdid, - mdid_func, - mdid_commute_opr, - m_mdid_inverse_opr, - cmp_type, - returns_null_on_null_input, - is_ndv_preserving, - RetrieveScOpOpFamilies(mp, mdid) - ); + CMDScalarOpGPDB *md_scalar_op = GPOS_NEW(mp) CMDScalarOpGPDB( + mp, mdid, mdname, mdid_type_left, mdid_type_right, result_type_mdid, + mdid_func, mdid_commute_opr, m_mdid_inverse_opr, cmp_type, + returns_null_on_null_input, is_ndv_preserving, + RetrieveScOpOpFamilies(mp, mdid)); return md_scalar_op; } @@ -1785,15 +1660,14 @@ CTranslatorRelcacheToDXL::RetrieveScOp // //--------------------------------------------------------------------------- void -CTranslatorRelcacheToDXL::LookupFuncProps - ( +CTranslatorRelcacheToDXL::LookupFuncProps( OID func_oid, - IMDFunction::EFuncStbl *stability, // output: function stability - IMDFunction::EFuncDataAcc *access, // output: function datya access - BOOL *is_strict, // output: is function strict? - BOOL *is_ndv_preserving, // output: preserves NDVs of inputs - BOOL *returns_set // output: does function return set? - ) + IMDFunction::EFuncStbl *stability, // output: function stability + IMDFunction::EFuncDataAcc *access, // output: function datya access + BOOL *is_strict, // output: is function strict? + BOOL *is_ndv_preserving, // output: preserves NDVs of inputs + BOOL *returns_set // output: does function return set? +) { GPOS_ASSERT(NULL != stability); GPOS_ASSERT(NULL != access); @@ -1822,11 +1696,7 @@ CTranslatorRelcacheToDXL::LookupFuncProps // //--------------------------------------------------------------------------- CMDFunctionGPDB * -CTranslatorRelcacheToDXL::RetrieveFunc - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveFunc(CMemoryPool *mp, IMDId *mdid) { OID func_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -1837,11 +1707,12 @@ CTranslatorRelcacheToDXL::RetrieveFunc if (NULL == name) { - - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } - CWStringDynamic *func_name_str = CDXLUtils::CreateDynamicStringFromCharArray(mp, name); + CWStringDynamic *func_name_str = + CDXLUtils::CreateDynamicStringFromCharArray(mp, name); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, func_name_str); // CMDName ctor created a copy of the string @@ -1863,7 +1734,7 @@ CTranslatorRelcacheToDXL::RetrieveFunc ListCell *lc = NULL; arg_type_mdids = GPOS_NEW(mp) IMdIdArray(mp); - ForEach (lc, out_arg_types_list) + ForEach(lc, out_arg_types_list) { OID oidArgType = lfirst_oid(lc); GPOS_ASSERT(InvalidOid != oidArgType); @@ -1879,22 +1750,13 @@ CTranslatorRelcacheToDXL::RetrieveFunc BOOL is_strict = true; BOOL returns_set = true; BOOL is_ndv_preserving = true; - LookupFuncProps(func_oid, &stability, &access, &is_strict, &is_ndv_preserving, &returns_set); + LookupFuncProps(func_oid, &stability, &access, &is_strict, + &is_ndv_preserving, &returns_set); mdid->AddRef(); - CMDFunctionGPDB *md_func = GPOS_NEW(mp) CMDFunctionGPDB - ( - mp, - mdid, - mdname, - result_type_mdid, - arg_type_mdids, - returns_set, - stability, - access, - is_strict, - is_ndv_preserving - ); + CMDFunctionGPDB *md_func = GPOS_NEW(mp) CMDFunctionGPDB( + mp, mdid, mdname, result_type_mdid, arg_type_mdids, returns_set, + stability, access, is_strict, is_ndv_preserving); return md_func; } @@ -1908,11 +1770,7 @@ CTranslatorRelcacheToDXL::RetrieveFunc // //--------------------------------------------------------------------------- CMDAggregateGPDB * -CTranslatorRelcacheToDXL::RetrieveAgg - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveAgg(CMemoryPool *mp, IMDId *mdid) { OID agg_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -1923,11 +1781,12 @@ CTranslatorRelcacheToDXL::RetrieveAgg if (NULL == name) { - - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } - CWStringDynamic *agg_name_str = CDXLUtils::CreateDynamicStringFromCharArray(mp, name); + CWStringDynamic *agg_name_str = + CDXLUtils::CreateDynamicStringFromCharArray(mp, name); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, agg_name_str); // CMDName ctor created a copy of the string @@ -1939,31 +1798,24 @@ CTranslatorRelcacheToDXL::RetrieveAgg GPOS_ASSERT(InvalidOid != result_oid); CMDIdGPDB *result_type_mdid = GPOS_NEW(mp) CMDIdGPDB(result_oid); - IMDId *intermediate_result_type_mdid = RetrieveAggIntermediateResultType(mp, mdid); + IMDId *intermediate_result_type_mdid = + RetrieveAggIntermediateResultType(mp, mdid); mdid->AddRef(); - + BOOL is_ordered = gpdb::IsOrderedAgg(agg_oid); - + // GPDB does not support splitting of ordered aggs and aggs without a // preliminary function BOOL is_splittable = !is_ordered && gpdb::AggHasPrelimFunc(agg_oid); - + // cannot use hash agg for ordered aggs or aggs without a prelim func // due to the fact that hashAgg may spill BOOL is_hash_agg_capable = !is_ordered && gpdb::AggHasPrelimFunc(agg_oid); - CMDAggregateGPDB *pmdagg = GPOS_NEW(mp) CMDAggregateGPDB - ( - mp, - mdid, - mdname, - result_type_mdid, - intermediate_result_type_mdid, - is_ordered, - is_splittable, - is_hash_agg_capable - ); + CMDAggregateGPDB *pmdagg = GPOS_NEW(mp) CMDAggregateGPDB( + mp, mdid, mdname, result_type_mdid, intermediate_result_type_mdid, + is_ordered, is_splittable, is_hash_agg_capable); return pmdagg; } @@ -1976,11 +1828,7 @@ CTranslatorRelcacheToDXL::RetrieveAgg // //--------------------------------------------------------------------------- CMDTriggerGPDB * -CTranslatorRelcacheToDXL::RetrieveTrigger - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveTrigger(CMemoryPool *mp, IMDId *mdid) { OID trigger_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -1991,10 +1839,12 @@ CTranslatorRelcacheToDXL::RetrieveTrigger if (NULL == name) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } - CWStringDynamic *trigger_name_str = CDXLUtils::CreateDynamicStringFromCharArray(mp, name); + CWStringDynamic *trigger_name_str = + CDXLUtils::CreateDynamicStringFromCharArray(mp, name); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, trigger_name_str); GPOS_DELETE(trigger_name_str); @@ -2015,16 +1865,8 @@ CTranslatorRelcacheToDXL::RetrieveTrigger BOOL is_enabled = gpdb::IsTriggerEnabled(trigger_oid); mdid->AddRef(); - CMDTriggerGPDB *pmdtrigger = GPOS_NEW(mp) CMDTriggerGPDB - ( - mp, - mdid, - mdname, - mdid_rel, - mdid_func, - trigger_type, - is_enabled - ); + CMDTriggerGPDB *pmdtrigger = GPOS_NEW(mp) CMDTriggerGPDB( + mp, mdid, mdname, mdid_rel, mdid_func, trigger_type, is_enabled); return pmdtrigger; } @@ -2037,12 +1879,9 @@ CTranslatorRelcacheToDXL::RetrieveTrigger // //--------------------------------------------------------------------------- CMDCheckConstraintGPDB * -CTranslatorRelcacheToDXL::RetrieveCheckConstraints - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveCheckConstraints(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid) { OID check_constraint_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); GPOS_ASSERT(InvalidOid != check_constraint_oid); @@ -2051,9 +1890,11 @@ CTranslatorRelcacheToDXL::RetrieveCheckConstraints CHAR *name = gpdb::GetCheckConstraintName(check_constraint_oid); if (NULL == name) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } - CWStringDynamic *check_constr_name = CDXLUtils::CreateDynamicStringFromCharArray(mp, name); + CWStringDynamic *check_constr_name = + CDXLUtils::CreateDynamicStringFromCharArray(mp, name); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, check_constr_name); GPOS_DELETE(check_constr_name); @@ -2066,17 +1907,14 @@ CTranslatorRelcacheToDXL::RetrieveCheckConstraints Node *node = gpdb::PnodeCheckConstraint(check_constraint_oid); GPOS_ASSERT(NULL != node); - CTranslatorScalarToDXL scalar_translator - ( - mp, - md_accessor, - NULL, /* pulidgtorCol */ - NULL, /* pulidgtorCTE */ - 0, /* query_level */ - true, /* m_fQuery */ - NULL, /* query_level_to_cte_map */ - NULL /* cte_dxlnode_array */ - ); + CTranslatorScalarToDXL scalar_translator(mp, md_accessor, + NULL, /* pulidgtorCol */ + NULL, /* pulidgtorCTE */ + 0, /* query_level */ + true, /* m_fQuery */ + NULL, /* query_level_to_cte_map */ + NULL /* cte_dxlnode_array */ + ); // generate a mock mapping between var to column information CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); @@ -2086,27 +1924,24 @@ CTranslatorRelcacheToDXL::RetrieveCheckConstraints for (ULONG ul = 0; ul < length; ul++) { const IMDColumn *md_col = md_rel->GetMdCol(ul); - CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); + CMDName *md_colname = + GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); CMDIdGPDB *mdid_col_type = CMDIdGPDB::CastMdid(md_col->MdidType()); mdid_col_type->AddRef(); // create a column descriptor for the column - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - md_colname, - ul + 1 /*colid*/, - md_col->AttrNum(), - mdid_col_type, - md_col->TypeModifier(), - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, md_colname, ul + 1 /*colid*/, md_col->AttrNum(), mdid_col_type, + md_col->TypeModifier(), false /* fColDropped */ + ); dxl_col_descr_array->Append(dxl_col_descr); } - var_colid_mapping->LoadColumns(0 /*query_level */, 1 /* rteIndex */, dxl_col_descr_array); + var_colid_mapping->LoadColumns(0 /*query_level */, 1 /* rteIndex */, + dxl_col_descr_array); // translate the check constraint expression - CDXLNode *scalar_dxlnode = scalar_translator.TranslateScalarToDXL((Expr *) node, var_colid_mapping); + CDXLNode *scalar_dxlnode = scalar_translator.TranslateScalarToDXL( + (Expr *) node, var_colid_mapping); // cleanup dxl_col_descr_array->Release(); @@ -2114,14 +1949,8 @@ CTranslatorRelcacheToDXL::RetrieveCheckConstraints mdid->AddRef(); - return GPOS_NEW(mp) CMDCheckConstraintGPDB - ( - mp, - mdid, - mdname, - mdid_rel, - scalar_dxlnode - ); + return GPOS_NEW(mp) + CMDCheckConstraintGPDB(mp, mdid, mdname, mdid_rel, scalar_dxlnode); } //--------------------------------------------------------------------------- @@ -2133,11 +1962,7 @@ CTranslatorRelcacheToDXL::RetrieveCheckConstraints // //--------------------------------------------------------------------------- CMDName * -CTranslatorRelcacheToDXL::GetTypeName - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::GetTypeName(CMemoryPool *mp, IMDId *mdid) { OID oid_type = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -2146,7 +1971,8 @@ CTranslatorRelcacheToDXL::GetTypeName CHAR *typename_str = gpdb::GetTypeName(oid_type); GPOS_ASSERT(NULL != typename_str); - CWStringDynamic *str_name = CDXLUtils::CreateDynamicStringFromCharArray(mp, typename_str); + CWStringDynamic *str_name = + CDXLUtils::CreateDynamicStringFromCharArray(mp, typename_str); CMDName *mdname = GPOS_NEW(mp) CMDName(mp, str_name); // cleanup @@ -2163,10 +1989,7 @@ CTranslatorRelcacheToDXL::GetTypeName // //--------------------------------------------------------------------------- CMDFunctionGPDB::EFuncStbl -CTranslatorRelcacheToDXL::GetFuncStability - ( - CHAR c - ) +CTranslatorRelcacheToDXL::GetFuncStability(CHAR c) { CMDFunctionGPDB::EFuncStbl efuncstbl = CMDFunctionGPDB::EfsSentinel; @@ -2197,10 +2020,7 @@ CTranslatorRelcacheToDXL::GetFuncStability // //--------------------------------------------------------------------------- CMDFunctionGPDB::EFuncDataAcc -CTranslatorRelcacheToDXL::GetEFuncDataAccess - ( - CHAR c - ) +CTranslatorRelcacheToDXL::GetEFuncDataAccess(CHAR c) { CMDFunctionGPDB::EFuncDataAcc access = CMDFunctionGPDB::EfdaSentinel; @@ -2219,7 +2039,8 @@ CTranslatorRelcacheToDXL::GetEFuncDataAccess access = CMDFunctionGPDB::EfdaModifiesSQLData; break; case 's': - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("unknown data access")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("unknown data access")); default: GPOS_ASSERT(!"Invalid data access property"); } @@ -2236,11 +2057,8 @@ CTranslatorRelcacheToDXL::GetEFuncDataAccess // //--------------------------------------------------------------------------- IMDId * -CTranslatorRelcacheToDXL::RetrieveAggIntermediateResultType - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveAggIntermediateResultType(CMemoryPool *mp, + IMDId *mdid) { OID agg_oid = CMDIdGPDB::CastMdid(mdid)->Oid(); @@ -2257,11 +2075,7 @@ CTranslatorRelcacheToDXL::RetrieveAggIntermediateResultType // //--------------------------------------------------------------------------- IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveRelStats - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveRelStats(CMemoryPool *mp, IMDId *mdid) { CMDIdRelStats *m_rel_stats_mdid = CMDIdRelStats::CastMdid(mdid); IMDId *mdid_rel = m_rel_stats_mdid->GetRelMdId(); @@ -2270,7 +2084,8 @@ CTranslatorRelcacheToDXL::RetrieveRelStats Relation rel = gpdb::GetRelation(rel_oid); if (NULL == rel) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } double num_rows = 0.0; @@ -2280,14 +2095,15 @@ CTranslatorRelcacheToDXL::RetrieveRelStats { // get rel name CHAR *relname = NameStr(rel->rd_rel->relname); - CWStringDynamic *relname_str = CDXLUtils::CreateDynamicStringFromCharArray(mp, relname); + CWStringDynamic *relname_str = + CDXLUtils::CreateDynamicStringFromCharArray(mp, relname); mdname = GPOS_NEW(mp) CMDName(mp, relname_str); // CMDName ctor created a copy of the string GPOS_DELETE(relname_str); BlockNumber pages = 0; GpPolicy *gp_policy = gpdb::GetDistributionPolicy(rel); - if (!gp_policy ||gp_policy->ptype != POLICYTYPE_PARTITIONED) + if (!gp_policy || gp_policy->ptype != POLICYTYPE_PARTITIONED) { gpdb::EstimateRelationSize(rel, NULL, &pages, &num_rows); } @@ -2300,7 +2116,8 @@ CTranslatorRelcacheToDXL::RetrieveRelStats RelOptInfo *relOptInfo = makeNode(RelOptInfo); relOptInfo->cdbpolicy = gpdb::GetDistributionPolicy(rel); bool default_stats_used = false; - gpdb::CdbEstimateRelationSize(relOptInfo, rel, NULL, &pages, &num_rows, &default_stats_used); + gpdb::CdbEstimateRelationSize(relOptInfo, rel, NULL, &pages, + &num_rows, &default_stats_used); pfree(relOptInfo); } } @@ -2314,21 +2131,15 @@ CTranslatorRelcacheToDXL::RetrieveRelStats GPOS_RETHROW(ex); } GPOS_CATCH_END; - + BOOL stats_empty = false; if (num_rows == 0.0) { stats_empty = true; } - - CDXLRelStats *dxl_rel_stats = GPOS_NEW(mp) CDXLRelStats - ( - mp, - m_rel_stats_mdid, - mdname, - CDouble(num_rows), - stats_empty - ); + + CDXLRelStats *dxl_rel_stats = GPOS_NEW(mp) CDXLRelStats( + mp, m_rel_stats_mdid, mdname, CDouble(num_rows), stats_empty); return dxl_rel_stats; @@ -2340,12 +2151,9 @@ CTranslatorRelcacheToDXL::RetrieveRelStats // However, if any statistics are present and not broken, // create column statistics using these statistics IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveColStats - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveColStats(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid) { CMDIdColStats *mdid_col_stats = CMDIdColStats::CastMdid(mdid); IMDId *mdid_rel = mdid_col_stats->GetRelMdId(); @@ -2355,7 +2163,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats Relation rel = gpdb::GetRelation(rel_oid); if (NULL == rel) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } const IMDRelation *md_rel = md_accessor->RetrieveRel(mdid_rel); @@ -2366,7 +2175,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats CDouble num_rows(rel->rd_rel->reltuples); // extract column name and type - CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); + CMDName *md_colname = + GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); OID att_type = CMDIdGPDB::CastMdid(md_col->MdidType())->Oid(); gpdb::CloseRelation(rel); @@ -2375,17 +2185,9 @@ CTranslatorRelcacheToDXL::RetrieveColStats if (0 > attno) { mdid_col_stats->AddRef(); - return GenerateStatsForSystemCols - ( - mp, - rel_oid, - mdid_col_stats, - md_colname, - att_type, - attno, - dxl_stats_bucket_array, - num_rows - ); + return GenerateStatsForSystemCols(mp, rel_oid, mdid_col_stats, + md_colname, att_type, attno, + dxl_stats_bucket_array, num_rows); } // extract out histogram and mcv information from pg_statistic @@ -2408,7 +2210,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats mdid_atttype->Release(); } - return CDXLColStats::CreateDXLDummyColStats(mp, mdid_col_stats, md_colname, width); + return CDXLColStats::CreateDXLDummyColStats(mp, mdid_col_stats, + md_colname, width); } Form_pg_statistic form_pg_stats = (Form_pg_statistic) GETSTRUCT(stats_tup); @@ -2430,7 +2233,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats if (form_pg_stats->stadistinct < 0) { GPOS_ASSERT(form_pg_stats->stadistinct > -1.01); - num_distinct = num_rows * (1 - null_freq ) * CDouble(-form_pg_stats->stadistinct); + num_distinct = + num_rows * (1 - null_freq) * CDouble(-form_pg_stats->stadistinct); } else { @@ -2443,23 +2247,19 @@ CTranslatorRelcacheToDXL::RetrieveColStats // tuple for a given column AttStatsSlot mcv_slot; - (void) gpdb::GetAttrStatsSlot - ( - &mcv_slot, - stats_tup, - STATISTIC_KIND_MCV, - InvalidOid, - ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS - ); + (void) gpdb::GetAttrStatsSlot(&mcv_slot, stats_tup, STATISTIC_KIND_MCV, + InvalidOid, + ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS); if (InvalidOid != mcv_slot.valuetype && mcv_slot.valuetype != att_type) { char msgbuf[NAMEDATALEN * 2 + 100]; - snprintf(msgbuf, sizeof(msgbuf), "Type mismatch between attribute %ls of table %ls having type %d and statistic having type %d, please ANALYZE the table again", - md_col->Mdname().GetMDName()->GetBuffer(), md_rel->Mdname().GetMDName()->GetBuffer(), att_type, mcv_slot.valuetype); - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - NOTICE, - msgbuf, - NULL); + snprintf( + msgbuf, sizeof(msgbuf), + "Type mismatch between attribute %ls of table %ls having type %d and statistic having type %d, please ANALYZE the table again", + md_col->Mdname().GetMDName()->GetBuffer(), + md_rel->Mdname().GetMDName()->GetBuffer(), att_type, + mcv_slot.valuetype); + GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, NOTICE, msgbuf, NULL); gpdb::FreeAttrStatsSlot(&mcv_slot); is_dummy_stats = true; @@ -2468,12 +2268,12 @@ CTranslatorRelcacheToDXL::RetrieveColStats else if (mcv_slot.nvalues != mcv_slot.nnumbers) { char msgbuf[NAMEDATALEN * 2 + 100]; - snprintf(msgbuf, sizeof(msgbuf), "The number of most common values and frequencies do not match on column %ls of table %ls.", - md_col->Mdname().GetMDName()->GetBuffer(), md_rel->Mdname().GetMDName()->GetBuffer()); - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - NOTICE, - msgbuf, - NULL); + snprintf( + msgbuf, sizeof(msgbuf), + "The number of most common values and frequencies do not match on column %ls of table %ls.", + md_col->Mdname().GetMDName()->GetBuffer(), + md_rel->Mdname().GetMDName()->GetBuffer()); + GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, NOTICE, msgbuf, NULL); // if the number of MCVs(nvalues) and number of MCFs(nnumbers) do not match, we discard the MCVs and MCFs gpdb::FreeAttrStatsSlot(&mcv_slot); @@ -2482,7 +2282,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats else { // fix mcv and null frequencies (sometimes they can add up to more than 1.0) - NormalizeFrequencies(mcv_slot.numbers, (ULONG) mcv_slot.nvalues, &null_freq); + NormalizeFrequencies(mcv_slot.numbers, (ULONG) mcv_slot.nvalues, + &null_freq); // total MCV frequency CDouble sum_mcv_freq = 0.0; @@ -2496,24 +2297,20 @@ CTranslatorRelcacheToDXL::RetrieveColStats AttStatsSlot hist_slot; // get histogram datums from pg_statistic entry - (void) gpdb::GetAttrStatsSlot - ( - &hist_slot, - stats_tup, - STATISTIC_KIND_HISTOGRAM, - InvalidOid, - ATTSTATSSLOT_VALUES - ); + (void) gpdb::GetAttrStatsSlot(&hist_slot, stats_tup, + STATISTIC_KIND_HISTOGRAM, InvalidOid, + ATTSTATSSLOT_VALUES); if (InvalidOid != hist_slot.valuetype && hist_slot.valuetype != att_type) { char msgbuf[NAMEDATALEN * 2 + 100]; - snprintf(msgbuf, sizeof(msgbuf), "Type mismatch between attribute %ls of table %ls having type %d and statistic having type %d, please ANALYZE the table again", - md_col->Mdname().GetMDName()->GetBuffer(), md_rel->Mdname().GetMDName()->GetBuffer(), att_type, hist_slot.valuetype); - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - NOTICE, - msgbuf, - NULL); + snprintf( + msgbuf, sizeof(msgbuf), + "Type mismatch between attribute %ls of table %ls having type %d and statistic having type %d, please ANALYZE the table again", + md_col->Mdname().GetMDName()->GetBuffer(), + md_rel->Mdname().GetMDName()->GetBuffer(), att_type, + hist_slot.valuetype); + GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, NOTICE, msgbuf, NULL); gpdb::FreeAttrStatsSlot(&hist_slot); is_dummy_stats = true; @@ -2526,7 +2323,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats CDouble col_width = CStatistics::DefaultColumnWidth; gpdb::FreeHeapTuple(stats_tup); - return CDXLColStats::CreateDXLDummyColStats(mp, mdid_col_stats, md_colname, col_width); + return CDXLColStats::CreateDXLDummyColStats(mp, mdid_col_stats, + md_colname, col_width); } CDouble num_ndv_buckets(0.0); @@ -2537,18 +2335,10 @@ CTranslatorRelcacheToDXL::RetrieveColStats // transform all the bits and pieces from pg_statistic // to a single bucket structure CDXLBucketArray *dxl_stats_bucket_array_transformed = - TransformStatsToDXLBucketArray - ( - mp, - att_type, - num_distinct, - null_freq, - mcv_slot.values, - mcv_slot.numbers, - ULONG(mcv_slot.nvalues), - hist_slot.values, - ULONG(hist_slot.nvalues) - ); + TransformStatsToDXLBucketArray( + mp, att_type, num_distinct, null_freq, mcv_slot.values, + mcv_slot.numbers, ULONG(mcv_slot.nvalues), hist_slot.values, + ULONG(hist_slot.nvalues)); GPOS_ASSERT(NULL != dxl_stats_bucket_array_transformed); @@ -2560,7 +2350,8 @@ CTranslatorRelcacheToDXL::RetrieveColStats num_freq_buckets = num_freq_buckets + dxl_bucket->GetFrequency(); } - CUtils::AddRefAppend(dxl_stats_bucket_array, dxl_stats_bucket_array_transformed); + CUtils::AddRefAppend(dxl_stats_bucket_array, + dxl_stats_bucket_array_transformed); dxl_stats_bucket_array_transformed->Release(); // there will be remaining tuples if the merged histogram and the NULLS do not cover @@ -2568,8 +2359,10 @@ CTranslatorRelcacheToDXL::RetrieveColStats if ((1 - CStatistics::Epsilon > num_freq_buckets + null_freq) && (0 < num_distinct - num_ndv_buckets)) { - distinct_remaining = std::max(CDouble(0.0), (num_distinct - num_ndv_buckets)); - freq_remaining = std::max(CDouble(0.0), (1 - num_freq_buckets - null_freq)); + distinct_remaining = + std::max(CDouble(0.0), (num_distinct - num_ndv_buckets)); + freq_remaining = + std::max(CDouble(0.0), (1 - num_freq_buckets - null_freq)); } // free up allocated datum and float4 arrays @@ -2580,18 +2373,10 @@ CTranslatorRelcacheToDXL::RetrieveColStats // create col stats object mdid_col_stats->AddRef(); - CDXLColStats *dxl_col_stats = GPOS_NEW(mp) CDXLColStats - ( - mp, - mdid_col_stats, - md_colname, - width, - null_freq, - distinct_remaining, - freq_remaining, - dxl_stats_bucket_array, - false /* is_col_stats_missing */ - ); + CDXLColStats *dxl_col_stats = GPOS_NEW(mp) CDXLColStats( + mp, mdid_col_stats, md_colname, width, null_freq, distinct_remaining, + freq_remaining, dxl_stats_bucket_array, false /* is_col_stats_missing */ + ); return dxl_col_stats; } @@ -2606,80 +2391,65 @@ CTranslatorRelcacheToDXL::RetrieveColStats // //--------------------------------------------------------------------------- CDXLColStats * -CTranslatorRelcacheToDXL::GenerateStatsForSystemCols - ( - CMemoryPool *mp, - OID rel_oid, - CMDIdColStats *mdid_col_stats, - CMDName *md_colname, - OID att_type, - AttrNumber attno, - CDXLBucketArray *dxl_stats_bucket_array, - CDouble num_rows - ) +CTranslatorRelcacheToDXL::GenerateStatsForSystemCols( + CMemoryPool *mp, OID rel_oid, CMDIdColStats *mdid_col_stats, + CMDName *md_colname, OID att_type, AttrNumber attno, + CDXLBucketArray *dxl_stats_bucket_array, CDouble num_rows) { - GPOS_ASSERT(NULL != mdid_col_stats); - GPOS_ASSERT(NULL != md_colname); - GPOS_ASSERT(InvalidOid != att_type); - GPOS_ASSERT(0 > attno); - GPOS_ASSERT(NULL != dxl_stats_bucket_array); - - CMDIdGPDB *mdid_atttype = GPOS_NEW(mp) CMDIdGPDB(att_type); - IMDType *md_type = RetrieveType(mp, mdid_atttype); - GPOS_ASSERT(md_type->IsFixedLength()); - - BOOL is_col_stats_missing = true; - CDouble null_freq(0.0); - CDouble width(md_type->Length()); - CDouble distinct_remaining(0.0); - CDouble freq_remaining(0.0); - - if (CStatistics::MinRows <= num_rows) - { - switch(attno) + GPOS_ASSERT(NULL != mdid_col_stats); + GPOS_ASSERT(NULL != md_colname); + GPOS_ASSERT(InvalidOid != att_type); + GPOS_ASSERT(0 > attno); + GPOS_ASSERT(NULL != dxl_stats_bucket_array); + + CMDIdGPDB *mdid_atttype = GPOS_NEW(mp) CMDIdGPDB(att_type); + IMDType *md_type = RetrieveType(mp, mdid_atttype); + GPOS_ASSERT(md_type->IsFixedLength()); + + BOOL is_col_stats_missing = true; + CDouble null_freq(0.0); + CDouble width(md_type->Length()); + CDouble distinct_remaining(0.0); + CDouble freq_remaining(0.0); + + if (CStatistics::MinRows <= num_rows) + { + switch (attno) + { + case GpSegmentIdAttributeNumber: // gp_segment_id { - case GpSegmentIdAttributeNumber: // gp_segment_id - { - is_col_stats_missing = false; - freq_remaining = CDouble(1.0); - distinct_remaining = CDouble(gpdb::GetGPSegmentCount()); - break; - } - case TableOidAttributeNumber: // tableoid - { - is_col_stats_missing = false; - freq_remaining = CDouble(1.0); - distinct_remaining = CDouble(RetrieveNumChildPartitions(rel_oid)); - break; - } - case SelfItemPointerAttributeNumber: // ctid - { - is_col_stats_missing = false; - freq_remaining = CDouble(1.0); - distinct_remaining = num_rows; - break; - } - default: - break; + is_col_stats_missing = false; + freq_remaining = CDouble(1.0); + distinct_remaining = CDouble(gpdb::GetGPSegmentCount()); + break; } - } - - // cleanup - mdid_atttype->Release(); - md_type->Release(); - - return GPOS_NEW(mp) CDXLColStats - ( - mp, - mdid_col_stats, - md_colname, - width, - null_freq, - distinct_remaining, - freq_remaining, - dxl_stats_bucket_array, - is_col_stats_missing - ); + case TableOidAttributeNumber: // tableoid + { + is_col_stats_missing = false; + freq_remaining = CDouble(1.0); + distinct_remaining = + CDouble(RetrieveNumChildPartitions(rel_oid)); + break; + } + case SelfItemPointerAttributeNumber: // ctid + { + is_col_stats_missing = false; + freq_remaining = CDouble(1.0); + distinct_remaining = num_rows; + break; + } + default: + break; + } + } + + // cleanup + mdid_atttype->Release(); + md_type->Release(); + + return GPOS_NEW(mp) CDXLColStats( + mp, mdid_col_stats, md_colname, width, null_freq, distinct_remaining, + freq_remaining, dxl_stats_bucket_array, is_col_stats_missing); } @@ -2693,31 +2463,28 @@ CTranslatorRelcacheToDXL::GenerateStatsForSystemCols // //--------------------------------------------------------------------------- ULONG -CTranslatorRelcacheToDXL::RetrieveNumChildPartitions - ( - OID rel_oid - ) +CTranslatorRelcacheToDXL::RetrieveNumChildPartitions(OID rel_oid) { - GPOS_ASSERT(InvalidOid != rel_oid); - - ULONG num_part_tables = gpos::ulong_max; - if (gpdb::RelPartIsNone(rel_oid)) - { - // not a partitioned table - num_part_tables = 1; - } - else if (gpdb::IsLeafPartition(rel_oid)) - { - // leaf partition - num_part_tables = 1; - } - else - { - num_part_tables = gpdb::CountLeafPartTables(rel_oid); - } - GPOS_ASSERT(gpos::ulong_max != num_part_tables); - - return num_part_tables; + GPOS_ASSERT(InvalidOid != rel_oid); + + ULONG num_part_tables = gpos::ulong_max; + if (gpdb::RelPartIsNone(rel_oid)) + { + // not a partitioned table + num_part_tables = 1; + } + else if (gpdb::IsLeafPartition(rel_oid)) + { + // leaf partition + num_part_tables = 1; + } + else + { + num_part_tables = gpdb::CountLeafPartTables(rel_oid); + } + GPOS_ASSERT(gpos::ulong_max != num_part_tables); + + return num_part_tables; } @@ -2730,11 +2497,7 @@ CTranslatorRelcacheToDXL::RetrieveNumChildPartitions // //--------------------------------------------------------------------------- IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveCast - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveCast(CMemoryPool *mp, IMDId *mdid) { CMDIdCast *mdid_cast = CMDIdCast::CastMdid(mdid); IMDId *mdid_src = mdid_cast->MdidSrc(); @@ -2743,18 +2506,20 @@ CTranslatorRelcacheToDXL::RetrieveCast OID src_oid = CMDIdGPDB::CastMdid(mdid_src)->Oid(); OID dest_oid = CMDIdGPDB::CastMdid(mdid_dest)->Oid(); - CoercionPathType pathtype; + CoercionPathType pathtype; OID cast_fn_oid = 0; BOOL is_binary_coercible = false; - - BOOL cast_exists = gpdb::GetCastFunc(src_oid, dest_oid, &is_binary_coercible, &cast_fn_oid, &pathtype); - + + BOOL cast_exists = gpdb::GetCastFunc( + src_oid, dest_oid, &is_binary_coercible, &cast_fn_oid, &pathtype); + if (!cast_exists) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); - } - + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); + } + CHAR *func_name = NULL; if (InvalidOid != cast_fn_oid) { @@ -2765,10 +2530,11 @@ CTranslatorRelcacheToDXL::RetrieveCast // no explicit cast function: use the destination type name as the cast name func_name = gpdb::GetTypeName(dest_oid); } - + if (NULL == func_name) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } mdid->AddRef(); @@ -2776,23 +2542,31 @@ CTranslatorRelcacheToDXL::RetrieveCast mdid_dest->AddRef(); CMDName *mdname = CDXLUtils::CreateMDNameFromCharArray(mp, func_name); - - switch (pathtype) { + + switch (pathtype) + { case COERCION_PATH_ARRAYCOERCE: { coercePathType = IMDCast::EmdtArrayCoerce; - return GPOS_NEW(mp) CMDArrayCoerceCastGPDB(mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid), IMDCast::EmdtArrayCoerce, default_type_modifier, false, EdxlcfImplicitCast, -1); + return GPOS_NEW(mp) CMDArrayCoerceCastGPDB( + mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, + GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid), IMDCast::EmdtArrayCoerce, + default_type_modifier, false, EdxlcfImplicitCast, -1); } - break; + break; case COERCION_PATH_FUNC: - return GPOS_NEW(mp) CMDCastGPDB(mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid), IMDCast::EmdtFunc); + return GPOS_NEW(mp) CMDCastGPDB( + mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, + GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid), IMDCast::EmdtFunc); break; default: break; } // fall back for none path types - return GPOS_NEW(mp) CMDCastGPDB(mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid)); + return GPOS_NEW(mp) + CMDCastGPDB(mp, mdid, mdname, mdid_src, mdid_dest, is_binary_coercible, + GPOS_NEW(mp) CMDIdGPDB(cast_fn_oid)); } //--------------------------------------------------------------------------- @@ -2804,34 +2578,32 @@ CTranslatorRelcacheToDXL::RetrieveCast // //--------------------------------------------------------------------------- IMDCacheObject * -CTranslatorRelcacheToDXL::RetrieveScCmp - ( - CMemoryPool *mp, - IMDId *mdid - ) +CTranslatorRelcacheToDXL::RetrieveScCmp(CMemoryPool *mp, IMDId *mdid) { CMDIdScCmp *mdid_scalar_cmp = CMDIdScCmp::CastMdid(mdid); IMDId *mdid_left = mdid_scalar_cmp->GetLeftMdid(); IMDId *mdid_right = mdid_scalar_cmp->GetRightMdid(); - + IMDType::ECmpType cmp_type = mdid_scalar_cmp->ParseCmpType(); OID left_oid = CMDIdGPDB::CastMdid(mdid_left)->Oid(); OID right_oid = CMDIdGPDB::CastMdid(mdid_right)->Oid(); CmpType cmpt = (CmpType) GetComparisonType(cmp_type); - + OID scalar_cmp_oid = gpdb::GetComparisonOperator(left_oid, right_oid, cmpt); - + if (InvalidOid == scalar_cmp_oid) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); - } + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); + } CHAR *name = gpdb::GetOpName(scalar_cmp_oid); if (NULL == name) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, mdid->GetBuffer()); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDCacheEntryNotFound, + mdid->GetBuffer()); } mdid->AddRef(); @@ -2840,7 +2612,9 @@ CTranslatorRelcacheToDXL::RetrieveScCmp CMDName *mdname = CDXLUtils::CreateMDNameFromCharArray(mp, name); - return GPOS_NEW(mp) CMDScCmpGPDB(mp, mdid, mdname, mdid_left, mdid_right, cmp_type, GPOS_NEW(mp) CMDIdGPDB(scalar_cmp_oid)); + return GPOS_NEW(mp) + CMDScCmpGPDB(mp, mdid, mdname, mdid_left, mdid_right, cmp_type, + GPOS_NEW(mp) CMDIdGPDB(scalar_cmp_oid)); } //--------------------------------------------------------------------------- @@ -2852,31 +2626,17 @@ CTranslatorRelcacheToDXL::RetrieveScCmp // //--------------------------------------------------------------------------- CDXLBucketArray * -CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray - ( - CMemoryPool *mp, - OID att_type, - CDouble num_distinct, - CDouble null_freq, - const Datum *mcv_values, - const float4 *mcv_frequencies, - ULONG num_mcv_values, - const Datum *hist_values, - ULONG num_hist_values - ) +CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray( + CMemoryPool *mp, OID att_type, CDouble num_distinct, CDouble null_freq, + const Datum *mcv_values, const float4 *mcv_frequencies, + ULONG num_mcv_values, const Datum *hist_values, ULONG num_hist_values) { CMDIdGPDB *mdid_atttype = GPOS_NEW(mp) CMDIdGPDB(att_type); IMDType *md_type = RetrieveType(mp, mdid_atttype); // translate MCVs to Orca histogram. Create an empty histogram if there are no MCVs. - CHistogram *gpdb_mcv_hist = TransformMcvToOrcaHistogram - ( - mp, - md_type, - mcv_values, - mcv_frequencies, - num_mcv_values - ); + CHistogram *gpdb_mcv_hist = TransformMcvToOrcaHistogram( + mp, md_type, mcv_values, mcv_frequencies, num_mcv_values); GPOS_ASSERT(gpdb_mcv_hist->IsValid()); @@ -2888,11 +2648,12 @@ CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray { hist_freq = CDouble(1.0) - null_freq - mcv_freq; } - - BOOL is_text_type = mdid_atttype->Equals(&CMDIdGPDB::m_mdid_varchar) - || mdid_atttype->Equals(&CMDIdGPDB::m_mdid_bpchar) - || mdid_atttype->Equals(&CMDIdGPDB::m_mdid_text); - BOOL has_hist = !is_text_type && 1 < num_hist_values && CStatistics::Epsilon < hist_freq; + + BOOL is_text_type = mdid_atttype->Equals(&CMDIdGPDB::m_mdid_varchar) || + mdid_atttype->Equals(&CMDIdGPDB::m_mdid_bpchar) || + mdid_atttype->Equals(&CMDIdGPDB::m_mdid_text); + BOOL has_hist = !is_text_type && 1 < num_hist_values && + CStatistics::Epsilon < hist_freq; CHistogram *histogram = NULL; @@ -2900,15 +2661,8 @@ CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray if (has_hist) { // histogram from gpdb histogram - histogram = TransformHistToOrcaHistogram - ( - mp, - md_type, - hist_values, - num_hist_values, - num_distinct, - hist_freq - ); + histogram = TransformHistToOrcaHistogram( + mp, md_type, hist_values, num_hist_values, num_distinct, hist_freq); if (0 == histogram->GetNumBuckets()) { has_hist = false; @@ -2920,18 +2674,22 @@ CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray if (has_hist && !has_mcv) { // if histogram exists and dominates, use histogram only - dxl_stats_bucket_array = TransformHistogramToDXLBucketArray(mp, md_type, histogram); + dxl_stats_bucket_array = + TransformHistogramToDXLBucketArray(mp, md_type, histogram); } else if (!has_hist && has_mcv) { // if MCVs exist and dominate, use MCVs only - dxl_stats_bucket_array = TransformHistogramToDXLBucketArray(mp, md_type, gpdb_mcv_hist); + dxl_stats_bucket_array = + TransformHistogramToDXLBucketArray(mp, md_type, gpdb_mcv_hist); } else if (has_hist && has_mcv) { // both histogram and MCVs exist and have significant info, merge MCV and histogram buckets - CHistogram *merged_hist = CStatisticsUtils::MergeMCVHist(mp, gpdb_mcv_hist, histogram); - dxl_stats_bucket_array = TransformHistogramToDXLBucketArray(mp, md_type, merged_hist); + CHistogram *merged_hist = + CStatisticsUtils::MergeMCVHist(mp, gpdb_mcv_hist, histogram); + dxl_stats_bucket_array = + TransformHistogramToDXLBucketArray(mp, md_type, merged_hist); GPOS_DELETE(merged_hist); } else @@ -2963,14 +2721,9 @@ CTranslatorRelcacheToDXL::TransformStatsToDXLBucketArray // //--------------------------------------------------------------------------- CHistogram * -CTranslatorRelcacheToDXL::TransformMcvToOrcaHistogram - ( - CMemoryPool *mp, - const IMDType *md_type, - const Datum *mcv_values, - const float4 *mcv_frequencies, - ULONG num_mcv_values - ) +CTranslatorRelcacheToDXL::TransformMcvToOrcaHistogram( + CMemoryPool *mp, const IMDType *md_type, const Datum *mcv_values, + const float4 *mcv_frequencies, ULONG num_mcv_values) { IDatumArray *datums = GPOS_NEW(mp) IDatumArray(mp); CDoubleArray *freqs = GPOS_NEW(mp) CDoubleArray(mp); @@ -2978,7 +2731,8 @@ CTranslatorRelcacheToDXL::TransformMcvToOrcaHistogram for (ULONG ul = 0; ul < num_mcv_values; ul++) { Datum datumMCV = mcv_values[ul]; - IDatum *datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum(mp, md_type, false /* is_null */, datumMCV); + IDatum *datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum( + mp, md_type, false /* is_null */, datumMCV); datums->Append(datum); freqs->Append(GPOS_NEW(mp) CDouble(mcv_frequencies[ul])); @@ -2992,14 +2746,8 @@ CTranslatorRelcacheToDXL::TransformMcvToOrcaHistogram } } - CHistogram *hist = CStatisticsUtils::TransformMCVToHist - ( - mp, - md_type, - datums, - freqs, - num_mcv_values - ); + CHistogram *hist = CStatisticsUtils::TransformMCVToHist( + mp, md_type, datums, freqs, num_mcv_values); datums->Release(); freqs->Release(); @@ -3015,15 +2763,9 @@ CTranslatorRelcacheToDXL::TransformMcvToOrcaHistogram // //--------------------------------------------------------------------------- CHistogram * -CTranslatorRelcacheToDXL::TransformHistToOrcaHistogram - ( - CMemoryPool *mp, - const IMDType *md_type, - const Datum *hist_values, - ULONG num_hist_values, - CDouble num_distinct, - CDouble hist_freq - ) +CTranslatorRelcacheToDXL::TransformHistToOrcaHistogram( + CMemoryPool *mp, const IMDType *md_type, const Datum *hist_values, + ULONG num_hist_values, CDouble num_distinct, CDouble hist_freq) { GPOS_ASSERT(1 < num_hist_values); @@ -3036,8 +2778,10 @@ CTranslatorRelcacheToDXL::TransformHistToOrcaHistogram CBucketArray *buckets = GPOS_NEW(mp) CBucketArray(mp); for (ULONG ul = 0; ul < num_buckets; ul++) { - IDatum *min_datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum(mp, md_type, false /* is_null */, hist_values[ul]); - IDatum *max_datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum(mp, md_type, false /* is_null */, hist_values[ul + 1]); + IDatum *min_datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum( + mp, md_type, false /* is_null */, hist_values[ul]); + IDatum *max_datum = CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum( + mp, md_type, false /* is_null */, hist_values[ul + 1]); BOOL is_lower_closed, is_upper_closed; if (min_datum->StatsAreEqual(max_datum)) @@ -3068,18 +2812,14 @@ CTranslatorRelcacheToDXL::TransformHistToOrcaHistogram is_upper_closed = true; } - CBucket *bucket = GPOS_NEW(mp) CBucket - ( - GPOS_NEW(mp) CPoint(min_datum), - GPOS_NEW(mp) CPoint(max_datum), - is_lower_closed, - is_upper_closed, - freq_per_bucket, - distinct_per_bucket - ); + CBucket *bucket = GPOS_NEW(mp) + CBucket(GPOS_NEW(mp) CPoint(min_datum), + GPOS_NEW(mp) CPoint(max_datum), is_lower_closed, + is_upper_closed, freq_per_bucket, distinct_per_bucket); buckets->Append(bucket); - if (!min_datum->StatsAreComparable(max_datum) || !min_datum->StatsAreLessThan(max_datum)) + if (!min_datum->StatsAreComparable(max_datum) || + !min_datum->StatsAreLessThan(max_datum)) { // if less than operation is not supported on this datum, // or the translated histogram does not conform to GPDB sort order (e.g. text column in Linux platform), @@ -3107,12 +2847,8 @@ CTranslatorRelcacheToDXL::TransformHistToOrcaHistogram // //--------------------------------------------------------------------------- CDXLBucketArray * -CTranslatorRelcacheToDXL::TransformHistogramToDXLBucketArray - ( - CMemoryPool *mp, - const IMDType *md_type, - const CHistogram *hist - ) +CTranslatorRelcacheToDXL::TransformHistogramToDXLBucketArray( + CMemoryPool *mp, const IMDType *md_type, const CHistogram *hist) { CDXLBucketArray *dxl_stats_bucket_array = GPOS_NEW(mp) CDXLBucketArray(mp); const CBucketArray *buckets = hist->GetBuckets(); @@ -3124,15 +2860,10 @@ CTranslatorRelcacheToDXL::TransformHistogramToDXLBucketArray CDXLDatum *dxl_lower = md_type->GetDatumVal(mp, datum_lower); IDatum *datum_upper = bucket->GetUpperBound()->GetDatum(); CDXLDatum *dxl_upper = md_type->GetDatumVal(mp, datum_upper); - CDXLBucket *dxl_bucket = GPOS_NEW(mp) CDXLBucket - ( - dxl_lower, - dxl_upper, - bucket->IsLowerClosed(), - bucket->IsUpperClosed(), - bucket->GetFrequency(), - bucket->GetNumDistinct() - ); + CDXLBucket *dxl_bucket = GPOS_NEW(mp) + CDXLBucket(dxl_lower, dxl_upper, bucket->IsLowerClosed(), + bucket->IsUpperClosed(), bucket->GetFrequency(), + bucket->GetNumDistinct()); dxl_stats_bucket_array->Append(dxl_bucket); } return dxl_stats_bucket_array; @@ -3147,12 +2878,10 @@ CTranslatorRelcacheToDXL::TransformHistogramToDXLBucketArray // //--------------------------------------------------------------------------- IMDRelation::Erelstoragetype -CTranslatorRelcacheToDXL::RetrieveRelStorageType - ( - CHAR storage_type - ) +CTranslatorRelcacheToDXL::RetrieveRelStorageType(CHAR storage_type) { - IMDRelation::Erelstoragetype rel_storage_type = IMDRelation::ErelstorageSentinel; + IMDRelation::Erelstoragetype rel_storage_type = + IMDRelation::ErelstorageSentinel; switch (storage_type) { @@ -3188,14 +2917,10 @@ CTranslatorRelcacheToDXL::RetrieveRelStorageType // //--------------------------------------------------------------------------- void -CTranslatorRelcacheToDXL::RetrievePartKeysAndTypes - ( - CMemoryPool *mp, - Relation rel, - OID oid, - ULongPtrArray **part_keys, - CharPtrArray **part_types - ) +CTranslatorRelcacheToDXL::RetrievePartKeysAndTypes(CMemoryPool *mp, + Relation rel, OID oid, + ULongPtrArray **part_keys, + CharPtrArray **part_types) { GPOS_ASSERT(NULL != rel); @@ -3212,12 +2937,15 @@ CTranslatorRelcacheToDXL::RetrievePartKeysAndTypes *part_keys = GPOS_NEW(mp) ULongPtrArray(mp); *part_types = GPOS_NEW(mp) CharPtrArray(mp); - PartitionNode *pn = gpdb::GetParts(oid, 0 /*level*/, 0 /*parent*/, false /*inctemplate*/, true /*includesubparts*/); + PartitionNode *pn = + gpdb::GetParts(oid, 0 /*level*/, 0 /*parent*/, false /*inctemplate*/, + true /*includesubparts*/); GPOS_ASSERT(NULL != pn); if (gpdb::FHashPartitioned(pn->part->parkind)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Hash partitioning")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Hash partitioning")); } List *part_keys_list = NIL; @@ -3226,13 +2954,14 @@ CTranslatorRelcacheToDXL::RetrievePartKeysAndTypes ListCell *lc_key = NULL; ListCell *lc_type = NULL; - ForBoth (lc_key, part_keys_list, lc_type, part_types_list) + ForBoth(lc_key, part_keys_list, lc_type, part_types_list) { List *part_key = (List *) lfirst(lc_key); if (1 < gpdb::ListLength(part_key)) { - GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, GPOS_WSZ_LIT("Composite part key")); + GPOS_RAISE(gpdxl::ExmaMD, gpdxl::ExmiMDObjUnsupported, + GPOS_WSZ_LIT("Composite part key")); } INT attno = linitial_int(part_key); @@ -3256,12 +2985,9 @@ CTranslatorRelcacheToDXL::RetrievePartKeysAndTypes // //--------------------------------------------------------------------------- ULONG * -CTranslatorRelcacheToDXL::ConstructAttnoMapping - ( - CMemoryPool *mp, - CMDColumnArray *mdcol_array, - ULONG max_cols - ) +CTranslatorRelcacheToDXL::ConstructAttnoMapping(CMemoryPool *mp, + CMDColumnArray *mdcol_array, + ULONG max_cols) { GPOS_ASSERT(NULL != mdcol_array); GPOS_ASSERT(0 < mdcol_array->Size()); @@ -3272,17 +2998,17 @@ CTranslatorRelcacheToDXL::ConstructAttnoMapping ULONG *attno_mapping = GPOS_NEW_ARRAY(mp, ULONG, max_cols); // initialize all positions to gpos::ulong_max - for (ULONG ul = 0; ul < max_cols; ul++) + for (ULONG ul = 0; ul < max_cols; ul++) { attno_mapping[ul] = gpos::ulong_max; } - - for (ULONG ul = 0; ul < num_of_cols; ul++) + + for (ULONG ul = 0; ul < num_of_cols; ul++) { const IMDColumn *md_col = (*mdcol_array)[ul]; INT attno = md_col->AttrNum(); - ULONG idx = (ULONG) (GPDXL_SYSTEM_COLUMNS + attno); + ULONG idx = (ULONG)(GPDXL_SYSTEM_COLUMNS + attno); attno_mapping[idx] = ul; } @@ -3298,28 +3024,24 @@ CTranslatorRelcacheToDXL::ConstructAttnoMapping // //--------------------------------------------------------------------------- ULongPtr2dArray * -CTranslatorRelcacheToDXL::RetrieveRelKeysets - ( - CMemoryPool *mp, - OID oid, - BOOL should_add_default_keys, - BOOL is_partitioned, - ULONG *attno_mapping - ) +CTranslatorRelcacheToDXL::RetrieveRelKeysets(CMemoryPool *mp, OID oid, + BOOL should_add_default_keys, + BOOL is_partitioned, + ULONG *attno_mapping) { ULongPtr2dArray *key_sets = GPOS_NEW(mp) ULongPtr2dArray(mp); List *rel_keys = gpdb::GetRelationKeys(oid); ListCell *lc_key = NULL; - ForEach (lc_key, rel_keys) + ForEach(lc_key, rel_keys) { List *key_elem_list = (List *) lfirst(lc_key); ULongPtrArray *key_set = GPOS_NEW(mp) ULongPtrArray(mp); ListCell *lc_key_elem = NULL; - ForEach (lc_key_elem, key_elem_list) + ForEach(lc_key_elem, key_elem_list) { INT key_idx = lfirst_int(lc_key_elem); ULONG pos = GetAttributePosition(key_idx, attno_mapping); @@ -3329,26 +3051,29 @@ CTranslatorRelcacheToDXL::RetrieveRelKeysets key_sets->Append(key_set); } - + // add {segid, ctid} as a key - + if (should_add_default_keys) { ULongPtrArray *key_set = GPOS_NEW(mp) ULongPtrArray(mp); if (is_partitioned) { // TableOid is part of default key for partitioned tables - ULONG table_oid_pos = GetAttributePosition(TableOidAttributeNumber, attno_mapping); + ULONG table_oid_pos = + GetAttributePosition(TableOidAttributeNumber, attno_mapping); key_set->Append(GPOS_NEW(mp) ULONG(table_oid_pos)); } - ULONG seg_id_pos= GetAttributePosition(GpSegmentIdAttributeNumber, attno_mapping); - ULONG ctid_pos = GetAttributePosition(SelfItemPointerAttributeNumber, attno_mapping); + ULONG seg_id_pos = + GetAttributePosition(GpSegmentIdAttributeNumber, attno_mapping); + ULONG ctid_pos = + GetAttributePosition(SelfItemPointerAttributeNumber, attno_mapping); key_set->Append(GPOS_NEW(mp) ULONG(seg_id_pos)); key_set->Append(GPOS_NEW(mp) ULONG(ctid_pos)); - + key_sets->Append(key_set); } - + return key_sets; } @@ -3362,12 +3087,8 @@ CTranslatorRelcacheToDXL::RetrieveRelKeysets // //--------------------------------------------------------------------------- void -CTranslatorRelcacheToDXL::NormalizeFrequencies - ( - float4 *freqs, - ULONG length, - CDouble *null_freq - ) +CTranslatorRelcacheToDXL::NormalizeFrequencies(float4 *freqs, ULONG length, + CDouble *null_freq) { if (length == 0 && (*null_freq) < 1.0) { @@ -3382,7 +3103,7 @@ CTranslatorRelcacheToDXL::NormalizeFrequencies if (total > CDouble(1.0)) { - float4 denom = (float4) (total + CStatistics::Epsilon).Get(); + float4 denom = (float4)(total + CStatistics::Epsilon).Get(); // divide all values by the total for (ULONG ul = 0; ul < length; ul++) @@ -3412,18 +3133,17 @@ CTranslatorRelcacheToDXL::NormalizeFrequencies // //--------------------------------------------------------------------------- BOOL -CTranslatorRelcacheToDXL::IsIndexSupported - ( - Relation index_rel - ) +CTranslatorRelcacheToDXL::IsIndexSupported(Relation index_rel) { HeapTupleData *tup = index_rel->rd_indextuple; - + // index expressions and index constraints not supported return gpdb::HeapAttIsNull(tup, Anum_pg_index_indexprs) && - gpdb::HeapAttIsNull(tup, Anum_pg_index_indpred) && - index_rel->rd_index->indisvalid && - (BTREE_AM_OID == index_rel->rd_rel->relam || BITMAP_AM_OID == index_rel->rd_rel->relam || GIST_AM_OID == index_rel->rd_rel->relam); + gpdb::HeapAttIsNull(tup, Anum_pg_index_indpred) && + index_rel->rd_index->indisvalid && + (BTREE_AM_OID == index_rel->rd_rel->relam || + BITMAP_AM_OID == index_rel->rd_rel->relam || + GIST_AM_OID == index_rel->rd_rel->relam); } //--------------------------------------------------------------------------- @@ -3435,42 +3155,36 @@ CTranslatorRelcacheToDXL::IsIndexSupported // //--------------------------------------------------------------------------- CMDPartConstraintGPDB * -CTranslatorRelcacheToDXL::RetrievePartConstraintForIndex - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const IMDRelation *md_rel, - Node *part_constraint, - ULongPtrArray *level_with_default_part_array, - BOOL is_unbounded - ) +CTranslatorRelcacheToDXL::RetrievePartConstraintForIndex( + CMemoryPool *mp, CMDAccessor *md_accessor, const IMDRelation *md_rel, + Node *part_constraint, ULongPtrArray *level_with_default_part_array, + BOOL is_unbounded) { CDXLColDescrArray *dxl_col_descr_array = GPOS_NEW(mp) CDXLColDescrArray(mp); const ULONG num_columns = md_rel->ColumnCount(); - + for (ULONG ul = 0; ul < num_columns; ul++) { const IMDColumn *md_col = md_rel->GetMdCol(ul); - CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); + CMDName *md_colname = + GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); CMDIdGPDB *mdid_col_type = CMDIdGPDB::CastMdid(md_col->MdidType()); mdid_col_type->AddRef(); // create a column descriptor for the column - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - md_colname, - ul + 1, // colid - md_col->AttrNum(), - mdid_col_type, - md_col->TypeModifier(), - false // fColDropped - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, md_colname, + ul + 1, // colid + md_col->AttrNum(), mdid_col_type, md_col->TypeModifier(), + false // fColDropped + ); dxl_col_descr_array->Append(dxl_col_descr); } - CMDPartConstraintGPDB *mdpart_constraint = RetrievePartConstraintFromNode(mp, md_accessor, dxl_col_descr_array, part_constraint, level_with_default_part_array, is_unbounded); - + CMDPartConstraintGPDB *mdpart_constraint = RetrievePartConstraintFromNode( + mp, md_accessor, dxl_col_descr_array, part_constraint, + level_with_default_part_array, is_unbounded); + dxl_col_descr_array->Release(); return mdpart_constraint; @@ -3485,14 +3199,9 @@ CTranslatorRelcacheToDXL::RetrievePartConstraintForIndex // //--------------------------------------------------------------------------- CMDPartConstraintGPDB * -CTranslatorRelcacheToDXL::RetrievePartConstraintForRel - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - OID rel_oid, - CMDColumnArray *mdcol_array, - bool has_index - ) +CTranslatorRelcacheToDXL::RetrievePartConstraintForRel( + CMemoryPool *mp, CMDAccessor *md_accessor, OID rel_oid, + CMDColumnArray *mdcol_array, bool has_index) { // get the part constraints List *default_levels_rel = NIL; @@ -3531,34 +3240,35 @@ CTranslatorRelcacheToDXL::RetrievePartConstraintForRel // expression since ORCA is never going to use it. // only send the default partition information. default_levels_derived->AddRef(); - mdpart_constraint = GPOS_NEW(mp) CMDPartConstraintGPDB(mp, default_levels_derived, is_unbounded, NULL); + mdpart_constraint = GPOS_NEW(mp) CMDPartConstraintGPDB( + mp, default_levels_derived, is_unbounded, NULL); } else { - CDXLColDescrArray *dxl_col_descr_array = GPOS_NEW(mp) CDXLColDescrArray(mp); + CDXLColDescrArray *dxl_col_descr_array = + GPOS_NEW(mp) CDXLColDescrArray(mp); const ULONG num_columns = mdcol_array->Size(); for (ULONG ul = 0; ul < num_columns; ul++) { const IMDColumn *md_col = (*mdcol_array)[ul]; - CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); + CMDName *md_colname = + GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); CMDIdGPDB *mdid_col_type = CMDIdGPDB::CastMdid(md_col->MdidType()); mdid_col_type->AddRef(); // create a column descriptor for the column - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - md_colname, - ul + 1, // colid - md_col->AttrNum(), - mdid_col_type, - md_col->TypeModifier(), - false // fColDropped - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, md_colname, + ul + 1, // colid + md_col->AttrNum(), mdid_col_type, md_col->TypeModifier(), + false // fColDropped + ); dxl_col_descr_array->Append(dxl_col_descr); } - mdpart_constraint = RetrievePartConstraintFromNode(mp, md_accessor, dxl_col_descr_array, node, default_levels_derived, is_unbounded); + mdpart_constraint = RetrievePartConstraintFromNode( + mp, md_accessor, dxl_col_descr_array, node, default_levels_derived, + is_unbounded); dxl_col_descr_array->Release(); } @@ -3577,46 +3287,41 @@ CTranslatorRelcacheToDXL::RetrievePartConstraintForRel // //--------------------------------------------------------------------------- CMDPartConstraintGPDB * -CTranslatorRelcacheToDXL::RetrievePartConstraintFromNode - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CDXLColDescrArray *dxl_col_descr_array, - Node *part_constraints, - ULongPtrArray *level_with_default_part_array, - BOOL is_unbounded - ) +CTranslatorRelcacheToDXL::RetrievePartConstraintFromNode( + CMemoryPool *mp, CMDAccessor *md_accessor, + CDXLColDescrArray *dxl_col_descr_array, Node *part_constraints, + ULongPtrArray *level_with_default_part_array, BOOL is_unbounded) { if (NULL == part_constraints) { return NULL; } - CTranslatorScalarToDXL scalar_translator - ( - mp, - md_accessor, - NULL, // pulidgtorCol - NULL, // pulidgtorCTE - 0, // query_level - true, // m_fQuery - NULL, // query_level_to_cte_map - NULL // cte_dxlnode_array - ); + CTranslatorScalarToDXL scalar_translator(mp, md_accessor, + NULL, // pulidgtorCol + NULL, // pulidgtorCTE + 0, // query_level + true, // m_fQuery + NULL, // query_level_to_cte_map + NULL // cte_dxlnode_array + ); // generate a mock mapping between var to column information CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); - var_colid_mapping->LoadColumns(0 /*query_level */, 1 /* rteIndex */, dxl_col_descr_array); + var_colid_mapping->LoadColumns(0 /*query_level */, 1 /* rteIndex */, + dxl_col_descr_array); // translate the check constraint expression - CDXLNode *scalar_dxlnode = scalar_translator.TranslateScalarToDXL((Expr *) part_constraints, var_colid_mapping); + CDXLNode *scalar_dxlnode = scalar_translator.TranslateScalarToDXL( + (Expr *) part_constraints, var_colid_mapping); // cleanup GPOS_DELETE(var_colid_mapping); level_with_default_part_array->AddRef(); - return GPOS_NEW(mp) CMDPartConstraintGPDB(mp, level_with_default_part_array, is_unbounded, scalar_dxlnode); + return GPOS_NEW(mp) CMDPartConstraintGPDB(mp, level_with_default_part_array, + is_unbounded, scalar_dxlnode); } //--------------------------------------------------------------------------- @@ -3630,15 +3335,10 @@ CTranslatorRelcacheToDXL::RetrievePartConstraintFromNode // //--------------------------------------------------------------------------- BOOL -CTranslatorRelcacheToDXL::RelHasSystemColumns - ( - char rel_kind - ) +CTranslatorRelcacheToDXL::RelHasSystemColumns(char rel_kind) { - return RELKIND_RELATION == rel_kind || - RELKIND_SEQUENCE == rel_kind || - RELKIND_AOSEGMENTS == rel_kind || - RELKIND_TOASTVALUE == rel_kind; + return RELKIND_RELATION == rel_kind || RELKIND_SEQUENCE == rel_kind || + RELKIND_AOSEGMENTS == rel_kind || RELKIND_TOASTVALUE == rel_kind; } //--------------------------------------------------------------------------- @@ -3650,10 +3350,7 @@ CTranslatorRelcacheToDXL::RelHasSystemColumns // //--------------------------------------------------------------------------- IMDType::ECmpType -CTranslatorRelcacheToDXL::ParseCmpType - ( - ULONG cmpt - ) +CTranslatorRelcacheToDXL::ParseCmpType(ULONG cmpt) { for (ULONG ul = 0; ul < GPOS_ARRAY_SIZE(cmp_type_mappings); ul++) { @@ -3663,7 +3360,7 @@ CTranslatorRelcacheToDXL::ParseCmpType return (IMDType::ECmpType) mapping[0]; } } - + return IMDType::EcmptOther; } @@ -3675,11 +3372,8 @@ CTranslatorRelcacheToDXL::ParseCmpType // Translate optimizer comparison types into GPDB comparison types // //--------------------------------------------------------------------------- -ULONG -CTranslatorRelcacheToDXL::GetComparisonType - ( - IMDType::ECmpType cmp_type - ) +ULONG +CTranslatorRelcacheToDXL::GetComparisonType(IMDType::ECmpType cmp_type) { for (ULONG ul = 0; ul < GPOS_ARRAY_SIZE(cmp_type_mappings); ul++) { @@ -3689,7 +3383,7 @@ CTranslatorRelcacheToDXL::GetComparisonType return (ULONG) mapping[1]; } } - + return CmptOther; } @@ -3702,23 +3396,21 @@ CTranslatorRelcacheToDXL::GetComparisonType // //--------------------------------------------------------------------------- IMdIdArray * -CTranslatorRelcacheToDXL::RetrieveIndexOpFamilies - ( - CMemoryPool *mp, - IMDId *mdid_index - ) +CTranslatorRelcacheToDXL::RetrieveIndexOpFamilies(CMemoryPool *mp, + IMDId *mdid_index) { - List *op_families = gpdb::GetIndexOpFamilies(CMDIdGPDB::CastMdid(mdid_index)->Oid()); + List *op_families = + gpdb::GetIndexOpFamilies(CMDIdGPDB::CastMdid(mdid_index)->Oid()); IMdIdArray *input_col_mdids = GPOS_NEW(mp) IMdIdArray(mp); - + ListCell *lc = NULL; - + ForEach(lc, op_families) { OID op_family_oid = lfirst_oid(lc); input_col_mdids->Append(GPOS_NEW(mp) CMDIdGPDB(op_family_oid)); } - + return input_col_mdids; } @@ -3731,25 +3423,22 @@ CTranslatorRelcacheToDXL::RetrieveIndexOpFamilies // //--------------------------------------------------------------------------- IMdIdArray * -CTranslatorRelcacheToDXL::RetrieveScOpOpFamilies - ( - CMemoryPool *mp, - IMDId *mdid_scalar_op - ) +CTranslatorRelcacheToDXL::RetrieveScOpOpFamilies(CMemoryPool *mp, + IMDId *mdid_scalar_op) { - List *op_families = gpdb::GetOpFamiliesForScOp(CMDIdGPDB::CastMdid(mdid_scalar_op)->Oid()); + List *op_families = + gpdb::GetOpFamiliesForScOp(CMDIdGPDB::CastMdid(mdid_scalar_op)->Oid()); IMdIdArray *input_col_mdids = GPOS_NEW(mp) IMdIdArray(mp); - + ListCell *lc = NULL; - + ForEach(lc, op_families) { OID op_family_oid = lfirst_oid(lc); input_col_mdids->Append(GPOS_NEW(mp) CMDIdGPDB(op_family_oid)); } - + return input_col_mdids; } // EOF - diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp index f84199a6dd..4aaf26b732 100644 --- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp @@ -62,28 +62,20 @@ using namespace gpopt; // @doc: // Ctor //--------------------------------------------------------------------------- -CTranslatorScalarToDXL::CTranslatorScalarToDXL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *colid_generator, - CIdGenerator *cte_id_generator, - ULONG query_level, - BOOL is_query_mode, - HMUlCTEListEntry *cte_entries, - CDXLNodeArray *cte_dxlnode_array - ) - : - m_mp(mp), - m_md_accessor(md_accessor), - m_colid_generator(colid_generator), - m_cte_id_generator(cte_id_generator), - m_query_level(query_level), - m_has_distributed_tables(false), - m_is_query_mode(is_query_mode), - m_op_type(EpspotNone), - m_cte_entries(cte_entries), - m_cte_producers(cte_dxlnode_array) +CTranslatorScalarToDXL::CTranslatorScalarToDXL( + CMemoryPool *mp, CMDAccessor *md_accessor, CIdGenerator *colid_generator, + CIdGenerator *cte_id_generator, ULONG query_level, BOOL is_query_mode, + HMUlCTEListEntry *cte_entries, CDXLNodeArray *cte_dxlnode_array) + : m_mp(mp), + m_md_accessor(md_accessor), + m_colid_generator(colid_generator), + m_cte_id_generator(cte_id_generator), + m_query_level(query_level), + m_has_distributed_tables(false), + m_is_query_mode(is_query_mode), + m_op_type(EpspotNone), + m_cte_entries(cte_entries), + m_cte_producers(cte_dxlnode_array) { } @@ -95,18 +87,14 @@ CTranslatorScalarToDXL::CTranslatorScalarToDXL // Return the EdxlBoolExprType for a given GPDB BoolExprType //--------------------------------------------------------------------------- EdxlBoolExprType -CTranslatorScalarToDXL::EdxlbooltypeFromGPDBBoolType - ( - BoolExprType boolexprtype - ) - const +CTranslatorScalarToDXL::EdxlbooltypeFromGPDBBoolType( + BoolExprType boolexprtype) const { - static ULONG mapping[][2] = - { + static ULONG mapping[][2] = { {NOT_EXPR, Edxlnot}, {AND_EXPR, Edxland}, {OR_EXPR, Edxlor}, - }; + }; EdxlBoolExprType type = EdxlBoolExprTypeSentinel; @@ -138,27 +126,27 @@ CTranslatorScalarToDXL::EdxlbooltypeFromGPDBBoolType // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateVarToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateVarToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, Var)); - const Var * var = (Var *) expr; + const Var *var = (Var *) expr; if (var->varattno == 0) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Whole-row variable")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Whole-row variable")); } // column name - const CWStringBase *str = var_colid_mapping->GetOptColName(m_query_level, var, m_op_type); + const CWStringBase *str = + var_colid_mapping->GetOptColName(m_query_level, var, m_op_type); // column id ULONG id; - if(var->varattno != 0 || EpspotIndexScan == m_op_type || EpspotIndexOnlyScan == m_op_type) + if (var->varattno != 0 || EpspotIndexScan == m_op_type || + EpspotIndexOnlyScan == m_op_type) { id = var_colid_mapping->GetColId(m_query_level, var, m_op_type); } @@ -169,21 +157,13 @@ CTranslatorScalarToDXL::TranslateVarToDXL CMDName *mdname = GPOS_NEW(m_mp) CMDName(m_mp, str); // create a column reference for the given var - CDXLColRef *dxl_colref = GPOS_NEW(m_mp) CDXLColRef - ( - m_mp, - mdname, - id, - GPOS_NEW(m_mp) CMDIdGPDB(var->vartype), - var->vartypmod - ); + CDXLColRef *dxl_colref = GPOS_NEW(m_mp) + CDXLColRef(m_mp, mdname, id, GPOS_NEW(m_mp) CMDIdGPDB(var->vartype), + var->vartypmod); // create the scalar ident operator - CDXLScalarIdent *scalar_ident = GPOS_NEW(m_mp) CDXLScalarIdent - ( - m_mp, - dxl_colref - ); + CDXLScalarIdent *scalar_ident = + GPOS_NEW(m_mp) CDXLScalarIdent(m_mp, dxl_colref); // create the DXL node holding the scalar ident operator CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, scalar_ident); @@ -203,18 +183,16 @@ CTranslatorScalarToDXL::TranslateVarToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateScalarToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables // output - ) +CTranslatorScalarToDXL::TranslateScalarToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables // output +) { - static const STranslatorElem translators[] = - { + static const STranslatorElem translators[] = { {T_Var, &CTranslatorScalarToDXL::TranslateVarToDXL}, {T_OpExpr, &CTranslatorScalarToDXL::TranslateOpExprToDXL}, - {T_ScalarArrayOpExpr, &CTranslatorScalarToDXL::TranslateScalarArrayOpExprToDXL}, + {T_ScalarArrayOpExpr, + &CTranslatorScalarToDXL::TranslateScalarArrayOpExprToDXL}, {T_DistinctExpr, &CTranslatorScalarToDXL::TranslateDistinctExprToDXL}, {T_Const, &CTranslatorScalarToDXL::TranslateConstToDXL}, {T_BoolExpr, &CTranslatorScalarToDXL::TranslateBoolExprToDXL}, @@ -229,9 +207,11 @@ CTranslatorScalarToDXL::TranslateScalarToDXL {T_NullTest, &CTranslatorScalarToDXL::TranslateNullTestToDXL}, {T_NullIfExpr, &CTranslatorScalarToDXL::TranslateNullIfExprToDXL}, {T_RelabelType, &CTranslatorScalarToDXL::TranslateRelabelTypeToDXL}, - {T_CoerceToDomain, &CTranslatorScalarToDXL::TranslateCoerceToDomainToDXL}, + {T_CoerceToDomain, + &CTranslatorScalarToDXL::TranslateCoerceToDomainToDXL}, {T_CoerceViaIO, &CTranslatorScalarToDXL::TranslateCoerceViaIOToDXL}, - {T_ArrayCoerceExpr, &CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL}, + {T_ArrayCoerceExpr, + &CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL}, {T_SubLink, &CTranslatorScalarToDXL::TranslateSubLinkToDXL}, {T_ArrayExpr, &CTranslatorScalarToDXL::TranslateArrayExprToDXL}, {T_ArrayRef, &CTranslatorScalarToDXL::TranslateArrayRefToDXL}, @@ -263,15 +243,18 @@ CTranslatorScalarToDXL::TranslateScalarToDXL if (NULL == func_ptr) { - CHAR *str = (CHAR*) gpdb::NodeToString(const_cast(expr)); - CWStringDynamic *wcstr = CDXLUtils::CreateDynamicStringFromCharArray(m_mp, str); - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, wcstr->GetBuffer()); + CHAR *str = (CHAR *) gpdb::NodeToString(const_cast(expr)); + CWStringDynamic *wcstr = + CDXLUtils::CreateDynamicStringFromCharArray(m_mp, str); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + wcstr->GetBuffer()); } CDXLNode *return_node = (this->*func_ptr)(expr, var_colid_mapping); // combine old and current values for distributed tables flag - m_has_distributed_tables = m_has_distributed_tables || has_distributed_tables_old; + m_has_distributed_tables = + m_has_distributed_tables || has_distributed_tables_old; if (NULL != has_distributed_tables && m_has_distributed_tables) { @@ -294,11 +277,8 @@ CTranslatorScalarToDXL::TranslateScalarToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateDistinctExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateDistinctExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, DistinctExpr)); const DistinctExpr *distinct_expr = (DistinctExpr *) expr; @@ -306,26 +286,17 @@ CTranslatorScalarToDXL::TranslateDistinctExprToDXL // process arguments of op expr GPOS_ASSERT(2 == gpdb::ListLength(distinct_expr->args)); - CDXLNode *left_node = TranslateScalarToDXL - ( - (Expr *) gpdb::ListNth(distinct_expr->args, 0), - var_colid_mapping - ); + CDXLNode *left_node = TranslateScalarToDXL( + (Expr *) gpdb::ListNth(distinct_expr->args, 0), var_colid_mapping); - CDXLNode *right_node = TranslateScalarToDXL - ( - (Expr *) gpdb::ListNth(distinct_expr->args, 1), - var_colid_mapping - ); + CDXLNode *right_node = TranslateScalarToDXL( + (Expr *) gpdb::ListNth(distinct_expr->args, 1), var_colid_mapping); GPOS_ASSERT(NULL != left_node); GPOS_ASSERT(NULL != right_node); - CDXLScalarDistinctComp *dxlop = GPOS_NEW(m_mp) CDXLScalarDistinctComp - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(distinct_expr->opno) - ); + CDXLScalarDistinctComp *dxlop = GPOS_NEW(m_mp) CDXLScalarDistinctComp( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(distinct_expr->opno)); // create the DXL node holding the scalar distinct comparison operator CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -349,11 +320,8 @@ CTranslatorScalarToDXL::TranslateDistinctExprToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarCmpFromOpExpr - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateScalarCmpFromOpExpr( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, OpExpr)); const OpExpr *op_expr = (OpExpr *) expr; @@ -375,7 +343,8 @@ CTranslatorScalarToDXL::CreateScalarCmpFromOpExpr // get operator name const CWStringConst *str = GetDXLArrayCmpType(mdid); - CDXLScalarComp *dxlop = GPOS_NEW(m_mp) CDXLScalarComp(m_mp, mdid, GPOS_NEW(m_mp) CWStringConst(str->GetBuffer())); + CDXLScalarComp *dxlop = GPOS_NEW(m_mp) CDXLScalarComp( + m_mp, mdid, GPOS_NEW(m_mp) CWStringConst(str->GetBuffer())); // create the DXL node holding the scalar comparison operator CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -399,23 +368,21 @@ CTranslatorScalarToDXL::CreateScalarCmpFromOpExpr // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateOpExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateOpExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, OpExpr)); const OpExpr *op_expr = (OpExpr *) expr; // check if this is a scalar comparison - CMDIdGPDB *return_type_mdid = GPOS_NEW(m_mp) CMDIdGPDB(((OpExpr *) expr)->opresulttype); - const IMDType *md_type= m_md_accessor->RetrieveType(return_type_mdid); + CMDIdGPDB *return_type_mdid = + GPOS_NEW(m_mp) CMDIdGPDB(((OpExpr *) expr)->opresulttype); + const IMDType *md_type = m_md_accessor->RetrieveType(return_type_mdid); const ULONG num_args = gpdb::ListLength(op_expr->args); - if (IMDType::EtiBool == md_type->GetDatumType() && 2 == num_args) + if (IMDType::EtiBool == md_type->GetDatumType() && 2 == num_args) { return_type_mdid->Release(); return CreateScalarCmpFromOpExpr(expr, var_colid_mapping); @@ -425,7 +392,9 @@ CTranslatorScalarToDXL::TranslateOpExprToDXL IMDId *mdid = GPOS_NEW(m_mp) CMDIdGPDB(op_expr->opno); const CWStringConst *str = GetDXLArrayCmpType(mdid); - CDXLScalarOpExpr *dxlop = GPOS_NEW(m_mp) CDXLScalarOpExpr(m_mp, mdid, return_type_mdid, GPOS_NEW(m_mp) CWStringConst(str->GetBuffer())); + CDXLScalarOpExpr *dxlop = GPOS_NEW(m_mp) + CDXLScalarOpExpr(m_mp, mdid, return_type_mdid, + GPOS_NEW(m_mp) CWStringConst(str->GetBuffer())); // create the DXL node holding the scalar opexpr CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -444,18 +413,17 @@ CTranslatorScalarToDXL::TranslateOpExprToDXL // Create a DXL node for a scalar nullif from a GPDB Expr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateNullIfExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateNullIfExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, NullIfExpr)); const NullIfExpr *null_if_expr = (NullIfExpr *) expr; GPOS_ASSERT(2 == gpdb::ListLength(null_if_expr->args)); - CDXLScalarNullIf *dxlop = GPOS_NEW(m_mp) CDXLScalarNullIf(m_mp, GPOS_NEW(m_mp) CMDIdGPDB(null_if_expr->opno), GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType((Node *)null_if_expr))); + CDXLScalarNullIf *dxlop = GPOS_NEW(m_mp) CDXLScalarNullIf( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(null_if_expr->opno), + GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType((Node *) null_if_expr))); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -473,11 +441,8 @@ CTranslatorScalarToDXL::TranslateNullIfExprToDXL // Create a DXL node for a scalar array expression from a GPDB OpExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateScalarArrayOpExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateScalarArrayOpExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { return CreateScalarArrayCompFromExpr(expr, var_colid_mapping); } @@ -490,11 +455,8 @@ CTranslatorScalarToDXL::TranslateScalarArrayOpExprToDXL // Create a DXL node for a scalar array comparison from a GPDB OpExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarArrayCompFromExpr - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateScalarArrayCompFromExpr( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, ScalarArrayOpExpr)); const ScalarArrayOpExpr *scalar_array_op_expr = (ScalarArrayOpExpr *) expr; @@ -502,10 +464,10 @@ CTranslatorScalarToDXL::CreateScalarArrayCompFromExpr // process arguments of op expr GPOS_ASSERT(2 == gpdb::ListLength(scalar_array_op_expr->args)); - Expr *left_expr = (Expr*) gpdb::ListNth(scalar_array_op_expr->args, 0); + Expr *left_expr = (Expr *) gpdb::ListNth(scalar_array_op_expr->args, 0); CDXLNode *left_node = TranslateScalarToDXL(left_expr, var_colid_mapping); - Expr *right_expr = (Expr*) gpdb::ListNth(scalar_array_op_expr->args, 1); + Expr *right_expr = (Expr *) gpdb::ListNth(scalar_array_op_expr->args, 1); // If the argument array is an array Const, try to transform it to an // ArrayExpr, to allow ORCA to optimize it better. (ORCA knows how to @@ -529,12 +491,14 @@ CTranslatorScalarToDXL::CreateScalarArrayCompFromExpr EdxlArrayCompType type = Edxlarraycomptypeany; - if(!scalar_array_op_expr->useOr) + if (!scalar_array_op_expr->useOr) { type = Edxlarraycomptypeall; } - CDXLScalarArrayComp *dxlop = GPOS_NEW(m_mp) CDXLScalarArrayComp(m_mp, GPOS_NEW(m_mp) CMDIdGPDB(scalar_array_op_expr->opno), GPOS_NEW(m_mp) CWStringConst(op_name->GetBuffer()), type); + CDXLScalarArrayComp *dxlop = GPOS_NEW(m_mp) CDXLScalarArrayComp( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(scalar_array_op_expr->opno), + GPOS_NEW(m_mp) CWStringConst(op_name->GetBuffer()), type); // create the DXL node holding the scalar opexpr CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -554,24 +518,17 @@ CTranslatorScalarToDXL::CreateScalarArrayCompFromExpr // Create a DXL node for a scalar const value from a GPDB Const //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateConstToDXL - ( +CTranslatorScalarToDXL::TranslateConstToDXL( const Expr *expr, - const CMappingVarColId * // var_colid_mapping - ) + const CMappingVarColId * // var_colid_mapping +) { GPOS_ASSERT(IsA(expr, Const)); const Const *constant = (Const *) expr; - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarConstValue - ( - m_mp, - TranslateConstToDXL(constant) - ) - ); + CDXLNode *dxlnode = + GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarConstValue( + m_mp, TranslateConstToDXL(constant))); return dxlnode; } @@ -584,21 +541,17 @@ CTranslatorScalarToDXL::TranslateConstToDXL // Create a DXL datum from a GPDB Const //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateConstToDXL - ( - CMemoryPool *mp, - CMDAccessor *mda, - const Const *constant - ) +CTranslatorScalarToDXL::TranslateConstToDXL(CMemoryPool *mp, CMDAccessor *mda, + const Const *constant) { CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(constant->consttype); - const IMDType *md_type= mda->RetrieveType(mdid); + const IMDType *md_type = mda->RetrieveType(mdid); mdid->Release(); - // translate gpdb datum into a DXL datum - CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateDatumToDXL(mp, md_type, constant->consttypmod, constant->constisnull, - constant->constlen, - constant->constvalue); + // translate gpdb datum into a DXL datum + CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateDatumToDXL( + mp, md_type, constant->consttypmod, constant->constisnull, + constant->constlen, constant->constvalue); return datum_dxl; } @@ -612,11 +565,7 @@ CTranslatorScalarToDXL::TranslateConstToDXL // Create a DXL datum from a GPDB Const //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateConstToDXL - ( - const Const *constant - ) - const +CTranslatorScalarToDXL::TranslateConstToDXL(const Const *constant) const { return TranslateConstToDXL(m_mp, m_md_accessor, constant); } @@ -634,11 +583,8 @@ CTranslatorScalarToDXL::TranslateConstToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateBoolExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateBoolExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, BoolExpr)); const BoolExpr *bool_expr = (BoolExpr *) expr; @@ -648,27 +594,24 @@ CTranslatorScalarToDXL::TranslateBoolExprToDXL GPOS_ASSERT(EdxlBoolExprTypeSentinel != type); // create the DXL node holding the scalar boolean operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBoolExpr(m_mp, type)); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBoolExpr(m_mp, type)); ULONG count = gpdb::ListLength(bool_expr->args); if ((NOT_EXPR != bool_expr->boolop) && (2 > count)) { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Boolean Expression (OR / AND): Incorrect Number of Children ") - ); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT( + "Boolean Expression (OR / AND): Incorrect Number of Children ")); } else if ((NOT_EXPR == bool_expr->boolop) && (1 != count)) { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Boolean Expression (NOT): Incorrect Number of Children ") - ); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT( + "Boolean Expression (NOT): Incorrect Number of Children ")); } TranslateScalarChildren(dxlnode, bool_expr->args, var_colid_mapping); @@ -688,11 +631,8 @@ CTranslatorScalarToDXL::TranslateBoolExprToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateBooleanTestToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateBooleanTestToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, BooleanTest)); @@ -700,15 +640,14 @@ CTranslatorScalarToDXL::TranslateBooleanTestToDXL GPOS_ASSERT(NULL != boolean_test->arg); - static ULONG mapping[][2] = - { + static ULONG mapping[][2] = { {IS_TRUE, EdxlbooleantestIsTrue}, {IS_NOT_TRUE, EdxlbooleantestIsNotTrue}, {IS_FALSE, EdxlbooleantestIsFalse}, {IS_NOT_FALSE, EdxlbooleantestIsNotFalse}, {IS_UNKNOWN, EdxlbooleantestIsUnknown}, {IS_NOT_UNKNOWN, EdxlbooleantestIsNotUnknown}, - }; + }; EdxlBooleanTestType type = EdxlbooleantestSentinel; const ULONG arity = GPOS_ARRAY_SIZE(mapping); @@ -724,13 +663,11 @@ CTranslatorScalarToDXL::TranslateBooleanTestToDXL GPOS_ASSERT(EdxlbooleantestSentinel != type && "Invalid boolean test type"); // create the DXL node holding the scalar boolean test operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarBooleanTest(m_mp,type) - ); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBooleanTest(m_mp, type)); - CDXLNode *dxlnode_arg = TranslateScalarToDXL(boolean_test->arg, var_colid_mapping); + CDXLNode *dxlnode_arg = + TranslateScalarToDXL(boolean_test->arg, var_colid_mapping); GPOS_ASSERT(NULL != dxlnode_arg); dxlnode->AddChild(dxlnode_arg); @@ -746,20 +683,19 @@ CTranslatorScalarToDXL::TranslateBooleanTestToDXL // Create a DXL node for a scalar nulltest expression from a GPDB OpExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateNullTestToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateNullTestToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, NullTest)); const NullTest *null_test = (NullTest *) expr; GPOS_ASSERT(NULL != null_test->arg); - CDXLNode *child_node = TranslateScalarToDXL(null_test->arg, var_colid_mapping); + CDXLNode *child_node = + TranslateScalarToDXL(null_test->arg, var_colid_mapping); GPOS_ASSERT(NULL != child_node); - GPOS_ASSERT(IS_NULL == null_test->nulltesttype || IS_NOT_NULL == null_test->nulltesttype); + GPOS_ASSERT(IS_NULL == null_test->nulltesttype || + IS_NOT_NULL == null_test->nulltesttype); BOOL is_null = false; if (IS_NULL == null_test->nulltesttype) @@ -768,7 +704,8 @@ CTranslatorScalarToDXL::TranslateNullTestToDXL } // create the DXL node holding the scalar NullTest operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarNullTest(m_mp, is_null)); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarNullTest(m_mp, is_null)); dxlnode->AddChild(child_node); return dxlnode; @@ -782,22 +719,16 @@ CTranslatorScalarToDXL::TranslateNullTestToDXL // Create a DXL node for a coalesce function from a GPDB OpExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateCoalesceExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateCoalesceExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, CoalesceExpr)); CoalesceExpr *coalesce_expr = (CoalesceExpr *) expr; GPOS_ASSERT(NULL != coalesce_expr->args); - CDXLScalarCoalesce *dxlop = GPOS_NEW(m_mp) CDXLScalarCoalesce - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(coalesce_expr->coalescetype) - ); + CDXLScalarCoalesce *dxlop = GPOS_NEW(m_mp) CDXLScalarCoalesce( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(coalesce_expr->coalescetype)); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -814,18 +745,16 @@ CTranslatorScalarToDXL::TranslateCoalesceExprToDXL // Create a DXL node for a min/max operator from a GPDB OpExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateMinMaxExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateMinMaxExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, MinMaxExpr)); MinMaxExpr *min_max_expr = (MinMaxExpr *) expr; GPOS_ASSERT(NULL != min_max_expr->args); - CDXLScalarMinMax::EdxlMinMaxType min_max_type = CDXLScalarMinMax::EmmtSentinel; + CDXLScalarMinMax::EdxlMinMaxType min_max_type = + CDXLScalarMinMax::EmmtSentinel; if (IS_GREATEST == min_max_expr->op) { min_max_type = CDXLScalarMinMax::EmmtMax; @@ -836,12 +765,8 @@ CTranslatorScalarToDXL::TranslateMinMaxExprToDXL min_max_type = CDXLScalarMinMax::EmmtMin; } - CDXLScalarMinMax *dxlop = GPOS_NEW(m_mp) CDXLScalarMinMax - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(min_max_expr->minmaxtype), - min_max_type - ); + CDXLScalarMinMax *dxlop = GPOS_NEW(m_mp) CDXLScalarMinMax( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(min_max_expr->minmaxtype), min_max_type); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -858,19 +783,17 @@ CTranslatorScalarToDXL::TranslateMinMaxExprToDXL // Translate list elements and add them as children of the DXL node //--------------------------------------------------------------------------- void -CTranslatorScalarToDXL::TranslateScalarChildren - ( - CDXLNode *dxlnode, - List *list, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables // output - ) +CTranslatorScalarToDXL::TranslateScalarChildren( + CDXLNode *dxlnode, List *list, const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables // output +) { ListCell *lc = NULL; - ForEach (lc, list) + ForEach(lc, list) { Expr *child_expr = (Expr *) lfirst(lc); - CDXLNode *child_node = TranslateScalarToDXL(child_expr, var_colid_mapping, has_distributed_tables); + CDXLNode *child_node = TranslateScalarToDXL( + child_expr, var_colid_mapping, has_distributed_tables); GPOS_ASSERT(NULL != child_node); dxlnode->AddChild(child_node); } @@ -888,11 +811,8 @@ CTranslatorScalarToDXL::TranslateScalarChildren // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateCaseExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateCaseExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, CaseExpr)); @@ -900,13 +820,9 @@ CTranslatorScalarToDXL::TranslateCaseExprToDXL if (NULL == case_expr->args) { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Do not support SIMPLE CASE STATEMENT") - ); - return NULL; + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Do not support SIMPLE CASE STATEMENT")); + return NULL; } if (NULL == case_expr->arg) @@ -926,38 +842,36 @@ CTranslatorScalarToDXL::TranslateCaseExprToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarSwitchFromCaseExpr - ( - const CaseExpr *case_expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateScalarSwitchFromCaseExpr( + const CaseExpr *case_expr, const CMappingVarColId *var_colid_mapping) { - GPOS_ASSERT (NULL != case_expr->arg); + GPOS_ASSERT(NULL != case_expr->arg); - CDXLScalarSwitch *dxlop = GPOS_NEW(m_mp) CDXLScalarSwitch - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(case_expr->casetype) - ); + CDXLScalarSwitch *dxlop = GPOS_NEW(m_mp) + CDXLScalarSwitch(m_mp, GPOS_NEW(m_mp) CMDIdGPDB(case_expr->casetype)); CDXLNode *switch_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); // translate the switch expression - CDXLNode *dxlnode_arg = TranslateScalarToDXL(case_expr->arg, var_colid_mapping); + CDXLNode *dxlnode_arg = + TranslateScalarToDXL(case_expr->arg, var_colid_mapping); switch_node->AddChild(dxlnode_arg); // translate the cases ListCell *lc = NULL; - ForEach (lc, case_expr->args) + ForEach(lc, case_expr->args) { CaseWhen *expr = (CaseWhen *) lfirst(lc); - CDXLScalarSwitchCase *swtich_case = GPOS_NEW(m_mp) CDXLScalarSwitchCase(m_mp); + CDXLScalarSwitchCase *swtich_case = + GPOS_NEW(m_mp) CDXLScalarSwitchCase(m_mp); CDXLNode *switch_case_node = GPOS_NEW(m_mp) CDXLNode(m_mp, swtich_case); - CDXLNode *cmp_expr_node = TranslateScalarToDXL(expr->expr, var_colid_mapping); + CDXLNode *cmp_expr_node = + TranslateScalarToDXL(expr->expr, var_colid_mapping); GPOS_ASSERT(NULL != cmp_expr_node); - CDXLNode *result_node = TranslateScalarToDXL(expr->result, var_colid_mapping); + CDXLNode *result_node = + TranslateScalarToDXL(expr->result, var_colid_mapping); GPOS_ASSERT(NULL != result_node); switch_case_node->AddChild(cmp_expr_node); @@ -970,11 +884,11 @@ CTranslatorScalarToDXL::CreateScalarSwitchFromCaseExpr // translate the "else" clause if (NULL != case_expr->defresult) { - CDXLNode *default_result_node = TranslateScalarToDXL(case_expr->defresult, var_colid_mapping); + CDXLNode *default_result_node = + TranslateScalarToDXL(case_expr->defresult, var_colid_mapping); GPOS_ASSERT(NULL != default_result_node); switch_node->AddChild(default_result_node); - } return switch_node; @@ -988,19 +902,15 @@ CTranslatorScalarToDXL::CreateScalarSwitchFromCaseExpr // Create a DXL node for a case test from a GPDB Expr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateCaseTestExprToDXL - ( +CTranslatorScalarToDXL::TranslateCaseTestExprToDXL( const Expr *expr, - const CMappingVarColId* //var_colid_mapping - ) + const CMappingVarColId * //var_colid_mapping +) { GPOS_ASSERT(IsA(expr, CaseTestExpr)); const CaseTestExpr *case_test_expr = (CaseTestExpr *) expr; - CDXLScalarCaseTest *dxlop = GPOS_NEW(m_mp) CDXLScalarCaseTest - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(case_test_expr->typeId) - ); + CDXLScalarCaseTest *dxlop = GPOS_NEW(m_mp) CDXLScalarCaseTest( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(case_test_expr->typeId)); return GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); } @@ -1013,13 +923,10 @@ CTranslatorScalarToDXL::TranslateCaseTestExprToDXL // Create a DXL If node from a GPDB CaseExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr - ( - const CaseExpr *case_expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr( + const CaseExpr *case_expr, const CMappingVarColId *var_colid_mapping) { - GPOS_ASSERT (NULL == case_expr->arg); + GPOS_ASSERT(NULL == case_expr->arg); const ULONG when_clause_count = gpdb::ListLength(case_expr->args); CDXLNode *root_if_tree_node = NULL; @@ -1027,19 +934,19 @@ CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr for (ULONG ul = 0; ul < when_clause_count; ul++) { - CDXLScalarIfStmt *if_stmt_new_dxl = GPOS_NEW(m_mp) CDXLScalarIfStmt - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(case_expr->casetype) - ); + CDXLScalarIfStmt *if_stmt_new_dxl = GPOS_NEW(m_mp) CDXLScalarIfStmt( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(case_expr->casetype)); - CDXLNode *if_stmt_new_node = GPOS_NEW(m_mp) CDXLNode(m_mp, if_stmt_new_dxl); + CDXLNode *if_stmt_new_node = + GPOS_NEW(m_mp) CDXLNode(m_mp, if_stmt_new_dxl); CaseWhen *expr = (CaseWhen *) gpdb::ListNth(case_expr->args, ul); GPOS_ASSERT(IsA(expr, CaseWhen)); - CDXLNode *cond_node = TranslateScalarToDXL(expr->expr, var_colid_mapping); - CDXLNode *result_node = TranslateScalarToDXL(expr->result, var_colid_mapping); + CDXLNode *cond_node = + TranslateScalarToDXL(expr->expr, var_colid_mapping); + CDXLNode *result_node = + TranslateScalarToDXL(expr->result, var_colid_mapping); GPOS_ASSERT(NULL != cond_node); GPOS_ASSERT(NULL != result_node); @@ -1047,7 +954,7 @@ CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr if_stmt_new_node->AddChild(cond_node); if_stmt_new_node->AddChild(result_node); - if(NULL == root_if_tree_node) + if (NULL == root_if_tree_node) { root_if_tree_node = if_stmt_new_node; } @@ -1060,7 +967,8 @@ CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr if (NULL != case_expr->defresult) { - CDXLNode *default_result_node = TranslateScalarToDXL(case_expr->defresult, var_colid_mapping); + CDXLNode *default_result_node = + TranslateScalarToDXL(case_expr->defresult, var_colid_mapping); GPOS_ASSERT(NULL != default_result_node); cur_node->AddChild(default_result_node); } @@ -1076,11 +984,8 @@ CTranslatorScalarToDXL::CreateScalarIfStmtFromCaseExpr // Create a DXL node for a scalar RelabelType expression from a GPDB RelabelType //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateRelabelTypeToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateRelabelTypeToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, RelabelType)); @@ -1088,21 +993,17 @@ CTranslatorScalarToDXL::TranslateRelabelTypeToDXL GPOS_ASSERT(NULL != relabel_type->arg); - CDXLNode *child_node = TranslateScalarToDXL(relabel_type->arg, var_colid_mapping); + CDXLNode *child_node = + TranslateScalarToDXL(relabel_type->arg, var_colid_mapping); GPOS_ASSERT(NULL != child_node); // create the DXL node holding the scalar boolean operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarCast - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(relabel_type->resulttype), - GPOS_NEW(m_mp) CMDIdGPDB(0) // casting function oid - ) - ); + CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLScalarCast( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(relabel_type->resulttype), + GPOS_NEW(m_mp) CMDIdGPDB(0) // casting function oid + )); dxlnode->AddChild(child_node); return dxlnode; @@ -1117,38 +1018,28 @@ CTranslatorScalarToDXL::TranslateRelabelTypeToDXL // GPDB coerce expression //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateCoerceToDomainToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateCoerceToDomainToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { - GPOS_ASSERT(IsA(expr, CoerceToDomain)); + GPOS_ASSERT(IsA(expr, CoerceToDomain)); - const CoerceToDomain *coerce = (CoerceToDomain *) expr; + const CoerceToDomain *coerce = (CoerceToDomain *) expr; - GPOS_ASSERT(NULL != coerce->arg); + GPOS_ASSERT(NULL != coerce->arg); - CDXLNode *child_node = TranslateScalarToDXL(coerce->arg, var_colid_mapping); + CDXLNode *child_node = TranslateScalarToDXL(coerce->arg, var_colid_mapping); - GPOS_ASSERT(NULL != child_node); + GPOS_ASSERT(NULL != child_node); - // create the DXL node holding the scalar boolean operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarCoerceToDomain - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(coerce->resulttype), - coerce->resulttypmod, - (EdxlCoercionForm) coerce->coercionformat, - coerce->location - ) - ); - dxlnode->AddChild(child_node); + // create the DXL node holding the scalar boolean operator + CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLScalarCoerceToDomain( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(coerce->resulttype), + coerce->resulttypmod, + (EdxlCoercionForm) coerce->coercionformat, coerce->location)); + dxlnode->AddChild(child_node); - return dxlnode; + return dxlnode; } //--------------------------------------------------------------------------- @@ -1160,38 +1051,27 @@ CTranslatorScalarToDXL::TranslateCoerceToDomainToDXL // GPDB coerce expression //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateCoerceViaIOToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateCoerceViaIOToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { - GPOS_ASSERT(IsA(expr, CoerceViaIO)); + GPOS_ASSERT(IsA(expr, CoerceViaIO)); - const CoerceViaIO *coerce = (CoerceViaIO *) expr; + const CoerceViaIO *coerce = (CoerceViaIO *) expr; - GPOS_ASSERT(NULL != coerce->arg); + GPOS_ASSERT(NULL != coerce->arg); - CDXLNode *child_node = TranslateScalarToDXL(coerce->arg, var_colid_mapping); + CDXLNode *child_node = TranslateScalarToDXL(coerce->arg, var_colid_mapping); - GPOS_ASSERT(NULL != child_node); + GPOS_ASSERT(NULL != child_node); - // create the DXL node holding the scalar boolean operator - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarCoerceViaIO - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(coerce->resulttype), - -1, - (EdxlCoercionForm) coerce->coerceformat, - coerce->location - ) - ); - dxlnode->AddChild(child_node); + // create the DXL node holding the scalar boolean operator + CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, GPOS_NEW(m_mp) CDXLScalarCoerceViaIO( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(coerce->resulttype), -1, + (EdxlCoercionForm) coerce->coerceformat, coerce->location)); + dxlnode->AddChild(child_node); - return dxlnode; + return dxlnode; } //--------------------------------------------------------------------------- @@ -1202,41 +1082,32 @@ CTranslatorScalarToDXL::TranslateCoerceViaIOToDXL // GPDB Array Coerce expression //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, ArrayCoerceExpr)); const ArrayCoerceExpr *array_coerce_expr = (ArrayCoerceExpr *) expr; - + GPOS_ASSERT(NULL != array_coerce_expr->arg); - - CDXLNode *child_node = TranslateScalarToDXL(array_coerce_expr->arg, var_colid_mapping); - + + CDXLNode *child_node = + TranslateScalarToDXL(array_coerce_expr->arg, var_colid_mapping); + GPOS_ASSERT(NULL != child_node); - - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(array_coerce_expr->elemfuncid), - GPOS_NEW(m_mp) CMDIdGPDB(array_coerce_expr->resulttype), - array_coerce_expr->resulttypmod, - array_coerce_expr->isExplicit, - (EdxlCoercionForm) array_coerce_expr->coerceformat, - array_coerce_expr->location - ) - ); - - dxlnode->AddChild(child_node); - - return dxlnode; -} + CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( + m_mp, + GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(array_coerce_expr->elemfuncid), + GPOS_NEW(m_mp) CMDIdGPDB(array_coerce_expr->resulttype), + array_coerce_expr->resulttypmod, array_coerce_expr->isExplicit, + (EdxlCoercionForm) array_coerce_expr->coerceformat, + array_coerce_expr->location)); + + dxlnode->AddChild(child_node); + + return dxlnode; +} @@ -1248,11 +1119,8 @@ CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL // Create a DXL node for a scalar funcexpr from a GPDB FuncExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateFuncExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateFuncExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, FuncExpr)); const FuncExpr *func_expr = (FuncExpr *) expr; @@ -1261,30 +1129,25 @@ CTranslatorScalarToDXL::TranslateFuncExprToDXL CMDIdGPDB *mdid_func = GPOS_NEW(m_mp) CMDIdGPDB(func_expr->funcid); // create the DXL node holding the scalar funcexpr - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarFuncExpr - ( - m_mp, - mdid_func, - GPOS_NEW(m_mp) CMDIdGPDB(func_expr->funcresulttype), - type_modifier, - func_expr->funcretset - ) - ); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarFuncExpr( + m_mp, mdid_func, + GPOS_NEW(m_mp) CMDIdGPDB(func_expr->funcresulttype), + type_modifier, func_expr->funcretset)); const IMDFunction *md_func = m_md_accessor->RetrieveFunc(mdid_func); if (IMDFunction::EfsVolatile == md_func->GetFuncStability()) { ListCell *lc = NULL; - ForEach (lc, func_expr->args) + ForEach(lc, func_expr->args) { Node *arg_node = (Node *) lfirst(lc); if (CTranslatorUtils::HasSubquery(arg_node)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, - GPOS_WSZ_LIT("Volatile functions with subqueries in arguments")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "Volatile functions with subqueries in arguments")); } } } @@ -1302,22 +1165,18 @@ CTranslatorScalarToDXL::TranslateFuncExprToDXL // Create a DXL node for a scalar aggref from a GPDB FuncExpr //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateAggrefToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateAggrefToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, Aggref)); const Aggref *aggref = (Aggref *) expr; - static ULONG mapping[][2] = - { + static ULONG mapping[][2] = { {AGGSTAGE_NORMAL, EdxlaggstageNormal}, {AGGSTAGE_PARTIAL, EdxlaggstagePartial}, {AGGSTAGE_INTERMEDIATE, EdxlaggstageIntermediate}, {AGGSTAGE_FINAL, EdxlaggstageFinal}, - }; + }; EdxlAggrefStage agg_stage = EdxlaggstageSentinel; const ULONG arity = GPOS_ARRAY_SIZE(mapping); @@ -1338,21 +1197,19 @@ CTranslatorScalarToDXL::TranslateAggrefToDXL if (md_agg->IsOrdered()) { GPOS_ASSERT_IMP(NULL == aggref->aggorder, md_agg->IsOrdered()); - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Ordered aggregates") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Ordered aggregates")); } if (0 != aggref->agglevelsup) { // TODO: Feb 05 2015, remove temporary fix to avoid erroring out during execution - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, GPOS_WSZ_LIT("Aggregate functions with outer references")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLError, + GPOS_WSZ_LIT("Aggregate functions with outer references")); } - IMDId *mdid_return_type = CScalarAggFunc::PmdidLookupReturnType(agg_mdid, (EdxlaggstageNormal == agg_stage), m_md_accessor); + IMDId *mdid_return_type = CScalarAggFunc::PmdidLookupReturnType( + agg_mdid, (EdxlaggstageNormal == agg_stage), m_md_accessor); IMDId *resolved_ret_type = NULL; if (m_md_accessor->RetrieveType(mdid_return_type)->IsAmbiguous()) { @@ -1360,7 +1217,8 @@ CTranslatorScalarToDXL::TranslateAggrefToDXL resolved_ret_type = GPOS_NEW(m_mp) CMDIdGPDB(aggref->aggtype); } - CDXLScalarAggref *aggref_scalar = GPOS_NEW(m_mp) CDXLScalarAggref(m_mp,agg_mdid, resolved_ret_type, aggref->aggdistinct, agg_stage); + CDXLScalarAggref *aggref_scalar = GPOS_NEW(m_mp) CDXLScalarAggref( + m_mp, agg_mdid, resolved_ret_type, aggref->aggdistinct, agg_stage); // create the DXL node holding the scalar aggref CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, aggref_scalar); @@ -1378,23 +1236,16 @@ CTranslatorScalarToDXL::TranslateAggrefToDXL // Return the DXL representation of window frame boundary //--------------------------------------------------------------------------- EdxlFrameBoundary -CTranslatorScalarToDXL::Edxlfb - ( - WindowBoundingKind kind, - Node *pnode - ) - const +CTranslatorScalarToDXL::Edxlfb(WindowBoundingKind kind, Node *pnode) const { - static ULONG rgrgulMapping[][2] = - { - {WINDOW_UNBOUND_PRECEDING, EdxlfbUnboundedPreceding}, - {WINDOW_BOUND_PRECEDING, EdxlfbBoundedPreceding}, - {WINDOW_CURRENT_ROW, EdxlfbCurrentRow}, - {WINDOW_BOUND_FOLLOWING, EdxlfbBoundedFollowing}, - {WINDOW_UNBOUND_FOLLOWING, EdxlfbUnboundedFollowing}, - {WINDOW_DELAYED_BOUND_PRECEDING, EdxlfbDelayedBoundedPreceding}, - {WINDOW_DELAYED_BOUND_FOLLOWING, EdxlfbDelayedBoundedFollowing} - }; + static ULONG rgrgulMapping[][2] = { + {WINDOW_UNBOUND_PRECEDING, EdxlfbUnboundedPreceding}, + {WINDOW_BOUND_PRECEDING, EdxlfbBoundedPreceding}, + {WINDOW_CURRENT_ROW, EdxlfbCurrentRow}, + {WINDOW_BOUND_FOLLOWING, EdxlfbBoundedFollowing}, + {WINDOW_UNBOUND_FOLLOWING, EdxlfbUnboundedFollowing}, + {WINDOW_DELAYED_BOUND_PRECEDING, EdxlfbDelayedBoundedPreceding}, + {WINDOW_DELAYED_BOUND_FOLLOWING, EdxlfbDelayedBoundedFollowing}}; const ULONG ulArity = GPOS_ARRAY_SIZE(rgrgulMapping); EdxlFrameBoundary edxlfb = EdxlfbSentinel; @@ -1405,12 +1256,14 @@ CTranslatorScalarToDXL::Edxlfb { edxlfb = (EdxlFrameBoundary) pulElem[1]; - if ((WINDOW_BOUND_FOLLOWING == kind) && ((NULL == pnode) || !IsA(pnode, Const))) + if ((WINDOW_BOUND_FOLLOWING == kind) && + ((NULL == pnode) || !IsA(pnode, Const))) { edxlfb = EdxlfbDelayedBoundedFollowing; } - if ((WINDOW_BOUND_PRECEDING == kind) && ((NULL == pnode) || !IsA(pnode, Const))) + if ((WINDOW_BOUND_PRECEDING == kind) && + ((NULL == pnode) || !IsA(pnode, Const))) { edxlfb = EdxlfbDelayedBoundedPreceding; } @@ -1431,13 +1284,11 @@ CTranslatorScalarToDXL::Edxlfb // Create a DXL window frame from a GPDB WindowFrame //--------------------------------------------------------------------------- CDXLWindowFrame * -CTranslatorScalarToDXL::GetWindowFrame - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping, +CTranslatorScalarToDXL::GetWindowFrame( + const Expr *expr, const CMappingVarColId *var_colid_mapping, CDXLNode *new_scalar_proj_list, - BOOL *has_distributed_tables // output - ) + BOOL *has_distributed_tables // output +) { GPOS_ASSERT(IsA(expr, WindowFrame)); const WindowFrame *pwindowframe = (WindowFrame *) expr; @@ -1448,17 +1299,18 @@ CTranslatorScalarToDXL::GetWindowFrame frame_spec = EdxlfsRange; } - EdxlFrameBoundary leading_boundary = Edxlfb(pwindowframe->lead->kind, pwindowframe->lead->val); - EdxlFrameBoundary trailing_boundary = Edxlfb(pwindowframe->trail->kind, pwindowframe->trail->val); + EdxlFrameBoundary leading_boundary = + Edxlfb(pwindowframe->lead->kind, pwindowframe->lead->val); + EdxlFrameBoundary trailing_boundary = + Edxlfb(pwindowframe->trail->kind, pwindowframe->trail->val); - static ULONG rgrgulExclusionMapping[][2] = - { - {WINDOW_EXCLUSION_NULL, EdxlfesNulls}, - {WINDOW_EXCLUSION_CUR_ROW, EdxlfesCurrentRow}, - {WINDOW_EXCLUSION_GROUP, EdxlfesGroup}, - {WINDOW_EXCLUSION_TIES, EdxlfesTies}, - {WINDOW_EXCLUSION_NO_OTHERS, EdxlfesNone}, - }; + static ULONG rgrgulExclusionMapping[][2] = { + {WINDOW_EXCLUSION_NULL, EdxlfesNulls}, + {WINDOW_EXCLUSION_CUR_ROW, EdxlfesCurrentRow}, + {WINDOW_EXCLUSION_GROUP, EdxlfesGroup}, + {WINDOW_EXCLUSION_TIES, EdxlfesTies}, + {WINDOW_EXCLUSION_NO_OTHERS, EdxlfesNone}, + }; const ULONG ulArityExclusion = GPOS_ARRAY_SIZE(rgrgulExclusionMapping); EdxlFrameExclusionStrategy strategy = EdxlfesSentinel; @@ -1471,23 +1323,33 @@ CTranslatorScalarToDXL::GetWindowFrame break; } } - GPOS_ASSERT(EdxlfesSentinel != strategy && "Invalid window frame exclusion"); + GPOS_ASSERT(EdxlfesSentinel != strategy && + "Invalid window frame exclusion"); - CDXLNode *lead_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, true /* fLeading */, leading_boundary)); - CDXLNode *trail_edge = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge(m_mp, false /* fLeading */, trailing_boundary)); + CDXLNode *lead_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, true /* fLeading */, leading_boundary)); + CDXLNode *trail_edge = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarWindowFrameEdge( + m_mp, false /* fLeading */, trailing_boundary)); // translate the lead and trail value if (NULL != pwindowframe->lead->val) { - lead_edge->AddChild(TranslateWindowFrameEdgeToDXL(pwindowframe->lead->val, var_colid_mapping, new_scalar_proj_list, has_distributed_tables)); + lead_edge->AddChild(TranslateWindowFrameEdgeToDXL( + pwindowframe->lead->val, var_colid_mapping, new_scalar_proj_list, + has_distributed_tables)); } if (NULL != pwindowframe->trail->val) { - trail_edge->AddChild(TranslateWindowFrameEdgeToDXL(pwindowframe->trail->val, var_colid_mapping, new_scalar_proj_list, has_distributed_tables)); + trail_edge->AddChild(TranslateWindowFrameEdgeToDXL( + pwindowframe->trail->val, var_colid_mapping, new_scalar_proj_list, + has_distributed_tables)); } - CDXLWindowFrame *window_frame_dxl = GPOS_NEW(m_mp) CDXLWindowFrame(m_mp, frame_spec, strategy, lead_edge, trail_edge); + CDXLWindowFrame *window_frame_dxl = GPOS_NEW(m_mp) + CDXLWindowFrame(m_mp, frame_spec, strategy, lead_edge, trail_edge); return window_frame_dxl; } @@ -1501,15 +1363,12 @@ CTranslatorScalarToDXL::GetWindowFrame // computed column then add it to the project list //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateWindowFrameEdgeToDXL - ( - const Node *node, - const CMappingVarColId* var_colid_mapping, - CDXLNode *new_scalar_proj_list, - BOOL *has_distributed_tables - ) +CTranslatorScalarToDXL::TranslateWindowFrameEdgeToDXL( + const Node *node, const CMappingVarColId *var_colid_mapping, + CDXLNode *new_scalar_proj_list, BOOL *has_distributed_tables) { - CDXLNode *val_node = TranslateScalarToDXL((Expr *) node, var_colid_mapping, has_distributed_tables); + CDXLNode *val_node = TranslateScalarToDXL((Expr *) node, var_colid_mapping, + has_distributed_tables); if (m_is_query_mode && !IsA(node, Var) && !IsA(node, Const)) { @@ -1519,25 +1378,22 @@ CTranslatorScalarToDXL::TranslateWindowFrameEdgeToDXL ULONG project_element_id = m_colid_generator->next_id(); // construct a projection element - CDXLNode *project_element_node = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem(m_mp, project_element_id, alias_mdname)); + CDXLNode *project_element_node = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarProjElem( + m_mp, project_element_id, alias_mdname)); project_element_node->AddChild(val_node); // add it to the computed columns project list new_scalar_proj_list->AddChild(project_element_node); // construct a new scalar ident - CDXLScalarIdent *scalar_ident = GPOS_NEW(m_mp) CDXLScalarIdent - ( - m_mp, - GPOS_NEW(m_mp) CDXLColRef - ( - m_mp, - GPOS_NEW(m_mp) CMDName(m_mp, &unnamed_col), - project_element_id, - GPOS_NEW(m_mp) CMDIdGPDB(gpdb::ExprType(const_cast(node))), - gpdb::ExprTypeMod(const_cast(node)) - ) - ); + CDXLScalarIdent *scalar_ident = GPOS_NEW(m_mp) CDXLScalarIdent( + m_mp, GPOS_NEW(m_mp) CDXLColRef( + m_mp, GPOS_NEW(m_mp) CMDName(m_mp, &unnamed_col), + project_element_id, + GPOS_NEW(m_mp) + CMDIdGPDB(gpdb::ExprType(const_cast(node))), + gpdb::ExprTypeMod(const_cast(node)))); val_node = GPOS_NEW(m_mp) CDXLNode(m_mp, scalar_ident); } @@ -1554,22 +1410,18 @@ CTranslatorScalarToDXL::TranslateWindowFrameEdgeToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateWindowRefToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateWindowRefToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, WindowRef)); const WindowRef *pwindowref = (WindowRef *) expr; - static ULONG mapping[][2] = - { + static ULONG mapping[][2] = { {WINSTAGE_IMMEDIATE, EdxlwinstageImmediate}, {WINSTAGE_PRELIMINARY, EdxlwinstagePreliminary}, {WINSTAGE_ROWKEY, EdxlwinstageRowKey}, - }; + }; const ULONG arity = GPOS_ARRAY_SIZE(mapping); EdxlWinStage dxl_win_stage = EdxlwinstageSentinel; @@ -1590,35 +1442,32 @@ CTranslatorScalarToDXL::TranslateWindowRefToDXL win_spec_pos = (ULONG) pwindowref->winspec; } - GPOS_ASSERT(EdxlwinstageSentinel != dxl_win_stage && "Invalid window stage"); + GPOS_ASSERT(EdxlwinstageSentinel != dxl_win_stage && + "Invalid window stage"); // fallback if window function is not supported if (WINDOW_PERCENT_RANK == pwindowref->winfnoid) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("PERCENT_RANK Window Functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("PERCENT_RANK Window Functions")); } else if (CUME_DIST_OID == pwindowref->winfnoid) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("CUME_DIST Window Functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("CUME_DIST Window Functions")); } else if (WINDOW_NTILE_INT4 == pwindowref->winfnoid || WINDOW_NTILE_INT8 == pwindowref->winfnoid || WINDOW_NTILE_NUMERIC == pwindowref->winfnoid) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("NTILE Window Functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("NTILE Window Functions")); } - CDXLScalarWindowRef *winref_dxlop = GPOS_NEW(m_mp) CDXLScalarWindowRef - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(pwindowref->winfnoid), - GPOS_NEW(m_mp) CMDIdGPDB(pwindowref->restype), - pwindowref->windistinct, - false, - false, - dxl_win_stage, - win_spec_pos - ); + CDXLScalarWindowRef *winref_dxlop = GPOS_NEW(m_mp) CDXLScalarWindowRef( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(pwindowref->winfnoid), + GPOS_NEW(m_mp) CMDIdGPDB(pwindowref->restype), pwindowref->windistinct, + false, false, dxl_win_stage, win_spec_pos); // create the DXL node holding the scalar aggref CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, winref_dxlop); @@ -1638,12 +1487,9 @@ CTranslatorScalarToDXL::TranslateWindowRefToDXL // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarCondFromQual - ( - List *quals, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables - ) +CTranslatorScalarToDXL::CreateScalarCondFromQual( + List *quals, const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables) { if (NULL == quals || 0 == gpdb::ListLength(quals)) { @@ -1653,15 +1499,18 @@ CTranslatorScalarToDXL::CreateScalarCondFromQual if (1 == gpdb::ListLength(quals)) { Expr *expr = (Expr *) gpdb::ListNth(quals, 0); - return TranslateScalarToDXL(expr, var_colid_mapping, has_distributed_tables); + return TranslateScalarToDXL(expr, var_colid_mapping, + has_distributed_tables); } else { // GPDB assumes that if there are a list of qual conditions then it is an implicit AND operation // Here we build the left deep AND tree - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBoolExpr(m_mp, Edxland)); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBoolExpr(m_mp, Edxland)); - TranslateScalarChildren(dxlnode, quals, var_colid_mapping, has_distributed_tables); + TranslateScalarChildren(dxlnode, quals, var_colid_mapping, + has_distributed_tables); return dxlnode; } @@ -1677,13 +1526,11 @@ CTranslatorScalarToDXL::CreateScalarCondFromQual // is responsible for freeing it //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateFilterFromQual - ( - List *quals, - const CMappingVarColId* var_colid_mapping, +CTranslatorScalarToDXL::CreateFilterFromQual( + List *quals, const CMappingVarColId *var_colid_mapping, Edxlopid filter_type, - BOOL *has_distributed_tables // output - ) + BOOL *has_distributed_tables // output +) { CDXLScalarFilter *dxlop = NULL; @@ -1705,7 +1552,8 @@ CTranslatorScalarToDXL::CreateFilterFromQual CDXLNode *filter_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); - CDXLNode *cond_node = CreateScalarCondFromQual(quals, var_colid_mapping, has_distributed_tables); + CDXLNode *cond_node = CreateScalarCondFromQual(quals, var_colid_mapping, + has_distributed_tables); if (NULL != cond_node) { @@ -1725,11 +1573,8 @@ CTranslatorScalarToDXL::CreateFilterFromQual // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateSubLinkToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateSubLinkToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { const SubLink *sublink = (SubLink *) expr; @@ -1740,17 +1585,18 @@ CTranslatorScalarToDXL::TranslateSubLinkToDXL case ALL_SUBLINK: case ANY_SUBLINK: - return CreateQuantifiedSubqueryFromSublink(sublink, var_colid_mapping); + return CreateQuantifiedSubqueryFromSublink(sublink, + var_colid_mapping); case EXISTS_SUBLINK: return CreateExistSubqueryFromSublink(sublink, var_colid_mapping); default: - { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Non-Scalar Subquery")); - return NULL; - } - + { + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Non-Scalar Subquery")); + return NULL; + } } } @@ -1762,45 +1608,41 @@ CTranslatorScalarToDXL::TranslateSubLinkToDXL // Create ANY / ALL quantified sub query from a GPDB sublink node //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateQuantifiedSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateQuantifiedSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping) { - CMappingVarColId *var_colid_map_copy = var_colid_mapping->CopyMapColId(m_mp); + CMappingVarColId *var_colid_map_copy = + var_colid_mapping->CopyMapColId(m_mp); CAutoP query_to_dxl_translator; - query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance - ( - m_mp, - m_md_accessor, - m_colid_generator, - m_cte_id_generator, - var_colid_map_copy, - (Query *) sublink->subselect, - m_query_level + 1, - m_cte_entries - ); - - CDXLNode *inner_dxlnode = query_to_dxl_translator->TranslateSelectQueryToDXL(); - - CDXLNodeArray *query_output_dxlnode_array = query_to_dxl_translator->GetQueryOutputCols(); + query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance( + m_mp, m_md_accessor, m_colid_generator, m_cte_id_generator, + var_colid_map_copy, (Query *) sublink->subselect, m_query_level + 1, + m_cte_entries); + + CDXLNode *inner_dxlnode = + query_to_dxl_translator->TranslateSelectQueryToDXL(); + + CDXLNodeArray *query_output_dxlnode_array = + query_to_dxl_translator->GetQueryOutputCols(); CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator->GetCTEs(); CUtils::AddRefAppend(m_cte_producers, cte_dxlnode_array); if (1 != query_output_dxlnode_array->Size()) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Non-Scalar Subquery")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Non-Scalar Subquery")); } - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator->HasDistributedTables(); + m_has_distributed_tables = m_has_distributed_tables || + query_to_dxl_translator->HasDistributedTables(); CDXLNode *dxl_sc_ident = (*query_output_dxlnode_array)[0]; GPOS_ASSERT(NULL != dxl_sc_ident); // get dxl scalar identifier - CDXLScalarIdent *scalar_ident = dynamic_cast(dxl_sc_ident->GetOperator()); + CDXLScalarIdent *scalar_ident = + dynamic_cast(dxl_sc_ident->GetOperator()); // get the dxl column reference const CDXLColRef *dxl_colref = scalar_ident->GetDXLColRef(); @@ -1808,7 +1650,7 @@ CTranslatorScalarToDXL::CreateQuantifiedSubqueryFromSublink // get the test expression GPOS_ASSERT(IsA(sublink->testexpr, OpExpr)); - OpExpr *op_expr = (OpExpr*) sublink->testexpr; + OpExpr *op_expr = (OpExpr *) sublink->testexpr; IMDId *mdid = GPOS_NEW(m_mp) CMDIdGPDB(op_expr->opno); @@ -1817,34 +1659,24 @@ CTranslatorScalarToDXL::CreateQuantifiedSubqueryFromSublink // translate left hand side of the expression GPOS_ASSERT(NULL != op_expr->args); - Expr* LHS_expr = (Expr*) gpdb::ListNth(op_expr->args, 0); + Expr *LHS_expr = (Expr *) gpdb::ListNth(op_expr->args, 0); CDXLNode *outer_dxlnode = TranslateScalarToDXL(LHS_expr, var_colid_mapping); CDXLNode *dxlnode = NULL; CDXLScalar *subquery = NULL; - GPOS_ASSERT(ALL_SUBLINK == sublink->subLinkType || ANY_SUBLINK == sublink->subLinkType); + GPOS_ASSERT(ALL_SUBLINK == sublink->subLinkType || + ANY_SUBLINK == sublink->subLinkType); if (ALL_SUBLINK == sublink->subLinkType) { - subquery = GPOS_NEW(m_mp) CDXLScalarSubqueryAll - ( - m_mp, - mdid, - GPOS_NEW(m_mp) CMDName(m_mp, str), - colid - ); - + subquery = GPOS_NEW(m_mp) CDXLScalarSubqueryAll( + m_mp, mdid, GPOS_NEW(m_mp) CMDName(m_mp, str), colid); } else { - subquery = GPOS_NEW(m_mp) CDXLScalarSubqueryAny - ( - m_mp, - mdid, - GPOS_NEW(m_mp) CMDName(m_mp, str), - colid - ); + subquery = GPOS_NEW(m_mp) CDXLScalarSubqueryAny( + m_mp, mdid, GPOS_NEW(m_mp) CMDName(m_mp, str), colid); } dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, subquery); @@ -1867,48 +1699,43 @@ CTranslatorScalarToDXL::CreateQuantifiedSubqueryFromSublink // Create a scalar subquery from a GPDB sublink node //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateScalarSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId *var_colid_mapping - ) +CTranslatorScalarToDXL::CreateScalarSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping) { - CMappingVarColId *var_colid_map_copy = var_colid_mapping->CopyMapColId(m_mp); + CMappingVarColId *var_colid_map_copy = + var_colid_mapping->CopyMapColId(m_mp); Query *subselect = (Query *) sublink->subselect; CAutoP query_to_dxl_translator; - query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance - ( - m_mp, - m_md_accessor, - m_colid_generator, - m_cte_id_generator, - var_colid_map_copy, - subselect, - m_query_level + 1, - m_cte_entries - ); - CDXLNode *subquery_dxlnode = query_to_dxl_translator->TranslateSelectQueryToDXL(); - - CDXLNodeArray *query_output_dxlnode_array = query_to_dxl_translator->GetQueryOutputCols(); + query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance( + m_mp, m_md_accessor, m_colid_generator, m_cte_id_generator, + var_colid_map_copy, subselect, m_query_level + 1, m_cte_entries); + CDXLNode *subquery_dxlnode = + query_to_dxl_translator->TranslateSelectQueryToDXL(); + + CDXLNodeArray *query_output_dxlnode_array = + query_to_dxl_translator->GetQueryOutputCols(); GPOS_ASSERT(1 == query_output_dxlnode_array->Size()); CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator->GetCTEs(); CUtils::AddRefAppend(m_cte_producers, cte_dxlnode_array); - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator->HasDistributedTables(); + m_has_distributed_tables = m_has_distributed_tables || + query_to_dxl_translator->HasDistributedTables(); // get dxl scalar identifier CDXLNode *dxl_sc_ident = (*query_output_dxlnode_array)[0]; GPOS_ASSERT(NULL != dxl_sc_ident); - CDXLScalarIdent *scalar_ident = CDXLScalarIdent::Cast(dxl_sc_ident->GetOperator()); + CDXLScalarIdent *scalar_ident = + CDXLScalarIdent::Cast(dxl_sc_ident->GetOperator()); // get the dxl column reference const CDXLColRef *dxl_colref = scalar_ident->GetDXLColRef(); const ULONG colid = dxl_colref->Id(); - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSubquery(m_mp, colid)); + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSubquery(m_mp, colid)); dxlnode->AddChild(subquery_dxlnode); @@ -1924,24 +1751,17 @@ CTranslatorScalarToDXL::CreateScalarSubqueryFromSublink // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateArrayExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateArrayExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, ArrayExpr)); const ArrayExpr *parrayexpr = (ArrayExpr *) expr; - CDXLScalarArray *dxlop = - GPOS_NEW(m_mp) CDXLScalarArray - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(parrayexpr->element_typeid), - GPOS_NEW(m_mp) CMDIdGPDB(parrayexpr->array_typeid), - parrayexpr->multidims - ); + CDXLScalarArray *dxlop = GPOS_NEW(m_mp) CDXLScalarArray( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(parrayexpr->element_typeid), + GPOS_NEW(m_mp) CMDIdGPDB(parrayexpr->array_typeid), + parrayexpr->multidims); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); @@ -1959,11 +1779,8 @@ CTranslatorScalarToDXL::TranslateArrayExprToDXL // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::TranslateArrayRefToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::TranslateArrayRefToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(IsA(expr, ArrayRef)); @@ -1977,27 +1794,28 @@ CTranslatorScalarToDXL::TranslateArrayRefToDXL else restype = parrayref->refelemtype; - CDXLScalarArrayRef *dxlop = - GPOS_NEW(m_mp) CDXLScalarArrayRef - ( - m_mp, - GPOS_NEW(m_mp) CMDIdGPDB(parrayref->refelemtype), - type_modifier, - GPOS_NEW(m_mp) CMDIdGPDB(parrayref->refarraytype), - GPOS_NEW(m_mp) CMDIdGPDB(restype) - ); + CDXLScalarArrayRef *dxlop = GPOS_NEW(m_mp) CDXLScalarArrayRef( + m_mp, GPOS_NEW(m_mp) CMDIdGPDB(parrayref->refelemtype), type_modifier, + GPOS_NEW(m_mp) CMDIdGPDB(parrayref->refarraytype), + GPOS_NEW(m_mp) CMDIdGPDB(restype)); CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); // add children - AddArrayIndexList(dxlnode, parrayref->reflowerindexpr, CDXLScalarArrayRefIndexList::EilbLower, var_colid_mapping); - AddArrayIndexList(dxlnode, parrayref->refupperindexpr, CDXLScalarArrayRefIndexList::EilbUpper, var_colid_mapping); + AddArrayIndexList(dxlnode, parrayref->reflowerindexpr, + CDXLScalarArrayRefIndexList::EilbLower, + var_colid_mapping); + AddArrayIndexList(dxlnode, parrayref->refupperindexpr, + CDXLScalarArrayRefIndexList::EilbUpper, + var_colid_mapping); - dxlnode->AddChild(TranslateScalarToDXL(parrayref->refexpr, var_colid_mapping)); + dxlnode->AddChild( + TranslateScalarToDXL(parrayref->refexpr, var_colid_mapping)); if (NULL != parrayref->refassgnexpr) { - dxlnode->AddChild(TranslateScalarToDXL(parrayref->refassgnexpr, var_colid_mapping)); + dxlnode->AddChild( + TranslateScalarToDXL(parrayref->refassgnexpr, var_colid_mapping)); } return dxlnode; @@ -2012,24 +1830,19 @@ CTranslatorScalarToDXL::TranslateArrayRefToDXL // //--------------------------------------------------------------------------- void -CTranslatorScalarToDXL::AddArrayIndexList - ( - CDXLNode *dxlnode, - List *list, +CTranslatorScalarToDXL::AddArrayIndexList( + CDXLNode *dxlnode, List *list, CDXLScalarArrayRefIndexList::EIndexListBound index_list_bound, - const CMappingVarColId* var_colid_mapping - ) + const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(NULL != dxlnode); - GPOS_ASSERT(EdxlopScalarArrayRef == dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarArrayRef == + dxlnode->GetOperator()->GetDXLOperator()); GPOS_ASSERT(CDXLScalarArrayRefIndexList::EilbSentinel > index_list_bound); - CDXLNode *index_list_dxlnode = - GPOS_NEW(m_mp) CDXLNode - ( - m_mp, - GPOS_NEW(m_mp) CDXLScalarArrayRefIndexList(m_mp, index_list_bound) - ); + CDXLNode *index_list_dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) + CDXLScalarArrayRefIndexList(m_mp, index_list_bound)); TranslateScalarChildren(index_list_dxlnode, list, var_colid_mapping); dxlnode->AddChild(index_list_dxlnode); @@ -2044,11 +1857,7 @@ CTranslatorScalarToDXL::AddArrayIndexList // //--------------------------------------------------------------------------- const CWStringConst * -CTranslatorScalarToDXL::GetDXLArrayCmpType - ( - IMDId *mdid - ) - const +CTranslatorScalarToDXL::GetDXLArrayCmpType(IMDId *mdid) const { // get operator name const IMDScalarOp *md_scalar_op = m_md_accessor->RetrieveScOp(mdid); @@ -2067,34 +1876,28 @@ CTranslatorScalarToDXL::GetDXLArrayCmpType // sublink node //--------------------------------------------------------------------------- CDXLNode * -CTranslatorScalarToDXL::CreateExistSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId* var_colid_mapping - ) +CTranslatorScalarToDXL::CreateExistSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping) { GPOS_ASSERT(NULL != sublink); - CMappingVarColId *var_colid_map_copy = var_colid_mapping->CopyMapColId(m_mp); + CMappingVarColId *var_colid_map_copy = + var_colid_mapping->CopyMapColId(m_mp); CAutoP query_to_dxl_translator; - query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance - ( - m_mp, - m_md_accessor, - m_colid_generator, - m_cte_id_generator, - var_colid_map_copy, - (Query *) sublink->subselect, - m_query_level + 1, - m_cte_entries - ); - CDXLNode *root_dxlnode = query_to_dxl_translator->TranslateSelectQueryToDXL(); - + query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance( + m_mp, m_md_accessor, m_colid_generator, m_cte_id_generator, + var_colid_map_copy, (Query *) sublink->subselect, m_query_level + 1, + m_cte_entries); + CDXLNode *root_dxlnode = + query_to_dxl_translator->TranslateSelectQueryToDXL(); + CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator->GetCTEs(); CUtils::AddRefAppend(m_cte_producers, cte_dxlnode_array); - m_has_distributed_tables = m_has_distributed_tables || query_to_dxl_translator->HasDistributedTables(); - - CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSubqueryExists(m_mp)); + m_has_distributed_tables = m_has_distributed_tables || + query_to_dxl_translator->HasDistributedTables(); + + CDXLNode *dxlnode = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarSubqueryExists(m_mp)); dxlnode->AddChild(root_dxlnode); return dxlnode; @@ -2108,24 +1911,18 @@ CTranslatorScalarToDXL::CreateExistSubqueryFromSublink // Create CDXLDatum from GPDB datum //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - INT type_modifier, - BOOL is_null, - ULONG len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + INT type_modifier, BOOL is_null, + ULONG len, Datum datum) { - static const SDXLDatumTranslatorElem translators[] = - { - {IMDType::EtiInt2 , &CTranslatorScalarToDXL::TranslateInt2DatumToDXL}, - {IMDType::EtiInt4 , &CTranslatorScalarToDXL::TranslateInt4DatumToDXL}, - {IMDType::EtiInt8 , &CTranslatorScalarToDXL::TranslateInt8DatumToDXL}, - {IMDType::EtiBool , &CTranslatorScalarToDXL::TranslateBoolDatumToDXL}, - {IMDType::EtiOid , &CTranslatorScalarToDXL::TranslateOidDatumToDXL}, - }; + static const SDXLDatumTranslatorElem translators[] = { + {IMDType::EtiInt2, &CTranslatorScalarToDXL::TranslateInt2DatumToDXL}, + {IMDType::EtiInt4, &CTranslatorScalarToDXL::TranslateInt4DatumToDXL}, + {IMDType::EtiInt8, &CTranslatorScalarToDXL::TranslateInt8DatumToDXL}, + {IMDType::EtiBool, &CTranslatorScalarToDXL::TranslateBoolDatumToDXL}, + {IMDType::EtiOid, &CTranslatorScalarToDXL::TranslateOidDatumToDXL}, + }; const ULONG num_translators = GPOS_ARRAY_SIZE(translators); // find translator for the datum type @@ -2143,7 +1940,8 @@ CTranslatorScalarToDXL::TranslateDatumToDXL if (NULL == func_ptr) { // generate a datum of generic type - return TranslateGenericDatumToDXL(mp, md_type, type_modifier, is_null, len, datum); + return TranslateGenericDatumToDXL(mp, md_type, type_modifier, is_null, + len, datum); } else { @@ -2159,15 +1957,11 @@ CTranslatorScalarToDXL::TranslateDatumToDXL // Translate a datum of generic type //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateGenericDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - INT type_modifier, - BOOL is_null, - ULONG len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateGenericDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + INT type_modifier, + BOOL is_null, ULONG len, + Datum datum) { CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); @@ -2176,7 +1970,8 @@ CTranslatorScalarToDXL::TranslateGenericDatumToDXL ULONG length = 0; if (!is_null) { - length = (ULONG) gpdb::DatumSize(datum, md_type->IsPassedByValue(), len); + length = + (ULONG) gpdb::DatumSize(datum, md_type->IsPassedByValue(), len); } CDouble double_value(0); @@ -2191,7 +1986,9 @@ CTranslatorScalarToDXL::TranslateGenericDatumToDXL lint_value = ExtractLintValueFromDatum(md_type, is_null, bytes, length); } - return CMDTypeGenericGPDB::CreateDXLDatumVal(mp, mdid, md_type, type_modifier, is_null, bytes, length, lint_value, double_value); + return CMDTypeGenericGPDB::CreateDXLDatumVal( + mp, mdid, md_type, type_modifier, is_null, bytes, length, lint_value, + double_value); } @@ -2203,20 +2000,18 @@ CTranslatorScalarToDXL::TranslateGenericDatumToDXL // Translate a datum of type bool //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateBoolDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG , //len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateBoolDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + ULONG, //len, + Datum datum) { GPOS_ASSERT(md_type->IsPassedByValue()); CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); - return GPOS_NEW(mp) CDXLDatumBool(mp, mdid, is_null, gpdb::BoolFromDatum(datum)); + return GPOS_NEW(mp) + CDXLDatumBool(mp, mdid, is_null, gpdb::BoolFromDatum(datum)); } @@ -2228,20 +2023,18 @@ CTranslatorScalarToDXL::TranslateBoolDatumToDXL // Translate a datum of type oid //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateOidDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG , //len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateOidDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + ULONG, //len, + Datum datum) { GPOS_ASSERT(md_type->IsPassedByValue()); CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); - return GPOS_NEW(mp) CDXLDatumOid(mp, mdid, is_null, gpdb::OidFromDatum(datum)); + return GPOS_NEW(mp) + CDXLDatumOid(mp, mdid, is_null, gpdb::OidFromDatum(datum)); } @@ -2253,20 +2046,18 @@ CTranslatorScalarToDXL::TranslateOidDatumToDXL // Translate a datum of type int2 //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateInt2DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG , //len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateInt2DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + ULONG, //len, + Datum datum) { GPOS_ASSERT(md_type->IsPassedByValue()); CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); - return GPOS_NEW(mp) CDXLDatumInt2(mp, mdid, is_null, gpdb::Int16FromDatum(datum)); + return GPOS_NEW(mp) + CDXLDatumInt2(mp, mdid, is_null, gpdb::Int16FromDatum(datum)); } @@ -2278,20 +2069,18 @@ CTranslatorScalarToDXL::TranslateInt2DatumToDXL // Translate a datum of type int4 //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateInt4DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG , //len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateInt4DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + ULONG, //len, + Datum datum) { GPOS_ASSERT(md_type->IsPassedByValue()); CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); - return GPOS_NEW(mp) CDXLDatumInt4(mp, mdid, is_null, gpdb::Int32FromDatum(datum)); + return GPOS_NEW(mp) + CDXLDatumInt4(mp, mdid, is_null, gpdb::Int32FromDatum(datum)); } @@ -2303,20 +2092,18 @@ CTranslatorScalarToDXL::TranslateInt4DatumToDXL // Translate a datum of type int8 //--------------------------------------------------------------------------- CDXLDatum * -CTranslatorScalarToDXL::TranslateInt8DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG , //len, - Datum datum - ) +CTranslatorScalarToDXL::TranslateInt8DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + ULONG, //len, + Datum datum) { GPOS_ASSERT(md_type->IsPassedByValue()); CMDIdGPDB *mdid_old = CMDIdGPDB::CastMdid(md_type->MDId()); CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(*mdid_old); - return GPOS_NEW(mp) CDXLDatumInt8(mp, mdid, is_null, gpdb::Int64FromDatum(datum)); + return GPOS_NEW(mp) + CDXLDatumInt8(mp, mdid, is_null, gpdb::Int64FromDatum(datum)); } @@ -2328,13 +2115,8 @@ CTranslatorScalarToDXL::TranslateInt8DatumToDXL // Extract the double value of the datum //--------------------------------------------------------------------------- CDouble -CTranslatorScalarToDXL::ExtractDoubleValueFromDatum - ( - IMDId *mdid, - BOOL is_null, - BYTE *bytes, - Datum datum - ) +CTranslatorScalarToDXL::ExtractDoubleValueFromDatum(IMDId *mdid, BOOL is_null, + BYTE *bytes, Datum datum) { GPOS_ASSERT(CMDTypeGenericGPDB::HasByte2DoubleMapping(mdid)); @@ -2347,7 +2129,7 @@ CTranslatorScalarToDXL::ExtractDoubleValueFromDatum if (mdid->Equals(&CMDIdGPDB::m_mdid_numeric)) { - Numeric num = (Numeric) (bytes); + Numeric num = (Numeric)(bytes); if (NUMERIC_IS_NAN(num)) { // in GPDB NaN is considered the largest numeric number. @@ -2380,11 +2162,13 @@ CTranslatorScalarToDXL::ExtractDoubleValueFromDatum } else if (CMDTypeGenericGPDB::IsTimeRelatedType(mdid)) { - d = gpdb::ConvertTimeValueToScalar(datum, CMDIdGPDB::CastMdid(mdid)->Oid()); + d = gpdb::ConvertTimeValueToScalar(datum, + CMDIdGPDB::CastMdid(mdid)->Oid()); } else if (CMDTypeGenericGPDB::IsNetworkRelatedType(mdid)) { - d = gpdb::ConvertNetworkToScalar(datum, CMDIdGPDB::CastMdid(mdid)->Oid()); + d = gpdb::ConvertNetworkToScalar(datum, + CMDIdGPDB::CastMdid(mdid)->Oid()); } return CDouble(d); @@ -2399,14 +2183,10 @@ CTranslatorScalarToDXL::ExtractDoubleValueFromDatum // Extract the byte array value of the datum. The result is NULL if datum is NULL //--------------------------------------------------------------------------- BYTE * -CTranslatorScalarToDXL::ExtractByteArrayFromDatum - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ) +CTranslatorScalarToDXL::ExtractByteArrayFromDatum(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum) { ULONG length = 0; BYTE *bytes = NULL; @@ -2443,13 +2223,9 @@ CTranslatorScalarToDXL::ExtractByteArrayFromDatum // Extract the long int value of a datum //--------------------------------------------------------------------------- LINT -CTranslatorScalarToDXL::ExtractLintValueFromDatum - ( - const IMDType *md_type, - BOOL is_null, - BYTE *bytes, - ULONG length - ) +CTranslatorScalarToDXL::ExtractLintValueFromDatum(const IMDType *md_type, + BOOL is_null, BYTE *bytes, + ULONG length) { IMDId *mdid = md_type->MDId(); GPOS_ASSERT(CMDTypeGenericGPDB::HasByte2IntMapping(md_type)); @@ -2466,8 +2242,7 @@ CTranslatorScalarToDXL::ExtractLintValueFromDatum Datum datumConstVal = (Datum) 0; clib::Memcpy(&datumConstVal, bytes, length); // Date is internally represented as an int32 - lint_value = (LINT) (gpdb::Int32FromDatum(datumConstVal)); - + lint_value = (LINT)(gpdb::Int32FromDatum(datumConstVal)); } else { @@ -2516,23 +2291,23 @@ CTranslatorScalarToDXL::ExtractLintValueFromDatum // Create IDatum from GPDB datum //--------------------------------------------------------------------------- IDatum * -CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - Datum gpdb_datum - ) +CTranslatorScalarToDXL::CreateIDatumFromGpdbDatum(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, + Datum gpdb_datum) { ULONG length = md_type->Length(); if (!md_type->IsPassedByValue() && !is_null) { - INT len = dynamic_cast(md_type)->GetGPDBLength(); - length = (ULONG) gpdb::DatumSize(gpdb_datum, md_type->IsPassedByValue(), len); + INT len = + dynamic_cast(md_type)->GetGPDBLength(); + length = (ULONG) gpdb::DatumSize(gpdb_datum, md_type->IsPassedByValue(), + len); } GPOS_ASSERT(is_null || length > 0); - CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateDatumToDXL(mp, md_type, gpmd::default_type_modifier, is_null, length, gpdb_datum); + CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateDatumToDXL( + mp, md_type, gpmd::default_type_modifier, is_null, length, gpdb_datum); IDatum *datum = md_type->GetDatumForDXLDatum(mp, datum_dxl); datum_dxl->Release(); return datum; diff --git a/src/backend/gpopt/translate/CTranslatorUtils.cpp b/src/backend/gpopt/translate/CTranslatorUtils.cpp index e81af3db5a..de70131579 100644 --- a/src/backend/gpopt/translate/CTranslatorUtils.cpp +++ b/src/backend/gpopt/translate/CTranslatorUtils.cpp @@ -89,12 +89,8 @@ extern bool optimizer_multilevel_partitioning; // //--------------------------------------------------------------------------- CDXLIndexDescr * -CTranslatorUtils::GetIndexDescr - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid - ) +CTranslatorUtils::GetIndexDescr(CMemoryPool *mp, CMDAccessor *md_accessor, + IMDId *mdid) { const IMDIndex *index = md_accessor->RetrieveIndex(mdid); const CWStringConst *index_name = index->Mdname().GetMDName(); @@ -112,14 +108,11 @@ CTranslatorUtils::GetIndexDescr // //--------------------------------------------------------------------------- CDXLTableDescr * -CTranslatorUtils::GetTableDescr - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const RangeTblEntry *rte, - BOOL *is_distributed_table // output - ) +CTranslatorUtils::GetTableDescr(CMemoryPool *mp, CMDAccessor *md_accessor, + CIdGenerator *id_generator, + const RangeTblEntry *rte, + BOOL *is_distributed_table // output +) { // generate an MDId for the table desc. OID rel_oid = rte->relid; @@ -128,39 +121,46 @@ CTranslatorUtils::GetTableDescr { // fall back to the planner for queries with partition tables that has an external table in one of its leaf // partitions. - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Query over external partitions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Query over external partitions")); } CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(rel_oid); const IMDRelation *rel = md_accessor->RetrieveRel(mdid); - + // look up table name const CWStringConst *tablename = rel->Mdname().GetMDName(); CMDName *table_mdname = GPOS_NEW(mp) CMDName(mp, tablename); - CDXLTableDescr *table_descr = GPOS_NEW(mp) CDXLTableDescr(mp, mdid, table_mdname, rte->checkAsUser); + CDXLTableDescr *table_descr = + GPOS_NEW(mp) CDXLTableDescr(mp, mdid, table_mdname, rte->checkAsUser); const ULONG len = rel->ColumnCount(); - IMDRelation::Ereldistrpolicy distribution_policy = rel->GetRelDistribution(); + IMDRelation::Ereldistrpolicy distribution_policy = + rel->GetRelDistribution(); if (NULL != is_distributed_table && - (IMDRelation::EreldistrHash == distribution_policy || IMDRelation::EreldistrRandom == distribution_policy)) + (IMDRelation::EreldistrHash == distribution_policy || + IMDRelation::EreldistrRandom == distribution_policy)) { *is_distributed_table = true; } - else if (!optimizer_enable_master_only_queries && (IMDRelation::EreldistrMasterOnly == distribution_policy)) - { - // fall back to the planner for queries on master-only table if they are disabled with Orca. This is due to - // the fact that catalog tables (master-only) are not analyzed often and will result in Orca producing - // inferior plans. - - GPOS_THROW_EXCEPTION(gpdxl::ExmaDXL, // major - gpdxl::ExmiQuery2DXLUnsupportedFeature, // minor - CException::ExsevDebug1, // ulSeverityLevel mapped to GPDB severity level - GPOS_WSZ_LIT("Queries on master-only tables")); - } + else if (!optimizer_enable_master_only_queries && + (IMDRelation::EreldistrMasterOnly == distribution_policy)) + { + // fall back to the planner for queries on master-only table if they are disabled with Orca. This is due to + // the fact that catalog tables (master-only) are not analyzed often and will result in Orca producing + // inferior plans. + + GPOS_THROW_EXCEPTION( + gpdxl::ExmaDXL, // major + gpdxl::ExmiQuery2DXLUnsupportedFeature, // minor + CException:: + ExsevDebug1, // ulSeverityLevel mapped to GPDB severity level + GPOS_WSZ_LIT("Queries on master-only tables")); + } // add columns from md cache relation object to table descriptor for (ULONG ul = 0; ul < len; ul++) @@ -170,23 +170,17 @@ CTranslatorUtils::GetTableDescr { continue; } - + CMDName *col = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); CMDIdGPDB *col_type = CMDIdGPDB::CastMdid(md_col->MdidType()); col_type->AddRef(); // create a column descriptor for the column - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - col, - id_generator->next_id(), - md_col->AttrNum(), - col_type, - md_col->TypeModifier(), /* type_modifier */ - false, /* fColDropped */ - md_col->Length() - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) + CDXLColDescr(mp, col, id_generator->next_id(), md_col->AttrNum(), + col_type, md_col->TypeModifier(), /* type_modifier */ + false, /* fColDropped */ + md_col->Length()); table_descr->AddColumnDescr(dxl_col_descr); } @@ -203,17 +197,12 @@ CTranslatorUtils::GetTableDescr // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsSirvFunc - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - OID func_oid - ) +CTranslatorUtils::IsSirvFunc(CMemoryPool *mp, CMDAccessor *md_accessor, + OID func_oid) { // we exempt the following 3 functions to avoid falling back to the planner // for DML on tables with sequences. The same exemption is also in the planner - if (GPDB_NEXTVAL == func_oid || - GPDB_CURRVAL == func_oid || + if (GPDB_NEXTVAL == func_oid || GPDB_CURRVAL == func_oid || GPDB_SETVAL == func_oid) { return false; @@ -223,7 +212,7 @@ CTranslatorUtils::IsSirvFunc const IMDFunction *func = md_accessor->RetrieveFunc(mdid_func); BOOL is_sirv = (!func->ReturnsSet() && - IMDFunction::EfsVolatile == func->GetFuncStability()); + IMDFunction::EfsVolatile == func->GetFuncStability()); mdid_func->Release(); @@ -239,10 +228,7 @@ CTranslatorUtils::IsSirvFunc // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::HasSubquery - ( - Node *node - ) +CTranslatorUtils::HasSubquery(Node *node) { List *unsupported_list = ListMake1Int(T_SubLink); INT unsupported = gpdb::FindNodes(node, unsupported_list); @@ -260,27 +246,26 @@ CTranslatorUtils::HasSubquery // //--------------------------------------------------------------------------- CDXLLogicalTVF * -CTranslatorUtils::ConvertToCDXLLogicalTVF - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const RangeTblEntry *rte - ) +CTranslatorUtils::ConvertToCDXLLogicalTVF(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *id_generator, + const RangeTblEntry *rte) { GPOS_ASSERT(NULL != rte->funcexpr); - FuncExpr *funcexpr = (FuncExpr *)rte->funcexpr; + FuncExpr *funcexpr = (FuncExpr *) rte->funcexpr; // get function id CMDIdGPDB *mdid_func = GPOS_NEW(mp) CMDIdGPDB(funcexpr->funcid); - CMDIdGPDB *mdid_return_type = GPOS_NEW(mp) CMDIdGPDB(funcexpr->funcresulttype); + CMDIdGPDB *mdid_return_type = + GPOS_NEW(mp) CMDIdGPDB(funcexpr->funcresulttype); const IMDType *type = md_accessor->RetrieveType(mdid_return_type); // In the planner, scalar functions that are volatile (SIRV) or read or modify SQL // data get patched into an InitPlan. This is not supported in the optimizer if (IsSirvFunc(mp, md_accessor, funcexpr->funcid)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("SIRV functions")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("SIRV functions")); } // get function from MDcache @@ -293,12 +278,15 @@ CTranslatorUtils::ConvertToCDXLLogicalTVF if (NULL != rte->funccoltypes) { // function returns record - use col names and types from query - column_descrs = GetColumnDescriptorsFromRecord(mp, id_generator, rte->eref->colnames, rte->funccoltypes, rte->funccoltypmods); + column_descrs = GetColumnDescriptorsFromRecord( + mp, id_generator, rte->eref->colnames, rte->funccoltypes, + rte->funccoltypmods); } else if (type->IsComposite() && IMDId::IsValid(type->GetBaseRelMdid())) { // function returns a "table" type or a user defined type - column_descrs = GetColumnDescriptorsFromComposite(mp, md_accessor, id_generator, type); + column_descrs = GetColumnDescriptorsFromComposite(mp, md_accessor, + id_generator, type); } else if (NULL != out_arg_types) { @@ -309,18 +297,14 @@ CTranslatorUtils::ConvertToCDXLLogicalTVF // resolve polymorphic types (anyelement/anyarray) using the // argument types from the query List *arg_types = gpdb::GetFuncArgTypes(funcexpr->funcid); - IMdIdArray *resolved_types = ResolvePolymorphicTypes - ( - mp, - out_arg_types, - arg_types, - funcexpr - ); + IMdIdArray *resolved_types = + ResolvePolymorphicTypes(mp, out_arg_types, arg_types, funcexpr); out_arg_types->Release(); out_arg_types = resolved_types; } - column_descrs = GetColumnDescriptorsFromRecord(mp, id_generator, rte->eref->colnames, out_arg_types); + column_descrs = GetColumnDescriptorsFromRecord( + mp, id_generator, rte->eref->colnames, out_arg_types); out_arg_types->Release(); } else @@ -328,12 +312,15 @@ CTranslatorUtils::ConvertToCDXLLogicalTVF // function returns base type CMDName func_mdname = func->Mdname(); // table valued functions don't describe the returned column type modifiers, hence the -1 - column_descrs = GetColumnDescriptorsFromBase(mp, id_generator, mdid_return_type, default_type_modifier, &func_mdname); + column_descrs = + GetColumnDescriptorsFromBase(mp, id_generator, mdid_return_type, + default_type_modifier, &func_mdname); } CMDName *pmdfuncname = GPOS_NEW(mp) CMDName(mp, func->Mdname().GetMDName()); - CDXLLogicalTVF *tvf_dxl = GPOS_NEW(mp) CDXLLogicalTVF(mp, mdid_func, mdid_return_type, pmdfuncname, column_descrs); + CDXLLogicalTVF *tvf_dxl = GPOS_NEW(mp) CDXLLogicalTVF( + mp, mdid_func, mdid_return_type, pmdfuncname, column_descrs); return tvf_dxl; } @@ -348,20 +335,19 @@ CTranslatorUtils::ConvertToCDXLLogicalTVF // //--------------------------------------------------------------------------- IMdIdArray * -CTranslatorUtils::ResolvePolymorphicTypes - ( - CMemoryPool *mp, - IMdIdArray *mdid_array, - List *arg_types_list, - FuncExpr *funcexpr - ) +CTranslatorUtils::ResolvePolymorphicTypes(CMemoryPool *mp, + IMdIdArray *mdid_array, + List *arg_types_list, + FuncExpr *funcexpr) { ULONG arg_index = 0; const ULONG num_arg_types = gpdb::ListLength(arg_types_list); const ULONG num_args_from_query = gpdb::ListLength(funcexpr->args); const ULONG num_return_args = mdid_array->Size(); - const ULONG num_args = num_arg_types < num_args_from_query ? num_arg_types : num_args_from_query; + const ULONG num_args = num_arg_types < num_args_from_query + ? num_arg_types + : num_args_from_query; const ULONG total_args = num_args + num_return_args; OID arg_types[num_args]; @@ -369,7 +355,7 @@ CTranslatorUtils::ResolvePolymorphicTypes // copy function argument types ListCell *arg_type = NULL; - ForEach (arg_type, arg_types_list) + ForEach(arg_type, arg_types_list) { arg_types[arg_index] = lfirst_oid(arg_type); arg_modes[arg_index++] = PROARGMODE_IN; @@ -383,23 +369,21 @@ CTranslatorUtils::ResolvePolymorphicTypes arg_modes[arg_index++] = PROARGMODE_TABLE; } - if(!gpdb::ResolvePolymorphicArgType(total_args, arg_types, arg_modes, funcexpr)) + if (!gpdb::ResolvePolymorphicArgType(total_args, arg_types, arg_modes, + funcexpr)) { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiDXLUnrecognizedType, - GPOS_WSZ_LIT("could not determine actual argument/return type for polymorphic function") - ); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiDXLUnrecognizedType, + GPOS_WSZ_LIT( + "could not determine actual argument/return type for polymorphic function")); } // generate a new array of mdids based on the resolved types IMdIdArray *resolved_types = GPOS_NEW(mp) IMdIdArray(mp); // get the resolved return types - for (ULONG ul = num_args; ul < total_args ; ul++) + for (ULONG ul = num_args; ul < total_args; ul++) { - IMDId *resolved_mdid = NULL; resolved_mdid = GPOS_NEW(mp) CMDIdGPDB(arg_types[ul]); resolved_types->Append(resolved_mdid); @@ -418,10 +402,7 @@ CTranslatorUtils::ResolvePolymorphicTypes // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::ContainsPolymorphicTypes - ( - IMdIdArray *mdid_array - ) +CTranslatorUtils::ContainsPolymorphicTypes(IMdIdArray *mdid_array) { GPOS_ASSERT(NULL != mdid_array); const ULONG len = mdid_array->Size(); @@ -446,14 +427,11 @@ CTranslatorUtils::ContainsPolymorphicTypes // //--------------------------------------------------------------------------- CDXLColDescrArray * -CTranslatorUtils::GetColumnDescriptorsFromRecord - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - List *col_names, - List *col_types, - List *col_type_modifiers - ) +CTranslatorUtils::GetColumnDescriptorsFromRecord(CMemoryPool *mp, + CIdGenerator *id_generator, + List *col_names, + List *col_types, + List *col_type_modifiers) { ListCell *col_name = NULL; ListCell *col_type = NULL; @@ -462,31 +440,26 @@ CTranslatorUtils::GetColumnDescriptorsFromRecord ULONG ul = 0; CDXLColDescrArray *column_descrs = GPOS_NEW(mp) CDXLColDescrArray(mp); - ForThree (col_name, col_names, - col_type, col_types, - col_type_modifier, col_type_modifiers) + ForThree(col_name, col_names, col_type, col_types, col_type_modifier, + col_type_modifiers) { Value *value = (Value *) lfirst(col_name); Oid coltype = lfirst_oid(col_type); INT type_modifier = lfirst_int(col_type_modifier); CHAR *col_name_char_array = strVal(value); - CWStringDynamic *column_name = CDXLUtils::CreateDynamicStringFromCharArray(mp, col_name_char_array); + CWStringDynamic *column_name = + CDXLUtils::CreateDynamicStringFromCharArray(mp, + col_name_char_array); CMDName *col_mdname = GPOS_NEW(mp) CMDName(mp, column_name); GPOS_DELETE(column_name); IMDId *col_type = GPOS_NEW(mp) CMDIdGPDB(coltype); - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - col_mdname, - id_generator->next_id(), - INT(ul + 1) /* attno */, - col_type, - type_modifier, - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, col_mdname, id_generator->next_id(), INT(ul + 1) /* attno */, + col_type, type_modifier, false /* fColDropped */ + ); column_descrs->Append(dxl_col_descr); ul++; } @@ -503,13 +476,10 @@ CTranslatorUtils::GetColumnDescriptorsFromRecord // //--------------------------------------------------------------------------- CDXLColDescrArray * -CTranslatorUtils::GetColumnDescriptorsFromRecord - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - List *col_names, - IMdIdArray *out_arg_types - ) +CTranslatorUtils::GetColumnDescriptorsFromRecord(CMemoryPool *mp, + CIdGenerator *id_generator, + List *col_names, + IMdIdArray *out_arg_types) { GPOS_ASSERT(out_arg_types->Size() == (ULONG) gpdb::ListLength(col_names)); ListCell *col_name = NULL; @@ -517,12 +487,14 @@ CTranslatorUtils::GetColumnDescriptorsFromRecord ULONG ul = 0; CDXLColDescrArray *column_descrs = GPOS_NEW(mp) CDXLColDescrArray(mp); - ForEach (col_name, col_names) + ForEach(col_name, col_names) { Value *value = (Value *) lfirst(col_name); CHAR *col_name_char_array = strVal(value); - CWStringDynamic *column_name = CDXLUtils::CreateDynamicStringFromCharArray(mp, col_name_char_array); + CWStringDynamic *column_name = + CDXLUtils::CreateDynamicStringFromCharArray(mp, + col_name_char_array); CMDName *col_mdname = GPOS_NEW(mp) CMDName(mp, column_name); GPOS_DELETE(column_name); @@ -531,16 +503,10 @@ CTranslatorUtils::GetColumnDescriptorsFromRecord // This function is only called to construct column descriptors for table-valued functions // which won't have type modifiers for columns of the returned table - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - col_mdname, - id_generator->next_id(), - INT(ul + 1) /* attno */, - col_type, - default_type_modifier, - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, col_mdname, id_generator->next_id(), INT(ul + 1) /* attno */, + col_type, default_type_modifier, false /* fColDropped */ + ); column_descrs->Append(dxl_col_descr); ul++; } @@ -557,30 +523,22 @@ CTranslatorUtils::GetColumnDescriptorsFromRecord // //--------------------------------------------------------------------------- CDXLColDescrArray * -CTranslatorUtils::GetColumnDescriptorsFromBase - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - IMDId *mdid_return_type, - INT type_modifier, - CMDName *pmdName - ) +CTranslatorUtils::GetColumnDescriptorsFromBase(CMemoryPool *mp, + CIdGenerator *id_generator, + IMDId *mdid_return_type, + INT type_modifier, + CMDName *pmdName) { CDXLColDescrArray *column_descrs = GPOS_NEW(mp) CDXLColDescrArray(mp); mdid_return_type->AddRef(); CMDName *col_mdname = GPOS_NEW(mp) CMDName(mp, pmdName->GetMDName()); - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - col_mdname, - id_generator->next_id(), - INT(1) /* attno */, - mdid_return_type, - type_modifier, /* type_modifier */ - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, col_mdname, id_generator->next_id(), INT(1) /* attno */, + mdid_return_type, type_modifier, /* type_modifier */ + false /* fColDropped */ + ); column_descrs->Append(dxl_col_descr); @@ -596,13 +554,10 @@ CTranslatorUtils::GetColumnDescriptorsFromBase // //--------------------------------------------------------------------------- CDXLColDescrArray * -CTranslatorUtils::GetColumnDescriptorsFromComposite - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const IMDType *type - ) +CTranslatorUtils::GetColumnDescriptorsFromComposite(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *id_generator, + const IMDType *type) { CMDColumnArray *col_ptr_arr = ExpandCompositeType(mp, md_accessor, type); @@ -612,20 +567,16 @@ CTranslatorUtils::GetColumnDescriptorsFromComposite { IMDColumn *md_col = (*col_ptr_arr)[ul]; - CMDName *col_mdname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); + CMDName *col_mdname = + GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); IMDId *col_type = md_col->MdidType(); col_type->AddRef(); - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - col_mdname, - id_generator->next_id(), - INT(ul + 1) /* attno */, - col_type, - md_col->TypeModifier(), /* type_modifier */ - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr( + mp, col_mdname, id_generator->next_id(), INT(ul + 1) /* attno */, + col_type, md_col->TypeModifier(), /* type_modifier */ + false /* fColDropped */ + ); column_descrs->Append(dxl_col_descr); } @@ -643,12 +594,8 @@ CTranslatorUtils::GetColumnDescriptorsFromComposite // //--------------------------------------------------------------------------- CMDColumnArray * -CTranslatorUtils::ExpandCompositeType - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const IMDType *type - ) +CTranslatorUtils::ExpandCompositeType(CMemoryPool *mp, CMDAccessor *md_accessor, + const IMDType *type) { GPOS_ASSERT(NULL != type); GPOS_ASSERT(type->IsComposite()); @@ -659,7 +606,7 @@ CTranslatorUtils::ExpandCompositeType CMDColumnArray *pdrgPmdcol = GPOS_NEW(mp) CMDColumnArray(mp); - for(ULONG ul = 0; ul < rel->ColumnCount(); ul++) + for (ULONG ul = 0; ul < rel->ColumnCount(); ul++) { CMDColumn *md_col = (CMDColumn *) rel->GetMdCol(ul); @@ -682,10 +629,7 @@ CTranslatorUtils::ExpandCompositeType // //--------------------------------------------------------------------------- EdxlJoinType -CTranslatorUtils::ConvertToDXLJoinType - ( - JoinType jt - ) +CTranslatorUtils::ConvertToDXLJoinType(JoinType jt) { EdxlJoinType join_type = EdxljtSentinel; @@ -737,10 +681,7 @@ CTranslatorUtils::ConvertToDXLJoinType // //--------------------------------------------------------------------------- EdxlIndexScanDirection -CTranslatorUtils::ConvertToDXLIndexScanDirection - ( - ScanDirection sd - ) +CTranslatorUtils::ConvertToDXLIndexScanDirection(ScanDirection sd) { EdxlIndexScanDirection idx_scan_direction = EdxlisdSentinel; @@ -776,11 +717,7 @@ CTranslatorUtils::ConvertToDXLIndexScanDirection // //--------------------------------------------------------------------------- const CDXLColDescr * -CTranslatorUtils::GetColumnDescrAt - ( - const CDXLTableDescr *table_descr, - ULONG pos - ) +CTranslatorUtils::GetColumnDescrAt(const CDXLTableDescr *table_descr, ULONG pos) { GPOS_ASSERT(0 != pos); GPOS_ASSERT(pos < table_descr->Arity()); @@ -797,10 +734,7 @@ CTranslatorUtils::GetColumnDescrAt // //--------------------------------------------------------------------------- const CWStringConst * -CTranslatorUtils::GetSystemColName - ( - AttrNumber attno - ) +CTranslatorUtils::GetSystemColName(AttrNumber attno) { GPOS_ASSERT(FirstLowInvalidHeapAttributeNumber < attno && 0 > attno); @@ -831,12 +765,8 @@ CTranslatorUtils::GetSystemColName return CDXLTokens::GetDXLTokenStr(EdxltokenGpSegmentIdColName); default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Invalid attribute number") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Invalid attribute number")); return NULL; } } @@ -850,11 +780,7 @@ CTranslatorUtils::GetSystemColName // //--------------------------------------------------------------------------- CMDIdGPDB * -CTranslatorUtils::GetSystemColType - ( - CMemoryPool *mp, - AttrNumber attno - ) +CTranslatorUtils::GetSystemColType(CMemoryPool *mp, AttrNumber attno) { GPOS_ASSERT(FirstLowInvalidHeapAttributeNumber < attno && 0 > attno); @@ -884,12 +810,8 @@ CTranslatorUtils::GetSystemColType return GPOS_NEW(mp) CMDIdGPDB(GPDB_INT4); default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Invalid attribute number") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Invalid attribute number")); return NULL; } } @@ -897,10 +819,7 @@ CTranslatorUtils::GetSystemColType // Returns the length for the system column with given attno number const ULONG -CTranslatorUtils::GetSystemColLength - ( - AttrNumber attno - ) +CTranslatorUtils::GetSystemColLength(AttrNumber attno) { GPOS_ASSERT(FirstLowInvalidHeapAttributeNumber < attno && 0 > attno); @@ -927,12 +846,8 @@ CTranslatorUtils::GetSystemColLength return 4; default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Invalid attribute number") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Invalid attribute number")); return gpos::ulong_max; } } @@ -947,10 +862,7 @@ CTranslatorUtils::GetSystemColLength // //--------------------------------------------------------------------------- ScanDirection -CTranslatorUtils::GetScanDirection - ( - EdxlIndexScanDirection idx_scan_direction - ) +CTranslatorUtils::GetScanDirection(EdxlIndexScanDirection idx_scan_direction) { if (EdxlisdBackward == idx_scan_direction) { @@ -974,31 +886,25 @@ CTranslatorUtils::GetScanDirection // //--------------------------------------------------------------------------- OID -CTranslatorUtils::OidCmpOperator - ( - Expr* expr - ) +CTranslatorUtils::OidCmpOperator(Expr *expr) { - GPOS_ASSERT(IsA(expr, OpExpr) || IsA(expr, ScalarArrayOpExpr) || IsA(expr, RowCompareExpr)); + GPOS_ASSERT(IsA(expr, OpExpr) || IsA(expr, ScalarArrayOpExpr) || + IsA(expr, RowCompareExpr)); switch (expr->type) { case T_OpExpr: return ((OpExpr *) expr)->opno; - + case T_ScalarArrayOpExpr: - return ((ScalarArrayOpExpr*) expr)->opno; + return ((ScalarArrayOpExpr *) expr)->opno; case T_RowCompareExpr: return LInitialOID(((RowCompareExpr *) expr)->opnos); - + default: - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Unsupported comparison") - ); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, + GPOS_WSZ_LIT("Unsupported comparison")); return InvalidOid; } } @@ -1012,19 +918,15 @@ CTranslatorUtils::OidCmpOperator // //--------------------------------------------------------------------------- OID -CTranslatorUtils::GetOpFamilyForIndexQual - ( - INT attno, - OID index_oid - ) +CTranslatorUtils::GetOpFamilyForIndexQual(INT attno, OID index_oid) { Relation rel = gpdb::GetRelation(index_oid); GPOS_ASSERT(NULL != rel); GPOS_ASSERT(attno <= rel->rd_index->indnatts); - + OID op_family_oid = rel->rd_opfamily[attno - 1]; gpdb::CloseRelation(rel); - + return op_family_oid; } @@ -1037,11 +939,7 @@ CTranslatorUtils::GetOpFamilyForIndexQual // //--------------------------------------------------------------------------- EdxlSetOpType -CTranslatorUtils::GetSetOpType - ( - SetOperation setop, - BOOL is_all - ) +CTranslatorUtils::GetSetOpType(SetOperation setop, BOOL is_all) { if (SETOP_UNION == setop && is_all) { @@ -1087,19 +985,13 @@ CTranslatorUtils::GetSetOpType // //--------------------------------------------------------------------------- WindowExclusion -CTranslatorUtils::Windowexclusion - ( - EdxlFrameExclusionStrategy edxlfes - ) +CTranslatorUtils::Windowexclusion(EdxlFrameExclusionStrategy edxlfes) { GPOS_ASSERT(EdxlfesSentinel > edxlfes); - ULONG rgrgulMapping[][2] = - { - {EdxlfesNulls, WINDOW_EXCLUSION_NULL}, - {EdxlfesCurrentRow, WINDOW_EXCLUSION_CUR_ROW}, - {EdxlfesGroup, WINDOW_EXCLUSION_GROUP}, - {EdxlfesTies, WINDOW_EXCLUSION_TIES} - }; + ULONG rgrgulMapping[][2] = {{EdxlfesNulls, WINDOW_EXCLUSION_NULL}, + {EdxlfesCurrentRow, WINDOW_EXCLUSION_CUR_ROW}, + {EdxlfesGroup, WINDOW_EXCLUSION_GROUP}, + {EdxlfesTies, WINDOW_EXCLUSION_TIES}}; const ULONG ulArity = GPOS_ARRAY_SIZE(rgrgulMapping); WindowExclusion we = WINDOW_EXCLUSION_NO_OTHERS; @@ -1127,23 +1019,18 @@ CTranslatorUtils::Windowexclusion // //--------------------------------------------------------------------------- WindowBoundingKind -CTranslatorUtils::Windowboundkind - ( - EdxlFrameBoundary edxlfb - ) +CTranslatorUtils::Windowboundkind(EdxlFrameBoundary edxlfb) { GPOS_ASSERT(EdxlfbSentinel > edxlfb); - ULONG rgrgulMapping[][2] = - { - {EdxlfbUnboundedPreceding, WINDOW_UNBOUND_PRECEDING}, - {EdxlfbBoundedPreceding, WINDOW_BOUND_PRECEDING}, - {EdxlfbCurrentRow, WINDOW_CURRENT_ROW}, - {EdxlfbBoundedFollowing, WINDOW_BOUND_FOLLOWING}, - {EdxlfbUnboundedFollowing, WINDOW_UNBOUND_FOLLOWING}, - {EdxlfbDelayedBoundedPreceding, WINDOW_DELAYED_BOUND_PRECEDING}, - {EdxlfbDelayedBoundedFollowing, WINDOW_DELAYED_BOUND_FOLLOWING} - }; + ULONG rgrgulMapping[][2] = { + {EdxlfbUnboundedPreceding, WINDOW_UNBOUND_PRECEDING}, + {EdxlfbBoundedPreceding, WINDOW_BOUND_PRECEDING}, + {EdxlfbCurrentRow, WINDOW_CURRENT_ROW}, + {EdxlfbBoundedFollowing, WINDOW_BOUND_FOLLOWING}, + {EdxlfbUnboundedFollowing, WINDOW_UNBOUND_FOLLOWING}, + {EdxlfbDelayedBoundedPreceding, WINDOW_DELAYED_BOUND_PRECEDING}, + {EdxlfbDelayedBoundedFollowing, WINDOW_DELAYED_BOUND_FOLLOWING}}; const ULONG ulArity = GPOS_ARRAY_SIZE(rgrgulMapping); WindowBoundingKind wbk = WINDOW_UNBOUND_PRECEDING; @@ -1156,7 +1043,8 @@ CTranslatorUtils::Windowboundkind break; } } - GPOS_ASSERT(WINDOW_DELAYED_BOUND_FOLLOWING >= wbk && "Invalid window frame boundary"); + GPOS_ASSERT(WINDOW_DELAYED_BOUND_FOLLOWING >= wbk && + "Invalid window frame boundary"); return wbk; } @@ -1172,12 +1060,9 @@ CTranslatorUtils::Windowboundkind // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorUtils::GetGroupingColidArray - ( - CMemoryPool *mp, - CBitSet *group_by_cols, - IntToUlongMap *sort_group_cols_to_colid_map - ) +CTranslatorUtils::GetGroupingColidArray( + CMemoryPool *mp, CBitSet *group_by_cols, + IntToUlongMap *sort_group_cols_to_colid_map) { ULongPtrArray *colids = GPOS_NEW(mp) ULongPtrArray(mp); @@ -1187,7 +1072,8 @@ CTranslatorUtils::GetGroupingColidArray while (bsi.Advance()) { - const ULONG colid = GetColId(bsi.Bit(), sort_group_cols_to_colid_map); + const ULONG colid = + GetColId(bsi.Bit(), sort_group_cols_to_colid_map); colids->Append(GPOS_NEW(mp) ULONG(colid)); } } @@ -1205,25 +1091,24 @@ CTranslatorUtils::GetGroupingColidArray // //--------------------------------------------------------------------------- CBitSetArray * -CTranslatorUtils::GetColumnAttnosForGroupBy - ( - CMemoryPool *mp, - List *group_clause_list, - ULONG num_cols, - UlongToUlongMap *group_col_pos, // mapping of grouping col positions to SortGroupRef ids - CBitSet *group_cols // existing uniqueue grouping columns - ) +CTranslatorUtils::GetColumnAttnosForGroupBy( + CMemoryPool *mp, List *group_clause_list, ULONG num_cols, + UlongToUlongMap * + group_col_pos, // mapping of grouping col positions to SortGroupRef ids + CBitSet *group_cols // existing uniqueue grouping columns +) { GPOS_ASSERT(NULL != group_clause_list); GPOS_ASSERT(0 < gpdb::ListLength(group_clause_list)); GPOS_ASSERT(NULL != group_col_pos); - Node *node = (Node*) LInitial(group_clause_list); + Node *node = (Node *) LInitial(group_clause_list); if (NULL == node || IsA(node, GroupClause)) { // simple group by - CBitSet *col_attnos = CreateAttnoSetForGroupingSet(mp, group_clause_list, num_cols, group_col_pos, group_cols); + CBitSet *col_attnos = CreateAttnoSetForGroupingSet( + mp, group_clause_list, num_cols, group_col_pos, group_cols); CBitSetArray *col_attnos_arr = GPOS_NEW(mp) CBitSetArray(mp); col_attnos_arr->Append(col_attnos); return col_attnos_arr; @@ -1231,7 +1116,8 @@ CTranslatorUtils::GetColumnAttnosForGroupBy if (!IsA(node, GroupingClause)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Group by clause")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Group by clause")); } const ULONG num_group_clauses = gpdb::ListLength(group_clause_list); @@ -1239,25 +1125,28 @@ CTranslatorUtils::GetColumnAttnosForGroupBy if (1 < num_group_clauses) { // multiple grouping sets - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Multiple grouping sets specifications")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Multiple grouping sets specifications")); } GroupingClause *grouping_clause = (GroupingClause *) node; if (GROUPINGTYPE_ROLLUP == grouping_clause->groupType) { - return CreateGroupingSetsForRollup(mp, grouping_clause, num_cols, group_col_pos, group_cols); + return CreateGroupingSetsForRollup(mp, grouping_clause, num_cols, + group_col_pos, group_cols); } if (GROUPINGTYPE_CUBE == grouping_clause->groupType) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Cube")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Cube")); } CBitSetArray *col_attnos_arr = GPOS_NEW(mp) CBitSetArray(mp); ListCell *grouping_set = NULL; - ForEach (grouping_set, grouping_clause->groupsets) + ForEach(grouping_set, grouping_clause->groupsets) { Node *grouping_set_node = (Node *) lfirst(grouping_set); @@ -1266,13 +1155,15 @@ CTranslatorUtils::GetColumnAttnosForGroupBy { // grouping set contains a single grouping column bset = GPOS_NEW(mp) CBitSet(mp, num_cols); - ULONG sort_group_ref = ((GroupClause *) grouping_set_node)->tleSortGroupRef; + ULONG sort_group_ref = + ((GroupClause *) grouping_set_node)->tleSortGroupRef; bset->ExchangeSet(sort_group_ref); UpdateGrpColMapping(mp, group_col_pos, group_cols, sort_group_ref); } else if (IsA(grouping_set_node, GroupingClause)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Multiple grouping sets specifications")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Multiple grouping sets specifications")); } else { @@ -1280,7 +1171,8 @@ CTranslatorUtils::GetColumnAttnosForGroupBy GPOS_ASSERT(IsA(grouping_set_node, List)); List *grouping_set_list = (List *) grouping_set_node; - bset = CreateAttnoSetForGroupingSet(mp, grouping_set_list, num_cols, group_col_pos, group_cols); + bset = CreateAttnoSetForGroupingSet(mp, grouping_set_list, num_cols, + group_col_pos, group_cols); } col_attnos_arr->Append(bset); } @@ -1297,20 +1189,18 @@ CTranslatorUtils::GetColumnAttnosForGroupBy // //--------------------------------------------------------------------------- CBitSetArray * -CTranslatorUtils::CreateGroupingSetsForRollup - ( - CMemoryPool *mp, - GroupingClause *grouping_clause, - ULONG num_cols, - UlongToUlongMap *group_col_pos, // mapping of grouping col positions to SortGroupRef ids, - CBitSet *group_cols // existing grouping columns - ) +CTranslatorUtils::CreateGroupingSetsForRollup( + CMemoryPool *mp, GroupingClause *grouping_clause, ULONG num_cols, + UlongToUlongMap * + group_col_pos, // mapping of grouping col positions to SortGroupRef ids, + CBitSet *group_cols // existing grouping columns +) { GPOS_ASSERT(NULL != grouping_clause); CBitSetArray *grouping_sets = GPOS_NEW(mp) CBitSetArray(mp); ListCell *grouping_set = NULL; - ForEach (grouping_set, grouping_clause->groupsets) + ForEach(grouping_set, grouping_clause->groupsets) { Node *node = (Node *) lfirst(grouping_set); CBitSet *bs = GPOS_NEW(mp) CBitSet(mp); @@ -1329,32 +1219,37 @@ CTranslatorUtils::CreateGroupingSetsForRollup // for example, rollup((a,b),(c,d)); List *list = (List *) node; ListCell *group_clause = NULL; - ForEach (group_clause, list) + ForEach(group_clause, list) { Node *group_clause_node = (Node *) lfirst(group_clause); if (!IsA(group_clause_node, GroupClause)) { // each list entry must be a group clause // for example, rollup((a,b),(c,(d,e))); - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Nested grouping sets")); + GPOS_RAISE(gpdxl::ExmaDXL, + gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Nested grouping sets")); } - GroupClause *sort_group_clause = (GroupClause *) group_clause_node; + GroupClause *sort_group_clause = + (GroupClause *) group_clause_node; ULONG sort_group_ref = sort_group_clause->tleSortGroupRef; (void) bs->ExchangeSet(sort_group_ref); - UpdateGrpColMapping(mp, group_col_pos, group_cols, sort_group_ref); + UpdateGrpColMapping(mp, group_col_pos, group_cols, + sort_group_ref); } grouping_sets->Append(bs); } else { // unsupported rollup operation - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Nested grouping sets")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT("Nested grouping sets")); } } const ULONG num_grouping_sets = grouping_sets->Size(); - CBitSetArray * col_attnos_arr = GPOS_NEW(mp) CBitSetArray(mp); + CBitSetArray *col_attnos_arr = GPOS_NEW(mp) CBitSetArray(mp); // compute prefixes of grouping sets array for (ULONG ulPrefix = 0; ulPrefix <= num_grouping_sets; ulPrefix++) @@ -1382,14 +1277,12 @@ CTranslatorUtils::CreateGroupingSetsForRollup // //--------------------------------------------------------------------------- CBitSet * -CTranslatorUtils::CreateAttnoSetForGroupingSet - ( - CMemoryPool *mp, - List *group_elems, - ULONG num_cols, - UlongToUlongMap *group_col_pos, // mapping of grouping col positions to SortGroupRef ids, - CBitSet *group_cols // existing grouping columns - ) +CTranslatorUtils::CreateAttnoSetForGroupingSet( + CMemoryPool *mp, List *group_elems, ULONG num_cols, + UlongToUlongMap * + group_col_pos, // mapping of grouping col positions to SortGroupRef ids, + CBitSet *group_cols // existing grouping columns +) { GPOS_ASSERT(NULL != group_elems); GPOS_ASSERT(0 < gpdb::ListLength(group_elems)); @@ -1397,9 +1290,9 @@ CTranslatorUtils::CreateAttnoSetForGroupingSet CBitSet *bs = GPOS_NEW(mp) CBitSet(mp, num_cols); ListCell *lc = NULL; - ForEach (lc, group_elems) + ForEach(lc, group_elems) { - Node *elem_node = (Node*) lfirst(lc); + Node *elem_node = (Node *) lfirst(lc); if (NULL == elem_node) { @@ -1408,15 +1301,17 @@ CTranslatorUtils::CreateAttnoSetForGroupingSet if (!IsA(elem_node, GroupClause)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("Mixing grouping sets with simple group by lists")); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "Mixing grouping sets with simple group by lists")); } ULONG sort_group_ref = ((GroupClause *) elem_node)->tleSortGroupRef; bs->ExchangeSet(sort_group_ref); - + UpdateGrpColMapping(mp, group_col_pos, group_cols, sort_group_ref); } - + return bs; } @@ -1429,15 +1324,12 @@ CTranslatorUtils::CreateAttnoSetForGroupingSet // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorUtils::GenerateColIds - ( - CMemoryPool *mp, - List *target_list, - IMdIdArray *input_mdid_arr, +CTranslatorUtils::GenerateColIds( + CMemoryPool *mp, List *target_list, IMdIdArray *input_mdid_arr, ULongPtrArray *input_colids, - BOOL *is_outer_ref, // array of flags indicating if input columns are outer references - CIdGenerator *colid_generator - ) + BOOL * + is_outer_ref, // array of flags indicating if input columns are outer references + CIdGenerator *colid_generator) { GPOS_ASSERT(NULL != target_list); GPOS_ASSERT(NULL != input_mdid_arr); @@ -1451,12 +1343,12 @@ CTranslatorUtils::GenerateColIds ListCell *target_entry_cell = NULL; ULongPtrArray *colid_array = GPOS_NEW(mp) ULongPtrArray(mp); - ForEach (target_entry_cell, target_list) + ForEach(target_entry_cell, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(target_entry_cell); GPOS_ASSERT(NULL != target_entry->expr); - OID expr_type_oid = gpdb::ExprType((Node*) target_entry->expr); + OID expr_type_oid = gpdb::ExprType((Node *) target_entry->expr); if (!target_entry->resjunk) { ULONG colid = gpos::ulong_max; @@ -1466,7 +1358,7 @@ CTranslatorUtils::GenerateColIds { // generate a new column when: // (1) the type of input column does not match that of the output column, or - // (2) input column is an outer reference + // (2) input column is an outer reference colid = colid_generator->next_id(); } else @@ -1475,7 +1367,7 @@ CTranslatorUtils::GenerateColIds colid = *(*input_colids)[col_pos]; } GPOS_ASSERT(gpos::ulong_max != colid); - + colid_array->Append(GPOS_NEW(mp) ULONG(colid)); col_pos++; @@ -1495,11 +1387,8 @@ CTranslatorUtils::GenerateColIds // of the output target list; otherwise return the original query //--------------------------------------------------------------------------- Query * -CTranslatorUtils::FixUnknownTypeConstant - ( - Query *old_query, - List *output_target_list - ) +CTranslatorUtils::FixUnknownTypeConstant(Query *old_query, + List *output_target_list) { GPOS_ASSERT(NULL != old_query); GPOS_ASSERT(NULL != output_target_list); @@ -1509,33 +1398,36 @@ CTranslatorUtils::FixUnknownTypeConstant ULONG pos = 0; ULONG col_pos = 0; ListCell *target_entry_cell = NULL; - ForEach (target_entry_cell, old_query->targetList) + ForEach(target_entry_cell, old_query->targetList) { - TargetEntry *old_target_entry = (TargetEntry *) lfirst(target_entry_cell); + TargetEntry *old_target_entry = + (TargetEntry *) lfirst(target_entry_cell); GPOS_ASSERT(NULL != old_target_entry->expr); if (!old_target_entry->resjunk) { - if (IsA(old_target_entry->expr, Const) && (GPDB_UNKNOWN == gpdb::ExprType((Node*) old_target_entry->expr) )) + if (IsA(old_target_entry->expr, Const) && + (GPDB_UNKNOWN == + gpdb::ExprType((Node *) old_target_entry->expr))) { if (NULL == new_query) { - new_query = (Query*) gpdb::CopyObject(const_cast(old_query)); + new_query = (Query *) gpdb::CopyObject( + const_cast(old_query)); } - TargetEntry *new_target_entry = (TargetEntry *) gpdb::ListNth(new_query->targetList, pos); + TargetEntry *new_target_entry = + (TargetEntry *) gpdb::ListNth(new_query->targetList, pos); GPOS_ASSERT(old_target_entry->resno == new_target_entry->resno); // implicitly cast the unknown constants to the target data type - OID target_type_oid = GetTargetListReturnTypeOid(output_target_list, col_pos); + OID target_type_oid = + GetTargetListReturnTypeOid(output_target_list, col_pos); GPOS_ASSERT(InvalidOid != target_type_oid); Node *old_node = (Node *) new_target_entry->expr; - new_target_entry->expr = (Expr*) gpdb::CoerceToCommonType - ( - NULL, /* pstate */ - (Node *) old_node, - target_type_oid, - "UNION/INTERSECT/EXCEPT" - ); + new_target_entry->expr = (Expr *) gpdb::CoerceToCommonType( + NULL, /* pstate */ + (Node *) old_node, target_type_oid, + "UNION/INTERSECT/EXCEPT"); gpdb::GPDBFree(old_node); } @@ -1564,16 +1456,12 @@ CTranslatorUtils::FixUnknownTypeConstant // //--------------------------------------------------------------------------- OID -CTranslatorUtils::GetTargetListReturnTypeOid - ( - List *target_list, - ULONG col_pos - ) +CTranslatorUtils::GetTargetListReturnTypeOid(List *target_list, ULONG col_pos) { ULONG col_idx = 0; ListCell *target_entry_cell = NULL; - ForEach (target_entry_cell, target_list) + ForEach(target_entry_cell, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(target_entry_cell); GPOS_ASSERT(NULL != target_entry->expr); @@ -1582,7 +1470,7 @@ CTranslatorUtils::GetTargetListReturnTypeOid { if (col_idx == col_pos) { - return gpdb::ExprType((Node*) target_entry->expr); + return gpdb::ExprType((Node *) target_entry->expr); } col_idx++; @@ -1602,13 +1490,9 @@ CTranslatorUtils::GetTargetListReturnTypeOid // //--------------------------------------------------------------------------- CDXLColDescrArray * -CTranslatorUtils::GetDXLColumnDescrArray - ( - CMemoryPool *mp, - List *target_list, - ULongPtrArray *colids, - BOOL keep_res_junked - ) +CTranslatorUtils::GetDXLColumnDescrArray(CMemoryPool *mp, List *target_list, + ULongPtrArray *colids, + BOOL keep_res_junked) { GPOS_ASSERT(NULL != target_list); GPOS_ASSERT(NULL != colids); @@ -1616,7 +1500,7 @@ CTranslatorUtils::GetDXLColumnDescrArray ListCell *target_entry_cell = NULL; CDXLColDescrArray *dxl_col_descrs = GPOS_NEW(mp) CDXLColDescrArray(mp); ULONG ul = 0; - ForEach (target_entry_cell, target_list) + ForEach(target_entry_cell, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(target_entry_cell); @@ -1626,7 +1510,8 @@ CTranslatorUtils::GetDXLColumnDescrArray } ULONG colid = *(*colids)[ul]; - CDXLColDescr *dxl_col_descr = GetColumnDescrAt(mp, target_entry, colid, ul+1 /*pos*/); + CDXLColDescr *dxl_col_descr = + GetColumnDescrAt(mp, target_entry, colid, ul + 1 /*pos*/); dxl_col_descrs->Append(dxl_col_descr); ul++; } @@ -1645,19 +1530,15 @@ CTranslatorUtils::GetDXLColumnDescrArray // target list //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorUtils::GetPosInTargetList - ( - CMemoryPool *mp, - List *target_list, - BOOL keep_res_junked - ) +CTranslatorUtils::GetPosInTargetList(CMemoryPool *mp, List *target_list, + BOOL keep_res_junked) { GPOS_ASSERT(NULL != target_list); ListCell *target_entry_cell = NULL; ULongPtrArray *positions = GPOS_NEW(mp) ULongPtrArray(mp); ULONG ul = 0; - ForEach (target_entry_cell, target_list) + ForEach(target_entry_cell, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(target_entry_cell); @@ -1682,13 +1563,8 @@ CTranslatorUtils::GetPosInTargetList // identifier //--------------------------------------------------------------------------- CDXLColDescr * -CTranslatorUtils::GetColumnDescrAt - ( - CMemoryPool *mp, - TargetEntry *target_entry, - ULONG colid, - ULONG pos - ) +CTranslatorUtils::GetColumnDescrAt(CMemoryPool *mp, TargetEntry *target_entry, + ULONG colid, ULONG pos) { GPOS_ASSERT(NULL != target_entry); GPOS_ASSERT(gpos::ulong_max != colid); @@ -1701,7 +1577,8 @@ CTranslatorUtils::GetColumnDescrAt } else { - CWStringDynamic *alias = CDXLUtils::CreateDynamicStringFromCharArray(mp, target_entry->resname); + CWStringDynamic *alias = CDXLUtils::CreateDynamicStringFromCharArray( + mp, target_entry->resname); mdname = GPOS_NEW(mp) CMDName(mp, alias); // CName constructor copies string GPOS_DELETE(alias); @@ -1711,16 +1588,11 @@ CTranslatorUtils::GetColumnDescrAt OID type_oid = gpdb::ExprType((Node *) target_entry->expr); INT type_modifier = gpdb::ExprTypeMod((Node *) target_entry->expr); CMDIdGPDB *col_type = GPOS_NEW(mp) CMDIdGPDB(type_oid); - CDXLColDescr *dxl_col_descr = GPOS_NEW(mp) CDXLColDescr - ( - mp, - mdname, - colid, - pos, /* attno */ - col_type, - type_modifier, /* type_modifier */ - false /* fColDropped */ - ); + CDXLColDescr *dxl_col_descr = + GPOS_NEW(mp) CDXLColDescr(mp, mdname, colid, pos, /* attno */ + col_type, type_modifier, /* type_modifier */ + false /* fColDropped */ + ); return dxl_col_descr; } @@ -1733,33 +1605,29 @@ CTranslatorUtils::GetColumnDescrAt // Create a dummy project element to rename the input column identifier //--------------------------------------------------------------------------- CDXLNode * -CTranslatorUtils::CreateDummyProjectElem - ( - CMemoryPool *mp, - ULONG colid_input, - ULONG colid_output, - CDXLColDescr *dxl_col_descr - ) +CTranslatorUtils::CreateDummyProjectElem(CMemoryPool *mp, ULONG colid_input, + ULONG colid_output, + CDXLColDescr *dxl_col_descr) { CMDIdGPDB *original_mdid = CMDIdGPDB::CastMdid(dxl_col_descr->MdidType()); - CMDIdGPDB *copy_mdid = GPOS_NEW(mp) CMDIdGPDB(original_mdid->Oid(), original_mdid->VersionMajor(), original_mdid->VersionMinor()); + CMDIdGPDB *copy_mdid = GPOS_NEW(mp) + CMDIdGPDB(original_mdid->Oid(), original_mdid->VersionMajor(), + original_mdid->VersionMinor()); // create a column reference for the scalar identifier to be casted - CMDName *mdname = GPOS_NEW(mp) CMDName(mp, dxl_col_descr->MdName()->GetMDName()); - CDXLColRef *dxl_colref = GPOS_NEW(mp) CDXLColRef(mp, mdname, colid_input, copy_mdid, dxl_col_descr->TypeModifier()); - CDXLScalarIdent *dxl_scalar_ident = GPOS_NEW(mp) CDXLScalarIdent(mp, dxl_colref); - - CDXLNode *dxl_project_element = GPOS_NEW(mp) CDXLNode - ( - mp, - GPOS_NEW(mp) CDXLScalarProjElem - ( - mp, - colid_output, - GPOS_NEW(mp) CMDName(mp, dxl_col_descr->MdName()->GetMDName()) - ), - GPOS_NEW(mp) CDXLNode(mp, dxl_scalar_ident) - ); + CMDName *mdname = + GPOS_NEW(mp) CMDName(mp, dxl_col_descr->MdName()->GetMDName()); + CDXLColRef *dxl_colref = GPOS_NEW(mp) CDXLColRef( + mp, mdname, colid_input, copy_mdid, dxl_col_descr->TypeModifier()); + CDXLScalarIdent *dxl_scalar_ident = + GPOS_NEW(mp) CDXLScalarIdent(mp, dxl_colref); + + CDXLNode *dxl_project_element = GPOS_NEW(mp) CDXLNode( + mp, + GPOS_NEW(mp) CDXLScalarProjElem( + mp, colid_output, + GPOS_NEW(mp) CMDName(mp, dxl_col_descr->MdName()->GetMDName())), + GPOS_NEW(mp) CDXLNode(mp, dxl_scalar_ident)); return dxl_project_element; } @@ -1773,12 +1641,8 @@ CTranslatorUtils::CreateDummyProjectElem // //--------------------------------------------------------------------------- ULongPtrArray * -CTranslatorUtils::GetOutputColIdsArray - ( - CMemoryPool *mp, - List *target_list, - IntToUlongMap *attno_to_colid_map - ) +CTranslatorUtils::GetOutputColIdsArray(CMemoryPool *mp, List *target_list, + IntToUlongMap *attno_to_colid_map) { GPOS_ASSERT(NULL != target_list); GPOS_ASSERT(NULL != attno_to_colid_map); @@ -1786,7 +1650,7 @@ CTranslatorUtils::GetOutputColIdsArray ULongPtrArray *colids = GPOS_NEW(mp) ULongPtrArray(mp); ListCell *target_entry_cell = NULL; - ForEach (target_entry_cell, target_list) + ForEach(target_entry_cell, target_list) { TargetEntry *target_entry = (TargetEntry *) lfirst(target_entry_cell); ULONG resno = (ULONG) target_entry->resno; @@ -1795,7 +1659,8 @@ CTranslatorUtils::GetOutputColIdsArray if (NULL == ul) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLAttributeNotFound, resno); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLAttributeNotFound, + resno); } colids->Append(GPOS_NEW(mp) ULONG(*ul)); @@ -1813,11 +1678,7 @@ CTranslatorUtils::GetOutputColIdsArray // //--------------------------------------------------------------------------- ULONG -CTranslatorUtils::GetColId - ( - INT index, - IntToUlongMap *colid_map - ) +CTranslatorUtils::GetColId(INT index, IntToUlongMap *colid_map) { GPOS_ASSERT(0 < index); @@ -1825,7 +1686,8 @@ CTranslatorUtils::GetColId if (NULL == ul) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLAttributeNotFound, index); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLAttributeNotFound, + index); } return *ul; @@ -1840,14 +1702,8 @@ CTranslatorUtils::GetColId // //--------------------------------------------------------------------------- ULONG -CTranslatorUtils::GetColId - ( - ULONG query_level, - INT varno, - INT var_attno, - IMDId *mdid, - CMappingVarColId *var_colid_mapping - ) +CTranslatorUtils::GetColId(ULONG query_level, INT varno, INT var_attno, + IMDId *mdid, CMappingVarColId *var_colid_mapping) { OID oid = CMDIdGPDB::CastMdid(mdid)->Oid(); Var *var = gpdb::MakeVar(varno, var_attno, oid, -1, 0); @@ -1864,23 +1720,21 @@ CTranslatorUtils::GetColId // // @doc: // Extract a matching target entry that is a window spec -// +// //--------------------------------------------------------------------------- TargetEntry * -CTranslatorUtils::GetWindowSpecTargetEntry - ( - Node *node, - List *window_clause_list, - List *target_list - ) +CTranslatorUtils::GetWindowSpecTargetEntry(Node *node, List *window_clause_list, + List *target_list) { GPOS_ASSERT(NULL != node); - List *target_list_subset = gpdb::FindMatchingMembersInTargetList(node, target_list); + List *target_list_subset = + gpdb::FindMatchingMembersInTargetList(node, target_list); ListCell *target_entry_cell = NULL; - ForEach (target_entry_cell, target_list_subset) + ForEach(target_entry_cell, target_list_subset) { - TargetEntry *cur_target_entry = (TargetEntry*) lfirst(target_entry_cell); + TargetEntry *cur_target_entry = + (TargetEntry *) lfirst(target_entry_cell); if (IsWindowSpec(cur_target_entry, window_clause_list)) { gpdb::GPDBFree(target_list_subset); @@ -1904,16 +1758,13 @@ CTranslatorUtils::GetWindowSpecTargetEntry // Check if the expression has a matching target entry that is a window spec //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsWindowSpec - ( - Node *node, - List *window_clause_list, - List *target_list - ) +CTranslatorUtils::IsWindowSpec(Node *node, List *window_clause_list, + List *target_list) { GPOS_ASSERT(NULL != node); - - TargetEntry *window_spec = GetWindowSpecTargetEntry(node, window_clause_list, target_list); + + TargetEntry *window_spec = + GetWindowSpecTargetEntry(node, window_clause_list, target_list); return (NULL != window_spec); } @@ -1927,17 +1778,15 @@ CTranslatorUtils::IsWindowSpec // Check if the TargetEntry is a used in the window specification //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsWindowSpec - ( - const TargetEntry *target_entry, - List *window_clause_list - ) +CTranslatorUtils::IsWindowSpec(const TargetEntry *target_entry, + List *window_clause_list) { ListCell *window_clause_cell = NULL; - ForEach (window_clause_cell, window_clause_list) + ForEach(window_clause_cell, window_clause_list) { - WindowSpec *window_spec = (WindowSpec*) lfirst(window_clause_cell); - if (IsSortingColumn(target_entry, window_spec->order) || IsSortingColumn(target_entry, window_spec->partition)) + WindowSpec *window_spec = (WindowSpec *) lfirst(window_clause_cell); + if (IsSortingColumn(target_entry, window_spec->order) || + IsSortingColumn(target_entry, window_spec->partition)) { return true; } @@ -1954,20 +1803,19 @@ CTranslatorUtils::IsWindowSpec // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorUtils::CreateDXLProjElemFromInt8Const - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - INT val - ) +CTranslatorUtils::CreateDXLProjElemFromInt8Const(CMemoryPool *mp, + CMDAccessor *md_accessor, + INT val) { GPOS_ASSERT(NULL != mp); const IMDTypeInt8 *md_type_int8 = md_accessor->PtMDType(); md_type_int8->MDId()->AddRef(); - CDXLDatumInt8 *datum_dxl = GPOS_NEW(mp) CDXLDatumInt8(mp, md_type_int8->MDId(), false /*fConstNull*/, val); + CDXLDatumInt8 *datum_dxl = GPOS_NEW(mp) + CDXLDatumInt8(mp, md_type_int8->MDId(), false /*fConstNull*/, val); - CDXLScalarConstValue *dxl_scalar_const = GPOS_NEW(mp) CDXLScalarConstValue(mp, datum_dxl); + CDXLScalarConstValue *dxl_scalar_const = + GPOS_NEW(mp) CDXLScalarConstValue(mp, datum_dxl); return GPOS_NEW(mp) CDXLNode(mp, dxl_scalar_const); } @@ -1981,17 +1829,16 @@ CTranslatorUtils::CreateDXLProjElemFromInt8Const // Check if the TargetEntry is a sorting column //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsSortingColumn - ( - const TargetEntry *target_entry, - List *sort_clause_list - ) +CTranslatorUtils::IsSortingColumn(const TargetEntry *target_entry, + List *sort_clause_list) { ListCell *sort_clause_cell = NULL; - ForEach (sort_clause_cell, sort_clause_list) + ForEach(sort_clause_cell, sort_clause_list) { - Node *sort_clause = (Node*) lfirst(sort_clause_cell); - if (IsA(sort_clause, SortClause) && target_entry->ressortgroupref == ((SortClause *) sort_clause)->tleSortGroupRef) + Node *sort_clause = (Node *) lfirst(sort_clause_cell); + if (IsA(sort_clause, SortClause) && + target_entry->ressortgroupref == + ((SortClause *) sort_clause)->tleSortGroupRef) { return true; } @@ -2009,20 +1856,18 @@ CTranslatorUtils::IsSortingColumn // Extract a matching target entry that is a grouping column //--------------------------------------------------------------------------- TargetEntry * -CTranslatorUtils::GetGroupingColumnTargetEntry - ( - Node *node, - List *group_clause, - List *target_list - ) +CTranslatorUtils::GetGroupingColumnTargetEntry(Node *node, List *group_clause, + List *target_list) { GPOS_ASSERT(NULL != node); - List *target_list_subset = gpdb::FindMatchingMembersInTargetList(node, target_list); + List *target_list_subset = + gpdb::FindMatchingMembersInTargetList(node, target_list); ListCell *target_entry_cell = NULL; - ForEach (target_entry_cell, target_list_subset) + ForEach(target_entry_cell, target_list_subset) { - TargetEntry *next_target_entry = (TargetEntry*) lfirst(target_entry_cell); + TargetEntry *next_target_entry = + (TargetEntry *) lfirst(target_entry_cell); if (IsGroupingColumn(next_target_entry, group_clause)) { gpdb::GPDBFree(target_list_subset); @@ -2046,16 +1891,13 @@ CTranslatorUtils::GetGroupingColumnTargetEntry // Check if the expression has a matching target entry that is a grouping column //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsGroupingColumn - ( - Node *node, - List *group_clause, - List *target_list - ) +CTranslatorUtils::IsGroupingColumn(Node *node, List *group_clause, + List *target_list) { GPOS_ASSERT(NULL != node); - TargetEntry *grouping_col_target_etnry = GetGroupingColumnTargetEntry(node, group_clause, target_list); + TargetEntry *grouping_col_target_etnry = + GetGroupingColumnTargetEntry(node, group_clause, target_list); return (NULL != grouping_col_target_etnry); } @@ -2069,42 +1911,44 @@ CTranslatorUtils::IsGroupingColumn // Check if the TargetEntry is a grouping column //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsGroupingColumn - ( - const TargetEntry *target_entry, - List *group_clause - ) +CTranslatorUtils::IsGroupingColumn(const TargetEntry *target_entry, + List *group_clause) { ListCell *group_clause_cell = NULL; - ForEach (group_clause_cell, group_clause) + ForEach(group_clause_cell, group_clause) { - Node *group_clause_node = (Node*) lfirst(group_clause_cell); + Node *group_clause_node = (Node *) lfirst(group_clause_cell); if (NULL == group_clause_node) { continue; } - if (IsA(group_clause_node, GroupClause) && IsGroupingColumn(target_entry, (GroupClause*) group_clause_node)) + if (IsA(group_clause_node, GroupClause) && + IsGroupingColumn(target_entry, (GroupClause *) group_clause_node)) { return true; } if (IsA(group_clause_node, GroupingClause)) { - GroupingClause *grouping_clause = (GroupingClause *) group_clause_node; + GroupingClause *grouping_clause = + (GroupingClause *) group_clause_node; ListCell *grouping_set = NULL; - ForEach (grouping_set, grouping_clause->groupsets) + ForEach(grouping_set, grouping_clause->groupsets) { Node *grouping_set_node = (Node *) lfirst(grouping_set); - if (IsA(grouping_set_node, GroupClause) && IsGroupingColumn(target_entry, ((GroupClause *) grouping_set_node))) + if (IsA(grouping_set_node, GroupClause) && + IsGroupingColumn(target_entry, + ((GroupClause *) grouping_set_node))) { return true; } - if (IsA(grouping_set_node, List) && IsGroupingColumn(target_entry, (List *) grouping_set_node)) + if (IsA(grouping_set_node, List) && + IsGroupingColumn(target_entry, (List *) grouping_set_node)) { return true; } @@ -2123,11 +1967,8 @@ CTranslatorUtils::IsGroupingColumn // Check if the TargetEntry is a grouping column //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsGroupingColumn - ( - const TargetEntry *target_entry, - const GroupClause *grouping_clause - ) +CTranslatorUtils::IsGroupingColumn(const TargetEntry *target_entry, + const GroupClause *grouping_clause) { GPOS_ASSERT(NULL != grouping_clause); @@ -2143,17 +1984,14 @@ CTranslatorUtils::IsGroupingColumn // the mappings in the provided context //--------------------------------------------------------------------------- List * -CTranslatorUtils::ConvertColidToAttnos - ( - ULongPtrArray *colids, - CDXLTranslateContext *translate_ctxt - ) +CTranslatorUtils::ConvertColidToAttnos(ULongPtrArray *colids, + CDXLTranslateContext *translate_ctxt) { GPOS_ASSERT(NULL != colids); GPOS_ASSERT(NULL != translate_ctxt); - + List *result = NIL; - + const ULONG length = colids->Size(); for (ULONG ul = 0; ul < length; ul++) { @@ -2162,7 +2000,7 @@ CTranslatorUtils::ConvertColidToAttnos GPOS_ASSERT(NULL != target_entry); result = gpdb::LAppendInt(result, target_entry->resno); } - + return result; } @@ -2175,10 +2013,7 @@ CTranslatorUtils::ConvertColidToAttnos // //--------------------------------------------------------------------------- LINT -CTranslatorUtils::GetLongFromStr - ( - const CWStringBase *wcstr - ) +CTranslatorUtils::GetLongFromStr(const CWStringBase *wcstr) { CHAR *str = CreateMultiByteCharStringFromWCString(wcstr->GetBuffer()); CHAR *end = NULL; @@ -2194,10 +2029,7 @@ CTranslatorUtils::GetLongFromStr // //--------------------------------------------------------------------------- INT -CTranslatorUtils::GetIntFromStr - ( - const CWStringBase *wcstr - ) +CTranslatorUtils::GetIntFromStr(const CWStringBase *wcstr) { return (INT) GetLongFromStr(wcstr); } @@ -2211,10 +2043,7 @@ CTranslatorUtils::GetIntFromStr // //--------------------------------------------------------------------------- CHAR * -CTranslatorUtils::CreateMultiByteCharStringFromWCString - ( - const WCHAR *wcstr - ) +CTranslatorUtils::CreateMultiByteCharStringFromWCString(const WCHAR *wcstr) { GPOS_ASSERT(NULL != wcstr); @@ -2223,7 +2052,7 @@ CTranslatorUtils::CreateMultiByteCharStringFromWCString #ifdef GPOS_DEBUG LINT li = (INT) #endif - clib::Wcstombs(str, const_cast(wcstr), max_len); + clib::Wcstombs(str, const_cast(wcstr), max_len); GPOS_ASSERT(0 <= li); str[max_len - 1] = '\0'; @@ -2240,17 +2069,14 @@ CTranslatorUtils::CreateMultiByteCharStringFromWCString // //--------------------------------------------------------------------------- UlongToUlongMap * -CTranslatorUtils::MakeNewToOldColMapping - ( - CMemoryPool *mp, - ULongPtrArray *old_colids, - ULongPtrArray *new_colids - ) +CTranslatorUtils::MakeNewToOldColMapping(CMemoryPool *mp, + ULongPtrArray *old_colids, + ULongPtrArray *new_colids) { GPOS_ASSERT(NULL != old_colids); GPOS_ASSERT(NULL != new_colids); GPOS_ASSERT(new_colids->Size() == old_colids->Size()); - + UlongToUlongMap *old_new_col_mapping = GPOS_NEW(mp) UlongToUlongMap(mp); const ULONG num_cols = old_colids->Size(); for (ULONG ul = 0; ul < num_cols; ul++) @@ -2259,11 +2085,12 @@ CTranslatorUtils::MakeNewToOldColMapping ULONG new_colid = *((*new_colids)[ul]); #ifdef GPOS_DEBUG BOOL result = -#endif // GPOS_DEBUG - old_new_col_mapping->Insert(GPOS_NEW(mp) ULONG(old_colid), GPOS_NEW(mp) ULONG(new_colid)); +#endif // GPOS_DEBUG + old_new_col_mapping->Insert(GPOS_NEW(mp) ULONG(old_colid), + GPOS_NEW(mp) ULONG(new_colid)); GPOS_ASSERT(result); } - + return old_new_col_mapping; } @@ -2276,23 +2103,22 @@ CTranslatorUtils::MakeNewToOldColMapping // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsDuplicateSensitiveMotion - ( - CDXLPhysicalMotion *dxl_motion - ) +CTranslatorUtils::IsDuplicateSensitiveMotion(CDXLPhysicalMotion *dxl_motion) { Edxlopid dxl_opid = dxl_motion->GetDXLOperator(); - + if (EdxlopPhysicalMotionRedistribute == dxl_opid) { - return CDXLPhysicalRedistributeMotion::Cast(dxl_motion)->IsDuplicateSensitive(); + return CDXLPhysicalRedistributeMotion::Cast(dxl_motion) + ->IsDuplicateSensitive(); } - + if (EdxlopPhysicalMotionRandom == dxl_opid) { - return CDXLPhysicalRandomMotion::Cast(dxl_motion)->IsDuplicateSensitive(); + return CDXLPhysicalRandomMotion::Cast(dxl_motion) + ->IsDuplicateSensitive(); } - + // other motion operators are not sensitive to duplicates return false; } @@ -2307,21 +2133,19 @@ CTranslatorUtils::IsDuplicateSensitiveMotion // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::HasProjElem - ( - CDXLNode *project_list_dxlnode, - Edxlopid dxl_opid - ) +CTranslatorUtils::HasProjElem(CDXLNode *project_list_dxlnode, Edxlopid dxl_opid) { GPOS_ASSERT(NULL != project_list_dxlnode); - GPOS_ASSERT(EdxlopScalarProjectList == project_list_dxlnode->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarProjectList == + project_list_dxlnode->GetOperator()->GetDXLOperator()); GPOS_ASSERT(EdxlopSentinel > dxl_opid); const ULONG arity = project_list_dxlnode->Arity(); for (ULONG ul = 0; ul < arity; ul++) { CDXLNode *dxl_project_element = (*project_list_dxlnode)[ul]; - GPOS_ASSERT(EdxlopScalarProjectElem == dxl_project_element->GetOperator()->GetDXLOperator()); + GPOS_ASSERT(EdxlopScalarProjectElem == + dxl_project_element->GetOperator()->GetDXLOperator()); CDXLNode *dxl_child_node = (*dxl_project_element)[0]; if (dxl_opid == dxl_child_node->GetOperator()->GetDXLOperator()) @@ -2344,13 +2168,10 @@ CTranslatorUtils::HasProjElem // //--------------------------------------------------------------------------- CDXLNode * -CTranslatorUtils::CreateDXLProjElemConstNULL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *pidgtorCol, - const IMDColumn *md_col - ) +CTranslatorUtils::CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *pidgtorCol, + const IMDColumn *md_col) { GPOS_ASSERT(NULL != md_col); GPOS_ASSERT(!md_col->IsSystemColumn()); @@ -2358,11 +2179,13 @@ CTranslatorUtils::CreateDXLProjElemConstNULL const WCHAR *col_name = md_col->Mdname().GetMDName()->GetBuffer(); if (!md_col->IsNullable()) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLNotNullViolation, col_name); + GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLNotNullViolation, + col_name); } ULONG colid = pidgtorCol->next_id(); - CDXLNode *dxl_project_element = CreateDXLProjElemConstNULL(mp, md_accessor, md_col->MdidType(), colid, col_name); + CDXLNode *dxl_project_element = CreateDXLProjElemConstNULL( + mp, md_accessor, md_col->MdidType(), colid, col_name); return dxl_project_element; } @@ -2375,17 +2198,15 @@ CTranslatorUtils::CreateDXLProjElemConstNULL // Create a DXL project element node with a Const NULL expression //--------------------------------------------------------------------------- CDXLNode * -CTranslatorUtils::CreateDXLProjElemConstNULL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid, - ULONG colid, - const WCHAR *col_name - ) -{ - CHAR *column_name = CDXLUtils::CreateMultiByteCharStringFromWCString(mp, col_name); - CDXLNode *dxl_project_element = CreateDXLProjElemConstNULL(mp, md_accessor, mdid, colid, column_name); +CTranslatorUtils::CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid, ULONG colid, + const WCHAR *col_name) +{ + CHAR *column_name = + CDXLUtils::CreateMultiByteCharStringFromWCString(mp, col_name); + CDXLNode *dxl_project_element = + CreateDXLProjElemConstNULL(mp, md_accessor, mdid, colid, column_name); GPOS_DELETE_ARRAY(column_name); @@ -2400,14 +2221,10 @@ CTranslatorUtils::CreateDXLProjElemConstNULL // Create a DXL project element node with a Const NULL expression //--------------------------------------------------------------------------- CDXLNode * -CTranslatorUtils::CreateDXLProjElemConstNULL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMDId *mdid, - ULONG colid, - CHAR *alias_name - ) +CTranslatorUtils::CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid, ULONG colid, + CHAR *alias_name) { // get the id and alias for the proj elem CMDName *alias_mdname = NULL; @@ -2419,7 +2236,8 @@ CTranslatorUtils::CreateDXLProjElemConstNULL } else { - CWStringDynamic *alias = CDXLUtils::CreateDynamicStringFromCharArray(mp, alias_name); + CWStringDynamic *alias = + CDXLUtils::CreateDynamicStringFromCharArray(mp, alias_name); alias_mdname = GPOS_NEW(mp) CMDName(mp, alias); GPOS_DELETE(alias); } @@ -2428,44 +2246,45 @@ CTranslatorUtils::CreateDXLProjElemConstNULL CDXLDatum *datum_dxl = NULL; if (mdid->Equals(&CMDIdGPDB::m_mdid_int2)) { - datum_dxl = GPOS_NEW(mp) CDXLDatumInt2(mp, mdid, true /*fConstNull*/, 0 /*value*/); + datum_dxl = GPOS_NEW(mp) + CDXLDatumInt2(mp, mdid, true /*fConstNull*/, 0 /*value*/); } else if (mdid->Equals(&CMDIdGPDB::m_mdid_int4)) { - datum_dxl = GPOS_NEW(mp) CDXLDatumInt4(mp, mdid, true /*fConstNull*/, 0 /*value*/); + datum_dxl = GPOS_NEW(mp) + CDXLDatumInt4(mp, mdid, true /*fConstNull*/, 0 /*value*/); } else if (mdid->Equals(&CMDIdGPDB::m_mdid_int8)) { - datum_dxl = GPOS_NEW(mp) CDXLDatumInt8(mp, mdid, true /*fConstNull*/, 0 /*value*/); + datum_dxl = GPOS_NEW(mp) + CDXLDatumInt8(mp, mdid, true /*fConstNull*/, 0 /*value*/); } else if (mdid->Equals(&CMDIdGPDB::m_mdid_bool)) { - datum_dxl = GPOS_NEW(mp) CDXLDatumBool(mp, mdid, true /*fConstNull*/, 0 /*value*/); + datum_dxl = GPOS_NEW(mp) + CDXLDatumBool(mp, mdid, true /*fConstNull*/, 0 /*value*/); } else if (mdid->Equals(&CMDIdGPDB::m_mdid_oid)) { - datum_dxl = GPOS_NEW(mp) CDXLDatumOid(mp, mdid, true /*fConstNull*/, 0 /*value*/); + datum_dxl = GPOS_NEW(mp) + CDXLDatumOid(mp, mdid, true /*fConstNull*/, 0 /*value*/); } else { const IMDType *md_type = md_accessor->RetrieveType(mdid); - datum_dxl = CMDTypeGenericGPDB::CreateDXLDatumVal - ( - mp, - mdid, - md_type, - default_type_modifier, - true /*fConstNull*/, - NULL, /*pba */ - 0 /*length*/, - 0 /*l_value*/, - 0 /*dValue*/ - ); + datum_dxl = CMDTypeGenericGPDB::CreateDXLDatumVal( + mp, mdid, md_type, default_type_modifier, true /*fConstNull*/, + NULL, /*pba */ + 0 /*length*/, 0 /*l_value*/, 0 /*dValue*/ + ); } - CDXLNode *dxl_const_node = GPOS_NEW(mp) CDXLNode(mp, GPOS_NEW(mp) CDXLScalarConstValue(mp, datum_dxl)); + CDXLNode *dxl_const_node = GPOS_NEW(mp) + CDXLNode(mp, GPOS_NEW(mp) CDXLScalarConstValue(mp, datum_dxl)); - return GPOS_NEW(mp) CDXLNode(mp, GPOS_NEW(mp) CDXLScalarProjElem(mp, colid, alias_mdname), dxl_const_node); + return GPOS_NEW(mp) + CDXLNode(mp, GPOS_NEW(mp) CDXLScalarProjElem(mp, colid, alias_mdname), + dxl_const_node); } @@ -2478,10 +2297,7 @@ CTranslatorUtils::CreateDXLProjElemConstNULL // //--------------------------------------------------------------------------- void -CTranslatorUtils::CheckRTEPermissions - ( - List *range_table_list - ) +CTranslatorUtils::CheckRTEPermissions(List *range_table_list) { gpdb::CheckRTPermissions(range_table_list); } @@ -2496,20 +2312,20 @@ CTranslatorUtils::CheckRTEPermissions // //--------------------------------------------------------------------------- void -CTranslatorUtils::CheckAggregateWindowFn - ( - Node *node - ) +CTranslatorUtils::CheckAggregateWindowFn(Node *node) { GPOS_ASSERT(NULL != node); GPOS_ASSERT(IsA(node, WindowRef)); - WindowRef *win_ref = (WindowRef*) node; + WindowRef *win_ref = (WindowRef *) node; - if (gpdb::AggregateExists(win_ref->winfnoid) && !gpdb::AggHasPrelimOrInvPrelimFunc(win_ref->winfnoid)) + if (gpdb::AggregateExists(win_ref->winfnoid) && + !gpdb::AggHasPrelimOrInvPrelimFunc(win_ref->winfnoid)) { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, - GPOS_WSZ_LIT("Aggregate window function without prelim or inverse prelim function")); + GPOS_RAISE( + gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, + GPOS_WSZ_LIT( + "Aggregate window function without prelim or inverse prelim function")); } } @@ -2523,21 +2339,18 @@ CTranslatorUtils::CheckAggregateWindowFn // //--------------------------------------------------------------------------- void -CTranslatorUtils::UpdateGrpColMapping - ( - CMemoryPool *mp, - UlongToUlongMap *group_col_pos, - CBitSet *group_cols, - ULONG sort_group_ref - ) +CTranslatorUtils::UpdateGrpColMapping(CMemoryPool *mp, + UlongToUlongMap *group_col_pos, + CBitSet *group_cols, ULONG sort_group_ref) { GPOS_ASSERT(NULL != group_col_pos); GPOS_ASSERT(NULL != group_cols); - + if (!group_cols->Get(sort_group_ref)) { ULONG num_unique_grouping_cols = group_cols->Size(); - group_col_pos->Insert(GPOS_NEW(mp) ULONG (num_unique_grouping_cols), GPOS_NEW(mp) ULONG(sort_group_ref)); + group_col_pos->Insert(GPOS_NEW(mp) ULONG(num_unique_grouping_cols), + GPOS_NEW(mp) ULONG(sort_group_ref)); (void) group_cols->ExchangeSet(sort_group_ref); } } @@ -2548,22 +2361,21 @@ CTranslatorUtils::UpdateGrpColMapping // CTranslatorUtils::MarkOuterRefs // // @doc: -// check if given column ids are outer refs in the tree rooted by +// check if given column ids are outer refs in the tree rooted by // given node //--------------------------------------------------------------------------- void -CTranslatorUtils::MarkOuterRefs - ( - ULONG *colids, // array of column ids to be checked - BOOL *is_outer_ref, // array of outer ref indicators, initially all set to true by caller - ULONG num_columns, // number of columns - CDXLNode *dxlnode - ) +CTranslatorUtils::MarkOuterRefs( + ULONG *colids, // array of column ids to be checked + BOOL * + is_outer_ref, // array of outer ref indicators, initially all set to true by caller + ULONG num_columns, // number of columns + CDXLNode *dxlnode) { GPOS_ASSERT(NULL != colids); GPOS_ASSERT(NULL != is_outer_ref); GPOS_ASSERT(NULL != dxlnode); - + const CDXLOperator *dxl_op = dxlnode->GetOperator(); for (ULONG ulCol = 0; ulCol < num_columns; ulCol++) { @@ -2592,38 +2404,32 @@ CTranslatorUtils::MarkOuterRefs // //--------------------------------------------------------------------------- SubLinkType -CTranslatorUtils::MapDXLSubplanToSublinkType - ( - EdxlSubPlanType dxl_subplan_type - ) -{ - GPOS_ASSERT(EdxlSubPlanTypeSentinel > dxl_subplan_type); - ULONG mapping[][2] = - { - {EdxlSubPlanTypeScalar, EXPR_SUBLINK}, - {EdxlSubPlanTypeExists, EXISTS_SUBLINK}, - {EdxlSubPlanTypeNotExists, NOT_EXISTS_SUBLINK}, - {EdxlSubPlanTypeAny, ANY_SUBLINK}, - {EdxlSubPlanTypeAll, ALL_SUBLINK} - }; - - const ULONG arity = GPOS_ARRAY_SIZE(mapping); - SubLinkType slink = EXPR_SUBLINK; - BOOL found = false; - for (ULONG ul = 0; ul < arity; ul++) - { - ULONG *elem = mapping[ul]; - if ((ULONG) dxl_subplan_type == elem[0]) - { - slink = (SubLinkType) elem[1]; - found = true; +CTranslatorUtils::MapDXLSubplanToSublinkType(EdxlSubPlanType dxl_subplan_type) +{ + GPOS_ASSERT(EdxlSubPlanTypeSentinel > dxl_subplan_type); + ULONG mapping[][2] = {{EdxlSubPlanTypeScalar, EXPR_SUBLINK}, + {EdxlSubPlanTypeExists, EXISTS_SUBLINK}, + {EdxlSubPlanTypeNotExists, NOT_EXISTS_SUBLINK}, + {EdxlSubPlanTypeAny, ANY_SUBLINK}, + {EdxlSubPlanTypeAll, ALL_SUBLINK}}; + + const ULONG arity = GPOS_ARRAY_SIZE(mapping); + SubLinkType slink = EXPR_SUBLINK; + BOOL found = false; + for (ULONG ul = 0; ul < arity; ul++) + { + ULONG *elem = mapping[ul]; + if ((ULONG) dxl_subplan_type == elem[0]) + { + slink = (SubLinkType) elem[1]; + found = true; break; - } - } + } + } GPOS_ASSERT(found && "Invalid SubPlanType"); - return slink; + return slink; } @@ -2636,37 +2442,31 @@ CTranslatorUtils::MapDXLSubplanToSublinkType // //--------------------------------------------------------------------------- EdxlSubPlanType -CTranslatorUtils::MapSublinkTypeToDXLSubplan - ( - SubLinkType slink - ) -{ - ULONG mapping[][2] = - { - {EXPR_SUBLINK, EdxlSubPlanTypeScalar}, - {EXISTS_SUBLINK , EdxlSubPlanTypeExists}, - {NOT_EXISTS_SUBLINK, EdxlSubPlanTypeNotExists}, - {ANY_SUBLINK, EdxlSubPlanTypeAny}, - {ALL_SUBLINK, EdxlSubPlanTypeAll} - }; - - const ULONG arity = GPOS_ARRAY_SIZE(mapping); - EdxlSubPlanType dxl_subplan_type = EdxlSubPlanTypeScalar; - BOOL found = false; - for (ULONG ul = 0; ul < arity; ul++) - { - ULONG *elem = mapping[ul]; - if ((ULONG) slink == elem[0]) - { - dxl_subplan_type = (EdxlSubPlanType) elem[1]; - found = true; +CTranslatorUtils::MapSublinkTypeToDXLSubplan(SubLinkType slink) +{ + ULONG mapping[][2] = {{EXPR_SUBLINK, EdxlSubPlanTypeScalar}, + {EXISTS_SUBLINK, EdxlSubPlanTypeExists}, + {NOT_EXISTS_SUBLINK, EdxlSubPlanTypeNotExists}, + {ANY_SUBLINK, EdxlSubPlanTypeAny}, + {ALL_SUBLINK, EdxlSubPlanTypeAll}}; + + const ULONG arity = GPOS_ARRAY_SIZE(mapping); + EdxlSubPlanType dxl_subplan_type = EdxlSubPlanTypeScalar; + BOOL found = false; + for (ULONG ul = 0; ul < arity; ul++) + { + ULONG *elem = mapping[ul]; + if ((ULONG) slink == elem[0]) + { + dxl_subplan_type = (EdxlSubPlanType) elem[1]; + found = true; break; - } - } + } + } - GPOS_ASSERT(found && "Invalid SubLinkType"); + GPOS_ASSERT(found && "Invalid SubLinkType"); - return dxl_subplan_type; + return dxl_subplan_type; } //--------------------------------------------------------------------------- @@ -2679,18 +2479,15 @@ CTranslatorUtils::MapSublinkTypeToDXLSubplan // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::RelHasTriggers - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const IMDRelation *rel, - const EdxlDmlType dml_type_dxl - ) +CTranslatorUtils::RelHasTriggers(CMemoryPool *mp, CMDAccessor *md_accessor, + const IMDRelation *rel, + const EdxlDmlType dml_type_dxl) { const ULONG num_triggers = rel->TriggerCount(); for (ULONG ul = 0; ul < num_triggers; ul++) { - if (IsApplicableTrigger(md_accessor, rel->TriggerMDidAt(ul), dml_type_dxl)) + if (IsApplicableTrigger(md_accessor, rel->TriggerMDidAt(ul), + dml_type_dxl)) { return true; } @@ -2725,12 +2522,9 @@ CTranslatorUtils::RelHasTriggers // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::IsApplicableTrigger - ( - CMDAccessor *md_accessor, - IMDId *trigger_mdid, - const EdxlDmlType dml_type_dxl - ) +CTranslatorUtils::IsApplicableTrigger(CMDAccessor *md_accessor, + IMDId *trigger_mdid, + const EdxlDmlType dml_type_dxl) { const IMDTrigger *trigger = md_accessor->RetrieveTrigger(trigger_mdid); if (!trigger->IsEnabled()) @@ -2752,18 +2546,15 @@ CTranslatorUtils::IsApplicableTrigger // //--------------------------------------------------------------------------- BOOL -CTranslatorUtils::RelHasConstraints - ( - const IMDRelation *rel - ) +CTranslatorUtils::RelHasConstraints(const IMDRelation *rel) { if (0 < rel->CheckConstraintCount()) { return true; } - + const ULONG num_cols = rel->ColumnCount(); - + for (ULONG ul = 0; ul < num_cols; ul++) { const IMDColumn *md_col = rel->GetMdCol(ul); @@ -2772,7 +2563,7 @@ CTranslatorUtils::RelHasConstraints return true; } } - + return false; } @@ -2781,29 +2572,32 @@ CTranslatorUtils::RelHasConstraints // CTranslatorUtils::GetAssertErrorMsgs // // @doc: -// Construct a list of error messages from a list of assert constraints +// Construct a list of error messages from a list of assert constraints // //--------------------------------------------------------------------------- List * -CTranslatorUtils::GetAssertErrorMsgs - ( - CDXLNode *assert_constraint_list - ) +CTranslatorUtils::GetAssertErrorMsgs(CDXLNode *assert_constraint_list) { GPOS_ASSERT(NULL != assert_constraint_list); - GPOS_ASSERT(EdxlopScalarAssertConstraintList == assert_constraint_list->GetOperator()->GetDXLOperator()); - + GPOS_ASSERT(EdxlopScalarAssertConstraintList == + assert_constraint_list->GetOperator()->GetDXLOperator()); + List *error_msgs_list = NIL; const ULONG num_constraints = assert_constraint_list->Arity(); - + for (ULONG ul = 0; ul < num_constraints; ul++) { CDXLNode *dxl_constraint_node = (*assert_constraint_list)[ul]; - CDXLScalarAssertConstraint *dxl_constraint_op = CDXLScalarAssertConstraint::Cast(dxl_constraint_node->GetOperator()); + CDXLScalarAssertConstraint *dxl_constraint_op = + CDXLScalarAssertConstraint::Cast( + dxl_constraint_node->GetOperator()); CWStringBase *error_msg = dxl_constraint_op->GetErrorMsgStr(); - error_msgs_list = gpdb::LAppend(error_msgs_list, gpdb::MakeStringValue(CreateMultiByteCharStringFromWCString(error_msg->GetBuffer()))); + error_msgs_list = gpdb::LAppend( + error_msgs_list, + gpdb::MakeStringValue( + CreateMultiByteCharStringFromWCString(error_msg->GetBuffer()))); } - + return error_msgs_list; } @@ -2816,10 +2610,7 @@ CTranslatorUtils::GetAssertErrorMsgs // //--------------------------------------------------------------------------- ULONG -CTranslatorUtils::GetNumNonSystemColumns - ( - const IMDRelation *rel - ) +CTranslatorUtils::GetNumNonSystemColumns(const IMDRelation *rel) { GPOS_ASSERT(NULL != rel); @@ -2828,7 +2619,7 @@ CTranslatorUtils::GetNumNonSystemColumns const ULONG num_cols = rel->ColumnCount(); for (ULONG ul = 0; ul < num_cols; ul++) { - const IMDColumn *md_col = rel->GetMdCol(ul); + const IMDColumn *md_col = rel->GetMdCol(ul); if (!md_col->IsSystemColumn()) { diff --git a/src/backend/gpopt/utils/CCatalogUtils.cpp b/src/backend/gpopt/utils/CCatalogUtils.cpp index 260ad410b2..a92b3169f7 100644 --- a/src/backend/gpopt/utils/CCatalogUtils.cpp +++ b/src/backend/gpopt/utils/CCatalogUtils.cpp @@ -65,9 +65,11 @@ CCatalogUtils::GetFunctionOids() // Return list of all oids_list from the catalog // //--------------------------------------------------------------------------- -List *CCatalogUtils::GetAllOids() +List * +CCatalogUtils::GetAllOids() { - return list_concat(list_concat(GetRelationOids(), GetOperatorOids()), GetFunctionOids()); + return list_concat(list_concat(GetRelationOids(), GetOperatorOids()), + GetFunctionOids()); } // EOF diff --git a/src/backend/gpopt/utils/CConstExprEvaluatorProxy.cpp b/src/backend/gpopt/utils/CConstExprEvaluatorProxy.cpp index 8d97417f85..6c6593a491 100644 --- a/src/backend/gpopt/utils/CConstExprEvaluatorProxy.cpp +++ b/src/backend/gpopt/utils/CConstExprEvaluatorProxy.cpp @@ -40,13 +40,13 @@ using namespace gpos; // //--------------------------------------------------------------------------- Var * -CConstExprEvaluatorProxy::CEmptyMappingColIdVar::VarFromDXLNodeScId - ( - const CDXLScalarIdent */*scalar_ident*/ - ) +CConstExprEvaluatorProxy::CEmptyMappingColIdVar::VarFromDXLNodeScId( + const CDXLScalarIdent * /*scalar_ident*/ +) { - elog(LOG, "Expression passed to CConstExprEvaluatorProxy contains variables. " - "Evaluation will fail and an exception will be thrown."); + elog(LOG, + "Expression passed to CConstExprEvaluatorProxy contains variables. " + "Evaluation will fail and an exception will be thrown."); GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError); return NULL; } @@ -61,31 +61,33 @@ CConstExprEvaluatorProxy::CEmptyMappingColIdVar::VarFromDXLNodeScId // //--------------------------------------------------------------------------- CDXLNode * -CConstExprEvaluatorProxy::EvaluateExpr - ( - const CDXLNode *dxl_expr - ) +CConstExprEvaluatorProxy::EvaluateExpr(const CDXLNode *dxl_expr) { // Translate DXL -> GPDB Expr - Expr *expr = m_dxl2scalar_translator.TranslateDXLToScalar(dxl_expr, &m_emptymapcidvar); + Expr *expr = m_dxl2scalar_translator.TranslateDXLToScalar( + dxl_expr, &m_emptymapcidvar); GPOS_ASSERT(NULL != expr); // Evaluate the expression - Expr *result = gpdb::EvaluateExpr(expr, - gpdb::ExprType((Node *)expr), - gpdb::ExprTypeMod((Node *)expr)); + Expr *result = gpdb::EvaluateExpr(expr, gpdb::ExprType((Node *) expr), + gpdb::ExprTypeMod((Node *) expr)); if (!IsA(result, Const)) { - #ifdef GPOS_DEBUG - elog(NOTICE, "Expression did not evaluate to Const, but to an expression of type %d", result->type); - #endif +#ifdef GPOS_DEBUG + elog( + NOTICE, + "Expression did not evaluate to Const, but to an expression of type %d", + result->type); +#endif GPOS_RAISE(gpdxl::ExmaConstExprEval, gpdxl::ExmiConstExprEvalNonConst); } - Const *const_result = (Const *)result; - CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateConstToDXL(m_mp, m_md_accessor, const_result); - CDXLNode *dxl_result = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarConstValue(m_mp, datum_dxl)); + Const *const_result = (Const *) result; + CDXLDatum *datum_dxl = CTranslatorScalarToDXL::TranslateConstToDXL( + m_mp, m_md_accessor, const_result); + CDXLNode *dxl_result = GPOS_NEW(m_mp) + CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarConstValue(m_mp, datum_dxl)); gpdb::GPDBFree(result); gpdb::GPDBFree(expr); diff --git a/src/backend/gpopt/utils/CMemoryPoolPalloc.cpp b/src/backend/gpopt/utils/CMemoryPoolPalloc.cpp index e869c20ce3..be9d12627d 100644 --- a/src/backend/gpopt/utils/CMemoryPoolPalloc.cpp +++ b/src/backend/gpopt/utils/CMemoryPoolPalloc.cpp @@ -24,20 +24,14 @@ extern "C" { using namespace gpos; // ctor -CMemoryPoolPalloc::CMemoryPoolPalloc() - : m_cxt(NULL) +CMemoryPoolPalloc::CMemoryPoolPalloc() : m_cxt(NULL) { m_cxt = gpdb::GPDBAllocSetContextCreate(); } void * -CMemoryPoolPalloc::NewImpl - ( - const ULONG bytes, - const CHAR *, - const ULONG, - CMemoryPool::EAllocationType eat - ) +CMemoryPoolPalloc::NewImpl(const ULONG bytes, const CHAR *, const ULONG, + CMemoryPool::EAllocationType eat) { // if it's a singleton allocation, allocate requested memory if (CMemoryPool::EatSingleton == eat) @@ -47,7 +41,8 @@ CMemoryPoolPalloc::NewImpl // if it's an array allocation, allocate header + requested memory else { - ULONG alloc_size = GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader) + GPOS_MEM_ALIGNED_SIZE(bytes); + ULONG alloc_size = GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader) + + GPOS_MEM_ALIGNED_SIZE(bytes); void *ptr = gpdb::GPDBMemoryContextAlloc(m_cxt, alloc_size); @@ -56,10 +51,11 @@ CMemoryPoolPalloc::NewImpl return NULL; } - SArrayAllocHeader *header = static_cast(ptr); + SArrayAllocHeader *header = static_cast(ptr); header->m_user_size = bytes; - return static_cast(ptr) + GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); + return static_cast(ptr) + + GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); } } @@ -72,7 +68,8 @@ CMemoryPoolPalloc::DeleteImpl(void *ptr, CMemoryPool::EAllocationType eat) } else { - void* header = static_cast(ptr) - GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); + void *header = static_cast(ptr) - + GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); gpdb::GPDBFree(header); } } @@ -96,8 +93,10 @@ ULONG CMemoryPoolPalloc::UserSizeOfAlloc(const void *ptr) { GPOS_ASSERT(ptr != NULL); - void* void_header = static_cast(const_cast(ptr)) - GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); - const SArrayAllocHeader *header = static_cast(void_header); + void *void_header = static_cast(const_cast(ptr)) - + GPOS_MEM_ALIGNED_STRUCT_SIZE(SArrayAllocHeader); + const SArrayAllocHeader *header = + static_cast(void_header); return header->m_user_size; } diff --git a/src/backend/gpopt/utils/CMemoryPoolPallocManager.cpp b/src/backend/gpopt/utils/CMemoryPoolPallocManager.cpp index 7ff05f54c8..e6cbf56d0e 100644 --- a/src/backend/gpopt/utils/CMemoryPoolPallocManager.cpp +++ b/src/backend/gpopt/utils/CMemoryPoolPallocManager.cpp @@ -23,9 +23,9 @@ extern "C" { using namespace gpos; // ctor -CMemoryPoolPallocManager::CMemoryPoolPallocManager(CMemoryPool *internal, EMemoryPoolType) - : - CMemoryPoolManager(internal, EMemoryPoolExternal) +CMemoryPoolPallocManager::CMemoryPoolPallocManager(CMemoryPool *internal, + EMemoryPoolType) + : CMemoryPoolManager(internal, EMemoryPoolExternal) { } @@ -37,14 +37,15 @@ CMemoryPoolPallocManager::NewMemoryPool() } void -CMemoryPoolPallocManager::DeleteImpl(void* ptr, CMemoryPool::EAllocationType eat) +CMemoryPoolPallocManager::DeleteImpl(void *ptr, + CMemoryPool::EAllocationType eat) { CMemoryPoolPalloc::DeleteImpl(ptr, eat); } // get user requested size of allocation ULONG -CMemoryPoolPallocManager::UserSizeOfAlloc(const void* ptr) +CMemoryPoolPallocManager::UserSizeOfAlloc(const void *ptr) { return CMemoryPoolPalloc::UserSizeOfAlloc(ptr); } @@ -52,7 +53,8 @@ CMemoryPoolPallocManager::UserSizeOfAlloc(const void* ptr) GPOS_RESULT CMemoryPoolPallocManager::Init() { - return CMemoryPoolManager::SetupGlobalMemoryPoolManager(); + return CMemoryPoolManager::SetupGlobalMemoryPoolManager< + CMemoryPoolPallocManager, CMemoryPoolPalloc>(); } // EOF diff --git a/src/backend/gpopt/utils/COptTasks.cpp b/src/backend/gpopt/utils/COptTasks.cpp index 39e8d0c4d4..325136ec37 100644 --- a/src/backend/gpopt/utils/COptTasks.cpp +++ b/src/backend/gpopt/utils/COptTasks.cpp @@ -111,16 +111,16 @@ const CSystemId default_sysid(IMDId::EmdidGPDB, GPOS_WSZ_STR_LENGTH("GPDB")); // //--------------------------------------------------------------------------- SOptContext::SOptContext() - : - m_query_dxl(NULL), - m_query(NULL), - m_plan_dxl(NULL), - m_plan_stmt(NULL), - m_should_generate_plan_stmt(false), - m_should_serialize_plan_dxl(false), - m_is_unexpected_failure(false), - m_error_msg(NULL) -{} + : m_query_dxl(NULL), + m_query(NULL), + m_plan_dxl(NULL), + m_plan_stmt(NULL), + m_should_generate_plan_stmt(false), + m_should_serialize_plan_dxl(false), + m_is_unexpected_failure(false), + m_error_msg(NULL) +{ +} //--------------------------------------------------------------------------- // @function: @@ -131,10 +131,7 @@ SOptContext::SOptContext() // Calling elog::ERROR would result in longjump and hence a memory leak. //--------------------------------------------------------------------------- void -SOptContext::HandleError - ( - BOOL *has_unexpected_failure - ) +SOptContext::HandleError(BOOL *has_unexpected_failure) { *has_unexpected_failure = m_is_unexpected_failure; if (NULL != m_error_msg) @@ -154,32 +151,28 @@ SOptContext::HandleError // //--------------------------------------------------------------------------- void -SOptContext::Free - ( - SOptContext::EPin input, - SOptContext::EPin output - ) +SOptContext::Free(SOptContext::EPin input, SOptContext::EPin output) { if (NULL != m_query_dxl && epinQueryDXL != input && epinQueryDXL != output) { gpdb::GPDBFree(m_query_dxl); } - + if (NULL != m_query && epinQuery != input && epinQuery != output) { gpdb::GPDBFree(m_query); } - + if (NULL != m_plan_dxl && epinPlanDXL != input && epinPlanDXL != output) { gpdb::GPDBFree(m_plan_dxl); } - + if (NULL != m_plan_stmt && epinPlStmt != input && epinPlStmt != output) { gpdb::GPDBFree(m_plan_stmt); } - + if (NULL != m_error_msg && epinErrorMsg != input && epinErrorMsg != output) { gpdb::GPDBFree(m_error_msg); @@ -195,14 +188,10 @@ SOptContext::Free // error message. // //--------------------------------------------------------------------------- -CHAR* -SOptContext::CloneErrorMsg - ( - MemoryContext context - ) +CHAR * +SOptContext::CloneErrorMsg(MemoryContext context) { - if (NULL == context || - NULL == m_error_msg) + if (NULL == context || NULL == m_error_msg) { return NULL; } @@ -219,14 +208,11 @@ SOptContext::CloneErrorMsg // //--------------------------------------------------------------------------- SOptContext * -SOptContext::Cast - ( - void *ptr - ) +SOptContext::Cast(void *ptr) { GPOS_ASSERT(NULL != ptr); - return reinterpret_cast(ptr); + return reinterpret_cast(ptr); } @@ -238,16 +224,10 @@ SOptContext::Cast // Ctor // //--------------------------------------------------------------------------- -COptTasks::SContextRelcacheToDXL::SContextRelcacheToDXL - ( - List *oid_list, - ULONG cmp_type, - const char *filename - ) - : - m_oid_list(oid_list), - m_cmp_type(cmp_type), - m_filename(filename) +COptTasks::SContextRelcacheToDXL::SContextRelcacheToDXL(List *oid_list, + ULONG cmp_type, + const char *filename) + : m_oid_list(oid_list), m_cmp_type(cmp_type), m_filename(filename) { GPOS_ASSERT(NULL != oid_list); } @@ -261,14 +241,11 @@ COptTasks::SContextRelcacheToDXL::SContextRelcacheToDXL // //--------------------------------------------------------------------------- COptTasks::SContextRelcacheToDXL * -COptTasks::SContextRelcacheToDXL::RelcacheConvert - ( - void *ptr - ) +COptTasks::SContextRelcacheToDXL::RelcacheConvert(void *ptr) { GPOS_ASSERT(NULL != ptr); - return reinterpret_cast(ptr); + return reinterpret_cast(ptr); } @@ -281,14 +258,11 @@ COptTasks::SContextRelcacheToDXL::RelcacheConvert // //--------------------------------------------------------------------------- COptTasks::SEvalExprContext * -COptTasks::SEvalExprContext::PevalctxtConvert - ( - void *ptr - ) +COptTasks::SEvalExprContext::PevalctxtConvert(void *ptr) { GPOS_ASSERT(NULL != ptr); - return reinterpret_cast(ptr); + return reinterpret_cast(ptr); } @@ -301,14 +275,11 @@ COptTasks::SEvalExprContext::PevalctxtConvert // //--------------------------------------------------------------------------- COptTasks::SOptimizeMinidumpContext * -COptTasks::SOptimizeMinidumpContext::Cast - ( - void *ptr - ) +COptTasks::SOptimizeMinidumpContext::Cast(void *ptr) { GPOS_ASSERT(NULL != ptr); - return reinterpret_cast(ptr); + return reinterpret_cast(ptr); } //--------------------------------------------------------------------------- @@ -320,11 +291,7 @@ COptTasks::SOptimizeMinidumpContext::Cast // //--------------------------------------------------------------------------- CHAR * -COptTasks::SzAllocate - ( - CMemoryPool *pmp, - ULONG ulSize - ) +COptTasks::SzAllocate(CMemoryPool *pmp, ULONG ulSize) { CHAR *sz = NULL; GPOS_TRY @@ -333,7 +300,7 @@ COptTasks::SzAllocate // we must guard against system OOM here #ifdef FAULT_INJECTOR gpdb::InjectFaultInOptTasks(OptTaskAllocateStringBuffer); -#endif // FAULT_INJECTOR +#endif // FAULT_INJECTOR if (NULL == pmp) { @@ -363,10 +330,7 @@ COptTasks::SzAllocate // //--------------------------------------------------------------------------- CHAR * -COptTasks::CreateMultiByteCharStringFromWCString - ( - const WCHAR *wcstr - ) +COptTasks::CreateMultiByteCharStringFromWCString(const WCHAR *wcstr) { GPOS_ASSERT(NULL != wcstr); @@ -390,15 +354,13 @@ COptTasks::CreateMultiByteCharStringFromWCString // Task that dumps the relcache info for a cast object into DXL // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToDXLFromMDCast - ( - void *ptr - ) +void * +COptTasks::ConvertToDXLFromMDCast(void *ptr) { GPOS_ASSERT(NULL != ptr); - SContextRelcacheToDXL *relcache_ctxt = SContextRelcacheToDXL::RelcacheConvert(ptr); + SContextRelcacheToDXL *relcache_ctxt = + SContextRelcacheToDXL::RelcacheConvert(ptr); GPOS_ASSERT(NULL != relcache_ctxt); GPOS_ASSERT(2 == gpdb::ListLength(relcache_ctxt->m_oid_list)); @@ -408,35 +370,41 @@ COptTasks::ConvertToDXLFromMDCast CAutoMemoryPool amp(CAutoMemoryPool::ElcExc); CMemoryPool *mp = amp.Pmp(); - IMDCacheObjectArray *mdcache_obj_array = GPOS_NEW(mp) IMDCacheObjectArray(mp); + IMDCacheObjectArray *mdcache_obj_array = + GPOS_NEW(mp) IMDCacheObjectArray(mp); - IMDId *cast = GPOS_NEW(mp) CMDIdCast(GPOS_NEW(mp) CMDIdGPDB(src_oid), GPOS_NEW(mp) CMDIdGPDB(dest_oid)); + IMDId *cast = GPOS_NEW(mp) CMDIdCast(GPOS_NEW(mp) CMDIdGPDB(src_oid), + GPOS_NEW(mp) CMDIdGPDB(dest_oid)); // relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); - + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); + { CAutoMDAccessor md_accessor(mp, relcache_provider, default_sysid); - - IMDCacheObject *md_obj = CTranslatorRelcacheToDXL::RetrieveObject(mp, md_accessor.Pmda(), cast); + + IMDCacheObject *md_obj = CTranslatorRelcacheToDXL::RetrieveObject( + mp, md_accessor.Pmda(), cast); GPOS_ASSERT(NULL != md_obj); - + mdcache_obj_array->Append(md_obj); cast->Release(); - + CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, + true /*serialize_header_footer*/, + true /*indentation*/); CHAR *str = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); GPOS_ASSERT(NULL != str); relcache_ctxt->m_dxl = str; - + // cleanup mdcache_obj_array->Release(); } - + return NULL; } @@ -448,55 +416,61 @@ COptTasks::ConvertToDXLFromMDCast // Task that dumps the relcache info for a scalar comparison object into DXL // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToDXLFromMDScalarCmp - ( - void *ptr - ) +void * +COptTasks::ConvertToDXLFromMDScalarCmp(void *ptr) { GPOS_ASSERT(NULL != ptr); - SContextRelcacheToDXL *relcache_ctxt = SContextRelcacheToDXL::RelcacheConvert(ptr); + SContextRelcacheToDXL *relcache_ctxt = + SContextRelcacheToDXL::RelcacheConvert(ptr); GPOS_ASSERT(NULL != relcache_ctxt); - GPOS_ASSERT(CmptOther > relcache_ctxt->m_cmp_type && "Incorrect comparison type specified"); + GPOS_ASSERT(CmptOther > relcache_ctxt->m_cmp_type && + "Incorrect comparison type specified"); GPOS_ASSERT(2 == gpdb::ListLength(relcache_ctxt->m_oid_list)); Oid left_oid = gpdb::ListNthOid(relcache_ctxt->m_oid_list, 0); Oid right_oid = gpdb::ListNthOid(relcache_ctxt->m_oid_list, 1); CmpType cmpt = (CmpType) relcache_ctxt->m_cmp_type; - + CAutoMemoryPool amp(CAutoMemoryPool::ElcExc); CMemoryPool *mp = amp.Pmp(); - IMDCacheObjectArray *mdcache_obj_array = GPOS_NEW(mp) IMDCacheObjectArray(mp); + IMDCacheObjectArray *mdcache_obj_array = + GPOS_NEW(mp) IMDCacheObjectArray(mp); - IMDId *scalar_cmp = GPOS_NEW(mp) CMDIdScCmp(GPOS_NEW(mp) CMDIdGPDB(left_oid), GPOS_NEW(mp) CMDIdGPDB(right_oid), CTranslatorRelcacheToDXL::ParseCmpType(cmpt)); + IMDId *scalar_cmp = GPOS_NEW(mp) CMDIdScCmp( + GPOS_NEW(mp) CMDIdGPDB(left_oid), GPOS_NEW(mp) CMDIdGPDB(right_oid), + CTranslatorRelcacheToDXL::ParseCmpType(cmpt)); // relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); - + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); + { CAutoMDAccessor md_accessor(mp, relcache_provider, default_sysid); - - IMDCacheObject *md_obj = CTranslatorRelcacheToDXL::RetrieveObject(mp, md_accessor.Pmda(), scalar_cmp); + + IMDCacheObject *md_obj = CTranslatorRelcacheToDXL::RetrieveObject( + mp, md_accessor.Pmda(), scalar_cmp); GPOS_ASSERT(NULL != md_obj); - + mdcache_obj_array->Append(md_obj); scalar_cmp->Release(); - + CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, + true /*serialize_header_footer*/, + true /*indentation*/); CHAR *str = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); GPOS_ASSERT(NULL != str); relcache_ctxt->m_dxl = str; - + // cleanup mdcache_obj_array->Release(); } - + return NULL; } @@ -510,11 +484,7 @@ COptTasks::ConvertToDXLFromMDScalarCmp // //--------------------------------------------------------------------------- void -COptTasks::Execute - ( - void *(*func) (void *) , - void *func_arg - ) +COptTasks::Execute(void *(*func)(void *), void *func_arg) { Assert(func); @@ -551,9 +521,8 @@ COptTasks::Execute } void -COptTasks::LogExceptionMessageAndDelete(CHAR* err_buf, ULONG severity_level) +COptTasks::LogExceptionMessageAndDelete(CHAR *err_buf, ULONG severity_level) { - if ('\0' != err_buf[0]) { int gpdb_severity_level; @@ -563,7 +532,8 @@ COptTasks::LogExceptionMessageAndDelete(CHAR* err_buf, ULONG severity_level) else gpdb_severity_level = LOG; - elog(gpdb_severity_level, "%s", CreateMultiByteCharStringFromWCString((WCHAR *)err_buf)); + elog(gpdb_severity_level, "%s", + CreateMultiByteCharStringFromWCString((WCHAR *) err_buf)); } pfree(err_buf); @@ -578,11 +548,8 @@ COptTasks::LogExceptionMessageAndDelete(CHAR* err_buf, ULONG severity_level) // task that does the translation from query to XML // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToDXLFromQueryTask - ( - void *ptr - ) +void * +COptTasks::ConvertToDXLFromQueryTask(void *ptr) { GPOS_ASSERT(NULL != ptr); @@ -595,31 +562,29 @@ COptTasks::ConvertToDXLFromQueryTask CMemoryPool *mp = amp.Pmp(); // ColId generator - CIdGenerator *colid_generator = GPOS_NEW(mp) CIdGenerator(GPDXL_COL_ID_START); - CIdGenerator *cteid_generator = GPOS_NEW(mp) CIdGenerator(GPDXL_CTE_ID_START); + CIdGenerator *colid_generator = + GPOS_NEW(mp) CIdGenerator(GPDXL_COL_ID_START); + CIdGenerator *cteid_generator = + GPOS_NEW(mp) CIdGenerator(GPDXL_CTE_ID_START); // map that stores gpdb att to optimizer col mapping CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); // relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); { CAutoMDAccessor md_accessor(mp, relcache_provider, default_sysid); CAutoP query_to_dxl_translator; - query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance - ( - mp, - md_accessor.Pmda(), - colid_generator, - cteid_generator, - var_colid_mapping, - (Query*)opt_ctxt->m_query, - 0 /* query_level */ - ); + query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance( + mp, md_accessor.Pmda(), colid_generator, cteid_generator, + var_colid_mapping, (Query *) opt_ctxt->m_query, 0 /* query_level */ + ); CDXLNode *query_dxl = query_to_dxl_translator->TranslateQueryToDXL(); - CDXLNodeArray *query_output_dxlnode_array = query_to_dxl_translator->GetQueryOutputCols(); + CDXLNodeArray *query_output_dxlnode_array = + query_to_dxl_translator->GetQueryOutputCols(); CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator->GetCTEs(); GPOS_ASSERT(NULL != query_output_dxlnode_array); @@ -629,17 +594,13 @@ COptTasks::ConvertToDXLFromQueryTask CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializeQuery - ( - mp, - oss, - query_dxl, - query_output_dxlnode_array, - cte_dxlnode_array, - true, // serialize_header_footer - true // indentation - ); - opt_ctxt->m_query_dxl = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); + CDXLUtils::SerializeQuery(mp, oss, query_dxl, + query_output_dxlnode_array, cte_dxlnode_array, + true, // serialize_header_footer + true // indentation + ); + opt_ctxt->m_query_dxl = + CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); // clean up query_dxl->Release(); @@ -658,15 +619,9 @@ COptTasks::ConvertToDXLFromQueryTask // //--------------------------------------------------------------------------- PlannedStmt * -COptTasks::ConvertToPlanStmtFromDXL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const CDXLNode *dxlnode, - bool can_set_tag - ) +COptTasks::ConvertToPlanStmtFromDXL(CMemoryPool *mp, CMDAccessor *md_accessor, + const CDXLNode *dxlnode, bool can_set_tag) { - GPOS_ASSERT(NULL != md_accessor); GPOS_ASSERT(NULL != dxlnode); @@ -677,19 +632,15 @@ COptTasks::ConvertToPlanStmtFromDXL List *table_list = NULL; List *subplans_list = NULL; - CContextDXLToPlStmt dxl_to_plan_stmt_ctxt - ( - mp, - &plan_id_generator, - &motion_id_generator, - ¶m_id_generator, - &table_list, - &subplans_list - ); - + CContextDXLToPlStmt dxl_to_plan_stmt_ctxt( + mp, &plan_id_generator, &motion_id_generator, ¶m_id_generator, + &table_list, &subplans_list); + // translate DXL -> PlannedStmt - CTranslatorDXLToPlStmt dxl_to_plan_stmt_translator(mp, md_accessor, &dxl_to_plan_stmt_ctxt, gpdb::GetGPSegmentCount()); - return dxl_to_plan_stmt_translator.GetPlannedStmtFromDXL(dxlnode, can_set_tag); + CTranslatorDXLToPlStmt dxl_to_plan_stmt_translator( + mp, md_accessor, &dxl_to_plan_stmt_ctxt, gpdb::GetGPSegmentCount()); + return dxl_to_plan_stmt_translator.GetPlannedStmtFromDXL(dxlnode, + can_set_tag); } @@ -702,11 +653,7 @@ COptTasks::ConvertToPlanStmtFromDXL // //--------------------------------------------------------------------------- CSearchStageArray * -COptTasks::LoadSearchStrategy - ( - CMemoryPool *mp, - char *path - ) +COptTasks::LoadSearchStrategy(CMemoryPool *mp, char *path) { CSearchStageArray *search_strategy_arr = NULL; CParseHandlerDXL *dxl_parse_handler = NULL; @@ -715,7 +662,8 @@ COptTasks::LoadSearchStrategy { if (NULL != path) { - dxl_parse_handler = CDXLUtils::GetParseHandlerForDXLFile(mp, path, NULL); + dxl_parse_handler = + CDXLUtils::GetParseHandlerForDXLFile(mp, path, NULL); if (NULL != dxl_parse_handler) { elog(DEBUG2, "\n[OPT]: Using search strategy in (%s)", path); @@ -727,7 +675,8 @@ COptTasks::LoadSearchStrategy } GPOS_CATCH_EX(ex) { - if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) { + if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) + { GPOS_RETHROW(ex); } elog(DEBUG2, "\n[OPT]: Using default search strategy"); @@ -749,11 +698,7 @@ COptTasks::LoadSearchStrategy // //--------------------------------------------------------------------------- COptimizerConfig * -COptTasks::CreateOptimizerConfig - ( - CMemoryPool *mp, - ICostModel *cost_model - ) +COptTasks::CreateOptimizerConfig(CMemoryPool *mp, ICostModel *cost_model) { // get chosen plan number, cost threshold ULLONG plan_id = (ULLONG) optimizer_plan_id; @@ -765,30 +710,29 @@ COptTasks::CreateOptimizerConfig DOUBLE damping_factor_groupby = (DOUBLE) optimizer_damping_factor_groupby; ULONG cte_inlining_cutoff = (ULONG) optimizer_cte_inlining_bound; - ULONG join_arity_for_associativity_commutativity = (ULONG) optimizer_join_arity_for_associativity_commutativity; - ULONG array_expansion_threshold = (ULONG) optimizer_array_expansion_threshold; + ULONG join_arity_for_associativity_commutativity = + (ULONG) optimizer_join_arity_for_associativity_commutativity; + ULONG array_expansion_threshold = + (ULONG) optimizer_array_expansion_threshold; ULONG join_order_threshold = (ULONG) optimizer_join_order_threshold; ULONG broadcast_threshold = (ULONG) optimizer_penalize_broadcast_threshold; - return GPOS_NEW(mp) COptimizerConfig - ( - GPOS_NEW(mp) CEnumeratorConfig(mp, plan_id, num_samples, cost_threshold), - GPOS_NEW(mp) CStatisticsConfig(mp, damping_factor_filter, damping_factor_join, damping_factor_groupby), - GPOS_NEW(mp) CCTEConfig(cte_inlining_cutoff), - cost_model, - GPOS_NEW(mp) CHint - ( - gpos::int_max /* optimizer_parts_to_force_sort_on_insert */, - join_arity_for_associativity_commutativity, - array_expansion_threshold, - join_order_threshold, - broadcast_threshold, - false, /* don't create Assert nodes for constraints, we'll + return GPOS_NEW(mp) COptimizerConfig( + GPOS_NEW(mp) + CEnumeratorConfig(mp, plan_id, num_samples, cost_threshold), + GPOS_NEW(mp) + CStatisticsConfig(mp, damping_factor_filter, damping_factor_join, + damping_factor_groupby), + GPOS_NEW(mp) CCTEConfig(cte_inlining_cutoff), cost_model, + GPOS_NEW(mp) + CHint(gpos::int_max /* optimizer_parts_to_force_sort_on_insert */, + join_arity_for_associativity_commutativity, + array_expansion_threshold, join_order_threshold, + broadcast_threshold, + false, /* don't create Assert nodes for constraints, we'll * enforce them ourselves in the executor */ - PUSH_GROUP_BY_BELOW_SETOP_THRESHOLD - ), - GPOS_NEW(mp) CWindowOids(OID(F_WINDOW_DUMMY), OID(F_WINDOW_RANK_OID)) - ); + PUSH_GROUP_BY_BELOW_SETOP_THRESHOLD), + GPOS_NEW(mp) CWindowOids(OID(F_WINDOW_DUMMY), OID(F_WINDOW_RANK_OID))); } //--------------------------------------------------------------------------- @@ -800,10 +744,7 @@ COptTasks::CreateOptimizerConfig // //--------------------------------------------------------------------------- void -COptTasks::SetCostModelParams - ( - ICostModel *cost_model - ) +COptTasks::SetCostModelParams(ICostModel *cost_model) { GPOS_ASSERT(NULL != cost_model); @@ -811,28 +752,37 @@ COptTasks::SetCostModelParams { // change NLJ cost factor ICostModelParams::SCostParam *cost_param = NULL; - if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) + if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || + OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) { - cost_param = cost_model->GetCostModelParams()->PcpLookup(CCostModelParamsGPDB::EcpNLJFactor); + cost_param = cost_model->GetCostModelParams()->PcpLookup( + CCostModelParamsGPDB::EcpNLJFactor); } else { - cost_param = cost_model->GetCostModelParams()->PcpLookup(CCostModelParamsGPDBLegacy::EcpNLJFactor); + cost_param = cost_model->GetCostModelParams()->PcpLookup( + CCostModelParamsGPDBLegacy::EcpNLJFactor); } CDouble nlj_factor(optimizer_nestloop_factor); - cost_model->GetCostModelParams()->SetParam(cost_param->Id(), nlj_factor, nlj_factor - 0.5, nlj_factor + 0.5); + cost_model->GetCostModelParams()->SetParam( + cost_param->Id(), nlj_factor, nlj_factor - 0.5, nlj_factor + 0.5); } if (optimizer_sort_factor > 1.0 || optimizer_sort_factor < 1.0) { // change sort cost factor ICostModelParams::SCostParam *cost_param = NULL; - if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) + if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || + OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) { - cost_param = cost_model->GetCostModelParams()->PcpLookup(CCostModelParamsGPDB::EcpSortTupWidthCostUnit); + cost_param = cost_model->GetCostModelParams()->PcpLookup( + CCostModelParamsGPDB::EcpSortTupWidthCostUnit); CDouble sort_factor(optimizer_sort_factor); - cost_model->GetCostModelParams()->SetParam(cost_param->Id(), cost_param->Get() * optimizer_sort_factor, cost_param->GetLowerBoundVal() * optimizer_sort_factor, cost_param->GetUpperBoundVal() * optimizer_sort_factor); + cost_model->GetCostModelParams()->SetParam( + cost_param->Id(), cost_param->Get() * optimizer_sort_factor, + cost_param->GetLowerBoundVal() * optimizer_sort_factor, + cost_param->GetUpperBoundVal() * optimizer_sort_factor); } } } @@ -847,14 +797,11 @@ COptTasks::SetCostModelParams // //--------------------------------------------------------------------------- ICostModel * -COptTasks::GetCostModel - ( - CMemoryPool *mp, - ULONG num_segments - ) +COptTasks::GetCostModel(CMemoryPool *mp, ULONG num_segments) { ICostModel *cost_model = NULL; - if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) + if (OPTIMIZER_GPDB_CALIBRATED == optimizer_cost_model || + OPTIMIZER_GPDB_EXPERIMENTAL == optimizer_cost_model) { cost_model = GPOS_NEW(mp) CCostModelGPDB(mp, num_segments); } @@ -876,11 +823,8 @@ COptTasks::GetCostModel // task that does the optimizes query to physical DXL // //--------------------------------------------------------------------------- -void* -COptTasks::OptimizeTask - ( - void *ptr - ) +void * +COptTasks::OptimizeTask(void *ptr) { GPOS_ASSERT(NULL != ptr); SOptContext *opt_ctxt = SOptContext::Cast(ptr); @@ -914,14 +858,16 @@ COptTasks::OptimizeTask CMDCache::Reset(); CMDCache::SetCacheQuota(optimizer_mdcache_size * 1024L); } - else if (CMDCache::ULLGetCacheQuota() != (ULLONG) optimizer_mdcache_size * 1024L) + else if (CMDCache::ULLGetCacheQuota() != + (ULLONG) optimizer_mdcache_size * 1024L) { CMDCache::SetCacheQuota(optimizer_mdcache_size * 1024L); } // load search strategy - CSearchStageArray *search_strategy_arr = LoadSearchStrategy(mp, optimizer_search_strategy_path); + CSearchStageArray *search_strategy_arr = + LoadSearchStrategy(mp, optimizer_search_strategy_path); CBitSet *trace_flags = NULL; CBitSet *enabled_trace_flags = NULL; @@ -934,22 +880,27 @@ COptTasks::OptimizeTask GPOS_TRY { // set trace flags - trace_flags = CConfigParamMapping::PackConfigParamInBitset(mp, CXform::ExfSentinel); - SetTraceflags(mp, trace_flags, &enabled_trace_flags, &disabled_trace_flags); + trace_flags = CConfigParamMapping::PackConfigParamInBitset( + mp, CXform::ExfSentinel); + SetTraceflags(mp, trace_flags, &enabled_trace_flags, + &disabled_trace_flags); // set up relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); { // scope for MD accessor - CMDAccessor mda(mp, CMDCache::Pcache(), default_sysid, relcache_provider); + CMDAccessor mda(mp, CMDCache::Pcache(), default_sysid, + relcache_provider); // ColId generator CIdGenerator colid_generator(GPDXL_COL_ID_START); CIdGenerator cteid_generator(GPDXL_CTE_ID_START); // map that stores gpdb att to optimizer col mapping - CMappingVarColId *var_colid_mapping = GPOS_NEW(mp) CMappingVarColId(mp); + CMappingVarColId *var_colid_mapping = + GPOS_NEW(mp) CMappingVarColId(mp); ULONG num_segments = gpdb::GetGPSegmentCount(); ULONG num_segments_for_costing = optimizer_segments; @@ -959,54 +910,49 @@ COptTasks::OptimizeTask } CAutoP query_to_dxl_translator; - query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance - ( - mp, - &mda, - &colid_generator, - &cteid_generator, - var_colid_mapping, - (Query*) opt_ctxt->m_query, - 0 /* query_level */ - ); + query_to_dxl_translator = CTranslatorQueryToDXL::QueryToDXLInstance( + mp, &mda, &colid_generator, &cteid_generator, var_colid_mapping, + (Query *) opt_ctxt->m_query, 0 /* query_level */ + ); ICostModel *cost_model = GetCostModel(mp, num_segments_for_costing); - COptimizerConfig *optimizer_config = CreateOptimizerConfig(mp, cost_model); + COptimizerConfig *optimizer_config = + CreateOptimizerConfig(mp, cost_model); CConstExprEvaluatorProxy expr_eval_proxy(mp, &mda); IConstExprEvaluator *expr_evaluator = - GPOS_NEW(mp) CConstExprEvaluatorDXL(mp, &mda, &expr_eval_proxy); - - CDXLNode *query_dxl = query_to_dxl_translator->TranslateQueryToDXL(); - CDXLNodeArray *query_output_dxlnode_array = query_to_dxl_translator->GetQueryOutputCols(); - CDXLNodeArray *cte_dxlnode_array = query_to_dxl_translator->GetCTEs(); + GPOS_NEW(mp) CConstExprEvaluatorDXL(mp, &mda, &expr_eval_proxy); + + CDXLNode *query_dxl = + query_to_dxl_translator->TranslateQueryToDXL(); + CDXLNodeArray *query_output_dxlnode_array = + query_to_dxl_translator->GetQueryOutputCols(); + CDXLNodeArray *cte_dxlnode_array = + query_to_dxl_translator->GetCTEs(); GPOS_ASSERT(NULL != query_output_dxlnode_array); - BOOL is_master_only = !optimizer_enable_motions || - (!optimizer_enable_motions_masteronly_queries && !query_to_dxl_translator->HasDistributedTables()); + BOOL is_master_only = + !optimizer_enable_motions || + (!optimizer_enable_motions_masteronly_queries && + !query_to_dxl_translator->HasDistributedTables()); CAutoTraceFlag atf(EopttraceDisableMotions, is_master_only); - plan_dxl = COptimizer::PdxlnOptimize - ( - mp, - &mda, - query_dxl, - query_output_dxlnode_array, - cte_dxlnode_array, - expr_evaluator, - num_segments, - gp_session_id, - gp_command_count, - search_strategy_arr, - optimizer_config - ); + plan_dxl = COptimizer::PdxlnOptimize( + mp, &mda, query_dxl, query_output_dxlnode_array, + cte_dxlnode_array, expr_evaluator, num_segments, gp_session_id, + gp_command_count, search_strategy_arr, optimizer_config); if (opt_ctxt->m_should_serialize_plan_dxl) { // serialize DXL to xml CWStringDynamic plan_str(mp); COstreamString oss(&plan_str); - CDXLUtils::SerializePlan(mp, oss, plan_dxl, optimizer_config->GetEnumeratorCfg()->GetPlanId(), optimizer_config->GetEnumeratorCfg()->GetPlanSpaceSize(), true /*serialize_header_footer*/, true /*indentation*/); - opt_ctxt->m_plan_dxl = CreateMultiByteCharStringFromWCString(plan_str.GetBuffer()); + CDXLUtils::SerializePlan( + mp, oss, plan_dxl, + optimizer_config->GetEnumeratorCfg()->GetPlanId(), + optimizer_config->GetEnumeratorCfg()->GetPlanSpaceSize(), + true /*serialize_header_footer*/, true /*indentation*/); + opt_ctxt->m_plan_dxl = + CreateMultiByteCharStringFromWCString(plan_str.GetBuffer()); } // translate DXL->PlStmt only when needed @@ -1014,7 +960,9 @@ COptTasks::OptimizeTask { // always use opt_ctxt->m_query->can_set_tag as the query_to_dxl_translator->Pquery() is a mutated Query object // that may not have the correct can_set_tag - opt_ctxt->m_plan_stmt = (PlannedStmt *) gpdb::CopyObject(ConvertToPlanStmtFromDXL(mp, &mda, plan_dxl, opt_ctxt->m_query->canSetTag)); + opt_ctxt->m_plan_stmt = + (PlannedStmt *) gpdb::CopyObject(ConvertToPlanStmtFromDXL( + mp, &mda, plan_dxl, opt_ctxt->m_query->canSetTag)); } CStatisticsConfig *stats_conf = optimizer_config->GetStatsConf(); @@ -1046,12 +994,14 @@ COptTasks::OptimizeTask if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) { - elog(DEBUG1, "GPDB Exception. Please check log for more information."); + elog(DEBUG1, + "GPDB Exception. Please check log for more information."); } else if (ShouldErrorOut(ex)) { IErrorContext *errctxt = CTask::Self()->GetErrCtxt(); - opt_ctxt->m_error_msg = CreateMultiByteCharStringFromWCString(errctxt->GetErrorMsg()); + opt_ctxt->m_error_msg = + CreateMultiByteCharStringFromWCString(errctxt->GetErrorMsg()); } else { @@ -1084,13 +1034,9 @@ COptTasks::OptimizeTask // //--------------------------------------------------------------------------- void -COptTasks::PrintMissingStatsWarning - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - IMdIdArray *col_stats, - MdidHashSet *rel_stats - ) +COptTasks::PrintMissingStatsWarning(CMemoryPool *mp, CMDAccessor *md_accessor, + IMdIdArray *col_stats, + MdidHashSet *rel_stats) { GPOS_ASSERT(NULL != md_accessor); GPOS_ASSERT(NULL != col_stats); @@ -1126,11 +1072,13 @@ COptTasks::PrintMissingStatsWarning CMDName mdname = rel->GetMdCol(pos)->Mdname(); char msgbuf[NAMEDATALEN * 2 + 100]; - snprintf(msgbuf, sizeof(msgbuf), "Missing statistics for column: %s.%s", CreateMultiByteCharStringFromWCString(rel->Mdname().GetMDName()->GetBuffer()), CreateMultiByteCharStringFromWCString(mdname.GetMDName()->GetBuffer())); - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - LOG, - msgbuf, - NULL); + snprintf(msgbuf, sizeof(msgbuf), + "Missing statistics for column: %s.%s", + CreateMultiByteCharStringFromWCString( + rel->Mdname().GetMDName()->GetBuffer()), + CreateMultiByteCharStringFromWCString( + mdname.GetMDName()->GetBuffer())); + GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, LOG, msgbuf, NULL); } } @@ -1138,15 +1086,16 @@ COptTasks::PrintMissingStatsWarning { int length = NAMEDATALEN * rel_stats->Size() + 200; char msgbuf[length]; - snprintf(msgbuf, sizeof(msgbuf), "One or more columns in the following table(s) do not have statistics: %s", CreateMultiByteCharStringFromWCString(wcstr.GetBuffer())); - GpdbEreport(ERRCODE_SUCCESSFUL_COMPLETION, - NOTICE, - msgbuf, - "For non-partitioned tables, run analyze ()." - " For partitioned tables, run analyze rootpartition ()." - " See log for columns missing statistics."); + snprintf( + msgbuf, sizeof(msgbuf), + "One or more columns in the following table(s) do not have statistics: %s", + CreateMultiByteCharStringFromWCString(wcstr.GetBuffer())); + GpdbEreport( + ERRCODE_SUCCESSFUL_COMPLETION, NOTICE, msgbuf, + "For non-partitioned tables, run analyze ()." + " For partitioned tables, run analyze rootpartition ()." + " See log for columns missing statistics."); } - } @@ -1158,15 +1107,13 @@ COptTasks::PrintMissingStatsWarning // Task that loads and optimizes a minidump and returns the result as string-serialized DXL // //--------------------------------------------------------------------------- -void* -COptTasks::OptimizeMinidumpTask - ( - void *ptr - ) +void * +COptTasks::OptimizeMinidumpTask(void *ptr) { GPOS_ASSERT(NULL != ptr); - SOptimizeMinidumpContext *minidump_ctxt = SOptimizeMinidumpContext::Cast(ptr); + SOptimizeMinidumpContext *minidump_ctxt = + SOptimizeMinidumpContext::Cast(ptr); GPOS_ASSERT(NULL != minidump_ctxt->m_szFileName); GPOS_ASSERT(NULL == minidump_ctxt->m_dxl_result); @@ -1186,7 +1133,9 @@ COptTasks::OptimizeMinidumpTask GPOS_TRY { - result_dxl = CMinidumperUtils::PdxlnExecuteMinidump(mp, minidump_ctxt->m_szFileName, num_segments, gp_session_id, gp_command_count, optimizer_config); + result_dxl = CMinidumperUtils::PdxlnExecuteMinidump( + mp, minidump_ctxt->m_szFileName, num_segments, gp_session_id, + gp_command_count, optimizer_config); } GPOS_CATCH_EX(ex) { @@ -1198,17 +1147,14 @@ COptTasks::OptimizeMinidumpTask CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializePlan - ( - mp, - oss, - result_dxl, - 0, // plan_id - 0, // plan_space_size - true, // serialize_header_footer - true // indentation - ); - minidump_ctxt->m_dxl_result = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); + CDXLUtils::SerializePlan(mp, oss, result_dxl, + 0, // plan_id + 0, // plan_space_size + true, // serialize_header_footer + true // indentation + ); + minidump_ctxt->m_dxl_result = + CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); CRefCount::SafeRelease(result_dxl); optimizer_config->Release(); @@ -1223,11 +1169,8 @@ COptTasks::OptimizeMinidumpTask // task that does the translation from xml to dxl to planned_stmt // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToPlanStmtFromDXLTask - ( - void *ptr - ) +void * +COptTasks::ConvertToPlanStmtFromDXLTask(void *ptr) { GPOS_ASSERT(NULL != ptr); @@ -1244,8 +1187,9 @@ COptTasks::ConvertToPlanStmtFromDXLTask ULLONG plan_id = 0; ULLONG plan_space_size = 0; - CDXLNode *original_plan_dxl = - CDXLUtils::GetPlanDXLNode(mp, opt_ctxt->m_plan_dxl, NULL /*XSD location*/, &plan_id, &plan_space_size); + CDXLNode *original_plan_dxl = CDXLUtils::GetPlanDXLNode( + mp, opt_ctxt->m_plan_dxl, NULL /*XSD location*/, &plan_id, + &plan_space_size); CIdGenerator plan_id_generator(1); CIdGenerator motion_id_generator(1); @@ -1254,25 +1198,24 @@ COptTasks::ConvertToPlanStmtFromDXLTask List *table_list = NULL; List *subplans_list = NULL; - CContextDXLToPlStmt dxl_to_plan_stmt_ctxt - ( - mp, - &plan_id_generator, - &motion_id_generator, - ¶m_id_generator, - &table_list, - &subplans_list - ); + CContextDXLToPlStmt dxl_to_plan_stmt_ctxt( + mp, &plan_id_generator, &motion_id_generator, ¶m_id_generator, + &table_list, &subplans_list); // relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); { CAutoMDAccessor md_accessor(mp, relcache_provider, default_sysid); // translate DXL -> PlannedStmt - CTranslatorDXLToPlStmt dxl_to_plan_stmt_translator(mp, md_accessor.Pmda(), &dxl_to_plan_stmt_ctxt, gpdb::GetGPSegmentCount()); - PlannedStmt *plan_stmt = dxl_to_plan_stmt_translator.GetPlannedStmtFromDXL(original_plan_dxl, opt_ctxt->m_query->canSetTag); + CTranslatorDXLToPlStmt dxl_to_plan_stmt_translator( + mp, md_accessor.Pmda(), &dxl_to_plan_stmt_ctxt, + gpdb::GetGPSegmentCount()); + PlannedStmt *plan_stmt = + dxl_to_plan_stmt_translator.GetPlannedStmtFromDXL( + original_plan_dxl, opt_ctxt->m_query->canSetTag); if (optimizer_print_plan) { elog(NOTICE, "Plstmt: %s", gpdb::NodeToString(plan_stmt)); @@ -1298,34 +1241,35 @@ COptTasks::ConvertToPlanStmtFromDXLTask // task that does dumps the relcache info for an object into DXL // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToDXLFromMDObjsTask - ( - void *ptr - ) +void * +COptTasks::ConvertToDXLFromMDObjsTask(void *ptr) { GPOS_ASSERT(NULL != ptr); - SContextRelcacheToDXL *relcache_ctxt = SContextRelcacheToDXL::RelcacheConvert(ptr); + SContextRelcacheToDXL *relcache_ctxt = + SContextRelcacheToDXL::RelcacheConvert(ptr); GPOS_ASSERT(NULL != relcache_ctxt); AUTO_MEM_POOL(amp); CMemoryPool *mp = amp.Pmp(); - IMDCacheObjectArray *mdcache_obj_array = GPOS_NEW(mp) IMDCacheObjectArray(mp, 1024, 1024); + IMDCacheObjectArray *mdcache_obj_array = + GPOS_NEW(mp) IMDCacheObjectArray(mp, 1024, 1024); // relcache MD provider CMDProviderRelcache *md_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); { CAutoMDAccessor md_accessor(mp, md_provider, default_sysid); ListCell *lc = NULL; - ForEach (lc, relcache_ctxt->m_oid_list) + ForEach(lc, relcache_ctxt->m_oid_list) { Oid oid = lfirst_oid(lc); // get object from relcache - CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(oid, 1 /* major */, 0 /* minor */); + CMDIdGPDB *mdid = + GPOS_NEW(mp) CMDIdGPDB(oid, 1 /* major */, 0 /* minor */); - IMDCacheObject *mdobj = CTranslatorRelcacheToDXL::RetrieveObject(mp, md_accessor.Pmda(), mdid); + IMDCacheObject *mdobj = CTranslatorRelcacheToDXL::RetrieveObject( + mp, md_accessor.Pmda(), mdid); GPOS_ASSERT(NULL != mdobj); mdcache_obj_array->Append(mdobj); @@ -1336,16 +1280,21 @@ COptTasks::ConvertToDXLFromMDObjsTask { COstreamFile cofs(relcache_ctxt->m_filename); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, cofs, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, cofs, + true /*serialize_header_footer*/, + true /*indentation*/); } else { CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, + true /*serialize_header_footer*/, + true /*indentation*/); - CHAR *str = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); + CHAR *str = + CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); GPOS_ASSERT(NULL != str); @@ -1367,40 +1316,44 @@ COptTasks::ConvertToDXLFromMDObjsTask // task that dumps relstats info for a table in DXL // //--------------------------------------------------------------------------- -void* -COptTasks::ConvertToDXLFromRelStatsTask - ( - void *ptr - ) +void * +COptTasks::ConvertToDXLFromRelStatsTask(void *ptr) { GPOS_ASSERT(NULL != ptr); - SContextRelcacheToDXL *relcache_ctxt = SContextRelcacheToDXL::RelcacheConvert(ptr); + SContextRelcacheToDXL *relcache_ctxt = + SContextRelcacheToDXL::RelcacheConvert(ptr); GPOS_ASSERT(NULL != relcache_ctxt); AUTO_MEM_POOL(amp); CMemoryPool *mp = amp.Pmp(); // relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); CAutoMDAccessor md_accessor(mp, relcache_provider, default_sysid); ICostModel *cost_model = GetCostModel(mp, gpdb::GetGPSegmentCount()); - CAutoOptCtxt aoc(mp, md_accessor.Pmda(), NULL /*expr_evaluator*/, cost_model); + CAutoOptCtxt aoc(mp, md_accessor.Pmda(), NULL /*expr_evaluator*/, + cost_model); - IMDCacheObjectArray *mdcache_obj_array = GPOS_NEW(mp) IMDCacheObjectArray(mp); + IMDCacheObjectArray *mdcache_obj_array = + GPOS_NEW(mp) IMDCacheObjectArray(mp); ListCell *lc = NULL; - ForEach (lc, relcache_ctxt->m_oid_list) + ForEach(lc, relcache_ctxt->m_oid_list) { Oid relation_oid = lfirst_oid(lc); // get object from relcache - CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(relation_oid, 1 /* major */, 0 /* minor */); + CMDIdGPDB *mdid = + GPOS_NEW(mp) CMDIdGPDB(relation_oid, 1 /* major */, 0 /* minor */); // generate mdid for relstats CMDIdRelStats *m_rel_stats_mdid = GPOS_NEW(mp) CMDIdRelStats(mdid); - IMDRelStats *mdobj_rel_stats = const_cast(md_accessor.Pmda()->Pmdrelstats(m_rel_stats_mdid)); - mdcache_obj_array->Append(dynamic_cast(mdobj_rel_stats)); + IMDRelStats *mdobj_rel_stats = const_cast( + md_accessor.Pmda()->Pmdrelstats(m_rel_stats_mdid)); + mdcache_obj_array->Append( + dynamic_cast(mdobj_rel_stats)); // extract out column stats for this relation Relation rel = gpdb::GetRelation(relation_oid); @@ -1410,10 +1363,13 @@ COptTasks::ConvertToDXLFromRelStatsTask if (!rel->rd_att->attrs[ul]->attisdropped) { mdid->AddRef(); - CMDIdColStats *mdid_col_stats = GPOS_NEW(mp) CMDIdColStats(mdid, pos_counter); + CMDIdColStats *mdid_col_stats = + GPOS_NEW(mp) CMDIdColStats(mdid, pos_counter); pos_counter++; - IMDColStats *mdobj_col_stats = const_cast(md_accessor.Pmda()->Pmdcolstats(mdid_col_stats)); - mdcache_obj_array->Append(dynamic_cast(mdobj_col_stats)); + IMDColStats *mdobj_col_stats = const_cast( + md_accessor.Pmda()->Pmdcolstats(mdid_col_stats)); + mdcache_obj_array->Append( + dynamic_cast(mdobj_col_stats)); mdid_col_stats->Release(); } } @@ -1425,14 +1381,18 @@ COptTasks::ConvertToDXLFromRelStatsTask { COstreamFile cofs(relcache_ctxt->m_filename); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, cofs, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, cofs, + true /*serialize_header_footer*/, + true /*indentation*/); } else { CWStringDynamic wcstr(mp); COstreamString oss(&wcstr); - CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, true /*serialize_header_footer*/, true /*indentation*/); + CDXLUtils::SerializeMetadata(mp, mdcache_obj_array, oss, + true /*serialize_header_footer*/, + true /*indentation*/); CHAR *str = CreateMultiByteCharStringFromWCString(wcstr.GetBuffer()); @@ -1457,11 +1417,8 @@ COptTasks::ConvertToDXLFromRelStatsTask // evaluates it and returns the result as a serialized DXL document. // //--------------------------------------------------------------------------- -void* -COptTasks::EvalExprFromDXLTask - ( - void *ptr - ) +void * +COptTasks::EvalExprFromDXLTask(void *ptr) { GPOS_ASSERT(NULL != ptr); SEvalExprContext *eval_expr_ctxt = SEvalExprContext::PevalctxtConvert(ptr); @@ -1472,7 +1429,8 @@ COptTasks::EvalExprFromDXLTask AUTO_MEM_POOL(amp); CMemoryPool *mp = amp.Pmp(); - CDXLNode *input_dxl = CDXLUtils::ParseDXLToScalarExprDXLNode(mp, eval_expr_ctxt->m_dxl, NULL /*xsd_file_path*/); + CDXLNode *input_dxl = CDXLUtils::ParseDXLToScalarExprDXLNode( + mp, eval_expr_ctxt->m_dxl, NULL /*xsd_file_path*/); GPOS_ASSERT(NULL != input_dxl); CDXLNode *result_dxl = NULL; @@ -1498,7 +1456,8 @@ COptTasks::EvalExprFromDXLTask CMDCache::Reset(); CMDCache::SetCacheQuota(optimizer_mdcache_size * 1024L); } - else if (CMDCache::ULLGetCacheQuota() != (ULLONG) optimizer_mdcache_size * 1024L) + else if (CMDCache::ULLGetCacheQuota() != + (ULLONG) optimizer_mdcache_size * 1024L) { CMDCache::SetCacheQuota(optimizer_mdcache_size * 1024L); } @@ -1506,10 +1465,12 @@ COptTasks::EvalExprFromDXLTask GPOS_TRY { // set up relcache MD provider - CMDProviderRelcache *relcache_provider = GPOS_NEW(mp) CMDProviderRelcache(mp); + CMDProviderRelcache *relcache_provider = + GPOS_NEW(mp) CMDProviderRelcache(mp); { // scope for MD accessor - CMDAccessor mda(mp, CMDCache::Pcache(), default_sysid, relcache_provider); + CMDAccessor mda(mp, CMDCache::Pcache(), default_sysid, + relcache_provider); CConstExprEvaluatorProxy expr_eval_proxy(mp, &mda); result_dxl = expr_eval_proxy.EvaluateExpr(input_dxl); @@ -1526,7 +1487,8 @@ COptTasks::EvalExprFromDXLTask if (ShouldErrorOut(ex)) { IErrorContext *errctxt = CTask::Self()->GetErrCtxt(); - char *serialized_error_msg = CreateMultiByteCharStringFromWCString(errctxt->GetErrorMsg()); + char *serialized_error_msg = + CreateMultiByteCharStringFromWCString(errctxt->GetErrorMsg()); elog(DEBUG1, "%s", serialized_error_msg); gpdb::GPDBFree(serialized_error_msg); } @@ -1535,14 +1497,12 @@ COptTasks::EvalExprFromDXLTask GPOS_CATCH_END; CWStringDynamic *dxl_string = - CDXLUtils::SerializeScalarExpr - ( - mp, - result_dxl, - true, // serialize_header_footer - true // indentation - ); - eval_expr_ctxt->m_dxl_result = CreateMultiByteCharStringFromWCString(dxl_string->GetBuffer()); + CDXLUtils::SerializeScalarExpr(mp, result_dxl, + true, // serialize_header_footer + true // indentation + ); + eval_expr_ctxt->m_dxl_result = + CreateMultiByteCharStringFromWCString(dxl_string->GetBuffer()); GPOS_DELETE(dxl_string); CRefCount::SafeRelease(result_dxl); input_dxl->Release(); @@ -1565,10 +1525,7 @@ COptTasks::EvalExprFromDXLTask // //--------------------------------------------------------------------------- char * -COptTasks::Optimize - ( - Query *query - ) +COptTasks::Optimize(Query *query) { Assert(query); @@ -1593,18 +1550,17 @@ COptTasks::Optimize // //--------------------------------------------------------------------------- PlannedStmt * -COptTasks::GPOPTOptimizedPlan - ( - Query *query, - SOptContext *gpopt_context, - BOOL *has_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan - ) +COptTasks::GPOPTOptimizedPlan( + Query *query, SOptContext *gpopt_context, + BOOL * + has_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan +) { Assert(query); Assert(gpopt_context); gpopt_context->m_query = query; - gpopt_context->m_should_generate_plan_stmt= true; + gpopt_context->m_should_generate_plan_stmt = true; GPOS_TRY { Execute(&OptimizeTask, gpopt_context); @@ -1629,10 +1585,7 @@ COptTasks::GPOPTOptimizedPlan // //--------------------------------------------------------------------------- char * -COptTasks::ConvertQueryToDXL - ( - Query *query - ) +COptTasks::ConvertQueryToDXL(Query *query) { Assert(query); @@ -1656,10 +1609,7 @@ COptTasks::ConvertQueryToDXL // //--------------------------------------------------------------------------- PlannedStmt * -COptTasks::ConvertToiPlanStmtFromXML - ( - char *dxl_string - ) +COptTasks::ConvertToiPlanStmtFromXML(char *dxl_string) { Assert(NULL != dxl_string); @@ -1683,13 +1633,10 @@ COptTasks::ConvertToiPlanStmtFromXML // //--------------------------------------------------------------------------- void -COptTasks::DumpMDObjs - ( - List *oid_list, - const char *filename - ) +COptTasks::DumpMDObjs(List *oid_list, const char *filename) { - SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, filename); + SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, + filename); Execute(&ConvertToDXLFromMDObjsTask, &relcache_ctxt); } @@ -1703,12 +1650,10 @@ COptTasks::DumpMDObjs // //--------------------------------------------------------------------------- char * -COptTasks::SzMDObjs - ( - List *oid_list - ) +COptTasks::SzMDObjs(List *oid_list) { - SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, NULL /*filename*/); + SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, + NULL /*filename*/); Execute(&ConvertToDXLFromMDObjsTask, &relcache_ctxt); return relcache_ctxt.m_dxl; @@ -1723,12 +1668,10 @@ COptTasks::SzMDObjs // //--------------------------------------------------------------------------- char * -COptTasks::DumpMDCast - ( - List *oid_list - ) +COptTasks::DumpMDCast(List *oid_list) { - SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, NULL /*filename*/); + SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, + NULL /*filename*/); Execute(&ConvertToDXLFromMDCast, &relcache_ctxt); return relcache_ctxt.m_dxl; @@ -1743,13 +1686,10 @@ COptTasks::DumpMDCast // //--------------------------------------------------------------------------- char * -COptTasks::DumpMDScalarCmp - ( - List *oid_list, - char *cmp_type - ) +COptTasks::DumpMDScalarCmp(List *oid_list, char *cmp_type) { - SContextRelcacheToDXL relcache_ctxt(oid_list, GetComparisonType(cmp_type), NULL /*filename*/); + SContextRelcacheToDXL relcache_ctxt(oid_list, GetComparisonType(cmp_type), + NULL /*filename*/); Execute(&ConvertToDXLFromMDScalarCmp, &relcache_ctxt); return relcache_ctxt.m_dxl; @@ -1765,12 +1705,10 @@ COptTasks::DumpMDScalarCmp // //--------------------------------------------------------------------------- char * -COptTasks::DumpRelStats - ( - List *oid_list - ) +COptTasks::DumpRelStats(List *oid_list) { - SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, NULL /*filename*/); + SContextRelcacheToDXL relcache_ctxt(oid_list, gpos::ulong_max /*cmp_type*/, + NULL /*filename*/); Execute(&ConvertToDXLFromRelStatsTask, &relcache_ctxt); return relcache_ctxt.m_dxl; @@ -1785,11 +1723,7 @@ COptTasks::DumpRelStats // //--------------------------------------------------------------------------- bool -COptTasks::SetXform - ( - char *xform_str, - bool should_disable - ) +COptTasks::SetXform(char *xform_str, bool should_disable) { CXform *xform = CXformFactory::Pxff()->Pxf(xform_str); if (NULL != xform) @@ -1811,17 +1745,15 @@ COptTasks::SetXform // //--------------------------------------------------------------------------- ULONG -COptTasks::GetComparisonType - ( - char *cmp_type - ) +COptTasks::GetComparisonType(char *cmp_type) { const ULONG num_cmp_types = 6; - const CmpType cmp_types[] = {CmptEq, CmptNEq, CmptLT, CmptGT, CmptLEq, CmptGEq}; + const CmpType cmp_types[] = {CmptEq, CmptNEq, CmptLT, + CmptGT, CmptLEq, CmptGEq}; const CHAR *cmp_types_str_arr[] = {"Eq", "NEq", "LT", "GT", "LEq", "GEq"}; - + for (ULONG ul = 0; ul < num_cmp_types; ul++) - { + { if (0 == strcasecmp(cmp_type, cmp_types_str_arr[ul])) { return cmp_types[ul]; @@ -1843,10 +1775,7 @@ COptTasks::GetComparisonType // //--------------------------------------------------------------------------- char * -COptTasks::EvalExprFromXML - ( - char *xml_string - ) +COptTasks::EvalExprFromXML(char *xml_string) { GPOS_ASSERT(NULL != xml_string); @@ -1869,10 +1798,7 @@ COptTasks::EvalExprFromXML // //--------------------------------------------------------------------------- char * -COptTasks::OptimizeMinidumpFromFile - ( - char *file_name - ) +COptTasks::OptimizeMinidumpFromFile(char *file_name) { GPOS_ASSERT(NULL != file_name); SOptimizeMinidumpContext optmdpctxt; diff --git a/src/backend/gpopt/utils/funcs.cpp b/src/backend/gpopt/utils/funcs.cpp index 1278c0ae07..50045f5b76 100644 --- a/src/backend/gpopt/utils/funcs.cpp +++ b/src/backend/gpopt/utils/funcs.cpp @@ -40,8 +40,7 @@ extern "C" { //--------------------------------------------------------------------------- extern "C" { -Datum -DisableXform(PG_FUNCTION_ARGS) +Datum DisableXform(PG_FUNCTION_ARGS) { char *szXform = text_to_cstring(PG_GETARG_TEXT_P(0)); bool is_result = COptTasks::SetXform(szXform, true /*fDisable*/); @@ -73,8 +72,7 @@ DisableXform(PG_FUNCTION_ARGS) //--------------------------------------------------------------------------- extern "C" { -Datum -EnableXform(PG_FUNCTION_ARGS) +Datum EnableXform(PG_FUNCTION_ARGS) { char *szXform = text_to_cstring(PG_GETARG_TEXT_P(0)); bool is_result = COptTasks::SetXform(szXform, false /*fDisable*/); diff --git a/src/include/gpopt/.clang-format b/src/include/gpopt/.clang-format new file mode 120000 index 0000000000..5260f46eb6 --- /dev/null +++ b/src/include/gpopt/.clang-format @@ -0,0 +1 @@ +../../backend/gpopt/.clang-format \ No newline at end of file diff --git a/src/include/gpopt/CGPOptimizer.h b/src/include/gpopt/CGPOptimizer.h index 1f490fe202..34aa661f5e 100644 --- a/src/include/gpopt/CGPOptimizer.h +++ b/src/include/gpopt/CGPOptimizer.h @@ -22,36 +22,30 @@ class CGPOptimizer { - public: - - // optimize given query using GP optimizer - static - PlannedStmt *GPOPTOptimizedPlan - ( - Query *query, - bool *had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan - ); - - // serialize planned statement into DXL - static - char *SerializeDXLPlan(Query *query); - - // gpopt initialize and terminate - static - void InitGPOPT(); - - static - void TerminateGPOPT(); +public: + // optimize given query using GP optimizer + static PlannedStmt *GPOPTOptimizedPlan( + Query *query, + bool * + had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan + ); + + // serialize planned statement into DXL + static char *SerializeDXLPlan(Query *query); + + // gpopt initialize and terminate + static void InitGPOPT(); + + static void TerminateGPOPT(); }; -extern "C" -{ +extern "C" { -extern PlannedStmt *GPOPTOptimizedPlan(Query *query, bool *had_unexpected_failure); +extern PlannedStmt *GPOPTOptimizedPlan(Query *query, + bool *had_unexpected_failure); extern char *SerializeDXLPlan(Query *query); -extern void InitGPOPT (); -extern void TerminateGPOPT (); - +extern void InitGPOPT(); +extern void TerminateGPOPT(); } -#endif // CGPOptimizer_H +#endif // CGPOptimizer_H diff --git a/src/include/gpopt/config/CConfigParamMapping.h b/src/include/gpopt/config/CConfigParamMapping.h index ead5cdf36e..b35c49c62d 100644 --- a/src/include/gpopt/config/CConfigParamMapping.h +++ b/src/include/gpopt/config/CConfigParamMapping.h @@ -25,55 +25,53 @@ using namespace gpos; namespace gpdxl { - //--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// @class: +// CConfigParamMapping +// +// @doc: +// Functionality for mapping GPDB config params to traceflags +// +//--------------------------------------------------------------------------- +class CConfigParamMapping +{ +private: + //------------------------------------------------------------------ // @class: - // CConfigParamMapping + // SConfigMappingElem // // @doc: - // Functionality for mapping GPDB config params to traceflags + // Unit describing the mapping of a single GPDB config param + // to a trace flag // - //--------------------------------------------------------------------------- - class CConfigParamMapping + //------------------------------------------------------------------ + struct SConfigMappingElem { - private: - //------------------------------------------------------------------ - // @class: - // SConfigMappingElem - // - // @doc: - // Unit describing the mapping of a single GPDB config param - // to a trace flag - // - //------------------------------------------------------------------ - struct SConfigMappingElem - { - // trace flag - EOptTraceFlag m_trace_flag; + // trace flag + EOptTraceFlag m_trace_flag; - // config param address - BOOL *m_is_param; + // config param address + BOOL *m_is_param; - // if true, we negate the config param value before setting traceflag value - BOOL m_negate_param; + // if true, we negate the config param value before setting traceflag value + BOOL m_negate_param; - // description - const WCHAR *description_str; - }; + // description + const WCHAR *description_str; + }; - // array of mapping elements - static SConfigMappingElem m_elements[]; + // array of mapping elements + static SConfigMappingElem m_elements[]; - // private ctor - CConfigParamMapping(const CConfigParamMapping &); + // private ctor + CConfigParamMapping(const CConfigParamMapping &); - public: - // pack enabled optimizer config params in a traceflag bitset - static - CBitSet *PackConfigParamInBitset(CMemoryPool *mp, ULONG xform_id); - }; -} +public: + // pack enabled optimizer config params in a traceflag bitset + static CBitSet *PackConfigParamInBitset(CMemoryPool *mp, ULONG xform_id); +}; +} // namespace gpdxl -#endif // ! GPOPT_CGUCMapping_H +#endif // ! GPOPT_CGUCMapping_H // EOF - diff --git a/src/include/gpopt/gpdbwrappers.h b/src/include/gpopt/gpdbwrappers.h index 554d3caa86..64b0b8e025 100644 --- a/src/include/gpopt/gpdbwrappers.h +++ b/src/include/gpopt/gpdbwrappers.h @@ -55,662 +55,690 @@ struct Var; struct Const; struct ArrayExpr; -namespace gpdb { +namespace gpdb +{ +// convert datum to bool +bool BoolFromDatum(Datum d); - // convert datum to bool - bool BoolFromDatum(Datum d); +// convert bool to datum +Datum DatumFromBool(bool b); - // convert bool to datum - Datum DatumFromBool(bool b); +// convert datum to char +char CharFromDatum(Datum d); - // convert datum to char - char CharFromDatum(Datum d); +// convert char to datum +Datum DatumFromChar(char c); - // convert char to datum - Datum DatumFromChar(char c); +// convert datum to int8 +int8 Int8FromDatum(Datum d); - // convert datum to int8 - int8 Int8FromDatum(Datum d); +// convert int8 to datum +Datum DatumFromInt8(int8 i8); - // convert int8 to datum - Datum DatumFromInt8(int8 i8); +// convert datum to uint8 +uint8 Uint8FromDatum(Datum d); - // convert datum to uint8 - uint8 Uint8FromDatum(Datum d); +// convert uint8 to datum +Datum DatumFromUint8(uint8 ui8); - // convert uint8 to datum - Datum DatumFromUint8(uint8 ui8); +// convert datum to int16 +int16 Int16FromDatum(Datum d); - // convert datum to int16 - int16 Int16FromDatum(Datum d); +// convert int16 to datum +Datum DatumFromInt16(int16 i16); - // convert int16 to datum - Datum DatumFromInt16(int16 i16); +// convert datum to uint16 +uint16 Uint16FromDatum(Datum d); - // convert datum to uint16 - uint16 Uint16FromDatum(Datum d); +// convert uint16 to datum +Datum DatumFromUint16(uint16 ui16); - // convert uint16 to datum - Datum DatumFromUint16(uint16 ui16); +// convert datum to int32 +int32 Int32FromDatum(Datum d); - // convert datum to int32 - int32 Int32FromDatum(Datum d); +// convert int32 to datum +Datum DatumFromInt32(int32 i32); - // convert int32 to datum - Datum DatumFromInt32(int32 i32); +// convert datum to uint32 +uint32 lUint32FromDatum(Datum d); - // convert datum to uint32 - uint32 lUint32FromDatum(Datum d); +// convert uint32 to datum +Datum DatumFromUint32(uint32 ui32); - // convert uint32 to datum - Datum DatumFromUint32(uint32 ui32); +// convert datum to int64 +int64 Int64FromDatum(Datum d); - // convert datum to int64 - int64 Int64FromDatum(Datum d); +// convert int64 to datum +Datum DatumFromInt64(int64 i64); - // convert int64 to datum - Datum DatumFromInt64(int64 i64); +// convert datum to uint64 +uint64 Uint64FromDatum(Datum d); - // convert datum to uint64 - uint64 Uint64FromDatum(Datum d); +// convert uint64 to datum +Datum DatumFromUint64(uint64 ui64); - // convert uint64 to datum - Datum DatumFromUint64(uint64 ui64); +// convert datum to oid +Oid OidFromDatum(Datum d); - // convert datum to oid - Oid OidFromDatum(Datum d); +// convert datum to generic object with pointer handle +void *PointerFromDatum(Datum d); - // convert datum to generic object with pointer handle - void *PointerFromDatum(Datum d); +// convert datum to float4 +float4 Float4FromDatum(Datum d); - // convert datum to float4 - float4 Float4FromDatum(Datum d); +// convert datum to float8 +float8 Float8FromDatum(Datum d); - // convert datum to float8 - float8 Float8FromDatum(Datum d); +// convert pointer to datum +Datum DatumFromPointer(const void *p); - // convert pointer to datum - Datum DatumFromPointer(const void *p); +// does an aggregate exist with the given oid +bool AggregateExists(Oid oid); - // does an aggregate exist with the given oid - bool AggregateExists(Oid oid); +// add member to Bitmapset +Bitmapset *BmsAddMember(Bitmapset *a, int x); - // add member to Bitmapset - Bitmapset *BmsAddMember(Bitmapset *a, int x); +// create a copy of an object +void *CopyObject(void *from); - // create a copy of an object - void *CopyObject(void *from); +// datum size +Size DatumSize(Datum value, bool type_by_val, int type_len); - // datum size - Size DatumSize(Datum value, bool type_by_val, int type_len); +// expression type +Oid ExprType(Node *expr); - // expression type - Oid ExprType(Node *expr); +// expression type modifier +int32 ExprTypeMod(Node *expr); - // expression type modifier - int32 ExprTypeMod(Node *expr); +// extract nodes with specific tag from a plan tree +List *ExtractNodesPlan(Plan *pl, int node_tag, bool descend_into_subqueries); - // extract nodes with specific tag from a plan tree - List *ExtractNodesPlan(Plan *pl, int node_tag, bool descend_into_subqueries); +// extract nodes with specific tag from an expression tree +List *ExtractNodesExpression(Node *node, int node_tag, + bool descend_into_subqueries); - // extract nodes with specific tag from an expression tree - List *ExtractNodesExpression(Node *node, int node_tag, bool descend_into_subqueries); - - // intermediate result type of given aggregate - Oid GetAggIntermediateResultType(Oid aggid); +// intermediate result type of given aggregate +Oid GetAggIntermediateResultType(Oid aggid); - // replace Vars that reference JOIN outputs with references to the original - // relation variables instead - Query *FlattenJoinAliasVar(Query *query, gpos::ULONG query_level); +// replace Vars that reference JOIN outputs with references to the original +// relation variables instead +Query *FlattenJoinAliasVar(Query *query, gpos::ULONG query_level); - // is aggregate ordered - bool IsOrderedAgg(Oid aggid); - - // does aggregate have a preliminary function - bool AggHasPrelimFunc(Oid aggid); +// is aggregate ordered +bool IsOrderedAgg(Oid aggid); - // does aggregate have a prelim or inverse prelim function - bool AggHasPrelimOrInvPrelimFunc(Oid aggid); +// does aggregate have a preliminary function +bool AggHasPrelimFunc(Oid aggid); - // intermediate result type of given aggregate - Oid GetAggregate(const char* agg, Oid type_oid); +// does aggregate have a prelim or inverse prelim function +bool AggHasPrelimOrInvPrelimFunc(Oid aggid); - // array type oid - Oid GetArrayType(Oid typid); +// intermediate result type of given aggregate +Oid GetAggregate(const char *agg, Oid type_oid); - // deconstruct array - void DeconstructArray(struct ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, - char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp); +// array type oid +Oid GetArrayType(Oid typid); - // attribute stats slot - bool GetAttrStatsSlot(AttStatsSlot *sslot, HeapTuple statstuple, int reqkind, - Oid reqop, int flags); +// deconstruct array +void DeconstructArray(struct ArrayType *array, Oid elmtype, int elmlen, + bool elmbyval, char elmalign, Datum **elemsp, + bool **nullsp, int *nelemsp); - // free attribute stats slot - void FreeAttrStatsSlot(AttStatsSlot *sslot); +// attribute stats slot +bool GetAttrStatsSlot(AttStatsSlot *sslot, HeapTuple statstuple, int reqkind, + Oid reqop, int flags); - // attribute statistics - HeapTuple GetAttStats(Oid relid, AttrNumber attnum); +// free attribute stats slot +void FreeAttrStatsSlot(AttStatsSlot *sslot); - // function oids - List *FunctionOids(void); +// attribute statistics +HeapTuple GetAttStats(Oid relid, AttrNumber attnum); - // does a function exist with the given oid - bool FunctionExists(Oid oid); +// function oids +List *FunctionOids(void); - // is the given function strict - bool FuncStrict(Oid funcid); +// does a function exist with the given oid +bool FunctionExists(Oid oid); - // does this preserve the NDVs of its inputs? - bool IsFuncNDVPreserving(Oid funcid); +// is the given function strict +bool FuncStrict(Oid funcid); - // stability property of given function - char FuncStability(Oid funcid); +// does this preserve the NDVs of its inputs? +bool IsFuncNDVPreserving(Oid funcid); - // data access property of given function - char FuncDataAccess(Oid funcid); +// stability property of given function +char FuncStability(Oid funcid); - // trigger name - char *GetTriggerName(Oid triggerid); +// data access property of given function +char FuncDataAccess(Oid funcid); - // trigger relid - Oid GetTriggerRelid(Oid triggerid); +// trigger name +char *GetTriggerName(Oid triggerid); - // trigger funcid - Oid GetTriggerFuncid(Oid triggerid); +// trigger relid +Oid GetTriggerRelid(Oid triggerid); - // trigger type - int32 GetTriggerType(Oid triggerid); +// trigger funcid +Oid GetTriggerFuncid(Oid triggerid); - // is trigger enabled - bool IsTriggerEnabled(Oid triggerid); +// trigger type +int32 GetTriggerType(Oid triggerid); - // does trigger exist - bool TriggerExists(Oid oid); +// is trigger enabled +bool IsTriggerEnabled(Oid triggerid); - // does check constraint exist - bool CheckConstraintExists(Oid check_constraint_oid); +// does trigger exist +bool TriggerExists(Oid oid); - // check constraint name - char *GetCheckConstraintName(Oid check_constraint_oid); +// does check constraint exist +bool CheckConstraintExists(Oid check_constraint_oid); - // check constraint relid - Oid GetCheckConstraintRelid(Oid check_constraint_oid); +// check constraint name +char *GetCheckConstraintName(Oid check_constraint_oid); - // check constraint expression tree - Node *PnodeCheckConstraint(Oid check_constraint_oid); +// check constraint relid +Oid GetCheckConstraintRelid(Oid check_constraint_oid); - // get the list of check constraints for a given relation - List *GetCheckConstraintOids(Oid rel_oid); +// check constraint expression tree +Node *PnodeCheckConstraint(Oid check_constraint_oid); - // part constraint expression tree - Node *GetRelationPartContraints(Oid rel_oid, List **default_levels); +// get the list of check constraints for a given relation +List *GetCheckConstraintOids(Oid rel_oid); - // get the cast function for the specified source and destination types - bool GetCastFunc(Oid src_oid, Oid dest_oid, bool *is_binary_coercible, Oid *cast_fn_oid, CoercionPathType *pathtype); - - // get type of operator - unsigned int GetComparisonType(Oid op_oid, Oid left_oid, Oid right_oid); - - // get scalar comparison between given types - Oid GetComparisonOperator(Oid left_oid, Oid right_oid, unsigned int cmpt); +// part constraint expression tree +Node *GetRelationPartContraints(Oid rel_oid, List **default_levels); - // get equality operator for given type - Oid GetEqualityOp(Oid type_oid); +// get the cast function for the specified source and destination types +bool GetCastFunc(Oid src_oid, Oid dest_oid, bool *is_binary_coercible, + Oid *cast_fn_oid, CoercionPathType *pathtype); - // function name - char *GetFuncName(Oid funcid); +// get type of operator +unsigned int GetComparisonType(Oid op_oid, Oid left_oid, Oid right_oid); - // output argument types of the given function - List *GetFuncOutputArgTypes(Oid funcid); +// get scalar comparison between given types +Oid GetComparisonOperator(Oid left_oid, Oid right_oid, unsigned int cmpt); - // argument types of the given function - List *GetFuncArgTypes(Oid funcid); +// get equality operator for given type +Oid GetEqualityOp(Oid type_oid); - // does a function return a set of rows - bool GetFuncRetset(Oid funcid); +// function name +char *GetFuncName(Oid funcid); - // return type of the given function - Oid GetFuncRetType(Oid funcid); +// output argument types of the given function +List *GetFuncOutputArgTypes(Oid funcid); - // commutator operator of the given operator - Oid GetCommutatorOp(Oid opno); +// argument types of the given function +List *GetFuncArgTypes(Oid funcid); - // inverse operator of the given operator - Oid GetInverseOp(Oid opno); +// does a function return a set of rows +bool GetFuncRetset(Oid funcid); - // function oid corresponding to the given operator oid - RegProcedure GetOpFunc(Oid opno); +// return type of the given function +Oid GetFuncRetType(Oid funcid); - // operator name - char *GetOpName(Oid opno); +// commutator operator of the given operator +Oid GetCommutatorOp(Oid opno); - // parts of a partitioned table - bool IsLeafPartition(Oid oid); +// inverse operator of the given operator +Oid GetInverseOp(Oid opno); - // partition table has an external partition - bool HasExternalPartition(Oid oid); +// function oid corresponding to the given operator oid +RegProcedure GetOpFunc(Oid opno); - // find the oid of the root partition given partition oid belongs to - Oid GetRootPartition(Oid oid); - - // partition attributes - List *GetPartitionAttrs(Oid oid); +// operator name +char *GetOpName(Oid opno); - // get partition keys and kinds ordered by partition level - void GetOrderedPartKeysAndKinds(Oid oid, List **pkeys, List **pkinds); +// parts of a partitioned table +bool IsLeafPartition(Oid oid); - // parts of a partitioned table - PartitionNode *GetParts(Oid relid, int2 level, Oid parent, bool inctemplate, bool includesubparts); +// partition table has an external partition +bool HasExternalPartition(Oid oid); - // keys of the relation with the given oid - List *GetRelationKeys(Oid relid); +// find the oid of the root partition given partition oid belongs to +Oid GetRootPartition(Oid oid); - // relid of a composite type - Oid GetTypeRelid(Oid typid); +// partition attributes +List *GetPartitionAttrs(Oid oid); - // name of the type with the given oid - char *GetTypeName(Oid typid); +// get partition keys and kinds ordered by partition level +void GetOrderedPartKeysAndKinds(Oid oid, List **pkeys, List **pkinds); - // number of GP segments - int GetGPSegmentCount(void); +// parts of a partitioned table +PartitionNode *GetParts(Oid relid, int2 level, Oid parent, bool inctemplate, + bool includesubparts); - // heap attribute is null - bool HeapAttIsNull(HeapTuple tup, int attnum); +// keys of the relation with the given oid +List *GetRelationKeys(Oid relid); - // free heap tuple - void FreeHeapTuple(HeapTuple htup); +// relid of a composite type +Oid GetTypeRelid(Oid typid); - // does an index exist with the given oid - bool IndexExists(Oid oid); +// name of the type with the given oid +char *GetTypeName(Oid typid); - // check if given oid is hashable internally in Greenplum Database - bool IsGreenplumDbHashable(Oid typid); +// number of GP segments +int GetGPSegmentCount(void); - // append an element to a list - List *LAppend(List *list, void *datum); +// heap attribute is null +bool HeapAttIsNull(HeapTuple tup, int attnum); - // append an integer to a list - List *LAppendInt(List *list, int datum); +// free heap tuple +void FreeHeapTuple(HeapTuple htup); - // append an oid to a list - List *LAppendOid(List *list, Oid datum); +// does an index exist with the given oid +bool IndexExists(Oid oid); - // prepend a new element to the list - List *LPrepend(void *datum, List *list); +// check if given oid is hashable internally in Greenplum Database +bool IsGreenplumDbHashable(Oid typid); - // prepend an integer to the list - List *LPrependInt(int datum, List *list); +// append an element to a list +List *LAppend(List *list, void *datum); - // prepend an oid to a list - List *LPrependOid(Oid datum, List *list); +// append an integer to a list +List *LAppendInt(List *list, int datum); - // concatenate lists - List *ListConcat(List *list1, List *list2); +// append an oid to a list +List *LAppendOid(List *list, Oid datum); - // copy list - List *ListCopy(List *list); +// prepend a new element to the list +List *LPrepend(void *datum, List *list); - // first cell in a list - ListCell *ListHead(List *l); +// prepend an integer to the list +List *LPrependInt(int datum, List *list); - // last cell in a list - ListCell *ListTail(List *l); +// prepend an oid to a list +List *LPrependOid(Oid datum, List *list); - // number of items in a list - uint32 ListLength(List *l); +// concatenate lists +List *ListConcat(List *list1, List *list2); - // return the nth element in a list of pointers - void *ListNth(List *list, int n); +// copy list +List *ListCopy(List *list); - // return the nth element in a list of ints - int ListNthInt(List *list, int n); +// first cell in a list +ListCell *ListHead(List *l); - // return the nth element in a list of oids - Oid ListNthOid(List *list, int n); +// last cell in a list +ListCell *ListTail(List *l); - // check whether the given oid is a member of the given list - bool ListMemberOid(List *list, Oid oid); +// number of items in a list +uint32 ListLength(List *l); - // free list - void ListFree(List *list); - - // deep free of a list - void ListFreeDeep(List *list); +// return the nth element in a list of pointers +void *ListNth(List *list, int n); - // is this a Gather motion - bool IsMotionGather(const Motion *motion); +// return the nth element in a list of ints +int ListNthInt(List *list, int n); - // does a partition table have an appendonly child - bool IsAppendOnlyPartitionTable(Oid root_oid); +// return the nth element in a list of oids +Oid ListNthOid(List *list, int n); - // does a multi-level partitioned table have uniform partitioning hierarchy - bool IsMultilevelPartitionUniform(Oid root_oid); +// check whether the given oid is a member of the given list +bool ListMemberOid(List *list, Oid oid); - // lookup type cache - TypeCacheEntry *LookupTypeCache(Oid type_id, int flags); +// free list +void ListFree(List *list); - // create a value node for a string - Value *MakeStringValue(char *str); +// deep free of a list +void ListFreeDeep(List *list); - // create a value node for an integer - Value *MakeIntegerValue(long i); +// is this a Gather motion +bool IsMotionGather(const Motion *motion); - // create a bool constant - Node *MakeBoolConst(bool value, bool isnull); +// does a partition table have an appendonly child +bool IsAppendOnlyPartitionTable(Oid root_oid); - // make a NULL constant of the given type - Node *MakeNULLConst(Oid type_oid); - - // create a new target entry - TargetEntry *MakeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk); +// does a multi-level partitioned table have uniform partitioning hierarchy +bool IsMultilevelPartitionUniform(Oid root_oid); - // create a new var node - Var *MakeVar(Index varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Index varlevelsup); +// lookup type cache +TypeCacheEntry *LookupTypeCache(Oid type_id, int flags); - // memory allocation functions - void *MemCtxtAllocImpl(MemoryContext context, Size size, const char* file, const char * func, int line); - void *MemCtxtAllocZeroAlignedImpl(MemoryContext context, Size size, const char* file, const char * func, int line); - void *MemCtxtAllocZeroImpl(MemoryContext context, Size size, const char* file, const char * func, int line); - void *MemCtxtReallocImpl(void *pointer, Size size, const char* file, const char * func, int line); - void *GPDBAlloc(Size size); - void GPDBFree(void *ptr); +// create a value node for a string +Value *MakeStringValue(char *str); - // create a duplicate of the given string in the given memory context - char *MemCtxtStrdup(MemoryContext context, const char *string); +// create a value node for an integer +Value *MakeIntegerValue(long i); - // similar to ereport for logging messages - void GpdbEreportImpl(int xerrcode, int severitylevel, const char *xerrmsg, const char *xerrhint, const char *filename, int lineno, const char *funcname); -#define GpdbEreport(xerrcode, severitylevel, xerrmsg, xerrhint) \ - gpdb::GpdbEreportImpl(xerrcode, severitylevel, xerrmsg, xerrhint , __FILE__, __LINE__, PG_FUNCNAME_MACRO) +// create a bool constant +Node *MakeBoolConst(bool value, bool isnull); - // string representation of a node - char *NodeToString(void *obj); +// make a NULL constant of the given type +Node *MakeNULLConst(Oid type_oid); - // node representation from a string - Node *StringToNode(char *string); +// create a new target entry +TargetEntry *MakeTargetEntry(Expr *expr, AttrNumber resno, char *resname, + bool resjunk); - // return the default value of the type - Node *GetTypeDefault(Oid typid); +// create a new var node +Var *MakeVar(Index varno, AttrNumber varattno, Oid vartype, int32 vartypmod, + Index varlevelsup); - // convert numeric to double; if out of range, return +/- HUGE_VAL - double NumericToDoubleNoOverflow(Numeric num); +// memory allocation functions +void *MemCtxtAllocImpl(MemoryContext context, Size size, const char *file, + const char *func, int line); +void *MemCtxtAllocZeroAlignedImpl(MemoryContext context, Size size, + const char *file, const char *func, int line); +void *MemCtxtAllocZeroImpl(MemoryContext context, Size size, const char *file, + const char *func, int line); +void *MemCtxtReallocImpl(void *pointer, Size size, const char *file, + const char *func, int line); +void *GPDBAlloc(Size size); +void GPDBFree(void *ptr); - // convert time-related datums to double for stats purpose - double ConvertTimeValueToScalar(Datum datum, Oid typid); +// create a duplicate of the given string in the given memory context +char *MemCtxtStrdup(MemoryContext context, const char *string); - // convert network-related datums to double for stats purpose - double ConvertNetworkToScalar(Datum datum, Oid typid); +// similar to ereport for logging messages +void GpdbEreportImpl(int xerrcode, int severitylevel, const char *xerrmsg, + const char *xerrhint, const char *filename, int lineno, + const char *funcname); +#define GpdbEreport(xerrcode, severitylevel, xerrmsg, xerrhint) \ + gpdb::GpdbEreportImpl(xerrcode, severitylevel, xerrmsg, xerrhint, \ + __FILE__, __LINE__, PG_FUNCNAME_MACRO) - // is the given operator hash-joinable - bool IsOpHashJoinable(Oid opno); +// string representation of a node +char *NodeToString(void *obj); - // is the given operator merge-joinable - bool IsOpMergeJoinable(Oid opno); +// node representation from a string +Node *StringToNode(char *string); - // is the given operator strict - bool IsOpStrict(Oid opno); +// return the default value of the type +Node *GetTypeDefault(Oid typid); - // does it preserve the NDVs of its inputs - bool IsOpNDVPreserving(Oid opno); +// convert numeric to double; if out of range, return +/- HUGE_VAL +double NumericToDoubleNoOverflow(Numeric num); - // get input types for a given operator - void GetOpInputTypes(Oid opno, Oid *lefttype, Oid *righttype); +// convert time-related datums to double for stats purpose +double ConvertTimeValueToScalar(Datum datum, Oid typid); - // does an operator exist with the given oid - bool OperatorExists(Oid oid); +// convert network-related datums to double for stats purpose +double ConvertNetworkToScalar(Datum datum, Oid typid); - // fetch detoasted copies of toastable datatypes - struct varlena *DetoastDatum(struct varlena * datum); +// is the given operator hash-joinable +bool IsOpHashJoinable(Oid opno); - // expression tree walker - bool WalkExpressionTree(Node *node, bool(*walker)(), void *context); +// is the given operator merge-joinable +bool IsOpMergeJoinable(Oid opno); - // query or expression tree walker - bool WalkQueryOrExpressionTree(Node *node, bool(*walker)(), void *context, int flags); +// is the given operator strict +bool IsOpStrict(Oid opno); - // modify a query tree - Query *MutateQueryTree(Query *query, Node *(*mutator)(), void *context, int flags); +// does it preserve the NDVs of its inputs +bool IsOpNDVPreserving(Oid opno); - // modify an expression tree - Node *MutateExpressionTree(Node *node, Node *(*mutator)(), void *context); +// get input types for a given operator +void GetOpInputTypes(Oid opno, Oid *lefttype, Oid *righttype); - // modify a query or an expression tree - Node *MutateQueryOrExpressionTree(Node *node, Node *(*mutator)(), void *context, int flags); +// does an operator exist with the given oid +bool OperatorExists(Oid oid); - // the part of MutateQueryTree that processes a query's rangetable - List *MutateRangeTable(List *rtable, Node *(*mutator)(), void *context, int flags); +// fetch detoasted copies of toastable datatypes +struct varlena *DetoastDatum(struct varlena *datum); - // check whether the part with the given oid is the root of a partition table - bool RelPartIsRoot(Oid relid); - - // check whether the part with the given oid is an interior subpartition - bool RelPartIsInterior(Oid relid); - - // check whether table with the given oid is a regular table and not part of a partitioned table - bool RelPartIsNone(Oid relid); +// expression tree walker +bool WalkExpressionTree(Node *node, bool (*walker)(), void *context); - // check whether partitioning type encodes hash partitioning - bool FHashPartitioned(char c); +// query or expression tree walker +bool WalkQueryOrExpressionTree(Node *node, bool (*walker)(), void *context, + int flags); - // check whether a relation is inherited - bool FHasSubclass(Oid rel_oid); +// modify a query tree +Query *MutateQueryTree(Query *query, Node *(*mutator)(), void *context, + int flags); - // check whether a relation has parquet children - bool HasParquetChildren(Oid rel_oid); - - // return the distribution policy of a relation; if the table is partitioned - // and the parts are distributed differently, return Random distribution - GpPolicy *GetDistributionPolicy(Relation rel); - - // return true if the table is partitioned and hash-distributed, and one of - // the child partitions is randomly distributed - gpos::BOOL IsChildPartDistributionMismatched(Relation rel); +// modify an expression tree +Node *MutateExpressionTree(Node *node, Node *(*mutator)(), void *context); - // return true if the table is partitioned and any of the child partitions - // have a trigger of the given type - gpos::BOOL ChildPartHasTriggers(Oid oid, int trigger_type); +// modify a query or an expression tree +Node *MutateQueryOrExpressionTree(Node *node, Node *(*mutator)(), void *context, + int flags); - // does a relation exist with the given oid - bool RelationExists(Oid oid); +// the part of MutateQueryTree that processes a query's rangetable +List *MutateRangeTable(List *rtable, Node *(*mutator)(), void *context, + int flags); - // extract all relation oids from the catalog - List *GetAllRelationOids(void); +// check whether the part with the given oid is the root of a partition table +bool RelPartIsRoot(Oid relid); - // estimate the relation size using the real number of blocks and tuple density - void EstimateRelationSize(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples); - void CdbEstimateRelationSize (RelOptInfo *relOptInfo, Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, bool *default_stats_used); +// check whether the part with the given oid is an interior subpartition +bool RelPartIsInterior(Oid relid); - // close the given relation - void CloseRelation(Relation rel); +// check whether table with the given oid is a regular table and not part of a partitioned table +bool RelPartIsNone(Oid relid); - // return the logical indexes for a partitioned table - LogicalIndexes *GetLogicalPartIndexes(Oid oid); - - // return the logical info structure for a given logical index oid - LogicalIndexInfo *GetLogicalIndexInfo(Oid root_oid, Oid index_oid); - - // return a list of index oids for a given relation - List *GetRelationIndexes(Relation relation); +// check whether partitioning type encodes hash partitioning +bool FHashPartitioned(char c); - // build an array of triggers for this relation - void BuildRelationTriggers(Relation rel); +// check whether a relation is inherited +bool FHasSubclass(Oid rel_oid); - // get relation with given oid - Relation GetRelation(Oid rel_oid); +// check whether a relation has parquet children +bool HasParquetChildren(Oid rel_oid); - // get external table entry with given oid - ExtTableEntry *GetExternalTableEntry(Oid rel_oid); +// return the distribution policy of a relation; if the table is partitioned +// and the parts are distributed differently, return Random distribution +GpPolicy *GetDistributionPolicy(Relation rel); - // return the first member of the given targetlist whose expression is - // equal to the given expression, or NULL if no such member exists - TargetEntry *FindFirstMatchingMemberInTargetList(Node *node, List *targetlist); +// return true if the table is partitioned and hash-distributed, and one of +// the child partitions is randomly distributed +gpos::BOOL IsChildPartDistributionMismatched(Relation rel); - // return a list of members of the given targetlist whose expression is - // equal to the given expression, or NULL if no such member exists - List *FindMatchingMembersInTargetList(Node *node, List *targetlist); +// return true if the table is partitioned and any of the child partitions +// have a trigger of the given type +gpos::BOOL ChildPartHasTriggers(Oid oid, int trigger_type); - // check if two gpdb objects are equal - bool Equals(void *p1, void *p2); +// does a relation exist with the given oid +bool RelationExists(Oid oid); - // does a type exist with the given oid - bool TypeExists(Oid oid); +// extract all relation oids from the catalog +List *GetAllRelationOids(void); - // check whether a type is composite - bool IsCompositeType(Oid typid); +// estimate the relation size using the real number of blocks and tuple density +void EstimateRelationSize(Relation rel, int32 *attr_widths, BlockNumber *pages, + double *tuples); +void CdbEstimateRelationSize(RelOptInfo *relOptInfo, Relation rel, + int32 *attr_widths, BlockNumber *pages, + double *tuples, bool *default_stats_used); - bool IsTextRelatedType(Oid typid); +// close the given relation +void CloseRelation(Relation rel); - // get integer value from an Integer value node - int GetIntFromValue(Node *node); +// return the logical indexes for a partitioned table +LogicalIndexes *GetLogicalPartIndexes(Oid oid); - // parse external table URI - Uri *ParseExternTableUri(const char *uri); - - // returns ComponentDatabases - CdbComponentDatabases *GetComponentDatabases(void); +// return the logical info structure for a given logical index oid +LogicalIndexInfo *GetLogicalIndexInfo(Oid root_oid, Oid index_oid); - // compare two strings ignoring case - int StrCmpIgnoreCase(const char *s1, const char *s2); +// return a list of index oids for a given relation +List *GetRelationIndexes(Relation relation); - // construct random segment map - bool *ConstructRandomSegMap(int total_primaries, int total_to_skip); +// build an array of triggers for this relation +void BuildRelationTriggers(Relation rel); - // create an empty 'StringInfoData' & return a pointer to it - StringInfo MakeStringInfo(void); +// get relation with given oid +Relation GetRelation(Oid rel_oid); - // append the two given strings to the StringInfo object - void AppendStringInfo(StringInfo str, const char *str1, const char *str2); +// get external table entry with given oid +ExtTableEntry *GetExternalTableEntry(Oid rel_oid); - // look for the given node tags in the given tree and return the index of - // the first one found, or -1 if there are none - int FindNodes(Node *node, List *nodeTags); +// return the first member of the given targetlist whose expression is +// equal to the given expression, or NULL if no such member exists +TargetEntry *FindFirstMatchingMemberInTargetList(Node *node, List *targetlist); - Node *CoerceToCommonType(ParseState *pstate, Node *node, Oid target_type, const char *context); +// return a list of members of the given targetlist whose expression is +// equal to the given expression, or NULL if no such member exists +List *FindMatchingMembersInTargetList(Node *node, List *targetlist); - // replace any polymorphic type with correct data type deduced from input arguments - bool ResolvePolymorphicArgType(int numargs, Oid *argtypes, char *argmodes, FuncExpr *call_expr); - - // hash a const value with GPDB's hash function - int32 CdbHashConst(Const *constant, int num_segments); +// check if two gpdb objects are equal +bool Equals(void *p1, void *p2); - // pick a random segment from a pool of segments using GPDB's hash function - int32 CdbHashRandom(int num_segments); +// does a type exist with the given oid +bool TypeExists(Oid oid); - // hash a list of const values with GPDB's hash function - int32 CdbHashConstList(List *constants, int num_segments); - - // check permissions on range table - void CheckRTPermissions(List *rtable); - - // get index operator family properties - void IndexOpProperties(Oid opno, Oid opfamily, int *strategy, Oid *subtype, bool *recheck); - - // get oids of families this operator belongs to - List *GetOpFamiliesForScOp(Oid opno); - - // get oids of op classes for the index keys - List *GetIndexOpFamilies(Oid index_oid); +// check whether a type is composite +bool IsCompositeType(Oid typid); - // get oids of op classes for the merge join - List *GetMergeJoinOpFamilies(Oid opno); +bool IsTextRelatedType(Oid typid); - // returns the result of evaluating 'expr' as an Expr. Caller keeps ownership of 'expr' - // and takes ownership of the result - Expr *EvaluateExpr(Expr *expr, Oid result_type, int32 typmod); - - // interpret the value of "With oids" option from a list of defelems - bool InterpretOidsOption(List *options); - - // extract string value from defelem's value - char *DefGetString(DefElem *defelem); +// get integer value from an Integer value node +int GetIntFromValue(Node *node); - // transform array Const to an ArrayExpr - Expr *TransformArrayConstToArrayExpr(Const *constant); +// parse external table URI +Uri *ParseExternTableUri(const char *uri); - // transform array Const to an ArrayExpr - Node *EvalConstExpressions(Node *node); +// returns ComponentDatabases +CdbComponentDatabases *GetComponentDatabases(void); - // static partition selection given a PartitionSelector node - SelectedParts *RunStaticPartitionSelection(PartitionSelector *ps); +// compare two strings ignoring case +int StrCmpIgnoreCase(const char *s1, const char *s2); - // simple fault injector used by COptTasks.cpp to inject GPDB fault - FaultInjectorType_e InjectFaultInOptTasks(FaultInjectorIdentifier_e identifier); +// construct random segment map +bool *ConstructRandomSegMap(int total_primaries, int total_to_skip); - // return the number of leaf partition for a given table oid - gpos::ULONG CountLeafPartTables(Oid oidRelation); +// create an empty 'StringInfoData' & return a pointer to it +StringInfo MakeStringInfo(void); - // Does the metadata cache need to be reset (because of a catalog - // table has been changed?) - bool MDCacheNeedsReset(void); +// append the two given strings to the StringInfo object +void AppendStringInfo(StringInfo str, const char *str1, const char *str2); - // returns true if a query cancel is requested in GPDB - bool IsAbortRequested(void); +// look for the given node tags in the given tree and return the index of +// the first one found, or -1 if there are none +int FindNodes(Node *node, List *nodeTags); - uint32 HashChar(Datum d); +Node *CoerceToCommonType(ParseState *pstate, Node *node, Oid target_type, + const char *context); - uint32 HashBpChar(Datum d); +// replace any polymorphic type with correct data type deduced from input arguments +bool ResolvePolymorphicArgType(int numargs, Oid *argtypes, char *argmodes, + FuncExpr *call_expr); - uint32 HashText(Datum d); +// hash a const value with GPDB's hash function +int32 CdbHashConst(Const *constant, int num_segments); - uint32 HashName(Datum d); +// pick a random segment from a pool of segments using GPDB's hash function +int32 CdbHashRandom(int num_segments); - uint32 UUIDHash(Datum d); +// hash a list of const values with GPDB's hash function +int32 CdbHashConstList(List *constants, int num_segments); - void * GPDBMemoryContextAlloc(MemoryContext context, Size size); +// check permissions on range table +void CheckRTPermissions(List *rtable); - MemoryContext GPDBAllocSetContextCreate(); +// get index operator family properties +void IndexOpProperties(Oid opno, Oid opfamily, int *strategy, Oid *subtype, + bool *recheck); - void GPDBMemoryContextDelete(MemoryContext context); +// get oids of families this operator belongs to +List *GetOpFamiliesForScOp(Oid opno); -} //namespace gpdb +// get oids of op classes for the index keys +List *GetIndexOpFamilies(Oid index_oid); -#define ForEach(cell, l) \ +// get oids of op classes for the merge join +List *GetMergeJoinOpFamilies(Oid opno); + +// returns the result of evaluating 'expr' as an Expr. Caller keeps ownership of 'expr' +// and takes ownership of the result +Expr *EvaluateExpr(Expr *expr, Oid result_type, int32 typmod); + +// interpret the value of "With oids" option from a list of defelems +bool InterpretOidsOption(List *options); + +// extract string value from defelem's value +char *DefGetString(DefElem *defelem); + +// transform array Const to an ArrayExpr +Expr *TransformArrayConstToArrayExpr(Const *constant); + +// transform array Const to an ArrayExpr +Node *EvalConstExpressions(Node *node); + +// static partition selection given a PartitionSelector node +SelectedParts *RunStaticPartitionSelection(PartitionSelector *ps); + +// simple fault injector used by COptTasks.cpp to inject GPDB fault +FaultInjectorType_e InjectFaultInOptTasks(FaultInjectorIdentifier_e identifier); + +// return the number of leaf partition for a given table oid +gpos::ULONG CountLeafPartTables(Oid oidRelation); + +// Does the metadata cache need to be reset (because of a catalog +// table has been changed?) +bool MDCacheNeedsReset(void); + +// returns true if a query cancel is requested in GPDB +bool IsAbortRequested(void); + +uint32 HashChar(Datum d); + +uint32 HashBpChar(Datum d); + +uint32 HashText(Datum d); + +uint32 HashName(Datum d); + +uint32 UUIDHash(Datum d); + +void *GPDBMemoryContextAlloc(MemoryContext context, Size size); + +MemoryContext GPDBAllocSetContextCreate(); + +void GPDBMemoryContextDelete(MemoryContext context); + +} //namespace gpdb + +#define ForEach(cell, l) \ for ((cell) = gpdb::ListHead(l); (cell) != NULL; (cell) = lnext(cell)) -#define ForBoth(cell1, list1, cell2, list2) \ - for ((cell1) = gpdb::ListHead(list1), (cell2) = gpdb::ListHead(list2); \ - (cell1) != NULL && (cell2) != NULL; \ +#define ForBoth(cell1, list1, cell2, list2) \ + for ((cell1) = gpdb::ListHead(list1), (cell2) = gpdb::ListHead(list2); \ + (cell1) != NULL && (cell2) != NULL; \ (cell1) = lnext(cell1), (cell2) = lnext(cell2)) -#define ForThree(cell1, list1, cell2, list2, cell3, list3) \ - for ((cell1) = gpdb::ListHead(list1), (cell2) = gpdb::ListHead(list2), (cell3) = gpdb::ListHead(list3); \ - (cell1) != NULL && (cell2) != NULL && (cell3) != NULL; \ - (cell1) = lnext(cell1), (cell2) = lnext(cell2), (cell3) = lnext(cell3)) +#define ForThree(cell1, list1, cell2, list2, cell3, list3) \ + for ((cell1) = gpdb::ListHead(list1), (cell2) = gpdb::ListHead(list2), \ + (cell3) = gpdb::ListHead(list3); \ + (cell1) != NULL && (cell2) != NULL && (cell3) != NULL; \ + (cell1) = lnext(cell1), (cell2) = lnext(cell2), \ + (cell3) = lnext(cell3)) -#define ForEachWithCount(cell, list, counter) \ - for ((cell) = gpdb::ListHead(list), (counter)=0; \ - (cell) != NULL; \ - (cell) = lnext(cell), ++(counter)) +#define ForEachWithCount(cell, list, counter) \ + for ((cell) = gpdb::ListHead(list), (counter) = 0; (cell) != NULL; \ + (cell) = lnext(cell), ++(counter)) #define ListMake1(x1) gpdb::LPrepend(x1, NIL) -#define ListMake2(x1,x2) gpdb::LPrepend(x1, ListMake1(x2)) +#define ListMake2(x1, x2) gpdb::LPrepend(x1, ListMake1(x2)) #define ListMake1Int(x1) gpdb::LPrependInt(x1, NIL) #define ListMake1Oid(x1) gpdb::LPrependOid(x1, NIL) -#define ListMake2Oid(x1,x2) gpdb::LPrependOid(x1, ListMake1Oid(x2)) +#define ListMake2Oid(x1, x2) gpdb::LPrependOid(x1, ListMake1Oid(x2)) #define LInitial(l) lfirst(gpdb::ListHead(l)) #define LInitialOID(l) lfirst_oid(gpdb::ListHead(l)) -#define Palloc0Fast(sz) \ - ( MemSetTest(0, (sz)) ? \ - gpdb::MemCtxtAllocZeroAlignedImpl(CurrentMemoryContext, (sz), __FILE__, PG_FUNCNAME_MACRO, __LINE__) : \ - gpdb::MemCtxtAllocZeroImpl(CurrentMemoryContext, (sz), __FILE__, PG_FUNCNAME_MACRO, __LINE__)) +#define Palloc0Fast(sz) \ + (MemSetTest(0, (sz)) \ + ? gpdb::MemCtxtAllocZeroAlignedImpl(CurrentMemoryContext, (sz), \ + __FILE__, PG_FUNCNAME_MACRO, \ + __LINE__) \ + : gpdb::MemCtxtAllocZeroImpl(CurrentMemoryContext, (sz), __FILE__, \ + PG_FUNCNAME_MACRO, __LINE__)) #ifdef __GNUC__ /* With GCC, we can use a compound statement within an expression */ -#define NewNode(size, tag) \ -({ Node *_result; \ - AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \ - _result = (Node *) Palloc0Fast(size); \ - _result->type = (tag); \ - _result; \ -}) +#define NewNode(size, tag) \ + ({ \ + Node *_result; \ + AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \ + _result = (Node *) Palloc0Fast(size); \ + _result->type = (tag); \ + _result; \ + }) #else /* @@ -721,19 +749,16 @@ namespace gpdb { */ extern PGDLLIMPORT Node *newNodeMacroHolder; -#define NewNode(size, tag) \ -( \ - AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \ - newNodeMacroHolder = (Node *) Palloc0Fast(size), \ - newNodeMacroHolder->type = (tag), \ - newNodeMacroHolder \ -) -#endif // __GNUC__ +#define NewNode(size, tag) \ + (AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \ + newNodeMacroHolder = (Node *) Palloc0Fast(size), \ + newNodeMacroHolder->type = (tag), newNodeMacroHolder) +#endif // __GNUC__ -#define MakeNode(_type_) ((_type_ *) NewNode(sizeof(_type_),T_##_type_)) +#define MakeNode(_type_) ((_type_ *) NewNode(sizeof(_type_), T_##_type_)) #define PStrDup(str) gpdb::MemCtxtStrdup(CurrentMemoryContext, (str)) -#endif // !GPDB_gpdbwrappers_H +#endif // !GPDB_gpdbwrappers_H // EOF diff --git a/src/include/gpopt/relcache/CMDProviderRelcache.h b/src/include/gpopt/relcache/CMDProviderRelcache.h index 5ec9bb1223..c9c4cd5a4e 100644 --- a/src/include/gpopt/relcache/CMDProviderRelcache.h +++ b/src/include/gpopt/relcache/CMDProviderRelcache.h @@ -28,61 +28,54 @@ // fwd decl namespace gpopt { - class CMDAccessor; +class CMDAccessor; } namespace gpmd { - using namespace gpos; - - //--------------------------------------------------------------------------- - // @class: - // CMDProviderRelcache - // - // @doc: - // Relcache-based provider of metadata objects. - // - //--------------------------------------------------------------------------- - class CMDProviderRelcache : public IMDProvider +using namespace gpos; + +//--------------------------------------------------------------------------- +// @class: +// CMDProviderRelcache +// +// @doc: +// Relcache-based provider of metadata objects. +// +//--------------------------------------------------------------------------- +class CMDProviderRelcache : public IMDProvider +{ +private: + // memory pool + CMemoryPool *m_mp; + + // private copy ctor + CMDProviderRelcache(const CMDProviderRelcache &); + +public: + // ctor/dtor + explicit CMDProviderRelcache(CMemoryPool *mp); + + ~CMDProviderRelcache() { - private: - // memory pool - CMemoryPool *m_mp; - - // private copy ctor - CMDProviderRelcache(const CMDProviderRelcache&); - - public: - // ctor/dtor - explicit - CMDProviderRelcache(CMemoryPool *mp); - - ~CMDProviderRelcache() - { - } - - // returns the DXL string of the requested metadata object - virtual - CWStringBase *GetMDObjDXLStr(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *md_id) const; - - // return the mdid for the requested type - virtual - IMDId *MDId - ( - CMemoryPool *mp, - CSystemId sysid, - IMDType::ETypeInfo type_info - ) - const - { - return GetGPDBTypeMdid(mp, sysid, type_info); - } - - }; -} + } + + // returns the DXL string of the requested metadata object + virtual CWStringBase *GetMDObjDXLStr(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *md_id) const; + + // return the mdid for the requested type + virtual IMDId * + MDId(CMemoryPool *mp, CSystemId sysid, IMDType::ETypeInfo type_info) const + { + return GetGPDBTypeMdid(mp, sysid, type_info); + } +}; +} // namespace gpmd -#endif // !GPMD_CMDProviderRelcache_H +#endif // !GPMD_CMDProviderRelcache_H // EOF diff --git a/src/include/gpopt/translate/CCTEListEntry.h b/src/include/gpopt/translate/CCTEListEntry.h index 564357037a..de2aa371a7 100644 --- a/src/include/gpopt/translate/CCTEListEntry.h +++ b/src/include/gpopt/translate/CCTEListEntry.h @@ -32,104 +32,101 @@ using namespace gpos; namespace gpdxl { - - // hash on character arrays - inline - ULONG HashStr - ( - const CHAR *str - ) - { - return gpos::HashByteArray((BYTE *) str, clib::Strlen(str)); - } - - // equality on character arrays - inline - BOOL StrEqual(const CHAR *str_a, const CHAR *str_b) - { - return (0 == clib::Strcmp(str_a, str_b)); - } - - - //--------------------------------------------------------------------------- - // @class: - // CCTEListEntry - // - // @doc: - // Class representing the list of common table expression defined at a - // query level - // - //--------------------------------------------------------------------------- - class CCTEListEntry : public CRefCount +// hash on character arrays +inline ULONG +HashStr(const CHAR *str) +{ + return gpos::HashByteArray((BYTE *) str, clib::Strlen(str)); +} + +// equality on character arrays +inline BOOL +StrEqual(const CHAR *str_a, const CHAR *str_b) +{ + return (0 == clib::Strcmp(str_a, str_b)); +} + + +//--------------------------------------------------------------------------- +// @class: +// CCTEListEntry +// +// @doc: +// Class representing the list of common table expression defined at a +// query level +// +//--------------------------------------------------------------------------- +class CCTEListEntry : public CRefCount +{ +private: + // pair of DXL CTE producer and target list of the original CTE query + struct SCTEProducerInfo { - private: - - // pair of DXL CTE producer and target list of the original CTE query - struct SCTEProducerInfo - { - const CDXLNode *m_cte_producer; - List *m_target_list; - - // ctor - SCTEProducerInfo - ( - const CDXLNode *cte_producer, - List *target_list - ) - : - m_cte_producer(cte_producer), - m_target_list(target_list) - {} - }; - - // hash maps mapping CHAR *->SCTEProducerInfo - typedef CHashMap HMSzCTEInfo; - - // query level where the CTEs are defined - ULONG m_query_level; - - // CTE producers at that level indexed by their name - HMSzCTEInfo *m_cte_info; - - public: - // ctor: single CTE - CCTEListEntry(CMemoryPool *mp, ULONG query_level, CommonTableExpr *cte, CDXLNode *cte_producer); - - // ctor: multiple CTEs - CCTEListEntry(CMemoryPool *mp, ULONG query_level, List *cte_list, CDXLNodeArray *dxlnodes); - - // dtor - virtual - ~CCTEListEntry() - { - m_cte_info->Release(); - }; - - // the query level - ULONG GetQueryLevel() const - { - return m_query_level; - } - - // lookup CTE producer by its name - const CDXLNode *GetCTEProducer(const CHAR *cte_str) const; - - // lookup CTE producer target list by its name - List *GetCTEProducerTargetList(const CHAR *cte_str) const; - - // add a new CTE producer for this level - void AddCTEProducer(CMemoryPool *mp, CommonTableExpr *cte, const CDXLNode *cte_producer); + const CDXLNode *m_cte_producer; + List *m_target_list; + + // ctor + SCTEProducerInfo(const CDXLNode *cte_producer, List *target_list) + : m_cte_producer(cte_producer), m_target_list(target_list) + { + } }; - // hash maps mapping ULONG -> CCTEListEntry - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupRelease > HMUlCTEListEntry; + // hash maps mapping CHAR *->SCTEProducerInfo + typedef CHashMap + HMSzCTEInfo; + + // query level where the CTEs are defined + ULONG m_query_level; + + // CTE producers at that level indexed by their name + HMSzCTEInfo *m_cte_info; - // iterator - typedef CHashMapIter, gpos::Equals, - CleanupDelete, CleanupRelease > HMIterUlCTEListEntry; +public: + // ctor: single CTE + CCTEListEntry(CMemoryPool *mp, ULONG query_level, CommonTableExpr *cte, + CDXLNode *cte_producer); + + // ctor: multiple CTEs + CCTEListEntry(CMemoryPool *mp, ULONG query_level, List *cte_list, + CDXLNodeArray *dxlnodes); + + // dtor + virtual ~CCTEListEntry() + { + m_cte_info->Release(); + }; + // the query level + ULONG + GetQueryLevel() const + { + return m_query_level; } -#endif // !GPDXL_CCTEListEntry_H + + // lookup CTE producer by its name + const CDXLNode *GetCTEProducer(const CHAR *cte_str) const; + + // lookup CTE producer target list by its name + List *GetCTEProducerTargetList(const CHAR *cte_str) const; + + // add a new CTE producer for this level + void AddCTEProducer(CMemoryPool *mp, CommonTableExpr *cte, + const CDXLNode *cte_producer); +}; + +// hash maps mapping ULONG -> CCTEListEntry +typedef CHashMap, + gpos::Equals, CleanupDelete, CleanupRelease> + HMUlCTEListEntry; + +// iterator +typedef CHashMapIter, + gpos::Equals, CleanupDelete, CleanupRelease> + HMIterUlCTEListEntry; + +} // namespace gpdxl +#endif // !GPDXL_CCTEListEntry_H //EOF diff --git a/src/include/gpopt/translate/CContextDXLToPlStmt.h b/src/include/gpopt/translate/CContextDXLToPlStmt.h index 5f6370313b..37c422da8f 100644 --- a/src/include/gpopt/translate/CContextDXLToPlStmt.h +++ b/src/include/gpopt/translate/CContextDXLToPlStmt.h @@ -38,183 +38,177 @@ struct GpPolicy; namespace gpdxl { +// fwd decl +class CDXLTranslateContext; + +typedef CHashMap, + gpos::Equals, CleanupDelete, + CleanupDelete > + HMUlDxltrctx; - // fwd decl - class CDXLTranslateContext; - - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupDelete > HMUlDxltrctx; - - //--------------------------------------------------------------------------- - // @class: - // CContextDXLToPlStmt - // - // @doc: - // Class providing access to CIdGenerators (needed to number initplans, motion - // nodes as well as params), list of RangeTableEntires and Subplans - // generated so far during DXL-->PlStmt translation. - // - //--------------------------------------------------------------------------- - class CContextDXLToPlStmt +//--------------------------------------------------------------------------- +// @class: +// CContextDXLToPlStmt +// +// @doc: +// Class providing access to CIdGenerators (needed to number initplans, motion +// nodes as well as params), list of RangeTableEntires and Subplans +// generated so far during DXL-->PlStmt translation. +// +//--------------------------------------------------------------------------- +class CContextDXLToPlStmt +{ +private: + // cte consumer information + struct SCTEConsumerInfo { - private: - - // cte consumer information - struct SCTEConsumerInfo - { - // list of ShareInputScan represent cte consumers - List *m_cte_consumer_list; - - // ctor - SCTEConsumerInfo - ( - List *plan_cte - ) - : - m_cte_consumer_list(plan_cte) - {} - - void AddCTEPlan - ( - ShareInputScan *share_input_scan - ) - { - GPOS_ASSERT(NULL != share_input_scan); - m_cte_consumer_list = gpdb::LAppend(m_cte_consumer_list, share_input_scan); - } - - ~SCTEConsumerInfo() - { - gpdb::ListFree(m_cte_consumer_list); - } - - }; - - // hash maps mapping ULONG -> SCTEConsumerInfo - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupDelete > HMUlCTEConsumerInfo; - - CMemoryPool *m_mp; - - // counter for generating plan ids - CIdGenerator *m_plan_id_counter; - - // counter for generating motion ids - CIdGenerator *m_motion_id_counter; - - // counter for generating unique param ids - CIdGenerator *m_param_id_counter; - - // list of all rtable entries - List **m_rtable_entries_list; - - // list of oids of partitioned tables - List *m_partitioned_tables_list; - - // number of partition selectors for each dynamic scan - ULongPtrArray *m_num_partition_selectors_array; - - // list of all subplan entries - List **m_subplan_entries_list; - - // index of the target relation in the rtable or 0 if not a DML statement - ULONG m_result_relation_index; - - // hash map of the cte identifiers and the cte consumers with the same cte identifier - HMUlCTEConsumerInfo *m_cte_consumer_info; - - // into clause - IntoClause *m_into_clause; - - // CTAS distribution policy - GpPolicy *m_distribution_policy; - - public: - // ctor/dtor - CContextDXLToPlStmt - ( - CMemoryPool *mp, - CIdGenerator *plan_id_counter, + // list of ShareInputScan represent cte consumers + List *m_cte_consumer_list; + + // ctor + SCTEConsumerInfo(List *plan_cte) : m_cte_consumer_list(plan_cte) + { + } + + void + AddCTEPlan(ShareInputScan *share_input_scan) + { + GPOS_ASSERT(NULL != share_input_scan); + m_cte_consumer_list = + gpdb::LAppend(m_cte_consumer_list, share_input_scan); + } + + ~SCTEConsumerInfo() + { + gpdb::ListFree(m_cte_consumer_list); + } + }; + + // hash maps mapping ULONG -> SCTEConsumerInfo + typedef CHashMap, + gpos::Equals, CleanupDelete, + CleanupDelete > + HMUlCTEConsumerInfo; + + CMemoryPool *m_mp; + + // counter for generating plan ids + CIdGenerator *m_plan_id_counter; + + // counter for generating motion ids + CIdGenerator *m_motion_id_counter; + + // counter for generating unique param ids + CIdGenerator *m_param_id_counter; + + // list of all rtable entries + List **m_rtable_entries_list; + + // list of oids of partitioned tables + List *m_partitioned_tables_list; + + // number of partition selectors for each dynamic scan + ULongPtrArray *m_num_partition_selectors_array; + + // list of all subplan entries + List **m_subplan_entries_list; + + // index of the target relation in the rtable or 0 if not a DML statement + ULONG m_result_relation_index; + + // hash map of the cte identifiers and the cte consumers with the same cte identifier + HMUlCTEConsumerInfo *m_cte_consumer_info; + + // into clause + IntoClause *m_into_clause; + + // CTAS distribution policy + GpPolicy *m_distribution_policy; + +public: + // ctor/dtor + CContextDXLToPlStmt(CMemoryPool *mp, CIdGenerator *plan_id_counter, CIdGenerator *motion_id_counter, CIdGenerator *param_id_counter, List **rtable_entries_list, - List **subplan_entries_list - ) - ; + List **subplan_entries_list); - // dtor - ~CContextDXLToPlStmt(); + // dtor + ~CContextDXLToPlStmt(); - // retrieve the next plan id - ULONG GetNextPlanId(); + // retrieve the next plan id + ULONG GetNextPlanId(); - // retrieve the current motion id - ULONG GetCurrentMotionId(); + // retrieve the current motion id + ULONG GetCurrentMotionId(); - // retrieve the next motion id - ULONG GetNextMotionId(); + // retrieve the next motion id + ULONG GetNextMotionId(); - // retrieve the current parameter id - ULONG GetCurrentParamId(); + // retrieve the current parameter id + ULONG GetCurrentParamId(); - // retrieve the next parameter id - ULONG GetNextParamId(); + // retrieve the next parameter id + ULONG GetNextParamId(); - // add a newly found CTE consumer - void AddCTEConsumerInfo(ULONG cte_id, ShareInputScan *share_input_scan); + // add a newly found CTE consumer + void AddCTEConsumerInfo(ULONG cte_id, ShareInputScan *share_input_scan); - // return the list of shared input scan plans representing the CTE consumers - List *GetCTEConsumerList(ULONG cte_id) const; + // return the list of shared input scan plans representing the CTE consumers + List *GetCTEConsumerList(ULONG cte_id) const; - // return list of range table entries - List *GetRTableEntriesList(); + // return list of range table entries + List *GetRTableEntriesList(); - // return list of partitioned table indexes - List *GetPartitionedTablesList() const - { - return m_partitioned_tables_list; - } + // return list of partitioned table indexes + List * + GetPartitionedTablesList() const + { + return m_partitioned_tables_list; + } - // return list containing number of partition selectors for every scan id - List *GetNumPartitionSelectorsList() const; + // return list containing number of partition selectors for every scan id + List *GetNumPartitionSelectorsList() const; - List *GetSubplanEntriesList(); + List *GetSubplanEntriesList(); - // index of result relation in the rtable - ULONG GetResultRelationIndex() const - { - return m_result_relation_index; - } + // index of result relation in the rtable + ULONG + GetResultRelationIndex() const + { + return m_result_relation_index; + } - // add a range table entry - void AddRTE(RangeTblEntry *rte, BOOL is_result_relation = false); + // add a range table entry + void AddRTE(RangeTblEntry *rte, BOOL is_result_relation = false); - // add a partitioned table index - void AddPartitionedTable(OID oid); + // add a partitioned table index + void AddPartitionedTable(OID oid); - // increment the number of partition selectors for the given scan id - void IncrementPartitionSelectors(ULONG scan_id); + // increment the number of partition selectors for the given scan id + void IncrementPartitionSelectors(ULONG scan_id); - void AddSubplan(Plan * ); - - // add CTAS information - void AddCtasInfo(IntoClause *into_clause, GpPolicy *distribution_policy); - - // into clause - IntoClause *GetIntoClause() const - { - return m_into_clause; - } + void AddSubplan(Plan *); - // CTAS distribution policy - GpPolicy *GetDistributionPolicy() const - { - return m_distribution_policy; - } + // add CTAS information + void AddCtasInfo(IntoClause *into_clause, GpPolicy *distribution_policy); - }; + // into clause + IntoClause * + GetIntoClause() const + { + return m_into_clause; + } + // CTAS distribution policy + GpPolicy * + GetDistributionPolicy() const + { + return m_distribution_policy; } -#endif // !GPDXL_CContextDXLToPlStmt_H +}; + +} // namespace gpdxl +#endif // !GPDXL_CContextDXLToPlStmt_H //EOF diff --git a/src/include/gpopt/translate/CDXLTranslateContext.h b/src/include/gpopt/translate/CDXLTranslateContext.h index 52eeb8b746..789d863312 100644 --- a/src/include/gpopt/translate/CDXLTranslateContext.h +++ b/src/include/gpopt/translate/CDXLTranslateContext.h @@ -29,90 +29,98 @@ struct TargetEntry; namespace gpdxl { +using namespace gpos; - using namespace gpos; +// hash maps mapping ULONG -> TargetEntry +typedef CHashMap, + gpos::Equals, CleanupDelete, CleanupNULL> + ULongToTargetEntryMap; - // hash maps mapping ULONG -> TargetEntry - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupNULL > ULongToTargetEntryMap; +// hash maps mapping ULONG -> CMappingElementColIdParamId +typedef CHashMap, + gpos::Equals, CleanupDelete, + CleanupRelease > + ULongToColParamMap; - // hash maps mapping ULONG -> CMappingElementColIdParamId - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupRelease > ULongToColParamMap; +typedef CHashMapIter, + gpos::Equals, CleanupDelete, + CleanupRelease > + ULongToColParamMapIter; - typedef CHashMapIter, gpos::Equals, - CleanupDelete, CleanupRelease > ULongToColParamMapIter; +//--------------------------------------------------------------------------- +// @class: +// CDXLTranslateContext +// +// @doc: +// Class providing access to translation context, such as mappings between +// ColIds and target entries +// +//--------------------------------------------------------------------------- +class CDXLTranslateContext +{ +private: + CMemoryPool *m_mp; - //--------------------------------------------------------------------------- - // @class: - // CDXLTranslateContext - // - // @doc: - // Class providing access to translation context, such as mappings between - // ColIds and target entries - // - //--------------------------------------------------------------------------- - class CDXLTranslateContext - { - - private: - CMemoryPool *m_mp; - - // private copy ctor - CDXLTranslateContext(const CDXLTranslateContext&); + // private copy ctor + CDXLTranslateContext(const CDXLTranslateContext &); - // mappings ColId->TargetEntry used for intermediate DXL nodes - ULongToTargetEntryMap *m_colid_to_target_entry_map; + // mappings ColId->TargetEntry used for intermediate DXL nodes + ULongToTargetEntryMap *m_colid_to_target_entry_map; - // mappings ColId->ParamId used for outer refs in subplans - ULongToColParamMap *m_colid_to_paramid_map; + // mappings ColId->ParamId used for outer refs in subplans + ULongToColParamMap *m_colid_to_paramid_map; - // is the node for which this context is built a child of an aggregate node - // This is used to assign 0 instead of OUTER for the varno value of columns - // in an Agg node, as expected in GPDB - // TODO: antovl - Jan 26, 2011; remove this when Agg node in GPDB is fixed - // to use OUTER instead of 0 for Var::varno in Agg target lists (MPP-12034) - BOOL m_is_child_agg_node; + // is the node for which this context is built a child of an aggregate node + // This is used to assign 0 instead of OUTER for the varno value of columns + // in an Agg node, as expected in GPDB + // TODO: antovl - Jan 26, 2011; remove this when Agg node in GPDB is fixed + // to use OUTER instead of 0 for Var::varno in Agg target lists (MPP-12034) + BOOL m_is_child_agg_node; - // copy the params hashmap - void CopyParamHashmap(ULongToColParamMap *original); + // copy the params hashmap + void CopyParamHashmap(ULongToColParamMap *original); - public: - // ctor/dtor - CDXLTranslateContext(CMemoryPool *mp, BOOL is_child_agg_node); +public: + // ctor/dtor + CDXLTranslateContext(CMemoryPool *mp, BOOL is_child_agg_node); - CDXLTranslateContext(CMemoryPool *mp, BOOL is_child_agg_node, ULongToColParamMap *original); + CDXLTranslateContext(CMemoryPool *mp, BOOL is_child_agg_node, + ULongToColParamMap *original); - ~CDXLTranslateContext(); + ~CDXLTranslateContext(); - // is parent an aggregate node - BOOL IsParentAggNode() const; + // is parent an aggregate node + BOOL IsParentAggNode() const; - // return the params hashmap - ULongToColParamMap *GetColIdToParamIdMap() - { - return m_colid_to_paramid_map; - } + // return the params hashmap + ULongToColParamMap * + GetColIdToParamIdMap() + { + return m_colid_to_paramid_map; + } - // return the target entry corresponding to the given ColId - const TargetEntry *GetTargetEntry(ULONG colid) const; + // return the target entry corresponding to the given ColId + const TargetEntry *GetTargetEntry(ULONG colid) const; - // return the param id corresponding to the given ColId - const CMappingElementColIdParamId *GetParamIdMappingElement(ULONG colid) const; + // return the param id corresponding to the given ColId + const CMappingElementColIdParamId *GetParamIdMappingElement( + ULONG colid) const; - // store the mapping of the given column id and target entry - void InsertMapping(ULONG colid, TargetEntry *target_entry); + // store the mapping of the given column id and target entry + void InsertMapping(ULONG colid, TargetEntry *target_entry); - // store the mapping of the given column id and param id - BOOL FInsertParamMapping(ULONG colid, CMappingElementColIdParamId *pmecolidparamid); - }; + // store the mapping of the given column id and param id + BOOL FInsertParamMapping(ULONG colid, + CMappingElementColIdParamId *pmecolidparamid); +}; - // array of dxl translation context - typedef CDynamicPtrArray CDXLTranslationContextArray; -} +// array of dxl translation context +typedef CDynamicPtrArray + CDXLTranslationContextArray; +} // namespace gpdxl -#endif // !GPDXL_CDXLTranslateContext_H +#endif // !GPDXL_CDXLTranslateContext_H // EOF diff --git a/src/include/gpopt/translate/CDXLTranslateContextBaseTable.h b/src/include/gpopt/translate/CDXLTranslateContextBaseTable.h index a6dc028598..cf03e3f4af 100644 --- a/src/include/gpopt/translate/CDXLTranslateContextBaseTable.h +++ b/src/include/gpopt/translate/CDXLTranslateContextBaseTable.h @@ -22,73 +22,72 @@ #include "gpos/base.h" #include "gpos/common/CHashMap.h" -#include "postgres.h" // Index +#include "postgres.h" // Index #include "naucrates/dxl/gpdb_types.h" namespace gpdxl { +using namespace gpos; - using namespace gpos; - - - //--------------------------------------------------------------------------- - // @class: - // CDXLTranslateContextBaseTable - // - // @doc: - // Class providing access to translation context, such as mappings between - // ColIds and target entries - // - //--------------------------------------------------------------------------- - class CDXLTranslateContextBaseTable - { - // hash maps mapping ULONG -> INT - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupDelete > UlongToIntMap; +//--------------------------------------------------------------------------- +// @class: +// CDXLTranslateContextBaseTable +// +// @doc: +// Class providing access to translation context, such as mappings between +// ColIds and target entries +// +//--------------------------------------------------------------------------- +class CDXLTranslateContextBaseTable +{ + // hash maps mapping ULONG -> INT + typedef CHashMap, gpos::Equals, + CleanupDelete, CleanupDelete > + UlongToIntMap; - private: - CMemoryPool *m_mp; - // oid of the base table - OID m_oid; +private: + CMemoryPool *m_mp; - // index of the relation in the rtable - Index m_rel_index; + // oid of the base table + OID m_oid; - // maps a colid of a column to the attribute number of that column in the schema of the underlying relation - UlongToIntMap *m_colid_to_attno_map; + // index of the relation in the rtable + Index m_rel_index; - // private copy ctor - CDXLTranslateContextBaseTable(const CDXLTranslateContextBaseTable&); + // maps a colid of a column to the attribute number of that column in the schema of the underlying relation + UlongToIntMap *m_colid_to_attno_map; - public: - // ctor/dtor - explicit CDXLTranslateContextBaseTable(CMemoryPool *mp); + // private copy ctor + CDXLTranslateContextBaseTable(const CDXLTranslateContextBaseTable &); +public: + // ctor/dtor + explicit CDXLTranslateContextBaseTable(CMemoryPool *mp); - ~CDXLTranslateContextBaseTable(); - // accessors - OID GetOid() const; + ~CDXLTranslateContextBaseTable(); - Index GetRelIndex() const; + // accessors + OID GetOid() const; - // return the index of the column in the base relation for the given DXL ColId - INT GetAttnoForColId(ULONG dxl_colid) const; + Index GetRelIndex() const; - // setters - void SetOID(OID oid); + // return the index of the column in the base relation for the given DXL ColId + INT GetAttnoForColId(ULONG dxl_colid) const; - void SetRelIndex(Index rel_index); + // setters + void SetOID(OID oid); - // store the mapping of the given DXL column id and index in the base relation schema - BOOL InsertMapping(ULONG dxl_colid, INT att_no); + void SetRelIndex(Index rel_index); - }; -} + // store the mapping of the given DXL column id and index in the base relation schema + BOOL InsertMapping(ULONG dxl_colid, INT att_no); +}; +} // namespace gpdxl -#endif // !GPDXL_CDXLTranslateContextBaseTable_H +#endif // !GPDXL_CDXLTranslateContextBaseTable_H // EOF diff --git a/src/include/gpopt/translate/CGPDBAttInfo.h b/src/include/gpopt/translate/CGPDBAttInfo.h index ed8c0b4003..c47b0066ee 100644 --- a/src/include/gpopt/translate/CGPDBAttInfo.h +++ b/src/include/gpopt/translate/CGPDBAttInfo.h @@ -23,101 +23,103 @@ namespace gpdxl { - using namespace gpos; - - //--------------------------------------------------------------------------- - // @class: - // CGPDBAttInfo - // - // @doc: - // Class to uniquely identify a column in GPDB - // - //--------------------------------------------------------------------------- - class CGPDBAttInfo: public CRefCount +using namespace gpos; + +//--------------------------------------------------------------------------- +// @class: +// CGPDBAttInfo +// +// @doc: +// Class to uniquely identify a column in GPDB +// +//--------------------------------------------------------------------------- +class CGPDBAttInfo : public CRefCount +{ +private: + // query level number + ULONG m_query_level; + + // varno in the rtable + ULONG m_varno; + + // attno + INT m_attno; + + // copy c'tor + CGPDBAttInfo(const CGPDBAttInfo &); + +public: + // ctor + CGPDBAttInfo(ULONG query_level, ULONG var_no, INT attrnum) + : m_query_level(query_level), m_varno(var_no), m_attno(attrnum) { - private: - - // query level number - ULONG m_query_level; - - // varno in the rtable - ULONG m_varno; - - // attno - INT m_attno; - - // copy c'tor - CGPDBAttInfo(const CGPDBAttInfo&); - - public: - // ctor - CGPDBAttInfo(ULONG query_level, ULONG var_no, INT attrnum) - : m_query_level(query_level), m_varno(var_no), m_attno(attrnum) - {} - - // d'tor - virtual - ~CGPDBAttInfo() {} - - // accessor - ULONG GetQueryLevel() const - { - return m_query_level; - } - - // accessor - ULONG GetVarNo() const - { - return m_varno; - } - - // accessor - INT GetAttNo() const - { - return m_attno; - } - - // equality check - BOOL Equals(const CGPDBAttInfo& gpdb_att_info) const - { - return m_query_level == gpdb_att_info.m_query_level - && m_varno == gpdb_att_info.m_varno - && m_attno == gpdb_att_info.m_attno; - } - - // hash value - ULONG HashValue() const - { - return gpos::CombineHashes( - gpos::HashValue(&m_query_level), - gpos::CombineHashes(gpos::HashValue(&m_varno), - gpos::HashValue(&m_attno))); - } - }; - - // hash function - inline ULONG HashGPDBAttInfo - ( - const CGPDBAttInfo *gpdb_att_info - ) + } + + // d'tor + virtual ~CGPDBAttInfo() { - GPOS_ASSERT(NULL != gpdb_att_info); - return gpdb_att_info->HashValue(); } - // equality function - inline BOOL EqualGPDBAttInfo - ( - const CGPDBAttInfo *gpdb_att_info_a, - const CGPDBAttInfo *gpdb_att_info_b - ) + // accessor + ULONG + GetQueryLevel() const { - GPOS_ASSERT(NULL != gpdb_att_info_a && NULL != gpdb_att_info_b); - return gpdb_att_info_a->Equals(*gpdb_att_info_b); + return m_query_level; } + // accessor + ULONG + GetVarNo() const + { + return m_varno; + } + + // accessor + INT + GetAttNo() const + { + return m_attno; + } + + // equality check + BOOL + Equals(const CGPDBAttInfo &gpdb_att_info) const + { + return m_query_level == gpdb_att_info.m_query_level && + m_varno == gpdb_att_info.m_varno && + m_attno == gpdb_att_info.m_attno; + } + + // hash value + ULONG + HashValue() const + { + return gpos::CombineHashes( + gpos::HashValue(&m_query_level), + gpos::CombineHashes(gpos::HashValue(&m_varno), + gpos::HashValue(&m_attno))); + } +}; + +// hash function +inline ULONG +HashGPDBAttInfo(const CGPDBAttInfo *gpdb_att_info) +{ + GPOS_ASSERT(NULL != gpdb_att_info); + return gpdb_att_info->HashValue(); } -#endif // !GPDXL_CGPDBAttInfo_H +// equality function +inline BOOL +EqualGPDBAttInfo(const CGPDBAttInfo *gpdb_att_info_a, + const CGPDBAttInfo *gpdb_att_info_b) +{ + GPOS_ASSERT(NULL != gpdb_att_info_a && NULL != gpdb_att_info_b); + return gpdb_att_info_a->Equals(*gpdb_att_info_b); +} + +} // namespace gpdxl + +#endif // !GPDXL_CGPDBAttInfo_H // EOF diff --git a/src/include/gpopt/translate/CGPDBAttOptCol.h b/src/include/gpopt/translate/CGPDBAttOptCol.h index 1deca681e4..5e585c6ee8 100644 --- a/src/include/gpopt/translate/CGPDBAttOptCol.h +++ b/src/include/gpopt/translate/CGPDBAttOptCol.h @@ -22,62 +22,61 @@ namespace gpdxl { - using namespace gpos; +using namespace gpos; - //--------------------------------------------------------------------------- - // @class: - // CGPDBAttOptCol - // - // @doc: - // Class to represent pair of GPDB var info to optimizer col info - // - //--------------------------------------------------------------------------- - class CGPDBAttOptCol: public CRefCount - { - private: - - // gpdb att info - CGPDBAttInfo *m_gpdb_att_info; - - // optimizer col info - COptColInfo *m_opt_col_info; +//--------------------------------------------------------------------------- +// @class: +// CGPDBAttOptCol +// +// @doc: +// Class to represent pair of GPDB var info to optimizer col info +// +//--------------------------------------------------------------------------- +class CGPDBAttOptCol : public CRefCount +{ +private: + // gpdb att info + CGPDBAttInfo *m_gpdb_att_info; - // copy c'tor - CGPDBAttOptCol(const CGPDBAttOptCol&); + // optimizer col info + COptColInfo *m_opt_col_info; - public: - // ctor - CGPDBAttOptCol(CGPDBAttInfo *gpdb_att_info, COptColInfo *opt_col_info) - : m_gpdb_att_info(gpdb_att_info), m_opt_col_info(opt_col_info) - { - GPOS_ASSERT(NULL != m_gpdb_att_info); - GPOS_ASSERT(NULL != m_opt_col_info); - } + // copy c'tor + CGPDBAttOptCol(const CGPDBAttOptCol &); - // d'tor - virtual - ~CGPDBAttOptCol() - { - m_gpdb_att_info->Release(); - m_opt_col_info->Release(); - } +public: + // ctor + CGPDBAttOptCol(CGPDBAttInfo *gpdb_att_info, COptColInfo *opt_col_info) + : m_gpdb_att_info(gpdb_att_info), m_opt_col_info(opt_col_info) + { + GPOS_ASSERT(NULL != m_gpdb_att_info); + GPOS_ASSERT(NULL != m_opt_col_info); + } - // accessor - const CGPDBAttInfo *GetGPDBAttInfo() const - { - return m_gpdb_att_info; - } + // d'tor + virtual ~CGPDBAttOptCol() + { + m_gpdb_att_info->Release(); + m_opt_col_info->Release(); + } - // accessor - const COptColInfo *GetOptColInfo() const - { - return m_opt_col_info; - } + // accessor + const CGPDBAttInfo * + GetGPDBAttInfo() const + { + return m_gpdb_att_info; + } - }; + // accessor + const COptColInfo * + GetOptColInfo() const + { + return m_opt_col_info; + } +}; -} +} // namespace gpdxl -#endif // !GPDXL_CGPDBAttOptCol_H +#endif // !GPDXL_CGPDBAttOptCol_H // EOF diff --git a/src/include/gpopt/translate/CIndexQualInfo.h b/src/include/gpopt/translate/CIndexQualInfo.h index 3ce85b235e..0fcaf0a863 100644 --- a/src/include/gpopt/translate/CIndexQualInfo.h +++ b/src/include/gpopt/translate/CIndexQualInfo.h @@ -21,81 +21,70 @@ namespace gpdxl { +using namespace gpopt; - using namespace gpopt; +class CDXLNode; - class CDXLNode; - - //--------------------------------------------------------------------------- - // @class: - // CIndexQualInfo - // - // @doc: - // Class providing access to the original index qual expression, its modified - // version tailored for GPDB, and index strategy - // - //--------------------------------------------------------------------------- - class CIndexQualInfo +//--------------------------------------------------------------------------- +// @class: +// CIndexQualInfo +// +// @doc: +// Class providing access to the original index qual expression, its modified +// version tailored for GPDB, and index strategy +// +//--------------------------------------------------------------------------- +class CIndexQualInfo +{ +public: + // attribute number in the index + AttrNumber m_attno; + + // index qual expression tailored for GPDB + Expr *m_expr; + + // original index qual expression + Expr *m_original_expr; + + // index strategy information + StrategyNumber m_strategy_num; + + // index subtype + OID m_index_subtype_oid; + + // ctor + CIndexQualInfo(AttrNumber attno, Expr *expr, Expr *original_expr, + StrategyNumber strategy_number, OID index_subtype_oid) + : m_attno(attno), + m_expr(expr), + m_original_expr(original_expr), + m_strategy_num(strategy_number), + m_index_subtype_oid(index_subtype_oid) { - public: - - // attribute number in the index - AttrNumber m_attno; - - // index qual expression tailored for GPDB - Expr *m_expr; - - // original index qual expression - Expr *m_original_expr; + GPOS_ASSERT((IsA(m_expr, OpExpr) && IsA(m_original_expr, OpExpr)) || + (IsA(m_expr, ScalarArrayOpExpr) && + IsA(original_expr, ScalarArrayOpExpr))); + } - // index strategy information - StrategyNumber m_strategy_num; - - // index subtype - OID m_index_subtype_oid; - - // ctor - CIndexQualInfo - ( - AttrNumber attno, - Expr *expr, - Expr *original_expr, - StrategyNumber strategy_number, - OID index_subtype_oid - ) - : - m_attno(attno), - m_expr(expr), - m_original_expr(original_expr), - m_strategy_num(strategy_number), - m_index_subtype_oid(index_subtype_oid) - { - GPOS_ASSERT((IsA(m_expr, OpExpr) && IsA(m_original_expr, OpExpr)) || - (IsA(m_expr, ScalarArrayOpExpr) && IsA(original_expr, ScalarArrayOpExpr))); - } - - // dtor - ~CIndexQualInfo() - {} + // dtor + ~CIndexQualInfo() + { + } - // comparison function for sorting index qualifiers - static - INT IndexQualInfoCmp - ( - const void *p1, - const void *p2 - ) - { - const CIndexQualInfo *qual_info1 = *(const CIndexQualInfo **) p1; - const CIndexQualInfo *qual_info2 = *(const CIndexQualInfo **) p2; + // comparison function for sorting index qualifiers + static INT + IndexQualInfoCmp(const void *p1, const void *p2) + { + const CIndexQualInfo *qual_info1 = *(const CIndexQualInfo **) p1; + const CIndexQualInfo *qual_info2 = *(const CIndexQualInfo **) p2; - return (INT) qual_info1->m_attno - (INT) qual_info2->m_attno; - } - }; - // array of index qual info - typedef CDynamicPtrArray CIndexQualInfoArray; -} + return (INT) qual_info1->m_attno - (INT) qual_info2->m_attno; + } +}; +// array of index qual info +typedef CDynamicPtrArray CIndexQualInfoArray; +} // namespace gpdxl -#endif // !GPDXL_CIndexQualInfo_H +#endif // !GPDXL_CIndexQualInfo_H // EOF diff --git a/src/include/gpopt/translate/CMappingColIdVar.h b/src/include/gpopt/translate/CMappingColIdVar.h index 54b626fb16..f65a822702 100644 --- a/src/include/gpopt/translate/CMappingColIdVar.h +++ b/src/include/gpopt/translate/CMappingColIdVar.h @@ -29,41 +29,39 @@ struct Query; namespace gpdxl { - using namespace gpos; +using namespace gpos; - // fwd decl - class CDXLScalarIdent; +// fwd decl +class CDXLScalarIdent; - //--------------------------------------------------------------------------- - // @class: - // CMappingColIdVar - // - // @doc: - // Class providing the interface for ColId in CDXLScalarIdent to Var - // mapping when translating CDXLScalar nodes - // - //--------------------------------------------------------------------------- - class CMappingColIdVar - { - protected: - // memory pool - CMemoryPool *m_mp; - - public: +//--------------------------------------------------------------------------- +// @class: +// CMappingColIdVar +// +// @doc: +// Class providing the interface for ColId in CDXLScalarIdent to Var +// mapping when translating CDXLScalar nodes +// +//--------------------------------------------------------------------------- +class CMappingColIdVar +{ +protected: + // memory pool + CMemoryPool *m_mp; - // ctor/dtor - explicit - CMappingColIdVar(CMemoryPool *); +public: + // ctor/dtor + explicit CMappingColIdVar(CMemoryPool *); - virtual - ~CMappingColIdVar(){} + virtual ~CMappingColIdVar() + { + } - // translate DXL ScalarIdent node into GPDB Var node - virtual - Var *VarFromDXLNodeScId(const CDXLScalarIdent *) = 0; - }; -} + // translate DXL ScalarIdent node into GPDB Var node + virtual Var *VarFromDXLNodeScId(const CDXLScalarIdent *) = 0; +}; +} // namespace gpdxl -#endif //GPDXL_CMappingColIdVar_H +#endif //GPDXL_CMappingColIdVar_H // EOF diff --git a/src/include/gpopt/translate/CMappingColIdVarPlStmt.h b/src/include/gpopt/translate/CMappingColIdVarPlStmt.h index faf592dbe2..14153a5929 100644 --- a/src/include/gpopt/translate/CMappingColIdVarPlStmt.h +++ b/src/include/gpopt/translate/CMappingColIdVarPlStmt.h @@ -30,61 +30,55 @@ struct Plan; namespace gpdxl { +// fwd decl +class CDXLTranslateContextBaseTable; +class CContextDXLToPlStmt; - // fwd decl - class CDXLTranslateContextBaseTable; - class CContextDXLToPlStmt; - - //--------------------------------------------------------------------------- - // @class: - // CMappingColIdVarPlStmt - // - // @doc: - // Class defining functions that provide the mapping between Var, Param - // and variables of Sub-query to CDXLNode during Query->DXL translation - // - //--------------------------------------------------------------------------- - class CMappingColIdVarPlStmt : public CMappingColIdVar - { - private: - - const CDXLTranslateContextBaseTable *m_base_table_context; - - // the array of translator context (one for each child of the DXL operator) - CDXLTranslationContextArray *m_child_contexts; - - CDXLTranslateContext *m_output_context; - - // translator context used to translate initplan and subplans associated - // with a param node - CContextDXLToPlStmt *m_dxl_to_plstmt_context; - - public: - - CMappingColIdVarPlStmt - ( - CMemoryPool *mp, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context, - CContextDXLToPlStmt *dxl_to_plstmt_context - ); - - // translate DXL ScalarIdent node into GPDB Var node - virtual - Var *VarFromDXLNodeScId(const CDXLScalarIdent *dxlop); - - // translate DXL ScalarIdent node into GPDB Param node - Param *ParamFromDXLNodeScId(const CDXLScalarIdent *dxlop); - - // get the output translator context - CDXLTranslateContext *GetOutputContext(); - - // return the context of the DXL->PlStmt translation - CContextDXLToPlStmt *GetDXLToPlStmtContext(); - }; -} - -#endif // GPDXL_CMappingColIdVarPlStmt_H +//--------------------------------------------------------------------------- +// @class: +// CMappingColIdVarPlStmt +// +// @doc: +// Class defining functions that provide the mapping between Var, Param +// and variables of Sub-query to CDXLNode during Query->DXL translation +// +//--------------------------------------------------------------------------- +class CMappingColIdVarPlStmt : public CMappingColIdVar +{ +private: + const CDXLTranslateContextBaseTable *m_base_table_context; + + // the array of translator context (one for each child of the DXL operator) + CDXLTranslationContextArray *m_child_contexts; + + CDXLTranslateContext *m_output_context; + + // translator context used to translate initplan and subplans associated + // with a param node + CContextDXLToPlStmt *m_dxl_to_plstmt_context; + +public: + CMappingColIdVarPlStmt( + CMemoryPool *mp, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, + CDXLTranslateContext *output_context, + CContextDXLToPlStmt *dxl_to_plstmt_context); + + // translate DXL ScalarIdent node into GPDB Var node + virtual Var *VarFromDXLNodeScId(const CDXLScalarIdent *dxlop); + + // translate DXL ScalarIdent node into GPDB Param node + Param *ParamFromDXLNodeScId(const CDXLScalarIdent *dxlop); + + // get the output translator context + CDXLTranslateContext *GetOutputContext(); + + // return the context of the DXL->PlStmt translation + CContextDXLToPlStmt *GetDXLToPlStmtContext(); +}; +} // namespace gpdxl + +#endif // GPDXL_CMappingColIdVarPlStmt_H // EOF diff --git a/src/include/gpopt/translate/CMappingElementColIdParamId.h b/src/include/gpopt/translate/CMappingElementColIdParamId.h index 8ca94bf0d9..9a7cd06cc5 100644 --- a/src/include/gpopt/translate/CMappingElementColIdParamId.h +++ b/src/include/gpopt/translate/CMappingElementColIdParamId.h @@ -22,66 +22,69 @@ namespace gpdxl { - using namespace gpos; - using namespace gpmd; - //--------------------------------------------------------------------------- - // @class: - // CMappingElementColIdParamId - // - // @doc: - // Wrapper class providing functions for the mapping element between - // ColId and ParamId during DXL->PlStmt translation - // - //--------------------------------------------------------------------------- - class CMappingElementColIdParamId : public CRefCount - { - private: - - // column identifier that is used as the key - ULONG m_colid; - - // param identifier - ULONG m_paramid; +using namespace gpos; +using namespace gpmd; +//--------------------------------------------------------------------------- +// @class: +// CMappingElementColIdParamId +// +// @doc: +// Wrapper class providing functions for the mapping element between +// ColId and ParamId during DXL->PlStmt translation +// +//--------------------------------------------------------------------------- +class CMappingElementColIdParamId : public CRefCount +{ +private: + // column identifier that is used as the key + ULONG m_colid; - // param type - IMDId *m_mdid; + // param identifier + ULONG m_paramid; - INT m_type_modifier; + // param type + IMDId *m_mdid; - public: + INT m_type_modifier; - // ctors and dtor - CMappingElementColIdParamId(ULONG colid, ULONG paramid, IMDId *mdid, INT type_modifier); +public: + // ctors and dtor + CMappingElementColIdParamId(ULONG colid, ULONG paramid, IMDId *mdid, + INT type_modifier); - virtual - ~CMappingElementColIdParamId() - {} + virtual ~CMappingElementColIdParamId() + { + } - // return the ColId - ULONG GetColId() const - { - return m_colid; - } + // return the ColId + ULONG + GetColId() const + { + return m_colid; + } - // return the ParamId - ULONG ParamId() const - { - return m_paramid; - } + // return the ParamId + ULONG + ParamId() const + { + return m_paramid; + } - // return the type - IMDId *MdidType() const - { - return m_mdid; - } + // return the type + IMDId * + MdidType() const + { + return m_mdid; + } - INT TypeModifier() const - { - return m_type_modifier; - } - }; -} + INT + TypeModifier() const + { + return m_type_modifier; + } +}; +} // namespace gpdxl -#endif // GPDXL_CMappingElementColIdParamId_H +#endif // GPDXL_CMappingElementColIdParamId_H // EOF diff --git a/src/include/gpopt/translate/CMappingElementColIdTE.h b/src/include/gpopt/translate/CMappingElementColIdTE.h index cf69bb845e..3da25e709f 100644 --- a/src/include/gpopt/translate/CMappingElementColIdTE.h +++ b/src/include/gpopt/translate/CMappingElementColIdTE.h @@ -28,55 +28,56 @@ struct TargetEntry; namespace gpdxl { - using namespace gpos; +using namespace gpos; - //--------------------------------------------------------------------------- - // @class: - // CMappingElementColIdTE - // - // @doc: - // Wrapper class providing functions for the mapping element (between ColId and TE) - // during DXL->Query translation - // - //--------------------------------------------------------------------------- - class CMappingElementColIdTE : public CRefCount - { - private: - - // the column identifier that is used as the key - ULONG m_colid; - - // the query level - ULONG m_query_level; +//--------------------------------------------------------------------------- +// @class: +// CMappingElementColIdTE +// +// @doc: +// Wrapper class providing functions for the mapping element (between ColId and TE) +// during DXL->Query translation +// +//--------------------------------------------------------------------------- +class CMappingElementColIdTE : public CRefCount +{ +private: + // the column identifier that is used as the key + ULONG m_colid; - // the target entry - TargetEntry *m_target_entry; + // the query level + ULONG m_query_level; - public: + // the target entry + TargetEntry *m_target_entry; - // ctors and dtor - CMappingElementColIdTE(ULONG, ULONG, TargetEntry *); +public: + // ctors and dtor + CMappingElementColIdTE(ULONG, ULONG, TargetEntry *); - // return the ColId - ULONG GetColId() const - { - return m_colid; - } + // return the ColId + ULONG + GetColId() const + { + return m_colid; + } - // return the query level - ULONG GetQueryLevel() const - { - return m_query_level; - } + // return the query level + ULONG + GetQueryLevel() const + { + return m_query_level; + } - // return the column name for the given attribute no - const TargetEntry *GetTargetEntry() const - { - return m_target_entry; - } - }; -} + // return the column name for the given attribute no + const TargetEntry * + GetTargetEntry() const + { + return m_target_entry; + } +}; +} // namespace gpdxl -#endif // GPDXL_CMappingElementColIdTE_H +#endif // GPDXL_CMappingElementColIdTE_H // EOF diff --git a/src/include/gpopt/translate/CMappingVarColId.h b/src/include/gpopt/translate/CMappingVarColId.h index 5238788dfe..57907eb7b0 100644 --- a/src/include/gpopt/translate/CMappingVarColId.h +++ b/src/include/gpopt/translate/CMappingVarColId.h @@ -35,146 +35,134 @@ struct List; namespace gpmd { - class IMDIndex; +class IMDIndex; } namespace gpdxl { - // physical operator types used in planned statements - enum EPlStmtPhysicalOpType - { - EpspotTblScan, - EpspotHashjoin, - EpspotNLJoin, - EpspotMergeJoin, - EpspotMotion, - EpspotLimit, - EpspotAgg, - EpspotWindow, - EpspotSort, - EpspotSubqueryScan, - EpspotAppend, - EpspotResult, - EpspotMaterialize, - EpspotSharedScan, - EpspotIndexScan, - EpspotIndexOnlyScan, - EpspotNone - }; - - //--------------------------------------------------------------------------- - // @class: - // CMappingVarColId - // - // @doc: - // Class providing the interface for VAR to DXL mapping during scalar - // operator translation that are used to generate the CDXLNode from a - // variable reference in a PlStmt or Query - // - //--------------------------------------------------------------------------- - class CMappingVarColId +// physical operator types used in planned statements +enum EPlStmtPhysicalOpType +{ + EpspotTblScan, + EpspotHashjoin, + EpspotNLJoin, + EpspotMergeJoin, + EpspotMotion, + EpspotLimit, + EpspotAgg, + EpspotWindow, + EpspotSort, + EpspotSubqueryScan, + EpspotAppend, + EpspotResult, + EpspotMaterialize, + EpspotSharedScan, + EpspotIndexScan, + EpspotIndexOnlyScan, + EpspotNone +}; + +//--------------------------------------------------------------------------- +// @class: +// CMappingVarColId +// +// @doc: +// Class providing the interface for VAR to DXL mapping during scalar +// operator translation that are used to generate the CDXLNode from a +// variable reference in a PlStmt or Query +// +//--------------------------------------------------------------------------- +class CMappingVarColId +{ +private: + // memory pool + CMemoryPool *m_mp; + + // hash map structure to store gpdb att -> opt col information + typedef CHashMap + GPDBAttOptColHashMap; + + // iterator + typedef CHashMapIter + GPDBAttOptColHashMapIter; + + // map from gpdb att to optimizer col + GPDBAttOptColHashMap *m_gpdb_att_opt_col_mapping; + + // insert mapping entry + void Insert(ULONG, ULONG, INT, ULONG, CWStringBase *str); + + // no copy constructor + CMappingVarColId(const CMappingVarColId &); + + // helper function to access mapping + const CGPDBAttOptCol *GetGPDBAttOptColMapping( + ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const; + +public: + // ctor + explicit CMappingVarColId(CMemoryPool *); + + // dtor + virtual ~CMappingVarColId() { - private: - // memory pool - CMemoryPool *m_mp; - - // hash map structure to store gpdb att -> opt col information - typedef CHashMap GPDBAttOptColHashMap; - - // iterator - typedef CHashMapIter GPDBAttOptColHashMapIter; - - // map from gpdb att to optimizer col - GPDBAttOptColHashMap *m_gpdb_att_opt_col_mapping; - - // insert mapping entry - void Insert(ULONG, ULONG, INT, ULONG, CWStringBase *str); - - // no copy constructor - CMappingVarColId(const CMappingVarColId &); - - // helper function to access mapping - const CGPDBAttOptCol *GetGPDBAttOptColMapping - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const; - - public: - - // ctor - explicit - CMappingVarColId(CMemoryPool *); - - // dtor - virtual - ~CMappingVarColId() - { - m_gpdb_att_opt_col_mapping->Release(); - } - - // given a gpdb attribute, return a column name in optimizer world - virtual - const CWStringBase *GetOptColName - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const; - - // given a gpdb attribute, return column id - virtual - ULONG GetColId - ( - ULONG current_query_level, - const Var *var, - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - const; - - // load up mapping information from an index - void LoadIndexColumns(ULONG query_level, ULONG RTE_index, const IMDIndex *index, const CDXLTableDescr *table_descr); - - // load up mapping information from table descriptor - void LoadTblColumns(ULONG query_level, ULONG RTE_index, const CDXLTableDescr *table_descr); - - // load up column id mapping information from the array of column descriptors - void LoadColumns(ULONG query_level, ULONG RTE_index, const CDXLColDescrArray *column_descrs); - - // load up mapping information from derived table columns - void LoadDerivedTblColumns(ULONG query_level, ULONG RTE_index, const CDXLNodeArray *derived_columns_dxl, List *target_list); - - // load information from CTE columns - void LoadCTEColumns(ULONG query_level, ULONG RTE_index, const ULongPtrArray *pdrgpulCTE, List *target_list); - - // load up mapping information from scalar projection list - void LoadProjectElements(ULONG query_level, ULONG RTE_index, const CDXLNode *project_list_dxlnode); - - // load up mapping information from list of column names - void Load(ULONG query_level, ULONG RTE_index, CIdGenerator *id_generator, List *col_names); - - // create a deep copy - CMappingVarColId *CopyMapColId(CMemoryPool *mp) const; - - // create a deep copy - CMappingVarColId *CopyMapColId(ULONG query_level) const; - - // create a copy of the mapping replacing old col ids with new ones - CMappingVarColId *CopyRemapColId - ( - CMemoryPool *mp, - ULongPtrArray *old_colids, - ULongPtrArray *new_colids - ) - const; - }; -} + m_gpdb_att_opt_col_mapping->Release(); + } + + // given a gpdb attribute, return a column name in optimizer world + virtual const CWStringBase *GetOptColName( + ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const; + + // given a gpdb attribute, return column id + virtual ULONG GetColId(ULONG current_query_level, const Var *var, + EPlStmtPhysicalOpType plstmt_physical_op_type) const; + + // load up mapping information from an index + void LoadIndexColumns(ULONG query_level, ULONG RTE_index, + const IMDIndex *index, + const CDXLTableDescr *table_descr); + + // load up mapping information from table descriptor + void LoadTblColumns(ULONG query_level, ULONG RTE_index, + const CDXLTableDescr *table_descr); + + // load up column id mapping information from the array of column descriptors + void LoadColumns(ULONG query_level, ULONG RTE_index, + const CDXLColDescrArray *column_descrs); + + // load up mapping information from derived table columns + void LoadDerivedTblColumns(ULONG query_level, ULONG RTE_index, + const CDXLNodeArray *derived_columns_dxl, + List *target_list); + + // load information from CTE columns + void LoadCTEColumns(ULONG query_level, ULONG RTE_index, + const ULongPtrArray *pdrgpulCTE, List *target_list); + + // load up mapping information from scalar projection list + void LoadProjectElements(ULONG query_level, ULONG RTE_index, + const CDXLNode *project_list_dxlnode); + + // load up mapping information from list of column names + void Load(ULONG query_level, ULONG RTE_index, CIdGenerator *id_generator, + List *col_names); + + // create a deep copy + CMappingVarColId *CopyMapColId(CMemoryPool *mp) const; + + // create a deep copy + CMappingVarColId *CopyMapColId(ULONG query_level) const; + + // create a copy of the mapping replacing old col ids with new ones + CMappingVarColId *CopyRemapColId(CMemoryPool *mp, ULongPtrArray *old_colids, + ULongPtrArray *new_colids) const; +}; +} // namespace gpdxl -#endif //GPDXL_CMappingVarColId_H +#endif //GPDXL_CMappingVarColId_H // EOF diff --git a/src/include/gpopt/translate/COptColInfo.h b/src/include/gpopt/translate/COptColInfo.h index 5175842e79..cb94a7837e 100644 --- a/src/include/gpopt/translate/COptColInfo.h +++ b/src/include/gpopt/translate/COptColInfo.h @@ -22,95 +22,89 @@ namespace gpdxl { - using namespace gpos; - - //--------------------------------------------------------------------------- - // @class: - // COptColInfo - // - // @doc: - // pair of column id and column name - // - //--------------------------------------------------------------------------- - class COptColInfo: public CRefCount +using namespace gpos; + +//--------------------------------------------------------------------------- +// @class: +// COptColInfo +// +// @doc: +// pair of column id and column name +// +//--------------------------------------------------------------------------- +class COptColInfo : public CRefCount +{ +private: + // column id + ULONG m_colid; + + // column name + CWStringBase *m_str; + + // private copy c'tor + COptColInfo(const COptColInfo &); + +public: + // ctor + COptColInfo(ULONG colid, CWStringBase *str) : m_colid(colid), m_str(str) + { + GPOS_ASSERT(m_str); + } + + // dtor + virtual ~COptColInfo() { - private: - - // column id - ULONG m_colid; - - // column name - CWStringBase *m_str; - - // private copy c'tor - COptColInfo(const COptColInfo&); - - public: - // ctor - COptColInfo(ULONG colid, CWStringBase *str) - : m_colid(colid), m_str(str) - { - GPOS_ASSERT(m_str); - } - - // dtor - virtual - ~COptColInfo() - { - GPOS_DELETE(m_str); - } - - // accessors - ULONG GetColId() const - { - return m_colid; - } - - CWStringBase* GetOptColName() const - { - return m_str; - } - - // equality check - BOOL Equals(const COptColInfo& optcolinfo) const - { - // don't need to check name as column id is unique - return m_colid == optcolinfo.m_colid; - } - - // hash value - ULONG HashValue() const - { - return gpos::HashValue(&m_colid); - } - - }; - - // hash function - inline - ULONG UlHashOptColInfo - ( - const COptColInfo *opt_col_info - ) + GPOS_DELETE(m_str); + } + + // accessors + ULONG + GetColId() const { - GPOS_ASSERT(NULL != opt_col_info); - return opt_col_info->HashValue(); + return m_colid; } - // equality function - inline - BOOL FEqualOptColInfo - ( - const COptColInfo *opt_col_infoA, - const COptColInfo *opt_col_infoB - ) + CWStringBase * + GetOptColName() const { - GPOS_ASSERT(NULL != opt_col_infoA && NULL != opt_col_infoB); - return opt_col_infoA->Equals(*opt_col_infoB); + return m_str; } + // equality check + BOOL + Equals(const COptColInfo &optcolinfo) const + { + // don't need to check name as column id is unique + return m_colid == optcolinfo.m_colid; + } + + // hash value + ULONG + HashValue() const + { + return gpos::HashValue(&m_colid); + } +}; + +// hash function +inline ULONG +UlHashOptColInfo(const COptColInfo *opt_col_info) +{ + GPOS_ASSERT(NULL != opt_col_info); + return opt_col_info->HashValue(); +} + +// equality function +inline BOOL +FEqualOptColInfo(const COptColInfo *opt_col_infoA, + const COptColInfo *opt_col_infoB) +{ + GPOS_ASSERT(NULL != opt_col_infoA && NULL != opt_col_infoB); + return opt_col_infoA->Equals(*opt_col_infoB); } -#endif // !GPDXL_COptColInfo_H +} // namespace gpdxl + +#endif // !GPDXL_COptColInfo_H // EOF diff --git a/src/include/gpopt/translate/CQueryMutators.h b/src/include/gpopt/translate/CQueryMutators.h index c9bc6dc6df..e22783d0b7 100644 --- a/src/include/gpopt/translate/CQueryMutators.h +++ b/src/include/gpopt/translate/CQueryMutators.h @@ -30,7 +30,7 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } struct Query; @@ -41,242 +41,220 @@ struct List; namespace gpdxl { - //--------------------------------------------------------------------------- - // @class: - // CQueryMutators - // - // @doc: - // Class providing methods for translating a GPDB Query object into a - // DXL Tree. - // - //--------------------------------------------------------------------------- - class CQueryMutators +//--------------------------------------------------------------------------- +// @class: +// CQueryMutators +// +// @doc: +// Class providing methods for translating a GPDB Query object into a +// DXL Tree. +// +//--------------------------------------------------------------------------- +class CQueryMutators +{ + typedef Node *(*MutatorWalkerFn)(); + typedef BOOL (*FallbackWalkerFn)(); + + typedef struct SContextGrpbyPlMutator { - typedef Node *(*MutatorWalkerFn) (); - typedef BOOL (*FallbackWalkerFn) (); + public: + // memory pool + CMemoryPool *m_mp; + + // MD accessor to get the function name + CMDAccessor *m_mda; + + // original query + // XXX I don't think this is really needed + Query *m_query; + + // the new target list of the group by (derived) query + List *m_derived_table_tlist; + + // the current query level + ULONG m_current_query_level; + + // indicate the levels up of the aggregate we are mutating + ULONG m_agg_levels_up; + + // indicate whether we are mutating the argument of an aggregate + BOOL m_is_mutating_agg_arg; + + // indice whether we are mutating the argument of a window function + BOOL m_is_mutating_window_arg; + + // ctor + SContextGrpbyPlMutator(CMemoryPool *mp, CMDAccessor *mda, Query *query, + List *derived_query_tlist) + : m_mp(mp), + m_mda(mda), + m_query(query), + m_derived_table_tlist(derived_query_tlist), + m_current_query_level(0), + m_agg_levels_up(gpos::ulong_max), + m_is_mutating_agg_arg(false), + m_is_mutating_window_arg(false) + { + } - typedef struct SContextGrpbyPlMutator + // dtor + ~SContextGrpbyPlMutator() { - public: - - // memory pool - CMemoryPool *m_mp; - - // MD accessor to get the function name - CMDAccessor *m_mda; - - // original query - // XXX I don't think this is really needed - Query *m_query; - - // the new target list of the group by (derived) query - List *m_derived_table_tlist; - - // the current query level - ULONG m_current_query_level; - - // indicate the levels up of the aggregate we are mutating - ULONG m_agg_levels_up; - - // indicate whether we are mutating the argument of an aggregate - BOOL m_is_mutating_agg_arg; - - // indice whether we are mutating the argument of a window function - BOOL m_is_mutating_window_arg; - - // ctor - SContextGrpbyPlMutator - ( - CMemoryPool *mp, - CMDAccessor *mda, - Query *query, - List *derived_query_tlist - ) - : - m_mp(mp), - m_mda(mda), - m_query(query), - m_derived_table_tlist(derived_query_tlist), - m_current_query_level(0), - m_agg_levels_up(gpos::ulong_max), - m_is_mutating_agg_arg(false), - m_is_mutating_window_arg(false) - { - } - - // dtor - ~SContextGrpbyPlMutator() - {} - - } CContextGrpbyPlMutator; - - typedef struct SContextIncLevelsupMutator + } + + } CContextGrpbyPlMutator; + + typedef struct SContextIncLevelsupMutator + { + public: + // the current query level + ULONG m_current_query_level; + + // fix target list entry of the top level + BOOL m_should_fix_top_level_target_list; + + // ctor + SContextIncLevelsupMutator(ULONG current_query_level, + BOOL should_fix_top_level_target_list) + : m_current_query_level(current_query_level), + m_should_fix_top_level_target_list( + should_fix_top_level_target_list) + { + } + + // dtor + ~SContextIncLevelsupMutator() { - public: - - // the current query level - ULONG m_current_query_level; - - // fix target list entry of the top level - BOOL m_should_fix_top_level_target_list; - - // ctor - SContextIncLevelsupMutator - ( - ULONG current_query_level, - BOOL should_fix_top_level_target_list - ) - : - m_current_query_level(current_query_level), - m_should_fix_top_level_target_list(should_fix_top_level_target_list) - { - } - - // dtor - ~SContextIncLevelsupMutator() - {} - - } CContextIncLevelsupMutator; - - // context for walker that iterates over the expression in the target entry - typedef struct SContextTLWalker - { - public: - - // list of target list entries in the query - List *m_target_entries; - - // list of grouping clauses - List *m_group_clause; - - // ctor - SContextTLWalker - ( - List *target_entries, - List *group_clause - ) - : - m_target_entries(target_entries), - m_group_clause(group_clause) - { - } - - // dtor - ~SContextTLWalker() - {} - - } CContextTLWalker; - - private: - - // check if the cte levels up needs to be corrected - static - BOOL NeedsLevelsUpCorrection(SContextIncLevelsupMutator *context, Index cte_levels_up); - - public: - - // fall back during since the target list refers to a attribute which algebrizer at this point cannot resolve - static - BOOL ShouldFallback(Node *node, SContextTLWalker *context); - - // check if the project list contains expressions on aggregates thereby needing normalization - static - BOOL NeedsProjListNormalization(const Query *query); - - // normalize query - static - Query *NormalizeQuery(CMemoryPool *mp, CMDAccessor *md_accessor, const Query *query, ULONG query_level); - - // check if the project list contains expressions on window operators thereby needing normalization - static - BOOL NeedsProjListWindowNormalization(const Query *query); - - // flatten expressions in window operation project list - static - Query *NormalizeWindowProjList(CMemoryPool *mp, CMDAccessor *md_accessor, const Query *query); - - // traverse the project list to extract all window functions in an arbitrarily complex project element - static - Node *RunWindowProjListMutator(Node *node, SContextGrpbyPlMutator *context); - - // flatten expressions in project list - static - Query *NormalizeGroupByProjList(CMemoryPool *mp, CMDAccessor *md_accessor, const Query *query); - - // make a copy of the aggref (minus the arguments) - static - Aggref *FlatCopyAggref(Aggref *aggref); - - // make a copy of the window function (minus the arguments) - static - WindowRef *FlatCopyWindowRef (WindowRef *old_windowref); - - // create a new entry in the derived table and return its corresponding var - static - Var *MakeVarInDerivedTable(Node *node, SContextGrpbyPlMutator *context); - - // check if a matching node exists in the list of target entries - static - Node *FindNodeInGroupByTargetList(Node *node, SContextGrpbyPlMutator *context); - - // increment the levels up of outer references - static - Var *IncrLevelsUpIfOuterRef(Var *var); - - // pull up having clause into a select - static - Query *NormalizeHaving(CMemoryPool *mp, CMDAccessor *md_accessor, const Query *query); - - // traverse the expression and fix the levels up of any outer reference - static - Node *RunIncrLevelsUpMutator(Node *node, SContextIncLevelsupMutator *context); + } + + } CContextIncLevelsupMutator; + + // context for walker that iterates over the expression in the target entry + typedef struct SContextTLWalker + { + public: + // list of target list entries in the query + List *m_target_entries; - // traverse the expression and fix the levels up of any CTE - static - Node *RunFixCTELevelsUpMutator(Node *node, SContextIncLevelsupMutator *context); + // list of grouping clauses + List *m_group_clause; - // mutate the grouping columns, fix levels up when necessary - static - Node *RunGroupingColMutator(Node *node, SContextGrpbyPlMutator *context); - - // fix the level up of grouping columns when necessary - static - Node *FixGroupingCols(Node *node, TargetEntry *original, SContextGrpbyPlMutator *context); + // ctor + SContextTLWalker(List *target_entries, List *group_clause) + : m_target_entries(target_entries), m_group_clause(group_clause) + { + } - // return a target entry for the aggregate or percentile expression - static - TargetEntry *PteAggregateOrPercentileExpr(CMemoryPool *mp, CMDAccessor *md_accessor, Node *node, ULONG attno); - - // traverse the having qual to extract all aggregate functions, - // fix correlated vars and return the modified having qual - static - Node *RunExtractAggregatesMutator(Node *node, SContextGrpbyPlMutator *context); - - // for a given an TE in the derived table, create a new TE to be added to the top level query - static - TargetEntry *MakeTopLevelTargetEntry(TargetEntry *target_entry, ULONG attno); + // dtor + ~SContextTLWalker() + { + } - // return the column name of the target entry - static - CHAR* GetTargetEntryColName(TargetEntry *target_entry, Query *query); + } CContextTLWalker; - // make the input query into a derived table and return a new root query - static - Query *ConvertToDerivedTable(const Query *query, BOOL should_fix_target_list, BOOL should_fix_having_qual); +private: + // check if the cte levels up needs to be corrected + static BOOL NeedsLevelsUpCorrection(SContextIncLevelsupMutator *context, + Index cte_levels_up); - // eliminate distinct clause - static - Query *EliminateDistinctClause(const Query *query); +public: + // fall back during since the target list refers to a attribute which algebrizer at this point cannot resolve + static BOOL ShouldFallback(Node *node, SContextTLWalker *context); - // reassign the sorting clause from the derived table to the new top-level query - static - void ReassignSortClause(Query *top_level_query, Query *derive_table_query); + // check if the project list contains expressions on aggregates thereby needing normalization + static BOOL NeedsProjListNormalization(const Query *query); - // fix window frame edge boundary when its value is defined by a subquery - static - Query *PqueryFixWindowFrameEdgeBoundary(const Query *pquery); - }; -} -#endif // GPDXL_CWalkerUtils_H + // normalize query + static Query *NormalizeQuery(CMemoryPool *mp, CMDAccessor *md_accessor, + const Query *query, ULONG query_level); + + // check if the project list contains expressions on window operators thereby needing normalization + static BOOL NeedsProjListWindowNormalization(const Query *query); + + // flatten expressions in window operation project list + static Query *NormalizeWindowProjList(CMemoryPool *mp, + CMDAccessor *md_accessor, + const Query *query); + + // traverse the project list to extract all window functions in an arbitrarily complex project element + static Node *RunWindowProjListMutator(Node *node, + SContextGrpbyPlMutator *context); + + // flatten expressions in project list + static Query *NormalizeGroupByProjList(CMemoryPool *mp, + CMDAccessor *md_accessor, + const Query *query); + + // make a copy of the aggref (minus the arguments) + static Aggref *FlatCopyAggref(Aggref *aggref); + + // make a copy of the window function (minus the arguments) + static WindowRef *FlatCopyWindowRef(WindowRef *old_windowref); + + // create a new entry in the derived table and return its corresponding var + static Var *MakeVarInDerivedTable(Node *node, + SContextGrpbyPlMutator *context); + + // check if a matching node exists in the list of target entries + static Node *FindNodeInGroupByTargetList(Node *node, + SContextGrpbyPlMutator *context); + + // increment the levels up of outer references + static Var *IncrLevelsUpIfOuterRef(Var *var); + + // pull up having clause into a select + static Query *NormalizeHaving(CMemoryPool *mp, CMDAccessor *md_accessor, + const Query *query); + + // traverse the expression and fix the levels up of any outer reference + static Node *RunIncrLevelsUpMutator(Node *node, + SContextIncLevelsupMutator *context); + + // traverse the expression and fix the levels up of any CTE + static Node *RunFixCTELevelsUpMutator(Node *node, + SContextIncLevelsupMutator *context); + + // mutate the grouping columns, fix levels up when necessary + static Node *RunGroupingColMutator(Node *node, + SContextGrpbyPlMutator *context); + + // fix the level up of grouping columns when necessary + static Node *FixGroupingCols(Node *node, TargetEntry *original, + SContextGrpbyPlMutator *context); + + // return a target entry for the aggregate or percentile expression + static TargetEntry *PteAggregateOrPercentileExpr(CMemoryPool *mp, + CMDAccessor *md_accessor, + Node *node, ULONG attno); + + // traverse the having qual to extract all aggregate functions, + // fix correlated vars and return the modified having qual + static Node *RunExtractAggregatesMutator(Node *node, + SContextGrpbyPlMutator *context); + + // for a given an TE in the derived table, create a new TE to be added to the top level query + static TargetEntry *MakeTopLevelTargetEntry(TargetEntry *target_entry, + ULONG attno); + + // return the column name of the target entry + static CHAR *GetTargetEntryColName(TargetEntry *target_entry, Query *query); + + // make the input query into a derived table and return a new root query + static Query *ConvertToDerivedTable(const Query *query, + BOOL should_fix_target_list, + BOOL should_fix_having_qual); + + // eliminate distinct clause + static Query *EliminateDistinctClause(const Query *query); + + // reassign the sorting clause from the derived table to the new top-level query + static void ReassignSortClause(Query *top_level_query, + Query *derive_table_query); + + // fix window frame edge boundary when its value is defined by a subquery + static Query *PqueryFixWindowFrameEdgeBoundary(const Query *pquery); +}; +} // namespace gpdxl +#endif // GPDXL_CWalkerUtils_H //EOF diff --git a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h index 8b6a017ff8..d2b99d64ec 100644 --- a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h +++ b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h @@ -36,14 +36,14 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } namespace gpmd { - class IMDRelation; - class IMDIndex; -} +class IMDRelation; +class IMDIndex; +} // namespace gpmd struct PlannedStmt; struct Scan; @@ -68,723 +68,596 @@ struct WindowFrame; namespace gpdxl { +using namespace gpopt; + +// fwd decl +class CDXLNode; +class CDXLPhysicalCTAS; +class CDXLDirectDispatchInfo; - using namespace gpopt; - - // fwd decl - class CDXLNode; - class CDXLPhysicalCTAS; - class CDXLDirectDispatchInfo; - - //--------------------------------------------------------------------------- - // @class: - // CTranslatorDXLToPlStmt - // - // @doc: - // Class providing methods for translating from DXL tree to GPDB PlannedStmt - // - //--------------------------------------------------------------------------- - class CTranslatorDXLToPlStmt +//--------------------------------------------------------------------------- +// @class: +// CTranslatorDXLToPlStmt +// +// @doc: +// Class providing methods for translating from DXL tree to GPDB PlannedStmt +// +//--------------------------------------------------------------------------- +class CTranslatorDXLToPlStmt +{ + // shorthand for functions for translating DXL operator nodes into planner trees + typedef Plan *(CTranslatorDXLToPlStmt::*PfPplan)( + const CDXLNode *dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings); + +private: + // pair of DXL operator type and the corresponding translator + struct STranslatorMapping { - // shorthand for functions for translating DXL operator nodes into planner trees - typedef Plan * (CTranslatorDXLToPlStmt::*PfPplan)(const CDXLNode *dxlnode, CDXLTranslateContext *output_context, CDXLTranslationContextArray *ctxt_translation_prev_siblings); - - private: - - // pair of DXL operator type and the corresponding translator - struct STranslatorMapping - { - // type - Edxlopid dxl_op_id; - - // translator function pointer - PfPplan dxlnode_to_logical_funct; - }; - - // context for fixing index var attno - struct SContextIndexVarAttno - { - // MD relation - const IMDRelation *m_md_rel; - - // MD index - const IMDIndex *m_md_index; - - // ctor - SContextIndexVarAttno - ( - const IMDRelation *md_rel, - const IMDIndex *md_index - ) - : - m_md_rel(md_rel), - m_md_index(md_index) - { - GPOS_ASSERT(NULL != md_rel); - GPOS_ASSERT(NULL != md_index); - } - }; // SContextIndexVarAttno - - // memory pool - CMemoryPool *m_mp; - - // meta data accessor - CMDAccessor *m_md_accessor; - - // DXL operator translators indexed by the operator id - PfPplan m_dxlop_translator_func_mapping_array[EdxlopSentinel]; - - CContextDXLToPlStmt *m_dxl_to_plstmt_context; - - CTranslatorDXLToScalar *m_translator_dxl_to_scalar; - - // command type - CmdType m_cmd_type; - - // is target table distributed, false when in non DML statements - BOOL m_is_tgt_tbl_distributed; - - // list of result relations range table indexes for DML statements, - // or NULL for select queries - List *m_result_rel_list; - - // external scan counter - ULONG m_external_scan_counter; - - // number of segments - ULONG m_num_of_segments; - - // partition selector counter - ULONG m_partition_selector_counter; - - // private copy ctor - CTranslatorDXLToPlStmt(const CTranslatorDXLToPlStmt&); - - // segment mapping for tables with LOCATION http:// or file:// - void MapLocationsFile - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - // segment mapping for tables with LOCATION gpfdist(s):// or custom protocol - void MapLocationsFdist - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - Uri *pUri, - const ULONG ulTotalPrimaries - ); - - // segment mapping for tables with EXECUTE 'cmd' ON. - void MapLocationsExecute - ( - OID oidRel, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - const ULONG ulTotalPrimaries - ); - - // segment mapping for tables with EXECUTE 'cmd' on all segments - void MapLocationsExecuteAllSegments - ( - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - // segment mapping for tables with EXECUTE 'cmd' per host - void MapLocationsExecutePerHost - ( - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - // segment mapping for tables with EXECUTE 'cmd' on a given host - void MapLocationsExecuteOneHost - ( - CHAR *szHostName, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - //segment mapping for tables with EXECUTE 'cmd' on N random segments - void MapLocationsExecuteRandomSegments - ( - ULONG ulSegments, - const ULONG ulTotalPrimaries, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - // segment mapping for tables with EXECUTE 'cmd' on a given segment - void MapLocationsExecuteOneSegment - ( - INT iTargetSegInd, - CHAR *szPrefixedCommand, - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB - ); - - // segment mapping for tables with LOCATION gphdfs:// - void MapLocationsHdfs - ( - char **rgszSegFileMap, - CdbComponentDatabases *pcdbCompDB, - CHAR *szFirstUri - ); - - // list of URIs for external scan - List* PlExternalScanUriList(OID oidRel); - - // walker to set index var attno's - static - BOOL SetIndexVarAttnoWalker(Node *node, SContextIndexVarAttno *ctxt_index_var_attno_walker); - - public: - // ctor - CTranslatorDXLToPlStmt(CMemoryPool *mp, CMDAccessor *md_accessor, CContextDXLToPlStmt *dxl_to_plstmt_context, ULONG num_of_segments); - - // dtor - ~CTranslatorDXLToPlStmt(); - - // translate DXL operator node into a Plan node - Plan *TranslateDXLOperatorToPlan - ( - const CDXLNode *dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // main translation routine for DXL tree -> PlannedStmt - PlannedStmt *GetPlannedStmtFromDXL(const CDXLNode *dxlnode, bool can_set_tag); - - // translate the join types from its DXL representation to the GPDB one - static JoinType GetGPDBJoinTypeFromDXLJoinType(EdxlJoinType join_type); - - private: - - // initialize index of operator translators - void InitTranslators(); - - // Set the bitmapset of a plan to the list of param_ids defined by the plan - void SetParamIds(Plan *); - - // Set the qDispSliceId in the subplans defining an initplan - void SetInitPlanSliceInformation(SubPlan *); - - // Set InitPlanVariable in PlannedStmt - void SetInitPlanVariables(PlannedStmt *); - - // translate DXL table scan node into a SeqScan node - Plan *TranslateDXLTblScan - ( - const CDXLNode *tbl_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL index scan node into a IndexScan node - Plan *TranslateDXLIndexScan - ( - const CDXLNode *index_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translates a DXL index scan node into a IndexScan node - Plan *TranslateDXLIndexScan - ( - const CDXLNode *index_scan_dxlnode, - CDXLPhysicalIndexScan *dxl_physical_idx_scan_op, - CDXLTranslateContext *output_context, - BOOL is_index_only_scan, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL hash join into a HashJoin node - Plan *TranslateDXLHashJoin - ( - const CDXLNode *TranslateDXLHashJoin, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL nested loop join into a NestLoop node - Plan *TranslateDXLNLJoin - ( - const CDXLNode *nl_join_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL merge join into a MergeJoin node - Plan *TranslateDXLMergeJoin - ( - const CDXLNode *merge_join_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL motion node into GPDB Motion plan node - Plan *TranslateDXLMotion - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL motion node - Plan *TranslateDXLDuplicateSensitiveMotion - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL duplicate sensitive redistribute motion node into - // GPDB result node with hash filters - Plan *TranslateDXLRedistributeMotionToResultHashFilters - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL aggregate node into GPDB Agg plan node - Plan *TranslateDXLAgg - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL window node into GPDB window node - Plan *TranslateDXLWindow - ( - const CDXLNode *motion_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate the DXL window frame into GPDB window frame node - WindowFrame *Pwindowframe - ( - const CDXLWindowFrame *pdxlwf, - const CDXLTranslateContext *pdxltrctxChild, - CDXLTranslateContext *pdxltrctxOut, - Plan *pplan - ); - - // translate DXL sort node into GPDB Sort plan node - Plan *TranslateDXLSort - ( - const CDXLNode *sort_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a DXL node into a Hash node - Plan *TranslateDXLHash - ( - const CDXLNode *dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL Limit node into a Limit node - Plan *TranslateDXLLimit - ( - const CDXLNode *limit_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate DXL TVF into a GPDB Function Scan node - Plan *TranslateDXLTvf - ( - const CDXLNode *tvf_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - Plan *TranslateDXLSubQueryScan - ( - const CDXLNode *subquery_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - Plan *TranslateDXLResult - ( - const CDXLNode *result_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - Plan *TranslateDXLAppend - ( - const CDXLNode *append_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - Plan *TranslateDXLMaterialize - ( - const CDXLNode *materialize_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - Plan *TranslateDXLSharedScan - ( - const CDXLNode *shared_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a sequence operator - Plan *TranslateDXLSequence - ( - const CDXLNode *sequence_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a dynamic table scan operator - Plan *TranslateDXLDynTblScan - ( - const CDXLNode *dyn_tbl_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a dynamic index scan operator - Plan *TranslateDXLDynIdxScan - ( - const CDXLNode *dyn_idx_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a DML operator - Plan *TranslateDXLDml - ( - const CDXLNode *dml_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a Split operator - Plan *TranslateDXLSplit - ( - const CDXLNode *split_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a row trigger operator - Plan *TranslateDXLRowTrigger - ( - const CDXLNode *row_trigger_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate an Assert operator - Plan *TranslateDXLAssert - ( - const CDXLNode *assert_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // Initialize spooling information - void InitializeSpoolingInfo - ( - Plan *plan, - ULONG share_id - ); - - // retrieve the flow of the shared input scan of the cte consumers - Flow *GetFlowCTEConsumer(List *shared_scan_cte_consumer_list); - - // translate a CTE producer into a GPDB share input scan - Plan *TranslateDXLCTEProducerToSharedScan - ( - const CDXLNode *cte_producer_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a CTE consumer into a GPDB share input scan - Plan *TranslateDXLCTEConsumerToSharedScan - ( - const CDXLNode *cte_consumer_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a (dynamic) bitmap table scan operator - Plan *TranslateDXLBitmapTblScan - ( - const CDXLNode *bitmapscan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a DXL PartitionSelector into a GPDB PartitionSelector - Plan *TranslateDXLPartSelector - ( - const CDXLNode *partition_selector_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings - ); - - // translate a DXL Value Scan into GPDB Value Scan - Plan *TranslateDXLValueScan - ( - const CDXLNode *value_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ); - - // translate DXL filter list into GPDB filter list - List *TranslateDXLFilterList - ( - const CDXLNode *filter_list_dxlnode, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ); - - // create range table entry from a CDXLPhysicalTVF node - RangeTblEntry *TranslateDXLTvfToRangeTblEntry - ( - const CDXLNode *tvf_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context - ); - - // create range table entry from a CDXLPhysicalValueScan node - RangeTblEntry *TranslateDXLValueScanToRangeTblEntry - ( - const CDXLNode *value_scan_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context - ); - - // create range table entry from a table descriptor - RangeTblEntry *TranslateDXLTblDescrToRangeTblEntry - ( - const CDXLTableDescr *table_descr, - const CDXLIndexDescr *index_descr_dxl, - Index index, - CDXLTranslateContextBaseTable *base_table_context - ); - - // translate DXL projection list into a target list - List *TranslateDXLProjList - ( - const CDXLNode *project_list_dxlnode, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ); - - // insert NULL values for dropped attributes to construct the target list for a DML statement - List *CreateTargetListWithNullsForDroppedCols(List *target_list, const IMDRelation *md_rel); - - // create a target list containing column references for a hash node from the - // project list of its child node - List *TranslateDXLProjectListToHashTargetList - ( - const CDXLNode *project_list_dxlnode, - CDXLTranslateContext *child_context, - CDXLTranslateContext *output_context - ); - - List *TranslateDXLFilterToQual - ( - const CDXLNode *filter_dxlnode, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ); - - - // translate operator costs from the DXL cost structure into the types - // used by GPDB - void TranslatePlanCosts - ( - const CDXLOperatorCost *dxl_operator_cost, - Cost *startup_cost_out, - Cost *total_cost_out, - Cost *cost_rows_out, - INT *width_out - ); - - // shortcut for translating both the projection list and the filter - void TranslateProjListAndFilter - ( - const CDXLNode *project_list_dxlnode, - const CDXLNode *filter_dxlnode, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - List **targetlist_out, - List **qual_out, - CDXLTranslateContext *output_context - ); - - // translate the hash expr list of a redistribute motion node - void TranslateHashExprList - ( - const CDXLNode *hash_expr_list_dxlnode, - const CDXLTranslateContext *child_context, - List **hash_expr_out_list, - List **hash_expr_types_out_list, - CDXLTranslateContext *output_context - ); - - // translate the tree of bitmap index operators that are under a (dynamic) bitmap table scan - Plan *TranslateDXLBitmapAccessPath - ( - const CDXLNode *bitmap_access_path_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, - const CDXLTableDescr *table_descr, - CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ); - - // translate a bitmap bool op expression - Plan *TranslateDXLBitmapBoolOp - ( - const CDXLNode *bitmap_boolop_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, - const CDXLTableDescr *table_descr, - CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ); - - // translate CDXLScalarBitmapIndexProbe into BitmapIndexScan - Plan *TranslateDXLBitmapIndexProbe - ( - const CDXLNode *bitmap_index_probe_dxlnode, - CDXLTranslateContext *output_context, - const IMDRelation *md_rel, - const CDXLTableDescr *table_descr, - CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings, - BitmapTableScan *bitmap_tbl_scan - ); - - void TranslateSortCols - ( - const CDXLNode *sort_col_list_dxl, - const CDXLTranslateContext *child_context, - AttrNumber *att_no_sort_colids, - Oid *sort_op_oids, - bool *is_nulls_first - ); - - List *TranslateDXLScCondToQual - ( - const CDXLNode *filter_dxlnode, - const CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *child_contexts, - CDXLTranslateContext *output_context - ); - - // parse string value into a Const - static - Cost CostFromStr(const CWStringBase *str); - - // check if the given operator is a DML operator on a distributed table - BOOL IsTgtTblDistributed(CDXLOperator *dxlop); - - // add a target entry for the given colid to the given target list - ULONG AddTargetEntryForColId - ( - List **target_list, - CDXLTranslateContext *dxl_translate_ctxt, - ULONG colid, - BOOL is_resjunk - ); - - // translate the index condition list in an Index scan - void TranslateIndexConditions - ( - CDXLNode *index_cond_list_dxlnode, - const CDXLTableDescr *dxl_tbl_descr, - BOOL is_index_only_scan, - BOOL is_bitmap_index_probe, - const IMDIndex *index, - const IMDRelation *md_rel, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings, - List **index_cond, - List **index_orig_cond, - List **index_strategy_list, - List **index_subtype_list - ); - - // translate the index filters - List *TranslateDXLIndexFilter - ( - CDXLNode *filter_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslateContextBaseTable *base_table_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings - ); - - // translate the assert constraints - List *TranslateDXLAssertConstraints - ( - CDXLNode *filter_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *child_contexts - ); - - // translate a CTAS operator - Plan *TranslateDXLCtas - ( - const CDXLNode *dml_dxlnode, - CDXLTranslateContext *output_context, - CDXLTranslationContextArray *ctxt_translation_prev_siblings = NULL // translation contexts of previous siblings - ); - - // sets the vartypmod fields in the target entries of the given target list - static - void SetVarTypMod(const CDXLPhysicalCTAS *dxlop, List *target_list); - - // translate the into clause for a DXL physical CTAS operator - IntoClause *TranslateDXLPhyCtasToIntoClause(const CDXLPhysicalCTAS *dxlop); - - // translate the distribution policy for a DXL physical CTAS operator - GpPolicy *TranslateDXLPhyCtasToDistrPolicy(const CDXLPhysicalCTAS *dxlop); - - // translate CTAS storage options - List *TranslateDXLCtasStorageOptions(CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options); - - // compute directed dispatch segment ids - List *TranslateDXLDirectDispatchInfo(CDXLDirectDispatchInfo *dxl_direct_dispatch_info); - - // hash a DXL datum with GPDB's hash function - ULONG GetDXLDatumGPDBHash(CDXLDatumArray *dxl_datum_array); + // type + Edxlopid dxl_op_id; + // translator function pointer + PfPplan dxlnode_to_logical_funct; }; -} -#endif // !GPDXL_CTranslatorDxlToPlStmt_H + // context for fixing index var attno + struct SContextIndexVarAttno + { + // MD relation + const IMDRelation *m_md_rel; + + // MD index + const IMDIndex *m_md_index; + + // ctor + SContextIndexVarAttno(const IMDRelation *md_rel, + const IMDIndex *md_index) + : m_md_rel(md_rel), m_md_index(md_index) + { + GPOS_ASSERT(NULL != md_rel); + GPOS_ASSERT(NULL != md_index); + } + }; // SContextIndexVarAttno + + // memory pool + CMemoryPool *m_mp; + + // meta data accessor + CMDAccessor *m_md_accessor; + + // DXL operator translators indexed by the operator id + PfPplan m_dxlop_translator_func_mapping_array[EdxlopSentinel]; + + CContextDXLToPlStmt *m_dxl_to_plstmt_context; + + CTranslatorDXLToScalar *m_translator_dxl_to_scalar; + + // command type + CmdType m_cmd_type; + + // is target table distributed, false when in non DML statements + BOOL m_is_tgt_tbl_distributed; + + // list of result relations range table indexes for DML statements, + // or NULL for select queries + List *m_result_rel_list; + + // external scan counter + ULONG m_external_scan_counter; + + // number of segments + ULONG m_num_of_segments; + + // partition selector counter + ULONG m_partition_selector_counter; + + // private copy ctor + CTranslatorDXLToPlStmt(const CTranslatorDXLToPlStmt &); + + // segment mapping for tables with LOCATION http:// or file:// + void MapLocationsFile(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + // segment mapping for tables with LOCATION gpfdist(s):// or custom protocol + void MapLocationsFdist(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, Uri *pUri, + const ULONG ulTotalPrimaries); + + // segment mapping for tables with EXECUTE 'cmd' ON. + void MapLocationsExecute(OID oidRel, char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, + const ULONG ulTotalPrimaries); + + // segment mapping for tables with EXECUTE 'cmd' on all segments + void MapLocationsExecuteAllSegments(CHAR *szPrefixedCommand, + char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + // segment mapping for tables with EXECUTE 'cmd' per host + void MapLocationsExecutePerHost(CHAR *szPrefixedCommand, + char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + // segment mapping for tables with EXECUTE 'cmd' on a given host + void MapLocationsExecuteOneHost(CHAR *szHostName, CHAR *szPrefixedCommand, + char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + //segment mapping for tables with EXECUTE 'cmd' on N random segments + void MapLocationsExecuteRandomSegments(ULONG ulSegments, + const ULONG ulTotalPrimaries, + CHAR *szPrefixedCommand, + char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + // segment mapping for tables with EXECUTE 'cmd' on a given segment + void MapLocationsExecuteOneSegment(INT iTargetSegInd, + CHAR *szPrefixedCommand, + char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB); + + // segment mapping for tables with LOCATION gphdfs:// + void MapLocationsHdfs(char **rgszSegFileMap, + CdbComponentDatabases *pcdbCompDB, CHAR *szFirstUri); + + // list of URIs for external scan + List *PlExternalScanUriList(OID oidRel); + + // walker to set index var attno's + static BOOL SetIndexVarAttnoWalker( + Node *node, SContextIndexVarAttno *ctxt_index_var_attno_walker); + +public: + // ctor + CTranslatorDXLToPlStmt(CMemoryPool *mp, CMDAccessor *md_accessor, + CContextDXLToPlStmt *dxl_to_plstmt_context, + ULONG num_of_segments); + + // dtor + ~CTranslatorDXLToPlStmt(); + + // translate DXL operator node into a Plan node + Plan *TranslateDXLOperatorToPlan( + const CDXLNode *dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // main translation routine for DXL tree -> PlannedStmt + PlannedStmt *GetPlannedStmtFromDXL(const CDXLNode *dxlnode, + bool can_set_tag); + + // translate the join types from its DXL representation to the GPDB one + static JoinType GetGPDBJoinTypeFromDXLJoinType(EdxlJoinType join_type); + +private: + // initialize index of operator translators + void InitTranslators(); + + // Set the bitmapset of a plan to the list of param_ids defined by the plan + void SetParamIds(Plan *); + + // Set the qDispSliceId in the subplans defining an initplan + void SetInitPlanSliceInformation(SubPlan *); + + // Set InitPlanVariable in PlannedStmt + void SetInitPlanVariables(PlannedStmt *); + + // translate DXL table scan node into a SeqScan node + Plan *TranslateDXLTblScan( + const CDXLNode *tbl_scan_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL index scan node into a IndexScan node + Plan *TranslateDXLIndexScan( + const CDXLNode *index_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translates a DXL index scan node into a IndexScan node + Plan *TranslateDXLIndexScan( + const CDXLNode *index_scan_dxlnode, + CDXLPhysicalIndexScan *dxl_physical_idx_scan_op, + CDXLTranslateContext *output_context, BOOL is_index_only_scan, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL hash join into a HashJoin node + Plan *TranslateDXLHashJoin( + const CDXLNode *TranslateDXLHashJoin, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL nested loop join into a NestLoop node + Plan *TranslateDXLNLJoin( + const CDXLNode *nl_join_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL merge join into a MergeJoin node + Plan *TranslateDXLMergeJoin( + const CDXLNode *merge_join_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL motion node into GPDB Motion plan node + Plan *TranslateDXLMotion( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL motion node + Plan *TranslateDXLDuplicateSensitiveMotion( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL duplicate sensitive redistribute motion node into + // GPDB result node with hash filters + Plan *TranslateDXLRedistributeMotionToResultHashFilters( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL aggregate node into GPDB Agg plan node + Plan *TranslateDXLAgg( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL window node into GPDB window node + Plan *TranslateDXLWindow( + const CDXLNode *motion_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate the DXL window frame into GPDB window frame node + WindowFrame *Pwindowframe(const CDXLWindowFrame *pdxlwf, + const CDXLTranslateContext *pdxltrctxChild, + CDXLTranslateContext *pdxltrctxOut, Plan *pplan); + + // translate DXL sort node into GPDB Sort plan node + Plan *TranslateDXLSort( + const CDXLNode *sort_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a DXL node into a Hash node + Plan *TranslateDXLHash( + const CDXLNode *dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL Limit node into a Limit node + Plan *TranslateDXLLimit( + const CDXLNode *limit_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate DXL TVF into a GPDB Function Scan node + Plan *TranslateDXLTvf( + const CDXLNode *tvf_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + Plan *TranslateDXLSubQueryScan( + const CDXLNode *subquery_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + Plan *TranslateDXLResult( + const CDXLNode *result_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + Plan *TranslateDXLAppend( + const CDXLNode *append_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + Plan *TranslateDXLMaterialize( + const CDXLNode *materialize_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + Plan *TranslateDXLSharedScan( + const CDXLNode *shared_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a sequence operator + Plan *TranslateDXLSequence( + const CDXLNode *sequence_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a dynamic table scan operator + Plan *TranslateDXLDynTblScan( + const CDXLNode *dyn_tbl_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a dynamic index scan operator + Plan *TranslateDXLDynIdxScan( + const CDXLNode *dyn_idx_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a DML operator + Plan *TranslateDXLDml( + const CDXLNode *dml_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a Split operator + Plan *TranslateDXLSplit( + const CDXLNode *split_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a row trigger operator + Plan *TranslateDXLRowTrigger( + const CDXLNode *row_trigger_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate an Assert operator + Plan *TranslateDXLAssert( + const CDXLNode *assert_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // Initialize spooling information + void InitializeSpoolingInfo(Plan *plan, ULONG share_id); + + // retrieve the flow of the shared input scan of the cte consumers + Flow *GetFlowCTEConsumer(List *shared_scan_cte_consumer_list); + + // translate a CTE producer into a GPDB share input scan + Plan *TranslateDXLCTEProducerToSharedScan( + const CDXLNode *cte_producer_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a CTE consumer into a GPDB share input scan + Plan *TranslateDXLCTEConsumerToSharedScan( + const CDXLNode *cte_consumer_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a (dynamic) bitmap table scan operator + Plan *TranslateDXLBitmapTblScan( + const CDXLNode *bitmapscan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a DXL PartitionSelector into a GPDB PartitionSelector + Plan *TranslateDXLPartSelector( + const CDXLNode *partition_selector_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray * + ctxt_translation_prev_siblings // translation contexts of previous siblings + ); + + // translate a DXL Value Scan into GPDB Value Scan + Plan *TranslateDXLValueScan( + const CDXLNode *value_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings); + + // translate DXL filter list into GPDB filter list + List *TranslateDXLFilterList( + const CDXLNode *filter_list_dxlnode, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, + CDXLTranslateContext *output_context); + + // create range table entry from a CDXLPhysicalTVF node + RangeTblEntry *TranslateDXLTvfToRangeTblEntry( + const CDXLNode *tvf_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context); + + // create range table entry from a CDXLPhysicalValueScan node + RangeTblEntry *TranslateDXLValueScanToRangeTblEntry( + const CDXLNode *value_scan_dxlnode, + CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context); + + // create range table entry from a table descriptor + RangeTblEntry *TranslateDXLTblDescrToRangeTblEntry( + const CDXLTableDescr *table_descr, + const CDXLIndexDescr *index_descr_dxl, Index index, + CDXLTranslateContextBaseTable *base_table_context); + + // translate DXL projection list into a target list + List *TranslateDXLProjList( + const CDXLNode *project_list_dxlnode, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, + CDXLTranslateContext *output_context); + + // insert NULL values for dropped attributes to construct the target list for a DML statement + List *CreateTargetListWithNullsForDroppedCols(List *target_list, + const IMDRelation *md_rel); + + // create a target list containing column references for a hash node from the + // project list of its child node + List *TranslateDXLProjectListToHashTargetList( + const CDXLNode *project_list_dxlnode, + CDXLTranslateContext *child_context, + CDXLTranslateContext *output_context); + + List *TranslateDXLFilterToQual( + const CDXLNode *filter_dxlnode, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, + CDXLTranslateContext *output_context); + + + // translate operator costs from the DXL cost structure into the types + // used by GPDB + void TranslatePlanCosts(const CDXLOperatorCost *dxl_operator_cost, + Cost *startup_cost_out, Cost *total_cost_out, + Cost *cost_rows_out, INT *width_out); + + // shortcut for translating both the projection list and the filter + void TranslateProjListAndFilter( + const CDXLNode *project_list_dxlnode, const CDXLNode *filter_dxlnode, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, List **targetlist_out, + List **qual_out, CDXLTranslateContext *output_context); + + // translate the hash expr list of a redistribute motion node + void TranslateHashExprList(const CDXLNode *hash_expr_list_dxlnode, + const CDXLTranslateContext *child_context, + List **hash_expr_out_list, + List **hash_expr_types_out_list, + CDXLTranslateContext *output_context); + + // translate the tree of bitmap index operators that are under a (dynamic) bitmap table scan + Plan *TranslateDXLBitmapAccessPath( + const CDXLNode *bitmap_access_path_dxlnode, + CDXLTranslateContext *output_context, const IMDRelation *md_rel, + const CDXLTableDescr *table_descr, + CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings, + BitmapTableScan *bitmap_tbl_scan); + + // translate a bitmap bool op expression + Plan *TranslateDXLBitmapBoolOp( + const CDXLNode *bitmap_boolop_dxlnode, + CDXLTranslateContext *output_context, const IMDRelation *md_rel, + const CDXLTableDescr *table_descr, + CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings, + BitmapTableScan *bitmap_tbl_scan); + + // translate CDXLScalarBitmapIndexProbe into BitmapIndexScan + Plan *TranslateDXLBitmapIndexProbe( + const CDXLNode *bitmap_index_probe_dxlnode, + CDXLTranslateContext *output_context, const IMDRelation *md_rel, + const CDXLTableDescr *table_descr, + CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings, + BitmapTableScan *bitmap_tbl_scan); + + void TranslateSortCols(const CDXLNode *sort_col_list_dxl, + const CDXLTranslateContext *child_context, + AttrNumber *att_no_sort_colids, Oid *sort_op_oids, + bool *is_nulls_first); + + List *TranslateDXLScCondToQual( + const CDXLNode *filter_dxlnode, + const CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *child_contexts, + CDXLTranslateContext *output_context); + + // parse string value into a Const + static Cost CostFromStr(const CWStringBase *str); + + // check if the given operator is a DML operator on a distributed table + BOOL IsTgtTblDistributed(CDXLOperator *dxlop); + + // add a target entry for the given colid to the given target list + ULONG AddTargetEntryForColId(List **target_list, + CDXLTranslateContext *dxl_translate_ctxt, + ULONG colid, BOOL is_resjunk); + + // translate the index condition list in an Index scan + void TranslateIndexConditions( + CDXLNode *index_cond_list_dxlnode, const CDXLTableDescr *dxl_tbl_descr, + BOOL is_index_only_scan, BOOL is_bitmap_index_probe, + const IMDIndex *index, const IMDRelation *md_rel, + CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings, + List **index_cond, List **index_orig_cond, List **index_strategy_list, + List **index_subtype_list); + + // translate the index filters + List *TranslateDXLIndexFilter( + CDXLNode *filter_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslateContextBaseTable *base_table_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings); + + // translate the assert constraints + List *TranslateDXLAssertConstraints( + CDXLNode *filter_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *child_contexts); + + // translate a CTAS operator + Plan *TranslateDXLCtas( + const CDXLNode *dml_dxlnode, CDXLTranslateContext *output_context, + CDXLTranslationContextArray *ctxt_translation_prev_siblings = + NULL // translation contexts of previous siblings + ); + + // sets the vartypmod fields in the target entries of the given target list + static void SetVarTypMod(const CDXLPhysicalCTAS *dxlop, List *target_list); + + // translate the into clause for a DXL physical CTAS operator + IntoClause *TranslateDXLPhyCtasToIntoClause(const CDXLPhysicalCTAS *dxlop); + + // translate the distribution policy for a DXL physical CTAS operator + GpPolicy *TranslateDXLPhyCtasToDistrPolicy(const CDXLPhysicalCTAS *dxlop); + + // translate CTAS storage options + List *TranslateDXLCtasStorageOptions( + CDXLCtasStorageOptions::CDXLCtasOptionArray *ctas_storage_options); + + // compute directed dispatch segment ids + List *TranslateDXLDirectDispatchInfo( + CDXLDirectDispatchInfo *dxl_direct_dispatch_info); + + // hash a DXL datum with GPDB's hash function + ULONG GetDXLDatumGPDBHash(CDXLDatumArray *dxl_datum_array); +}; +} // namespace gpdxl + +#endif // !GPDXL_CTranslatorDxlToPlStmt_H // EOF diff --git a/src/include/gpopt/translate/CTranslatorDXLToScalar.h b/src/include/gpopt/translate/CTranslatorDXLToScalar.h index b32c2cc694..8a6f852194 100644 --- a/src/include/gpopt/translate/CTranslatorDXLToScalar.h +++ b/src/include/gpopt/translate/CTranslatorDXLToScalar.h @@ -32,12 +32,12 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } namespace gpmd { - class IMDId; +class IMDId; } struct Aggref; @@ -59,374 +59,254 @@ struct SubPlan; namespace gpdxl { - using namespace gpopt; - using namespace gpmd; - - //--------------------------------------------------------------------------- - // @class: - // CTranslatorDXLToScalar - // - // @doc: - // Class providing methods for translating from DXL Scalar Node to - // GPDB's Expr. - // - //--------------------------------------------------------------------------- - class CTranslatorDXLToScalar +using namespace gpopt; +using namespace gpmd; + +//--------------------------------------------------------------------------- +// @class: +// CTranslatorDXLToScalar +// +// @doc: +// Class providing methods for translating from DXL Scalar Node to +// GPDB's Expr. +// +//--------------------------------------------------------------------------- +class CTranslatorDXLToScalar +{ + // shorthand for functions for translating DXL nodes to GPDB expressions + typedef Expr *(CTranslatorDXLToScalar::*expr_func_ptr)( + const CDXLNode *dxlnode, CMappingColIdVar *colid_var); + +private: + // pair of DXL op id and translator function + struct STranslatorElem { - // shorthand for functions for translating DXL nodes to GPDB expressions - typedef Expr * (CTranslatorDXLToScalar::*expr_func_ptr)(const CDXLNode *dxlnode, CMappingColIdVar *colid_var); - - private: - - // pair of DXL op id and translator function - struct STranslatorElem - { - Edxlopid eopid; - expr_func_ptr translate_func; - }; - - // shorthand for functions for translating DXL nodes to GPDB expressions - typedef Const * (CTranslatorDXLToScalar::*const_func_ptr)(CDXLDatum *); - - // pair of DXL datum type and translator function - struct SDatumTranslatorElem - { - CDXLDatum::EdxldatumType edxldt; - const_func_ptr translate_func; - }; - - CMemoryPool *m_mp; - - // meta data accessor - CMDAccessor *m_md_accessor; - - // The parent plan needed when translating an initplan - Plan *m_plan; - - // indicates whether a sublink was encountered during translation of the scalar subtree - BOOL m_has_subqueries; - - // number of segments - ULONG m_num_of_segments; - - // translate a CDXLScalarArrayComp into a GPDB ScalarArrayOpExpr - Expr *TranslateDXLScalarArrayCompToScalar - ( - const CDXLNode *scalar_array_cmp_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarOpExprToScalar - ( - const CDXLNode *scalar_op_expr_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarDistinctToScalar - ( - const CDXLNode *scalar_distinct_cmp_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarBoolExprToScalar - ( - const CDXLNode *scalar_bool_expr_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarBooleanTestToScalar - ( - const CDXLNode *scalar_boolean_test_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarCastToScalar - ( - const CDXLNode *scalar_relabel_type_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarCoerceToDomainToScalar - ( - const CDXLNode *coerce_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarCoerceViaIOToScalar - ( - const CDXLNode *coerce_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarArrayCoerceExprToScalar - ( - const CDXLNode *coerce_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarNullTestToScalar - ( - const CDXLNode *scalar_null_test_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarNullIfToScalar - ( - const CDXLNode *scalar_null_if_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarIfStmtToScalar - ( - const CDXLNode *scalar_if_stmt_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarSwitchToScalar - ( - const CDXLNode *scalar_switch_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarCaseTestToScalar - ( - const CDXLNode *scalar_case_test_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarAggrefToScalar - ( - const CDXLNode *aggref_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarWindowRefToScalar - ( - const CDXLNode *scalar_winref_node, - CMappingColIdVar *colid_var - ); - - Expr *TranslateDXLScalarFuncExprToScalar - ( - const CDXLNode *scalar_func_expr_node, - CMappingColIdVar *colid_var - ); - - // return a GPDB subplan from a DXL subplan - Expr *TranslateDXLScalarSubplanToScalar - ( - const CDXLNode *scalar_sub_plan_node, - CMappingColIdVar *colid_var - ); - - // build subplan node - SubPlan *TranslateSubplanFromChildPlan - ( - Plan *plan_child, - SubLinkType slink, - CContextDXLToPlStmt *dxl_to_plstmt_ctxt - ); - - // translate subplan test expression - Expr *TranslateDXLSubplanTestExprToScalar - ( - CDXLNode *test_expr_node, - SubLinkType slink, - CMappingColIdVar *colid_var, - List **param_ids_list - ); - - // translate subplan parameters - void TranslateSubplanParams - ( - SubPlan *sub_plan, - CDXLTranslateContext *dxl_translator_ctxt, - const CDXLColRefArray *outer_refs, - CMappingColIdVar *colid_var - ); - - CHAR *GetSubplanAlias(ULONG plan_id); - - Param *TranslateParamFromMapping - ( - const CMappingElementColIdParamId *colid_to_param_id_map - ); - - // translate a scalar coalesce - Expr *TranslateDXLScalarCoalesceToScalar - ( - const CDXLNode *scalar_coalesce_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar minmax - Expr *TranslateDXLScalarMinMaxToScalar - ( - const CDXLNode *scalar_min_max_node, - CMappingColIdVar *colid_var - ); - - // translate a scconstval - Expr *TranslateDXLScalarConstToScalar - ( - const CDXLNode *scalar_const_node, - CMappingColIdVar *colid_var - ); - - // translate an array expression - Expr *TranslateDXLScalarArrayToScalar - ( - const CDXLNode *scalar_array_node, - CMappingColIdVar *colid_var - ); - - // translate an arrayref expression - Expr *TranslateDXLScalarArrayRefToScalar - ( - const CDXLNode *scalar_array_ref_node, - CMappingColIdVar *colid_var - ); - - // translate an arrayref index list - List *TranslateDXLArrayRefIndexListToScalar - ( - const CDXLNode *index_list_node, - CDXLScalarArrayRefIndexList::EIndexListBound index_list_bound, - CMappingColIdVar *colid_var - ); - - // translate a DML action expression - Expr *TranslateDXLScalarDMLActionToScalar - ( - const CDXLNode *dml_action_node, - CMappingColIdVar *colid_var - ); - - - // translate children of DXL node, and add them to list - List *TranslateScalarChildren - ( - List *list, - const CDXLNode *dxlnode, - CMappingColIdVar *colid_var - ); - - // return the operator return type oid for the given func id. - OID GetFunctionReturnTypeOid(IMDId *mdid) const; - - // translate dxldatum to GPDB Const - Const *ConvertDXLDatumToConstOid(CDXLDatum *datum_dxl); - Const *ConvertDXLDatumToConstInt2(CDXLDatum *datum_dxl); - Const *ConvertDXLDatumToConstInt4(CDXLDatum *datum_dxl); - Const *ConvertDXLDatumToConstInt8(CDXLDatum *datum_dxl); - Const *ConvertDXLDatumToConstBool(CDXLDatum *datum_dxl); - Const *TranslateDXLDatumGenericToScalar(CDXLDatum *datum_dxl); - Expr *TranslateRelabelTypeOrFuncExprFromDXL - ( - const CDXLScalarCast *scalar_cast, - Expr *pexprChild - ); - - // private copy ctor - CTranslatorDXLToScalar(const CTranslatorDXLToScalar&); - - public: - struct STypeOidAndTypeModifier - { - OID oid_type; - INT type_modifier; - }; - - // ctor - CTranslatorDXLToScalar(CMemoryPool *mp, CMDAccessor *md_accessor, ULONG num_segments); - - // translate DXL scalar operator node into an Expr expression - // This function is called during the translation of DXL->Query or DXL->Query - Expr *TranslateDXLToScalar - ( - const CDXLNode *scalar_op_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part default into an Expr - Expr *TranslateDXLScalarPartDefaultToScalar - ( - const CDXLNode *part_default_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part bound into an Expr - Expr *TranslateDXLScalarPartBoundToScalar - ( - const CDXLNode *part_bound_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part bound inclusion into an Expr - Expr *TranslateDXLScalarPartBoundInclusionToScalar - ( - const CDXLNode *part_bound_incl_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part bound openness into an Expr - Expr *TranslateDXLScalarPartBoundOpenToScalar - ( - const CDXLNode *part_bound_open_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part list values into an Expr - Expr *TranslateDXLScalarPartListValuesToScalar - ( - const CDXLNode *part_list_values_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar part list null test into an Expr - Expr *TranslateDXLScalarPartListNullTestToScalar - ( - const CDXLNode *part_list_null_test_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar ident into an Expr - Expr *TranslateDXLScalarIdentToScalar - ( - const CDXLNode *scalar_id_node, - CMappingColIdVar *colid_var - ); - - // translate a scalar comparison into an Expr - Expr *TranslateDXLScalarCmpToScalar - ( - const CDXLNode *scalar_cmp_node, - CMappingColIdVar *colid_var - ); - - - // checks if the operator return a boolean result - static - BOOL HasBoolResult(CDXLNode *dxlnode, CMDAccessor *md_accessor); - - // check if the operator is a "true" bool constant - static - BOOL HasConstTrue(CDXLNode *dxlnode, CMDAccessor *md_accessor); - - // check if the operator is a NULL constant - static - BOOL HasConstNull(CDXLNode *dxlnode); - - // are there subqueries in the tree - BOOL HasSubqueries() const - { - return m_has_subqueries; - } - - // translate a DXL datum into GPDB const expression - Expr *TranslateDXLDatumToScalar(CDXLDatum *datum_dxl); + Edxlopid eopid; + expr_func_ptr translate_func; }; -} -#endif // !GPDXL_CTranslatorDXLToScalar_H + + // shorthand for functions for translating DXL nodes to GPDB expressions + typedef Const *(CTranslatorDXLToScalar::*const_func_ptr)(CDXLDatum *); + + // pair of DXL datum type and translator function + struct SDatumTranslatorElem + { + CDXLDatum::EdxldatumType edxldt; + const_func_ptr translate_func; + }; + + CMemoryPool *m_mp; + + // meta data accessor + CMDAccessor *m_md_accessor; + + // The parent plan needed when translating an initplan + Plan *m_plan; + + // indicates whether a sublink was encountered during translation of the scalar subtree + BOOL m_has_subqueries; + + // number of segments + ULONG m_num_of_segments; + + // translate a CDXLScalarArrayComp into a GPDB ScalarArrayOpExpr + Expr *TranslateDXLScalarArrayCompToScalar( + const CDXLNode *scalar_array_cmp_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarOpExprToScalar(const CDXLNode *scalar_op_expr_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarDistinctToScalar( + const CDXLNode *scalar_distinct_cmp_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarBoolExprToScalar( + const CDXLNode *scalar_bool_expr_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarBooleanTestToScalar( + const CDXLNode *scalar_boolean_test_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarCastToScalar( + const CDXLNode *scalar_relabel_type_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarCoerceToDomainToScalar(const CDXLNode *coerce_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarCoerceViaIOToScalar(const CDXLNode *coerce_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarArrayCoerceExprToScalar( + const CDXLNode *coerce_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarNullTestToScalar( + const CDXLNode *scalar_null_test_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarNullIfToScalar(const CDXLNode *scalar_null_if_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarIfStmtToScalar(const CDXLNode *scalar_if_stmt_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarSwitchToScalar(const CDXLNode *scalar_switch_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarCaseTestToScalar( + const CDXLNode *scalar_case_test_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarAggrefToScalar(const CDXLNode *aggref_node, + CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarWindowRefToScalar( + const CDXLNode *scalar_winref_node, CMappingColIdVar *colid_var); + + Expr *TranslateDXLScalarFuncExprToScalar( + const CDXLNode *scalar_func_expr_node, CMappingColIdVar *colid_var); + + // return a GPDB subplan from a DXL subplan + Expr *TranslateDXLScalarSubplanToScalar( + const CDXLNode *scalar_sub_plan_node, CMappingColIdVar *colid_var); + + // build subplan node + SubPlan *TranslateSubplanFromChildPlan( + Plan *plan_child, SubLinkType slink, + CContextDXLToPlStmt *dxl_to_plstmt_ctxt); + + // translate subplan test expression + Expr *TranslateDXLSubplanTestExprToScalar(CDXLNode *test_expr_node, + SubLinkType slink, + CMappingColIdVar *colid_var, + List **param_ids_list); + + // translate subplan parameters + void TranslateSubplanParams(SubPlan *sub_plan, + CDXLTranslateContext *dxl_translator_ctxt, + const CDXLColRefArray *outer_refs, + CMappingColIdVar *colid_var); + + CHAR *GetSubplanAlias(ULONG plan_id); + + Param *TranslateParamFromMapping( + const CMappingElementColIdParamId *colid_to_param_id_map); + + // translate a scalar coalesce + Expr *TranslateDXLScalarCoalesceToScalar( + const CDXLNode *scalar_coalesce_node, CMappingColIdVar *colid_var); + + // translate a scalar minmax + Expr *TranslateDXLScalarMinMaxToScalar(const CDXLNode *scalar_min_max_node, + CMappingColIdVar *colid_var); + + // translate a scconstval + Expr *TranslateDXLScalarConstToScalar(const CDXLNode *scalar_const_node, + CMappingColIdVar *colid_var); + + // translate an array expression + Expr *TranslateDXLScalarArrayToScalar(const CDXLNode *scalar_array_node, + CMappingColIdVar *colid_var); + + // translate an arrayref expression + Expr *TranslateDXLScalarArrayRefToScalar( + const CDXLNode *scalar_array_ref_node, CMappingColIdVar *colid_var); + + // translate an arrayref index list + List *TranslateDXLArrayRefIndexListToScalar( + const CDXLNode *index_list_node, + CDXLScalarArrayRefIndexList::EIndexListBound index_list_bound, + CMappingColIdVar *colid_var); + + // translate a DML action expression + Expr *TranslateDXLScalarDMLActionToScalar(const CDXLNode *dml_action_node, + CMappingColIdVar *colid_var); + + + // translate children of DXL node, and add them to list + List *TranslateScalarChildren(List *list, const CDXLNode *dxlnode, + CMappingColIdVar *colid_var); + + // return the operator return type oid for the given func id. + OID GetFunctionReturnTypeOid(IMDId *mdid) const; + + // translate dxldatum to GPDB Const + Const *ConvertDXLDatumToConstOid(CDXLDatum *datum_dxl); + Const *ConvertDXLDatumToConstInt2(CDXLDatum *datum_dxl); + Const *ConvertDXLDatumToConstInt4(CDXLDatum *datum_dxl); + Const *ConvertDXLDatumToConstInt8(CDXLDatum *datum_dxl); + Const *ConvertDXLDatumToConstBool(CDXLDatum *datum_dxl); + Const *TranslateDXLDatumGenericToScalar(CDXLDatum *datum_dxl); + Expr *TranslateRelabelTypeOrFuncExprFromDXL( + const CDXLScalarCast *scalar_cast, Expr *pexprChild); + + // private copy ctor + CTranslatorDXLToScalar(const CTranslatorDXLToScalar &); + +public: + struct STypeOidAndTypeModifier + { + OID oid_type; + INT type_modifier; + }; + + // ctor + CTranslatorDXLToScalar(CMemoryPool *mp, CMDAccessor *md_accessor, + ULONG num_segments); + + // translate DXL scalar operator node into an Expr expression + // This function is called during the translation of DXL->Query or DXL->Query + Expr *TranslateDXLToScalar(const CDXLNode *scalar_op_node, + CMappingColIdVar *colid_var); + + // translate a scalar part default into an Expr + Expr *TranslateDXLScalarPartDefaultToScalar( + const CDXLNode *part_default_node, CMappingColIdVar *colid_var); + + // translate a scalar part bound into an Expr + Expr *TranslateDXLScalarPartBoundToScalar(const CDXLNode *part_bound_node, + CMappingColIdVar *colid_var); + + // translate a scalar part bound inclusion into an Expr + Expr *TranslateDXLScalarPartBoundInclusionToScalar( + const CDXLNode *part_bound_incl_node, CMappingColIdVar *colid_var); + + // translate a scalar part bound openness into an Expr + Expr *TranslateDXLScalarPartBoundOpenToScalar( + const CDXLNode *part_bound_open_node, CMappingColIdVar *colid_var); + + // translate a scalar part list values into an Expr + Expr *TranslateDXLScalarPartListValuesToScalar( + const CDXLNode *part_list_values_node, CMappingColIdVar *colid_var); + + // translate a scalar part list null test into an Expr + Expr *TranslateDXLScalarPartListNullTestToScalar( + const CDXLNode *part_list_null_test_node, CMappingColIdVar *colid_var); + + // translate a scalar ident into an Expr + Expr *TranslateDXLScalarIdentToScalar(const CDXLNode *scalar_id_node, + CMappingColIdVar *colid_var); + + // translate a scalar comparison into an Expr + Expr *TranslateDXLScalarCmpToScalar(const CDXLNode *scalar_cmp_node, + CMappingColIdVar *colid_var); + + + // checks if the operator return a boolean result + static BOOL HasBoolResult(CDXLNode *dxlnode, CMDAccessor *md_accessor); + + // check if the operator is a "true" bool constant + static BOOL HasConstTrue(CDXLNode *dxlnode, CMDAccessor *md_accessor); + + // check if the operator is a NULL constant + static BOOL HasConstNull(CDXLNode *dxlnode); + + // are there subqueries in the tree + BOOL + HasSubqueries() const + { + return m_has_subqueries; + } + + // translate a DXL datum into GPDB const expression + Expr *TranslateDXLDatumToScalar(CDXLDatum *datum_dxl); +}; +} // namespace gpdxl +#endif // !GPDXL_CTranslatorDXLToScalar_H // EOF diff --git a/src/include/gpopt/translate/CTranslatorQueryToDXL.h b/src/include/gpopt/translate/CTranslatorQueryToDXL.h index 3cd5769d8b..a95be4faab 100644 --- a/src/include/gpopt/translate/CTranslatorQueryToDXL.h +++ b/src/include/gpopt/translate/CTranslatorQueryToDXL.h @@ -31,7 +31,7 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } struct Query; @@ -42,466 +42,435 @@ struct CommonTableExpr; namespace gpdxl { - using namespace gpos; - using namespace gpopt; - - typedef CHashMap, gpos::Equals, - CleanupDelete, CleanupDelete > UlongBoolHashMap; - - typedef CHashMapIter, gpos::Equals, - CleanupDelete, CleanupDelete > IntUlongHashmapIter; - - //--------------------------------------------------------------------------- - // @class: - // CTranslatorQueryToDXL - // - // @doc: - // Class providing methods for translating a GPDB Query object into a - // DXL Tree. - // - //--------------------------------------------------------------------------- - class CTranslatorQueryToDXL +using namespace gpos; +using namespace gpopt; + +typedef CHashMap, gpos::Equals, + CleanupDelete, CleanupDelete > + UlongBoolHashMap; + +typedef CHashMapIter, gpos::Equals, + CleanupDelete, CleanupDelete > + IntUlongHashmapIter; + +//--------------------------------------------------------------------------- +// @class: +// CTranslatorQueryToDXL +// +// @doc: +// Class providing methods for translating a GPDB Query object into a +// DXL Tree. +// +//--------------------------------------------------------------------------- +class CTranslatorQueryToDXL +{ + // shorthand for functions for translating DXL nodes to GPDB expressions + typedef CDXLNode *(CTranslatorQueryToDXL::*DXLNodeToLogicalFunc)( + const RangeTblEntry *rte, ULONG rti, ULONG current_query_level); + + // mapping RTEKind to WCHARs + struct SRTENameElem { - // shorthand for functions for translating DXL nodes to GPDB expressions - typedef CDXLNode * (CTranslatorQueryToDXL::*DXLNodeToLogicalFunc)(const RangeTblEntry *rte, ULONG rti, ULONG current_query_level); - - // mapping RTEKind to WCHARs - struct SRTENameElem - { - RTEKind m_rtekind; - const WCHAR *m_rte_name; - }; - - // pair of RTEKind and its translators - struct SRTETranslator - { - RTEKind m_rtekind; - DXLNodeToLogicalFunc dxlnode_to_logical_funct; - }; - - // mapping CmdType to WCHARs - struct SCmdNameElem - { - CmdType m_cmd_type; - const WCHAR *m_cmd_name; - }; - - // pair of unsupported node tag and feature name - struct SUnsupportedFeature - { - NodeTag node_tag; - const WCHAR *m_feature_name; - }; - - private: - // memory pool - CMemoryPool *m_mp; - - // source system id - CSystemId m_sysid; - - // meta data accessor - CMDAccessor *m_md_accessor; - - // counter for generating unique column ids - CIdGenerator *m_colid_counter; - - // counter for generating unique CTE ids - CIdGenerator *m_cte_id_counter; - - // scalar translator used to convert scalar operation into DXL. - CTranslatorScalarToDXL *m_scalar_translator; - - // holds the var to col id information mapping - CMappingVarColId *m_var_to_colid_map; - - // query being translated - Query *m_query; - - // absolute level of query being translated - ULONG m_query_level; - - // does the query have distributed tables - BOOL m_has_distributed_tables; - - // top query is a DML - BOOL m_is_top_query_dml; - - // this is a CTAS query - BOOL m_is_ctas_query; - - // hash map that maintains the list of CTEs defined at a particular query level - HMUlCTEListEntry *m_query_level_to_cte_map; - - // query output columns - CDXLNodeArray *m_dxl_query_output_cols; - - // list of CTE producers - CDXLNodeArray *m_dxl_cte_producers; - - // CTE producer IDs defined at the current query level - UlongBoolHashMap *m_cteid_at_current_query_level_map; - - //ctor - // private constructor, called from the public factory function QueryToDXLInstance - CTranslatorQueryToDXL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *m_colid_counter, - CIdGenerator *cte_id_counter, - CMappingVarColId *var_colid_mapping, - Query *query, - ULONG query_level, - BOOL is_top_query_dml, - HMUlCTEListEntry *query_level_to_cte_map // hash map between query level -> list of CTEs defined at that level - ); - - // private copy ctor - CTranslatorQueryToDXL(const CTranslatorQueryToDXL&); - - // check for unsupported node types, throws an exception if an unsupported - // node is found - void CheckUnsupportedNodeTypes(Query *query); - - // check for SIRV functions in the targetlist without a FROM clause and - // throw an exception when found - void CheckSirvFuncsWithoutFromClause(Query *query); - - // check for SIRV functions in the tree rooted at the given node - BOOL HasSirvFunctions (Node *node) const; - - // translate FromExpr (in the GPDB query) into a CDXLLogicalJoin or CDXLLogicalGet - CDXLNode *TranslateFromExprToDXL(FromExpr *from_expr); - - // translate set operations - CDXLNode *TranslateSetOpToDXL(Node *setop_node, List *target_list, IntToUlongMap *output_attno_to_colid_mapping); - - // create the set operation given its children, input and output columns - CDXLNode *CreateDXLSetOpFromColumns - ( - EdxlSetOpType setop_type, - List *output_target_list, - ULongPtrArray *output_colids, - ULongPtr2dArray *input_colids, - CDXLNodeArray *children_dxlnodes, - BOOL is_cast_across_input, - BOOL keep_res_junked - ) - const; - - // check if the set operation need to cast any of its input columns - BOOL SetOpNeedsCast(List *target_list, IMdIdArray *input_col_mdids) const; - // translate a window operator - CDXLNode *TranslateWindowToDXL - ( - CDXLNode *child_dxlnode, - List *target_list, - List *window_clause, - List *sort_clause, - IntToUlongMap *sort_col_attno_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping - ); - - // translate window spec - CDXLWindowSpecArray *TranslateWindowSpecToDXL(List *window_clause, IntToUlongMap *sort_col_attno_to_colid_mapping, CDXLNode *project_list_dxlnode_node); - - // update window spec positions of LEAD/LAG functions - void UpdateLeadLagWinSpecPos(CDXLNode *project_list_dxlnode, CDXLWindowSpecArray *window_specs_dxlnode) const; - - // manufucture window frame for lead/lag functions - CDXLWindowFrame *CreateWindowFramForLeadLag(BOOL is_lead_func, CDXLNode *dxl_offset) const; - - // translate the child of a set operation - CDXLNode *TranslateSetOpChild(Node *child_node, ULongPtrArray *pdrgpul, IMdIdArray *input_col_mdids, List *target_list); - - // return a dummy const table get - CDXLNode *DXLDummyConstTableGet() const; - - // translate an Expr into CDXLNode - CDXLNode *TranslateExprToDXL(Expr *expr); - - // translate the JoinExpr (inside FromExpr) into a CDXLLogicalJoin node - CDXLNode *TranslateJoinExprInFromToDXL(JoinExpr *join_expr); - - // construct a group by node for a set of grouping columns - CDXLNode *CreateSimpleGroupBy - ( - List *target_list, - List *group_clause, - CBitSet *bitset, - BOOL has_aggs, - BOOL has_grouping_sets, // is this GB part of a GS query - CDXLNode *child_dxlnode, - IntToUlongMap *phmiulSortGrpColsColId, // mapping sortgroupref -> ColId - IntToUlongMap *child_attno_colid_mapping, // mapping attno->colid in child node - IntToUlongMap *output_attno_to_colid_mapping // mapping attno -> ColId for output columns - ); - - // check if the argument of a DQA has already being used by another DQA - static - BOOL IsDuplicateDqaArg(List *dqa_list, Aggref *aggref); - - // translate a query with grouping sets - CDXLNode *TranslateGroupingSets - ( - FromExpr *from_expr, - List *target_list, - List *group_clause, - BOOL has_aggs, - IntToUlongMap *phmiulSortGrpColsColId, - IntToUlongMap *output_attno_to_colid_mapping - ); - - // expand the grouping sets into a union all operator - CDXLNode *CreateDXLUnionAllForGroupingSets - ( - FromExpr *from_expr, - List *target_list, - List *group_clause, - BOOL has_aggs, - CBitSetArray *pdrgpbsGroupingSets, - IntToUlongMap *phmiulSortGrpColsColId, - IntToUlongMap *output_attno_to_colid_mapping, - UlongToUlongMap *grpcol_index_to_colid_mapping // mapping pos->unique grouping columns for grouping func arguments - ); - - // construct a project node with NULL values for columns not included in the grouping set - CDXLNode *CreateDXLProjectNullsForGroupingSets - ( - List *target_list, - CDXLNode *child_dxlnode, - CBitSet *bitset, - IntToUlongMap *sort_grouping_col_mapping, - IntToUlongMap *output_attno_to_colid_mapping, - UlongToUlongMap *grpcol_index_to_colid_mapping - ) - const; - - // construct a project node with appropriate values for the grouping funcs in the given target list - CDXLNode *CreateDXLProjectGroupingFuncs - ( - List *target_list, - CDXLNode *child_dxlnode, - CBitSet *bitset, - IntToUlongMap *output_attno_to_colid_mapping, - UlongToUlongMap *grpcol_index_to_colid_mapping, - IntToUlongMap *sort_grpref_to_colid_mapping - ) - const; - - // add sorting and grouping column into the hash map - void AddSortingGroupingColumn(TargetEntry *target_entry, IntToUlongMap *phmiulSortGrpColsColId, ULONG colid) const; - - // translate the list of sorting columns - CDXLNodeArray *TranslateSortColumnsToDXL(List *sort_clause, IntToUlongMap *col_attno_colid_mapping) const; - - // translate the list of partition-by column identifiers - ULongPtrArray *TranslatePartColumns(List *sort_clause, IntToUlongMap *col_attno_colid_mapping) const; - - CDXLNode *TranslateLimitToDXLGroupBy - ( - List *plsortcl, // list of sort clauses - Node *limit_count, // query node representing the limit count - Node *limit_offset_node, // query node representing the limit offset - CDXLNode *dxlnode, // the dxl node representing the subtree - IntToUlongMap *grpcols_to_colid_mapping // the mapping between the position in the TargetList to the ColId - ); - - // throws an exception when RTE kind not yet supported - void UnsupportedRTEKind(RTEKind rtekind) const; - - // translate an entry of the from clause (this can either be FromExpr or JoinExpr) - CDXLNode *TranslateFromClauseToDXL(Node *node); - - // translate the target list entries of the query into a logical project - CDXLNode *TranslateTargetListToDXLProject - ( - List *target_list, - CDXLNode *child_dxlnode, - IntToUlongMap * group_col_to_colid_mapping, - IntToUlongMap *output_attno_to_colid_mapping, - List *group_clause, - BOOL is_aggref_expanded = false - ); - - // translate a target list entry or a join alias entry into a project element - CDXLNode *TranslateExprToDXLProject(Expr *expr, const CHAR *alias_name, 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 - ); - - // translate a base table range table entry into a logical get - CDXLNode *TranslateRTEToDXLLogicalGet - ( - const RangeTblEntry *rte, - ULONG rti, - ULONG //current_query_level - ); - - // generate a DXL node from column values, where each column value is - // either a datum or scalar expression represented as a project element. - CDXLNode *TranslateColumnValuesToDXL - ( - CDXLDatumArray *dxl_datum_array, - CDXLColDescrArray *dxl_column_descriptors, - CDXLNodeArray *dxl_project_elements - ) - const; - - // translate a value scan range table entry - CDXLNode *TranslateValueScanRTEToDXL - ( - const RangeTblEntry *rte, - ULONG rti, - ULONG //current_query_level - ); - - // create a dxl node from a array of datums and project elements - CDXLNode *TranslateTVFToDXL - ( - const RangeTblEntry *rte, - ULONG rti, - ULONG //current_query_level - ); - - // translate a derived table into a DXL logical operator - CDXLNode *TranslateDerivedTablesToDXL - ( - const RangeTblEntry *rte, - ULONG rti, - ULONG current_query_level - ); - - // create a DXL node representing the scalar constant "true" - CDXLNode *CreateDXLConstValueTrue(); - - // store mapping attno->colid - void StoreAttnoColIdMapping(IntToUlongMap *attno_to_colid_mapping, INT attno, ULONG colid) const; - - // construct an array of output columns - CDXLNodeArray *CreateDXLOutputCols(List *target_list, IntToUlongMap *attno_to_colid_mapping) const; - - // check for support command types, throws an exception when command type not yet supported - void CheckSupportedCmdType(Query *query); - - // translate a select-project-join expression into DXL - CDXLNode *TranslateSelectProjectJoinToDXL(List *target_list, FromExpr *from_expr, IntToUlongMap *sort_group_attno_to_colid_mapping, IntToUlongMap *output_attno_to_colid_mapping, List *group_clause); - - // translate a select-project-join expression into DXL and keep variables appearing - // in aggregates and grouping columns in the output column map - CDXLNode *TranslateSelectProjectJoinForGrpSetsToDXL(List *target_list, FromExpr *from_expr, IntToUlongMap *sort_group_attno_to_colid_mapping, IntToUlongMap *output_attno_to_colid_mapping, List *group_clause); - - // helper to check if OID is included in given array of OIDs - static - BOOL OIDFound(OID oid, const OID oids[], ULONG size); - - // check if given operator is lead() window function - static - BOOL IsLeadWindowFunc(CDXLOperator *dxlop); - - // check if given operator is lag() window function - static - BOOL IsLagWindowFunc(CDXLOperator *dxlop); - - // translate an insert query - CDXLNode *TranslateInsertQueryToDXL(); - - // translate a delete query - CDXLNode *TranslateDeleteQueryToDXL(); - - // translate an update query - CDXLNode *TranslateUpdateQueryToDXL(); - - // translate a CTAS query - CDXLNode *TranslateCTASToDXL(); - // translate CTAS storage options - CDXLCtasStorageOptions::CDXLCtasOptionArray *GetDXLCtasOptionArray(List *options, IMDRelation::Erelstoragetype *storage_type); - - // extract storage option value from defelem - CWStringDynamic *ExtractStorageOptionStr(DefElem *def_elem); - - // return resno -> colId mapping of columns to be updated - IntToUlongMap *UpdatedColumnMapping(); - - // obtain the ids of the ctid and segmentid columns for the target - // table of a DML query - void GetCtidAndSegmentId(ULONG *ctid, ULONG *segment_id); - - // obtain the column id for the tuple oid column of the target table - // of a DML statement - ULONG GetTupleOidColId(); - - // translate a grouping func expression - CDXLNode *TranslateGroupingFuncToDXL(const Expr *expr, CBitSet *bitset, UlongToUlongMap *grpcol_index_to_colid_mapping) const; - - // construct a list of CTE producers from the query's CTE list - void ConstructCTEProducerList(List *cte_list, ULONG query_level); - - // construct a stack of CTE anchors for each CTE producer in the given array - void ConstructCTEAnchors(CDXLNodeArray *dxlnodes, CDXLNode **dxl_cte_anchor_top, CDXLNode **dxl_cte_anchor_bottom); - - // generate an array of new column ids of the given size - ULongPtrArray *GenerateColIds(CMemoryPool *mp, ULONG size) const; - - // extract an array of colids from the given column mapping - ULongPtrArray *ExtractColIds(CMemoryPool *mp, IntToUlongMap *attno_to_colid_mapping) const; - - // construct a new mapping based on the given one by replacing the colid in the "From" list - // with the colid at the same position in the "To" list - IntToUlongMap *RemapColIds(CMemoryPool *mp, IntToUlongMap *attno_to_colid_mapping, ULongPtrArray *from_list_colids, ULongPtrArray *to_list_colids) const; - - // true iff this query or one of its ancestors is a DML query - BOOL IsDMLQuery(); - - public: - // dtor - ~CTranslatorQueryToDXL(); - - // query object - const Query *Pquery() const - { - return m_query; - } - - // does query have distributed tables - BOOL HasDistributedTables() const - { - return m_has_distributed_tables; - } - - // main translation routine for Query -> DXL tree - CDXLNode *TranslateSelectQueryToDXL(); - - // main driver - CDXLNode *TranslateQueryToDXL(); - - // return the list of output columns - CDXLNodeArray *GetQueryOutputCols() const; - - // return the list of CTEs - CDXLNodeArray *GetCTEs() const; - - // factory function - static - CTranslatorQueryToDXL *QueryToDXLInstance - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *m_colid_counter, - CIdGenerator *cte_id_counter, - CMappingVarColId *var_colid_mapping, - Query *query, - ULONG query_level, - HMUlCTEListEntry *query_level_to_cte_map = NULL // hash map between query level -> list of CTEs defined at that level - ); + RTEKind m_rtekind; + const WCHAR *m_rte_name; }; -} -#endif // GPDXL_CTranslatorQueryToDXL_H + + // pair of RTEKind and its translators + struct SRTETranslator + { + RTEKind m_rtekind; + DXLNodeToLogicalFunc dxlnode_to_logical_funct; + }; + + // mapping CmdType to WCHARs + struct SCmdNameElem + { + CmdType m_cmd_type; + const WCHAR *m_cmd_name; + }; + + // pair of unsupported node tag and feature name + struct SUnsupportedFeature + { + NodeTag node_tag; + const WCHAR *m_feature_name; + }; + +private: + // memory pool + CMemoryPool *m_mp; + + // source system id + CSystemId m_sysid; + + // meta data accessor + CMDAccessor *m_md_accessor; + + // counter for generating unique column ids + CIdGenerator *m_colid_counter; + + // counter for generating unique CTE ids + CIdGenerator *m_cte_id_counter; + + // scalar translator used to convert scalar operation into DXL. + CTranslatorScalarToDXL *m_scalar_translator; + + // holds the var to col id information mapping + CMappingVarColId *m_var_to_colid_map; + + // query being translated + Query *m_query; + + // absolute level of query being translated + ULONG m_query_level; + + // does the query have distributed tables + BOOL m_has_distributed_tables; + + // top query is a DML + BOOL m_is_top_query_dml; + + // this is a CTAS query + BOOL m_is_ctas_query; + + // hash map that maintains the list of CTEs defined at a particular query level + HMUlCTEListEntry *m_query_level_to_cte_map; + + // query output columns + CDXLNodeArray *m_dxl_query_output_cols; + + // list of CTE producers + CDXLNodeArray *m_dxl_cte_producers; + + // CTE producer IDs defined at the current query level + UlongBoolHashMap *m_cteid_at_current_query_level_map; + + //ctor + // private constructor, called from the public factory function QueryToDXLInstance + CTranslatorQueryToDXL( + CMemoryPool *mp, CMDAccessor *md_accessor, + CIdGenerator *m_colid_counter, CIdGenerator *cte_id_counter, + CMappingVarColId *var_colid_mapping, Query *query, ULONG query_level, + BOOL is_top_query_dml, + HMUlCTEListEntry * + query_level_to_cte_map // hash map between query level -> list of CTEs defined at that level + ); + + // private copy ctor + CTranslatorQueryToDXL(const CTranslatorQueryToDXL &); + + // check for unsupported node types, throws an exception if an unsupported + // node is found + void CheckUnsupportedNodeTypes(Query *query); + + // check for SIRV functions in the targetlist without a FROM clause and + // throw an exception when found + void CheckSirvFuncsWithoutFromClause(Query *query); + + // check for SIRV functions in the tree rooted at the given node + BOOL HasSirvFunctions(Node *node) const; + + // translate FromExpr (in the GPDB query) into a CDXLLogicalJoin or CDXLLogicalGet + CDXLNode *TranslateFromExprToDXL(FromExpr *from_expr); + + // translate set operations + CDXLNode *TranslateSetOpToDXL(Node *setop_node, List *target_list, + IntToUlongMap *output_attno_to_colid_mapping); + + // create the set operation given its children, input and output columns + CDXLNode *CreateDXLSetOpFromColumns(EdxlSetOpType setop_type, + List *output_target_list, + ULongPtrArray *output_colids, + ULongPtr2dArray *input_colids, + CDXLNodeArray *children_dxlnodes, + BOOL is_cast_across_input, + BOOL keep_res_junked) const; + + // check if the set operation need to cast any of its input columns + BOOL SetOpNeedsCast(List *target_list, IMdIdArray *input_col_mdids) const; + // translate a window operator + CDXLNode *TranslateWindowToDXL( + CDXLNode *child_dxlnode, List *target_list, List *window_clause, + List *sort_clause, IntToUlongMap *sort_col_attno_to_colid_mapping, + IntToUlongMap *output_attno_to_colid_mapping); + + // translate window spec + CDXLWindowSpecArray *TranslateWindowSpecToDXL( + List *window_clause, IntToUlongMap *sort_col_attno_to_colid_mapping, + CDXLNode *project_list_dxlnode_node); + + // update window spec positions of LEAD/LAG functions + void UpdateLeadLagWinSpecPos( + CDXLNode *project_list_dxlnode, + CDXLWindowSpecArray *window_specs_dxlnode) const; + + // manufucture window frame for lead/lag functions + CDXLWindowFrame *CreateWindowFramForLeadLag(BOOL is_lead_func, + CDXLNode *dxl_offset) const; + + // translate the child of a set operation + CDXLNode *TranslateSetOpChild(Node *child_node, ULongPtrArray *pdrgpul, + IMdIdArray *input_col_mdids, + List *target_list); + + // return a dummy const table get + CDXLNode *DXLDummyConstTableGet() const; + + // translate an Expr into CDXLNode + CDXLNode *TranslateExprToDXL(Expr *expr); + + // translate the JoinExpr (inside FromExpr) into a CDXLLogicalJoin node + CDXLNode *TranslateJoinExprInFromToDXL(JoinExpr *join_expr); + + // construct a group by node for a set of grouping columns + CDXLNode *CreateSimpleGroupBy( + List *target_list, List *group_clause, CBitSet *bitset, BOOL has_aggs, + BOOL has_grouping_sets, // is this GB part of a GS query + CDXLNode *child_dxlnode, + IntToUlongMap *phmiulSortGrpColsColId, // mapping sortgroupref -> ColId + IntToUlongMap + *child_attno_colid_mapping, // mapping attno->colid in child node + IntToUlongMap * + output_attno_to_colid_mapping // mapping attno -> ColId for output columns + ); + + // check if the argument of a DQA has already being used by another DQA + static BOOL IsDuplicateDqaArg(List *dqa_list, Aggref *aggref); + + // translate a query with grouping sets + CDXLNode *TranslateGroupingSets( + FromExpr *from_expr, List *target_list, List *group_clause, + BOOL has_aggs, IntToUlongMap *phmiulSortGrpColsColId, + IntToUlongMap *output_attno_to_colid_mapping); + + // expand the grouping sets into a union all operator + CDXLNode *CreateDXLUnionAllForGroupingSets( + FromExpr *from_expr, List *target_list, List *group_clause, + BOOL has_aggs, CBitSetArray *pdrgpbsGroupingSets, + IntToUlongMap *phmiulSortGrpColsColId, + IntToUlongMap *output_attno_to_colid_mapping, + UlongToUlongMap * + grpcol_index_to_colid_mapping // mapping pos->unique grouping columns for grouping func arguments + ); + + // construct a project node with NULL values for columns not included in the grouping set + CDXLNode *CreateDXLProjectNullsForGroupingSets( + List *target_list, CDXLNode *child_dxlnode, CBitSet *bitset, + IntToUlongMap *sort_grouping_col_mapping, + IntToUlongMap *output_attno_to_colid_mapping, + UlongToUlongMap *grpcol_index_to_colid_mapping) const; + + // construct a project node with appropriate values for the grouping funcs in the given target list + CDXLNode *CreateDXLProjectGroupingFuncs( + List *target_list, CDXLNode *child_dxlnode, CBitSet *bitset, + IntToUlongMap *output_attno_to_colid_mapping, + UlongToUlongMap *grpcol_index_to_colid_mapping, + IntToUlongMap *sort_grpref_to_colid_mapping) const; + + // add sorting and grouping column into the hash map + void AddSortingGroupingColumn(TargetEntry *target_entry, + IntToUlongMap *phmiulSortGrpColsColId, + ULONG colid) const; + + // translate the list of sorting columns + CDXLNodeArray *TranslateSortColumnsToDXL( + List *sort_clause, IntToUlongMap *col_attno_colid_mapping) const; + + // translate the list of partition-by column identifiers + ULongPtrArray *TranslatePartColumns( + List *sort_clause, IntToUlongMap *col_attno_colid_mapping) const; + + CDXLNode *TranslateLimitToDXLGroupBy( + List *plsortcl, // list of sort clauses + Node *limit_count, // query node representing the limit count + Node *limit_offset_node, // query node representing the limit offset + CDXLNode *dxlnode, // the dxl node representing the subtree + IntToUlongMap * + grpcols_to_colid_mapping // the mapping between the position in the TargetList to the ColId + ); + + // throws an exception when RTE kind not yet supported + void UnsupportedRTEKind(RTEKind rtekind) const; + + // translate an entry of the from clause (this can either be FromExpr or JoinExpr) + CDXLNode *TranslateFromClauseToDXL(Node *node); + + // translate the target list entries of the query into a logical project + CDXLNode *TranslateTargetListToDXLProject( + List *target_list, CDXLNode *child_dxlnode, + IntToUlongMap *group_col_to_colid_mapping, + IntToUlongMap *output_attno_to_colid_mapping, List *group_clause, + BOOL is_aggref_expanded = false); + + // translate a target list entry or a join alias entry into a project element + CDXLNode *TranslateExprToDXLProject(Expr *expr, const CHAR *alias_name, + 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); + + // translate a base table range table entry into a logical get + CDXLNode *TranslateRTEToDXLLogicalGet(const RangeTblEntry *rte, ULONG rti, + ULONG //current_query_level + ); + + // generate a DXL node from column values, where each column value is + // either a datum or scalar expression represented as a project element. + CDXLNode *TranslateColumnValuesToDXL( + CDXLDatumArray *dxl_datum_array, + CDXLColDescrArray *dxl_column_descriptors, + CDXLNodeArray *dxl_project_elements) const; + + // translate a value scan range table entry + CDXLNode *TranslateValueScanRTEToDXL(const RangeTblEntry *rte, ULONG rti, + ULONG //current_query_level + ); + + // create a dxl node from a array of datums and project elements + CDXLNode *TranslateTVFToDXL(const RangeTblEntry *rte, ULONG rti, + ULONG //current_query_level + ); + + // translate a derived table into a DXL logical operator + CDXLNode *TranslateDerivedTablesToDXL(const RangeTblEntry *rte, ULONG rti, + ULONG current_query_level); + + // create a DXL node representing the scalar constant "true" + CDXLNode *CreateDXLConstValueTrue(); + + // store mapping attno->colid + void StoreAttnoColIdMapping(IntToUlongMap *attno_to_colid_mapping, + INT attno, ULONG colid) const; + + // construct an array of output columns + CDXLNodeArray *CreateDXLOutputCols( + List *target_list, IntToUlongMap *attno_to_colid_mapping) const; + + // check for support command types, throws an exception when command type not yet supported + void CheckSupportedCmdType(Query *query); + + // translate a select-project-join expression into DXL + CDXLNode *TranslateSelectProjectJoinToDXL( + List *target_list, FromExpr *from_expr, + IntToUlongMap *sort_group_attno_to_colid_mapping, + IntToUlongMap *output_attno_to_colid_mapping, List *group_clause); + + // translate a select-project-join expression into DXL and keep variables appearing + // in aggregates and grouping columns in the output column map + CDXLNode *TranslateSelectProjectJoinForGrpSetsToDXL( + List *target_list, FromExpr *from_expr, + IntToUlongMap *sort_group_attno_to_colid_mapping, + IntToUlongMap *output_attno_to_colid_mapping, List *group_clause); + + // helper to check if OID is included in given array of OIDs + static BOOL OIDFound(OID oid, const OID oids[], ULONG size); + + // check if given operator is lead() window function + static BOOL IsLeadWindowFunc(CDXLOperator *dxlop); + + // check if given operator is lag() window function + static BOOL IsLagWindowFunc(CDXLOperator *dxlop); + + // translate an insert query + CDXLNode *TranslateInsertQueryToDXL(); + + // translate a delete query + CDXLNode *TranslateDeleteQueryToDXL(); + + // translate an update query + CDXLNode *TranslateUpdateQueryToDXL(); + + // translate a CTAS query + CDXLNode *TranslateCTASToDXL(); + // translate CTAS storage options + CDXLCtasStorageOptions::CDXLCtasOptionArray *GetDXLCtasOptionArray( + List *options, IMDRelation::Erelstoragetype *storage_type); + + // extract storage option value from defelem + CWStringDynamic *ExtractStorageOptionStr(DefElem *def_elem); + + // return resno -> colId mapping of columns to be updated + IntToUlongMap *UpdatedColumnMapping(); + + // obtain the ids of the ctid and segmentid columns for the target + // table of a DML query + void GetCtidAndSegmentId(ULONG *ctid, ULONG *segment_id); + + // obtain the column id for the tuple oid column of the target table + // of a DML statement + ULONG GetTupleOidColId(); + + // translate a grouping func expression + CDXLNode *TranslateGroupingFuncToDXL( + const Expr *expr, CBitSet *bitset, + UlongToUlongMap *grpcol_index_to_colid_mapping) const; + + // construct a list of CTE producers from the query's CTE list + void ConstructCTEProducerList(List *cte_list, ULONG query_level); + + // construct a stack of CTE anchors for each CTE producer in the given array + void ConstructCTEAnchors(CDXLNodeArray *dxlnodes, + CDXLNode **dxl_cte_anchor_top, + CDXLNode **dxl_cte_anchor_bottom); + + // generate an array of new column ids of the given size + ULongPtrArray *GenerateColIds(CMemoryPool *mp, ULONG size) const; + + // extract an array of colids from the given column mapping + ULongPtrArray *ExtractColIds(CMemoryPool *mp, + IntToUlongMap *attno_to_colid_mapping) const; + + // construct a new mapping based on the given one by replacing the colid in the "From" list + // with the colid at the same position in the "To" list + IntToUlongMap *RemapColIds(CMemoryPool *mp, + IntToUlongMap *attno_to_colid_mapping, + ULongPtrArray *from_list_colids, + ULongPtrArray *to_list_colids) const; + + // true iff this query or one of its ancestors is a DML query + BOOL IsDMLQuery(); + +public: + // dtor + ~CTranslatorQueryToDXL(); + + // query object + const Query * + Pquery() const + { + return m_query; + } + + // does query have distributed tables + BOOL + HasDistributedTables() const + { + return m_has_distributed_tables; + } + + // main translation routine for Query -> DXL tree + CDXLNode *TranslateSelectQueryToDXL(); + + // main driver + CDXLNode *TranslateQueryToDXL(); + + // return the list of output columns + CDXLNodeArray *GetQueryOutputCols() const; + + // return the list of CTEs + CDXLNodeArray *GetCTEs() const; + + // factory function + static CTranslatorQueryToDXL *QueryToDXLInstance( + CMemoryPool *mp, CMDAccessor *md_accessor, + CIdGenerator *m_colid_counter, CIdGenerator *cte_id_counter, + CMappingVarColId *var_colid_mapping, Query *query, ULONG query_level, + HMUlCTEListEntry *query_level_to_cte_map = + NULL // hash map between query level -> list of CTEs defined at that level + ); +}; +} // namespace gpdxl +#endif // GPDXL_CTranslatorQueryToDXL_H //EOF diff --git a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h index 8d35c59fa0..86cc6eb9d9 100644 --- a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h +++ b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h @@ -45,430 +45,368 @@ // fwd decl struct RelationData; -typedef struct RelationData* Relation; +typedef struct RelationData *Relation; struct LogicalIndexes; struct LogicalIndexInfo; namespace gpdxl { - using namespace gpos; - using namespace gpmd; +using namespace gpos; +using namespace gpmd; +//--------------------------------------------------------------------------- +// @class: +// CTranslatorRelcacheToDXL +// +// @doc: +// Class for translating GPDB's relcache entries into DXL MD objects +// +//--------------------------------------------------------------------------- +class CTranslatorRelcacheToDXL +{ +private: //--------------------------------------------------------------------------- // @class: - // CTranslatorRelcacheToDXL + // SFuncProps // // @doc: - // Class for translating GPDB's relcache entries into DXL MD objects + // Internal structure to capture exceptional cases where + // function properties are wrongly defined in the catalog, + // + // this information is used to correct function properties during + // translation // //--------------------------------------------------------------------------- - class CTranslatorRelcacheToDXL + struct SFuncProps { - private: - - //--------------------------------------------------------------------------- - // @class: - // SFuncProps - // - // @doc: - // Internal structure to capture exceptional cases where - // function properties are wrongly defined in the catalog, - // - // this information is used to correct function properties during - // translation - // - //--------------------------------------------------------------------------- - struct SFuncProps + private: + // function identifier + OID m_oid; + + // function stability + IMDFunction::EFuncStbl m_stability; + + // function data access + IMDFunction::EFuncDataAcc m_access; + + // is function strict? + BOOL m_is_strict; + + // can the function return multiple rows? + BOOL m_returns_set; + + public: + // ctor + SFuncProps(OID oid, IMDFunction::EFuncStbl stability, + IMDFunction::EFuncDataAcc access, BOOL is_strict, + BOOL ReturnsSet) + : m_oid(oid), + m_stability(stability), + m_access(access), + m_is_strict(is_strict), + m_returns_set(ReturnsSet) + { + } + + // dtor + virtual ~SFuncProps(){}; + + // return function identifier + OID + Oid() const + { + return m_oid; + } + + // return function stability + IMDFunction::EFuncStbl + GetStability() const + { + return m_stability; + } + + // return data access property + IMDFunction::EFuncDataAcc + GetDataAccess() const + { + return m_access; + } + + // is function strict? + BOOL + IsStrict() const + { + return m_is_strict; + } + + // does function return set? + BOOL + ReturnsSet() const { + return m_returns_set; + } + + }; // struct SFuncProps + + // array of function properties map + static const SFuncProps m_func_props[]; + + // lookup function properties + static void LookupFuncProps( + OID func_oid, + IMDFunction::EFuncStbl *stability, // output: function stability + IMDFunction::EFuncDataAcc *access, // output: function data access + BOOL *is_strict, // output: is function strict? + BOOL *is_ndv_preserving, // output: preserves NDVs of inputs + BOOL *ReturnsSet // output: does function return set? + ); + + // check and fall back for unsupported relations + static void CheckUnsupportedRelation(OID rel_oid); + + // get type name from the relcache + static CMDName *GetTypeName(CMemoryPool *mp, IMDId *mdid); + + // get function stability property from the GPDB character representation + static CMDFunctionGPDB::EFuncStbl GetFuncStability(CHAR c); + + // get function data access property from the GPDB character representation + static CMDFunctionGPDB::EFuncDataAcc GetEFuncDataAccess(CHAR c); + + // get type of aggregate's intermediate result from the relcache + static IMDId *RetrieveAggIntermediateResultType(CMemoryPool *mp, + IMDId *mdid); + + // retrieve a GPDB metadata object from the relcache + static IMDCacheObject *RetrieveObjectGPDB(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid); + + // retrieve relstats object from the relcache + static IMDCacheObject *RetrieveRelStats(CMemoryPool *mp, IMDId *mdid); + + // retrieve column stats object from the relcache + static IMDCacheObject *RetrieveColStats(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid); + + // retrieve cast object from the relcache + static IMDCacheObject *RetrieveCast(CMemoryPool *mp, IMDId *mdid); + + // retrieve scalar comparison object from the relcache + static IMDCacheObject *RetrieveScCmp(CMemoryPool *mp, IMDId *mdid); + + // transform GPDB's MCV information to optimizer's histogram structure + static CHistogram *TransformMcvToOrcaHistogram( + CMemoryPool *mp, const IMDType *md_type, const Datum *mcv_values, + const float4 *mcv_frequencies, ULONG num_mcv_values); + + // transform GPDB's hist information to optimizer's histogram structure + static CHistogram *TransformHistToOrcaHistogram( + CMemoryPool *mp, const IMDType *md_type, const Datum *hist_values, + ULONG num_hist_values, CDouble num_distinct, CDouble hist_freq); + + // histogram to array of dxl buckets + static CDXLBucketArray *TransformHistogramToDXLBucketArray( + CMemoryPool *mp, const IMDType *md_type, const CHistogram *hist); + + // transform stats from pg_stats form to optimizer's preferred form + static CDXLBucketArray *TransformStatsToDXLBucketArray( + CMemoryPool *mp, OID att_type, CDouble num_distinct, CDouble null_freq, + const Datum *mcv_values, const float4 *mcv_frequencies, + ULONG num_mcv_values, const Datum *hist_values, ULONG num_hist_values); + + // get partition keys and types for a relation + static void RetrievePartKeysAndTypes(CMemoryPool *mp, Relation rel, OID oid, + ULongPtrArray **part_keys, + CharPtrArray **part_types); + + // get keysets for relation + static ULongPtr2dArray *RetrieveRelKeysets(CMemoryPool *mp, OID oid, + BOOL should_add_default_keys, + BOOL is_partitioned, + ULONG *attno_mapping); + + // storage type for a relation + static IMDRelation::Erelstoragetype RetrieveRelStorageType( + CHAR storage_type); + + // fix frequencies if they add up to more than 1.0 + static void NormalizeFrequencies(float4 *pdrgf, ULONG length, + CDouble *null_freq); + + // get the relation columns + static CMDColumnArray *RetrieveRelColumns( + CMemoryPool *mp, CMDAccessor *md_accessor, Relation rel, + IMDRelation::Erelstoragetype rel_storage_type); + + // return the dxl representation of the column's default value + static CDXLNode *GetDefaultColumnValue(CMemoryPool *mp, + CMDAccessor *md_accessor, + TupleDesc rd_att, AttrNumber attrno); + + + // get the distribution columns + static ULongPtrArray *RetrieveRelDistrbutionCols( + CMemoryPool *mp, GpPolicy *gp_policy, CMDColumnArray *mdcol_array, + ULONG size); + + // construct a mapping GPDB attnos -> position in the column array + static ULONG *ConstructAttnoMapping(CMemoryPool *mp, + CMDColumnArray *mdcol_array, + ULONG max_cols); + + // check if index is supported + static BOOL IsIndexSupported(Relation index_rel); + + // retrieve index info list of partitioned table + static List *RetrievePartTableIndexInfo(Relation rel); + + // compute the array of included columns + static ULongPtrArray *ComputeIncludedCols(CMemoryPool *mp, + const IMDRelation *md_rel); + + // is given level included in the default partitions + static BOOL LevelHasDefaultPartition(List *default_levels, ULONG level); + + // retrieve part constraint for index + static CMDPartConstraintGPDB *RetrievePartConstraintForIndex( + CMemoryPool *mp, CMDAccessor *md_accessor, const IMDRelation *md_rel, + Node *part_constraint, ULongPtrArray *level_with_default_part_array, + BOOL is_unbounded); + + // retrieve part constraint for relation + static CMDPartConstraintGPDB *RetrievePartConstraintForRel( + CMemoryPool *mp, CMDAccessor *md_accessor, OID rel_oid, + CMDColumnArray *mdcol_array, BOOL has_index); + + // retrieve part constraint from a GPDB node + static CMDPartConstraintGPDB *RetrievePartConstraintFromNode( + CMemoryPool *mp, CMDAccessor *md_accessor, + CDXLColDescrArray *dxl_col_descr_array, Node *part_constraint, + ULongPtrArray *level_with_default_part_array, BOOL is_unbounded); + + // return relation name + static CMDName *GetRelName(CMemoryPool *mp, Relation rel); + + // return the index info list defined on the given relation + static CMDIndexInfoArray *RetrieveRelIndexInfo(CMemoryPool *mp, + Relation rel); + + // return index info list of indexes defined on a partitoned table + static CMDIndexInfoArray *RetrieveRelIndexInfoForPartTable( + CMemoryPool *mp, Relation root_rel); + + // return index info list of indexes defined on regular, external tables or leaf partitions + static CMDIndexInfoArray *RetrieveRelIndexInfoForNonPartTable( + CMemoryPool *mp, Relation rel); + + // retrieve an index over a partitioned table from the relcache + static IMDIndex *RetrievePartTableIndex(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid_index, + const IMDRelation *md_rel, + LogicalIndexes *logical_indexes); + + // lookup an index given its id from the logical indexes structure + static LogicalIndexInfo *LookupLogicalIndexById( + LogicalIndexes *logical_indexes, OID oid); + + // construct an MD cache index object given its logical index representation + static IMDIndex *RetrievePartTableIndex(CMemoryPool *mp, + CMDAccessor *md_accessor, + LogicalIndexInfo *index_info, + IMDId *mdid_index, + const IMDRelation *md_rel); + + // return the triggers defined on the given relation + static IMdIdArray *RetrieveRelTriggers(CMemoryPool *mp, Relation rel); + + // return the check constraints defined on the relation with the given oid + static IMdIdArray *RetrieveRelCheckConstraints(CMemoryPool *mp, OID oid); + + // does attribute number correspond to a transaction visibility attribute + static BOOL IsTransactionVisibilityAttribute(INT attrnum); + + // does relation type have system columns + static BOOL RelHasSystemColumns(char rel_kind); + + // translate Optimizer comparison types to GPDB + static ULONG GetComparisonType(IMDType::ECmpType cmp_type); + + // retrieve the opfamilies mdids for the given scalar op + static IMdIdArray *RetrieveScOpOpFamilies(CMemoryPool *mp, + IMDId *mdid_scalar_op); + + // retrieve the opfamilies mdids for the given index + static IMdIdArray *RetrieveIndexOpFamilies(CMemoryPool *mp, + IMDId *mdid_index); + + // for non-leaf partition tables return the number of child partitions + // else return 1 + static ULONG RetrieveNumChildPartitions(OID rel_oid); + + // generate statistics for the system level columns + static CDXLColStats *GenerateStatsForSystemCols( + CMemoryPool *mp, OID rel_oid, CMDIdColStats *mdid_col_stats, + CMDName *md_colname, OID att_type, AttrNumber attrnum, + CDXLBucketArray *dxl_stats_bucket_array, CDouble rows); + +public: + // retrieve a metadata object from the relcache + static IMDCacheObject *RetrieveObject(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid); + + // retrieve a relation from the relcache + static IMDRelation *RetrieveRel(CMemoryPool *mp, CMDAccessor *md_accessor, + IMDId *mdid); + + // add system columns (oid, tid, xmin, etc) in table descriptors + static void AddSystemColumns(CMemoryPool *mp, CMDColumnArray *mdcol_array, + Relation rel, BOOL is_ao_table); + + // retrieve an index from the relcache + static IMDIndex *RetrieveIndex(CMemoryPool *mp, CMDAccessor *md_accessor, + IMDId *mdid_index); + + // retrieve a check constraint from the relcache + static CMDCheckConstraintGPDB *RetrieveCheckConstraints( + CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); + + // populate the attribute number to position mapping + static ULONG *PopulateAttnoPositionMap(CMemoryPool *mp, + const IMDRelation *md_rel, + ULONG size); + + // return the position of a given attribute number + static ULONG GetAttributePosition(INT attno, ULONG *attno_mapping); + + // retrieve a type from the relcache + static IMDType *RetrieveType(CMemoryPool *mp, IMDId *mdid); + + // retrieve a scalar operator from the relcache + static CMDScalarOpGPDB *RetrieveScOp(CMemoryPool *mp, IMDId *mdid); + + // retrieve a function from the relcache + static CMDFunctionGPDB *RetrieveFunc(CMemoryPool *mp, IMDId *mdid); + + // retrieve an aggregate from the relcache + static CMDAggregateGPDB *RetrieveAgg(CMemoryPool *mp, IMDId *mdid); + + // retrieve a trigger from the relcache + static CMDTriggerGPDB *RetrieveTrigger(CMemoryPool *mp, IMDId *mdid); + + // translate GPDB comparison type + static IMDType::ECmpType ParseCmpType(ULONG cmpt); + + // get the distribution policy of the relation + static IMDRelation::Ereldistrpolicy GetRelDistribution(GpPolicy *gp_policy); +}; +} // namespace gpdxl + + - private: - - // function identifier - OID m_oid; - - // function stability - IMDFunction::EFuncStbl m_stability; - - // function data access - IMDFunction::EFuncDataAcc m_access; - - // is function strict? - BOOL m_is_strict; - - // can the function return multiple rows? - BOOL m_returns_set; - - public: - - // ctor - SFuncProps - ( - OID oid, - IMDFunction::EFuncStbl stability, - IMDFunction::EFuncDataAcc access, - BOOL is_strict, - BOOL ReturnsSet - ) - : - m_oid(oid), - m_stability(stability), - m_access(access), - m_is_strict(is_strict), - m_returns_set(ReturnsSet) - {} - - // dtor - virtual - ~SFuncProps() - {}; - - // return function identifier - OID Oid() const - { - return m_oid; - } - - // return function stability - IMDFunction::EFuncStbl GetStability() const - { - return m_stability; - } - - // return data access property - IMDFunction::EFuncDataAcc GetDataAccess() const - { - return m_access; - } - - // is function strict? - BOOL IsStrict() const - { - return m_is_strict; - } - - // does function return set? - BOOL ReturnsSet() const - { - return m_returns_set; - } - - }; // struct SFuncProps - - // array of function properties map - static - const SFuncProps m_func_props[]; - - // lookup function properties - static - void LookupFuncProps - ( - OID func_oid, - IMDFunction::EFuncStbl *stability, // output: function stability - IMDFunction::EFuncDataAcc *access, // output: function data access - BOOL *is_strict, // output: is function strict? - BOOL *is_ndv_preserving, // output: preserves NDVs of inputs - BOOL *ReturnsSet // output: does function return set? - ); - - // check and fall back for unsupported relations - static - void CheckUnsupportedRelation(OID rel_oid); - - // get type name from the relcache - static - CMDName *GetTypeName(CMemoryPool *mp, IMDId *mdid); - - // get function stability property from the GPDB character representation - static - CMDFunctionGPDB::EFuncStbl GetFuncStability(CHAR c); - - // get function data access property from the GPDB character representation - static - CMDFunctionGPDB::EFuncDataAcc GetEFuncDataAccess(CHAR c); - - // get type of aggregate's intermediate result from the relcache - static - IMDId *RetrieveAggIntermediateResultType(CMemoryPool *mp, IMDId *mdid); - - // retrieve a GPDB metadata object from the relcache - static - IMDCacheObject *RetrieveObjectGPDB(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // retrieve relstats object from the relcache - static - IMDCacheObject *RetrieveRelStats(CMemoryPool *mp, IMDId *mdid); - - // retrieve column stats object from the relcache - static - IMDCacheObject *RetrieveColStats(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // retrieve cast object from the relcache - static - IMDCacheObject *RetrieveCast(CMemoryPool *mp, IMDId *mdid); - - // retrieve scalar comparison object from the relcache - static - IMDCacheObject *RetrieveScCmp(CMemoryPool *mp, IMDId *mdid); - - // transform GPDB's MCV information to optimizer's histogram structure - static - CHistogram *TransformMcvToOrcaHistogram - ( - CMemoryPool *mp, - const IMDType *md_type, - const Datum *mcv_values, - const float4 *mcv_frequencies, - ULONG num_mcv_values - ); - - // transform GPDB's hist information to optimizer's histogram structure - static - CHistogram *TransformHistToOrcaHistogram - ( - CMemoryPool *mp, - const IMDType *md_type, - const Datum *hist_values, - ULONG num_hist_values, - CDouble num_distinct, - CDouble hist_freq - ); - - // histogram to array of dxl buckets - static - CDXLBucketArray *TransformHistogramToDXLBucketArray - ( - CMemoryPool *mp, - const IMDType *md_type, - const CHistogram *hist - ); - - // transform stats from pg_stats form to optimizer's preferred form - static - CDXLBucketArray *TransformStatsToDXLBucketArray - ( - CMemoryPool *mp, - OID att_type, - CDouble num_distinct, - CDouble null_freq, - const Datum *mcv_values, - const float4 *mcv_frequencies, - ULONG num_mcv_values, - const Datum *hist_values, - ULONG num_hist_values - ); - - // get partition keys and types for a relation - static - void RetrievePartKeysAndTypes(CMemoryPool *mp, Relation rel, OID oid, ULongPtrArray **part_keys, CharPtrArray **part_types); - - // get keysets for relation - static - ULongPtr2dArray *RetrieveRelKeysets(CMemoryPool *mp, OID oid, BOOL should_add_default_keys, BOOL is_partitioned, ULONG *attno_mapping); - - // storage type for a relation - static - IMDRelation::Erelstoragetype RetrieveRelStorageType(CHAR storage_type); - - // fix frequencies if they add up to more than 1.0 - static - void NormalizeFrequencies(float4 *pdrgf, ULONG length, CDouble *null_freq); - - // get the relation columns - static - CMDColumnArray *RetrieveRelColumns(CMemoryPool *mp, CMDAccessor *md_accessor, Relation rel, IMDRelation::Erelstoragetype rel_storage_type); - - // return the dxl representation of the column's default value - static - CDXLNode *GetDefaultColumnValue(CMemoryPool *mp, CMDAccessor *md_accessor, TupleDesc rd_att, AttrNumber attrno); - - - // get the distribution columns - static - ULongPtrArray *RetrieveRelDistrbutionCols(CMemoryPool *mp, GpPolicy *gp_policy, CMDColumnArray *mdcol_array, ULONG size); - - // construct a mapping GPDB attnos -> position in the column array - static - ULONG *ConstructAttnoMapping(CMemoryPool *mp, CMDColumnArray *mdcol_array, ULONG max_cols); - - // check if index is supported - static - BOOL IsIndexSupported(Relation index_rel); - - // retrieve index info list of partitioned table - static - List *RetrievePartTableIndexInfo(Relation rel); - - // compute the array of included columns - static - ULongPtrArray *ComputeIncludedCols(CMemoryPool *mp, const IMDRelation *md_rel); - - // is given level included in the default partitions - static - BOOL LevelHasDefaultPartition(List *default_levels, ULONG level); - - // retrieve part constraint for index - static - CMDPartConstraintGPDB *RetrievePartConstraintForIndex - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const IMDRelation *md_rel, - Node *part_constraint, - ULongPtrArray *level_with_default_part_array, - BOOL is_unbounded - ); - - // retrieve part constraint for relation - static - CMDPartConstraintGPDB *RetrievePartConstraintForRel(CMemoryPool *mp, CMDAccessor *md_accessor, OID rel_oid, CMDColumnArray *mdcol_array, BOOL has_index); - - // retrieve part constraint from a GPDB node - static - CMDPartConstraintGPDB *RetrievePartConstraintFromNode - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CDXLColDescrArray *dxl_col_descr_array, - Node *part_constraint, - ULongPtrArray *level_with_default_part_array, - BOOL is_unbounded - ); - - // return relation name - static - CMDName *GetRelName(CMemoryPool *mp, Relation rel); - - // return the index info list defined on the given relation - static - CMDIndexInfoArray *RetrieveRelIndexInfo(CMemoryPool *mp, Relation rel); - - // return index info list of indexes defined on a partitoned table - static - CMDIndexInfoArray *RetrieveRelIndexInfoForPartTable(CMemoryPool *mp, Relation root_rel); - - // return index info list of indexes defined on regular, external tables or leaf partitions - static - CMDIndexInfoArray *RetrieveRelIndexInfoForNonPartTable(CMemoryPool *mp, Relation rel); - - // retrieve an index over a partitioned table from the relcache - static - IMDIndex *RetrievePartTableIndex(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid_index, const IMDRelation *md_rel, LogicalIndexes *logical_indexes); - - // lookup an index given its id from the logical indexes structure - static - LogicalIndexInfo *LookupLogicalIndexById(LogicalIndexes *logical_indexes, OID oid); - - // construct an MD cache index object given its logical index representation - static - IMDIndex *RetrievePartTableIndex(CMemoryPool *mp, CMDAccessor *md_accessor, LogicalIndexInfo *index_info, IMDId *mdid_index, const IMDRelation *md_rel); - - // return the triggers defined on the given relation - static - IMdIdArray *RetrieveRelTriggers(CMemoryPool *mp, Relation rel); - - // return the check constraints defined on the relation with the given oid - static - IMdIdArray *RetrieveRelCheckConstraints(CMemoryPool *mp, OID oid); - - // does attribute number correspond to a transaction visibility attribute - static - BOOL IsTransactionVisibilityAttribute(INT attrnum); - - // does relation type have system columns - static - BOOL RelHasSystemColumns(char rel_kind); - - // translate Optimizer comparison types to GPDB - static - ULONG GetComparisonType(IMDType::ECmpType cmp_type); - - // retrieve the opfamilies mdids for the given scalar op - static - IMdIdArray *RetrieveScOpOpFamilies(CMemoryPool *mp, IMDId *mdid_scalar_op); - - // retrieve the opfamilies mdids for the given index - static - IMdIdArray *RetrieveIndexOpFamilies(CMemoryPool *mp, IMDId *mdid_index); - - // for non-leaf partition tables return the number of child partitions - // else return 1 - static - ULONG RetrieveNumChildPartitions(OID rel_oid); - - // generate statistics for the system level columns - static - CDXLColStats *GenerateStatsForSystemCols - ( - CMemoryPool *mp, - OID rel_oid, - CMDIdColStats *mdid_col_stats, - CMDName *md_colname, - OID att_type, - AttrNumber attrnum, - CDXLBucketArray *dxl_stats_bucket_array, - CDouble rows - ); - public: - // retrieve a metadata object from the relcache - static - IMDCacheObject *RetrieveObject(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // retrieve a relation from the relcache - static - IMDRelation *RetrieveRel(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // add system columns (oid, tid, xmin, etc) in table descriptors - static - void AddSystemColumns(CMemoryPool *mp, CMDColumnArray *mdcol_array, Relation rel, BOOL is_ao_table); - - // retrieve an index from the relcache - static - IMDIndex *RetrieveIndex(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid_index); - - // retrieve a check constraint from the relcache - static - CMDCheckConstraintGPDB *RetrieveCheckConstraints(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // populate the attribute number to position mapping - static - ULONG *PopulateAttnoPositionMap(CMemoryPool *mp, const IMDRelation *md_rel, ULONG size); - - // return the position of a given attribute number - static - ULONG GetAttributePosition(INT attno, ULONG *attno_mapping); - - // retrieve a type from the relcache - static - IMDType *RetrieveType(CMemoryPool *mp, IMDId *mdid); - - // retrieve a scalar operator from the relcache - static - CMDScalarOpGPDB *RetrieveScOp(CMemoryPool *mp, IMDId *mdid); - - // retrieve a function from the relcache - static - CMDFunctionGPDB *RetrieveFunc(CMemoryPool *mp, IMDId *mdid); - - // retrieve an aggregate from the relcache - static - CMDAggregateGPDB *RetrieveAgg(CMemoryPool *mp, IMDId *mdid); - - // retrieve a trigger from the relcache - static - CMDTriggerGPDB *RetrieveTrigger(CMemoryPool *mp, IMDId *mdid); - - // translate GPDB comparison type - static - IMDType::ECmpType ParseCmpType(ULONG cmpt); - - // get the distribution policy of the relation - static - IMDRelation::Ereldistrpolicy GetRelDistribution(GpPolicy *gp_policy); - }; -} - - - -#endif // !GPDXL_CTranslatorRelcacheToDXL_H +#endif // !GPDXL_CTranslatorRelcacheToDXL_H // EOF diff --git a/src/include/gpopt/translate/CTranslatorScalarToDXL.h b/src/include/gpopt/translate/CTranslatorScalarToDXL.h index cb55ebe685..3d2ce673b6 100644 --- a/src/include/gpopt/translate/CTranslatorScalarToDXL.h +++ b/src/include/gpopt/translate/CTranslatorScalarToDXL.h @@ -33,7 +33,7 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } struct Aggref; @@ -50,512 +50,331 @@ struct ScalarArrayOpExpr; namespace gpdxl { - using namespace gpopt; - using namespace gpmd; +using namespace gpopt; +using namespace gpmd; - // fwd decl - class CIdGenerator; - class CMappingVarColId; - class CDXLDatum; +// fwd decl +class CIdGenerator; +class CMappingVarColId; +class CDXLDatum; - class CTranslatorScalarToDXL +class CTranslatorScalarToDXL +{ + // shorthand for functions for translating GPDB expressions into DXL nodes + typedef CDXLNode *(CTranslatorScalarToDXL::*ExprToDXLFn)( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // shorthand for functions for translating DXL nodes to GPDB expressions + typedef CDXLDatum *(DxlDatumFromDatum)(CMemoryPool *mp, + const IMDType *md_type, BOOL is_null, + ULONG len, Datum datum); + +private: + // pair of node tag and translator function + struct STranslatorElem { - // shorthand for functions for translating GPDB expressions into DXL nodes - typedef CDXLNode * (CTranslatorScalarToDXL::*ExprToDXLFn)(const Expr *expr, const CMappingVarColId* var_colid_mapping); - - // shorthand for functions for translating DXL nodes to GPDB expressions - typedef CDXLDatum * (DxlDatumFromDatum)(CMemoryPool *mp, const IMDType *md_type, BOOL is_null, ULONG len, Datum datum); - - private: - - // pair of node tag and translator function - struct STranslatorElem - { - NodeTag tag; - ExprToDXLFn func_ptr; - }; - - // memory pool - CMemoryPool *m_mp; - - // meta data accessor - CMDAccessor *m_md_accessor; - - // counter for generating unique column ids - CIdGenerator *m_colid_generator; - - // counter for generating unique CTE ids - CIdGenerator *m_cte_id_generator; - - // absolute level of query whose vars will be translated - ULONG m_query_level; - - // does the currently translated scalar have distributed tables - BOOL m_has_distributed_tables; - - // is scalar being translated in query mode - BOOL m_is_query_mode; - - // physical operator that created this translator - EPlStmtPhysicalOpType m_op_type; - - // hash map that maintains the list of CTEs defined at a particular query level - HMUlCTEListEntry *m_cte_entries; - - // list of CTE producers shared among the logical and scalar translators - CDXLNodeArray *m_cte_producers; - - EdxlBoolExprType EdxlbooltypeFromGPDBBoolType(BoolExprType) const; - - // translate list elements and add them as children of the DXL node - void TranslateScalarChildren - ( - CDXLNode *dxlnode, - List *list, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables = NULL - ); - - // create a DXL scalar distinct comparison node from a GPDB DistinctExpr - CDXLNode *TranslateDistinctExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar boolean expression node from a GPDB qual list - CDXLNode *CreateScalarCondFromQual - ( - List *quals, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables - ); - - // create a DXL scalar comparison node from a GPDB op expression - CDXLNode *CreateScalarCmpFromOpExpr - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar opexpr node from a GPDB expression - CDXLNode *TranslateOpExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // translate an array expression - CDXLNode *TranslateScalarArrayOpExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar array comparison node from a GPDB expression - CDXLNode *CreateScalarArrayCompFromExpr - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar Const node from a GPDB expression - CDXLNode *TranslateConstToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL node for a scalar nullif from a GPDB Expr - CDXLNode *TranslateNullIfExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar boolexpr node from a GPDB expression - CDXLNode *TranslateBoolExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar boolean test node from a GPDB expression - CDXLNode *TranslateBooleanTestToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar nulltest node from a GPDB expression - CDXLNode *TranslateNullTestToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar case statement node from a GPDB expression - CDXLNode *TranslateCaseExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar if statement node from a GPDB case expression - CDXLNode *CreateScalarIfStmtFromCaseExpr - ( - const CaseExpr *case_expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar switch node from a GPDB case expression - CDXLNode *CreateScalarSwitchFromCaseExpr - ( - const CaseExpr *case_expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL node for a case test from a GPDB Expr. - CDXLNode *TranslateCaseTestExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar coalesce node from a GPDB expression - CDXLNode *TranslateCoalesceExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar minmax node from a GPDB expression - CDXLNode *TranslateMinMaxExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar relabeltype node from a GPDB expression - CDXLNode *TranslateRelabelTypeToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar coerce node from a GPDB expression - CDXLNode *TranslateCoerceToDomainToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar coerceviaio node from a GPDB expression - CDXLNode *TranslateCoerceViaIOToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar array coerce expression node from a GPDB expression - CDXLNode *TranslateArrayCoerceExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar funcexpr node from a GPDB expression - CDXLNode *TranslateFuncExprToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // return the window frame boundary - EdxlFrameBoundary Edxlfb(WindowBoundingKind kind, Node *pnode) const; - - // create a DXL scalar Windowref node from a GPDB expression - CDXLNode *TranslateWindowRefToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - // create a DXL scalar Aggref node from a GPDB expression - CDXLNode *TranslateAggrefToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *TranslateVarToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *CreateInitPlanFromParam(const Param *param) const; - - // create a DXL SubPlan node for a from a GPDB SubPlan - CDXLNode *TranslateSubplanToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *CreatePlanFromParam - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *TranslateSubLinkToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *CreateScalarSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *CreateExistSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId* var_colid_mapping - ); - - CDXLNode *CreateQuantifiedSubqueryFromSublink - ( - const SubLink *sublink, - const CMappingVarColId* var_colid_mapping - ); - - // translate an array expression - CDXLNode *TranslateArrayExprToDXL(const Expr *expr, const CMappingVarColId* var_colid_mapping); - - // translate an arrayref expression - CDXLNode *TranslateArrayRefToDXL(const Expr *expr, const CMappingVarColId* var_colid_mapping); - - // add an indexlist to the given DXL arrayref node - void AddArrayIndexList - ( - CDXLNode *dxlnode, - List *list, - CDXLScalarArrayRefIndexList::EIndexListBound index_list_bound, - const CMappingVarColId* var_colid_mapping - ); - - // get the operator name - const CWStringConst *GetDXLArrayCmpType(IMDId *mdid) const; - - // translate the window frame edge, if the column used in the edge is a - // computed column then add it to the project list - CDXLNode *TranslateWindowFrameEdgeToDXL - ( - const Node *node, - const CMappingVarColId* var_colid_mapping, - CDXLNode *new_scalar_proj_list, - BOOL *has_distributed_tables - ); - - public: - - // ctor - CTranslatorScalarToDXL - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *colid_generator, - CIdGenerator *cte_id_generator, - ULONG query_level, - BOOL is_query_mode, - HMUlCTEListEntry *cte_entries, - CDXLNodeArray *cte_dxlnode_array - ); - - // set the caller type - void SetCallingPhysicalOpType - ( - EPlStmtPhysicalOpType plstmt_physical_op_type - ) - { - m_op_type = plstmt_physical_op_type; - } - - // create a DXL datum from a GPDB const - CDXLDatum *TranslateConstToDXL(const Const *constant) const; - - // return the current caller type - EPlStmtPhysicalOpType GetPhysicalOpType() const - { - return m_op_type; - } - // create a DXL scalar operator node from a GPDB expression - // and a table descriptor for looking up column descriptors - CDXLNode *TranslateScalarToDXL - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping, - BOOL *has_distributed_tables = NULL - ); - - // create a DXL scalar filter node from a GPDB qual list - CDXLNode *CreateFilterFromQual - ( - List *quals, - const CMappingVarColId* var_colid_mapping, - Edxlopid filter_type, - BOOL *has_distributed_tables = NULL - ); - - // create a DXL WindowFrame node from a GPDB expression - CDXLWindowFrame *GetWindowFrame - ( - const Expr *expr, - const CMappingVarColId* var_colid_mapping, - CDXLNode *new_scalar_proj_list, - BOOL *has_distributed_tables = NULL - ); - - // translate GPDB Const to CDXLDatum - static - CDXLDatum *TranslateConstToDXL - ( - CMemoryPool *mp, - CMDAccessor *mda, - const Const *constant - ); - - // translate GPDB datum to CDXLDatum - static - CDXLDatum *TranslateDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - INT type_modifier, - BOOL is_null, - ULONG len, - Datum datum - ); - - // translate GPDB datum to IDatum - static - IDatum *CreateIDatumFromGpdbDatum - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - Datum datum - ); - - // extract the byte array value of the datum - static - BYTE *ExtractByteArrayFromDatum - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - static - CDouble ExtractDoubleValueFromDatum - ( - IMDId *mdid, - BOOL is_null, - BYTE *bytes, - Datum datum - ); - - // extract the long int value of a datum - static - LINT ExtractLintValueFromDatum - ( - const IMDType *md_type, - BOOL is_null, - BYTE *bytes, - ULONG len - ); - - // pair of DXL datum type and translator function - struct SDXLDatumTranslatorElem - { - IMDType::ETypeInfo type_info; - DxlDatumFromDatum *func_ptr; - }; - - // datum to oid CDXLDatum - static - CDXLDatum *TranslateOidDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - // datum to int2 CDXLDatum - static - CDXLDatum *TranslateInt2DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - // datum to int4 CDXLDatum - static - CDXLDatum *TranslateInt4DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - // datum to int8 CDXLDatum - static - CDXLDatum *TranslateInt8DatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - // datum to bool CDXLDatum - static - CDXLDatum *TranslateBoolDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - BOOL is_null, - ULONG len, - Datum datum - ); - - // datum to generic CDXLDatum - static - CDXLDatum *TranslateGenericDatumToDXL - ( - CMemoryPool *mp, - const IMDType *md_type, - INT type_modifier, - BOOL is_null, - ULONG len, - Datum datum - ); + NodeTag tag; + ExprToDXLFn func_ptr; }; -} -#endif // GPDXL_CTranslatorScalarToDXL_H + + // memory pool + CMemoryPool *m_mp; + + // meta data accessor + CMDAccessor *m_md_accessor; + + // counter for generating unique column ids + CIdGenerator *m_colid_generator; + + // counter for generating unique CTE ids + CIdGenerator *m_cte_id_generator; + + // absolute level of query whose vars will be translated + ULONG m_query_level; + + // does the currently translated scalar have distributed tables + BOOL m_has_distributed_tables; + + // is scalar being translated in query mode + BOOL m_is_query_mode; + + // physical operator that created this translator + EPlStmtPhysicalOpType m_op_type; + + // hash map that maintains the list of CTEs defined at a particular query level + HMUlCTEListEntry *m_cte_entries; + + // list of CTE producers shared among the logical and scalar translators + CDXLNodeArray *m_cte_producers; + + EdxlBoolExprType EdxlbooltypeFromGPDBBoolType(BoolExprType) const; + + // translate list elements and add them as children of the DXL node + void TranslateScalarChildren(CDXLNode *dxlnode, List *list, + const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables = NULL); + + // create a DXL scalar distinct comparison node from a GPDB DistinctExpr + CDXLNode *TranslateDistinctExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar boolean expression node from a GPDB qual list + CDXLNode *CreateScalarCondFromQual( + List *quals, const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables); + + // create a DXL scalar comparison node from a GPDB op expression + CDXLNode *CreateScalarCmpFromOpExpr( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar opexpr node from a GPDB expression + CDXLNode *TranslateOpExprToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // translate an array expression + CDXLNode *TranslateScalarArrayOpExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar array comparison node from a GPDB expression + CDXLNode *CreateScalarArrayCompFromExpr( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar Const node from a GPDB expression + CDXLNode *TranslateConstToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // create a DXL node for a scalar nullif from a GPDB Expr + CDXLNode *TranslateNullIfExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar boolexpr node from a GPDB expression + CDXLNode *TranslateBoolExprToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar boolean test node from a GPDB expression + CDXLNode *TranslateBooleanTestToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar nulltest node from a GPDB expression + CDXLNode *TranslateNullTestToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar case statement node from a GPDB expression + CDXLNode *TranslateCaseExprToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar if statement node from a GPDB case expression + CDXLNode *CreateScalarIfStmtFromCaseExpr( + const CaseExpr *case_expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar switch node from a GPDB case expression + CDXLNode *CreateScalarSwitchFromCaseExpr( + const CaseExpr *case_expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL node for a case test from a GPDB Expr. + CDXLNode *TranslateCaseTestExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar coalesce node from a GPDB expression + CDXLNode *TranslateCoalesceExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar minmax node from a GPDB expression + CDXLNode *TranslateMinMaxExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar relabeltype node from a GPDB expression + CDXLNode *TranslateRelabelTypeToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar coerce node from a GPDB expression + CDXLNode *TranslateCoerceToDomainToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar coerceviaio node from a GPDB expression + CDXLNode *TranslateCoerceViaIOToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar array coerce expression node from a GPDB expression + CDXLNode *TranslateArrayCoerceExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar funcexpr node from a GPDB expression + CDXLNode *TranslateFuncExprToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // return the window frame boundary + EdxlFrameBoundary Edxlfb(WindowBoundingKind kind, Node *pnode) const; + + // create a DXL scalar Windowref node from a GPDB expression + CDXLNode *TranslateWindowRefToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // create a DXL scalar Aggref node from a GPDB expression + CDXLNode *TranslateAggrefToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + CDXLNode *TranslateVarToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + CDXLNode *CreateInitPlanFromParam(const Param *param) const; + + // create a DXL SubPlan node for a from a GPDB SubPlan + CDXLNode *TranslateSubplanToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + CDXLNode *CreatePlanFromParam(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + CDXLNode *TranslateSubLinkToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + CDXLNode *CreateScalarSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping); + + CDXLNode *CreateExistSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping); + + CDXLNode *CreateQuantifiedSubqueryFromSublink( + const SubLink *sublink, const CMappingVarColId *var_colid_mapping); + + // translate an array expression + CDXLNode *TranslateArrayExprToDXL( + const Expr *expr, const CMappingVarColId *var_colid_mapping); + + // translate an arrayref expression + CDXLNode *TranslateArrayRefToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping); + + // add an indexlist to the given DXL arrayref node + void AddArrayIndexList( + CDXLNode *dxlnode, List *list, + CDXLScalarArrayRefIndexList::EIndexListBound index_list_bound, + const CMappingVarColId *var_colid_mapping); + + // get the operator name + const CWStringConst *GetDXLArrayCmpType(IMDId *mdid) const; + + // translate the window frame edge, if the column used in the edge is a + // computed column then add it to the project list + CDXLNode *TranslateWindowFrameEdgeToDXL( + const Node *node, const CMappingVarColId *var_colid_mapping, + CDXLNode *new_scalar_proj_list, BOOL *has_distributed_tables); + +public: + // ctor + CTranslatorScalarToDXL(CMemoryPool *mp, CMDAccessor *md_accessor, + CIdGenerator *colid_generator, + CIdGenerator *cte_id_generator, ULONG query_level, + BOOL is_query_mode, HMUlCTEListEntry *cte_entries, + CDXLNodeArray *cte_dxlnode_array); + + // set the caller type + void + SetCallingPhysicalOpType(EPlStmtPhysicalOpType plstmt_physical_op_type) + { + m_op_type = plstmt_physical_op_type; + } + + // create a DXL datum from a GPDB const + CDXLDatum *TranslateConstToDXL(const Const *constant) const; + + // return the current caller type + EPlStmtPhysicalOpType + GetPhysicalOpType() const + { + return m_op_type; + } + // create a DXL scalar operator node from a GPDB expression + // and a table descriptor for looking up column descriptors + CDXLNode *TranslateScalarToDXL(const Expr *expr, + const CMappingVarColId *var_colid_mapping, + BOOL *has_distributed_tables = NULL); + + // create a DXL scalar filter node from a GPDB qual list + CDXLNode *CreateFilterFromQual(List *quals, + const CMappingVarColId *var_colid_mapping, + Edxlopid filter_type, + BOOL *has_distributed_tables = NULL); + + // create a DXL WindowFrame node from a GPDB expression + CDXLWindowFrame *GetWindowFrame(const Expr *expr, + const CMappingVarColId *var_colid_mapping, + CDXLNode *new_scalar_proj_list, + BOOL *has_distributed_tables = NULL); + + // translate GPDB Const to CDXLDatum + static CDXLDatum *TranslateConstToDXL(CMemoryPool *mp, CMDAccessor *mda, + const Const *constant); + + // translate GPDB datum to CDXLDatum + static CDXLDatum *TranslateDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + INT type_modifier, BOOL is_null, + ULONG len, Datum datum); + + // translate GPDB datum to IDatum + static IDatum *CreateIDatumFromGpdbDatum(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, Datum datum); + + // extract the byte array value of the datum + static BYTE *ExtractByteArrayFromDatum(CMemoryPool *mp, + const IMDType *md_type, BOOL is_null, + ULONG len, Datum datum); + + static CDouble ExtractDoubleValueFromDatum(IMDId *mdid, BOOL is_null, + BYTE *bytes, Datum datum); + + // extract the long int value of a datum + static LINT ExtractLintValueFromDatum(const IMDType *md_type, BOOL is_null, + BYTE *bytes, ULONG len); + + // pair of DXL datum type and translator function + struct SDXLDatumTranslatorElem + { + IMDType::ETypeInfo type_info; + DxlDatumFromDatum *func_ptr; + }; + + // datum to oid CDXLDatum + static CDXLDatum *TranslateOidDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum); + + // datum to int2 CDXLDatum + static CDXLDatum *TranslateInt2DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum); + + // datum to int4 CDXLDatum + static CDXLDatum *TranslateInt4DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum); + + // datum to int8 CDXLDatum + static CDXLDatum *TranslateInt8DatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum); + + // datum to bool CDXLDatum + static CDXLDatum *TranslateBoolDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + BOOL is_null, ULONG len, + Datum datum); + + // datum to generic CDXLDatum + static CDXLDatum *TranslateGenericDatumToDXL(CMemoryPool *mp, + const IMDType *md_type, + INT type_modifier, + BOOL is_null, ULONG len, + Datum datum); +}; +} // namespace gpdxl +#endif // GPDXL_CTranslatorScalarToDXL_H // EOF diff --git a/src/include/gpopt/translate/CTranslatorUtils.h b/src/include/gpopt/translate/CTranslatorUtils.h index e7f225aeb2..09232e1f3c 100644 --- a/src/include/gpopt/translate/CTranslatorUtils.h +++ b/src/include/gpopt/translate/CTranslatorUtils.h @@ -37,384 +37,336 @@ // fwd declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; - // dynamic array of bitsets - typedef CDynamicPtrArray CBitSetArray; -} +// dynamic array of bitsets +typedef CDynamicPtrArray CBitSetArray; +} // namespace gpopt namespace gpdxl { - class CDXLTranslateContext; +class CDXLTranslateContext; } namespace gpdxl { - using namespace gpopt; - - //--------------------------------------------------------------------------- - // @class: - // CTranslatorUtils - // - // @doc: - // Class providing methods for translating GPDB's PlannedStmt/Query - // into DXL Tree - // - //--------------------------------------------------------------------------- - class CTranslatorUtils - { - private: - - // construct a set of column attnos corresponding to a single grouping set - static - CBitSet *CreateAttnoSetForGroupingSet(CMemoryPool *mp, List *group_elems, ULONG num_cols, UlongToUlongMap *group_col_pos, CBitSet *group_cols); - - // create a set of grouping sets for a rollup - static - CBitSetArray *CreateGroupingSetsForRollup(CMemoryPool *mp, GroupingClause *grouping_clause, ULONG num_cols, UlongToUlongMap *grouping_col_to_pos_map, CBitSet *group_cols); - - // check if the given mdid array contains any of the polymorphic - // types (ANYELEMENT, ANYARRAY) - static - BOOL ContainsPolymorphicTypes(IMdIdArray *mdid_array); - - // resolve polymorphic types in the given array of type ids, replacing - // them with the actual types obtained from the query - static - IMdIdArray *ResolvePolymorphicTypes - ( - CMemoryPool *mp, - IMdIdArray *mdid_array, - List *arg_types, - FuncExpr *func_expr - ); - - // update grouping col position mappings - static - void UpdateGrpColMapping(CMemoryPool *mp, UlongToUlongMap *grouping_col_to_pos_map, CBitSet *group_cols, ULONG sort_group_ref); - - public: - - struct SCmptypeStrategy - { - IMDType::ECmpType comptype; - StrategyNumber strategy_no; - - }; - - // get the GPDB scan direction from its corresponding DXL representation - static - ScanDirection GetScanDirection(EdxlIndexScanDirection idx_scan_direction); - - // get the oid of comparison operator - static - OID OidCmpOperator(Expr* expr); - - // get the opfamily for index key - static - OID GetOpFamilyForIndexQual(INT attno, OID oid_index); - - // return the type for the system column with the given number - static - CMDIdGPDB *GetSystemColType(CMemoryPool *mp, AttrNumber attno); - - // find the n-th column descriptor in the table descriptor - static - const CDXLColDescr *GetColumnDescrAt(const CDXLTableDescr *table_descr, ULONG pos); - - // return the name for the system column with given number - static - const CWStringConst *GetSystemColName(AttrNumber attno); - - // returns the length for the system column with given attno number - static - const ULONG GetSystemColLength(AttrNumber attno); - - // translate the join type from its GPDB representation into the DXL one - static - EdxlJoinType ConvertToDXLJoinType(JoinType jt); - - // translate the index scan direction from its GPDB representation into the DXL one - static - EdxlIndexScanDirection ConvertToDXLIndexScanDirection(ScanDirection sd); - - // create a DXL index descriptor from an index MD id - static - CDXLIndexDescr *GetIndexDescr(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid); - - // translate a RangeTableEntry into a CDXLTableDescr - static - CDXLTableDescr *GetTableDescr - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const RangeTblEntry *rte, - BOOL *is_distributed_table = NULL - ); - - // translate a RangeTableEntry into a CDXLLogicalTVF - static - CDXLLogicalTVF *ConvertToCDXLLogicalTVF - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const RangeTblEntry *rte - ); - - // get column descriptors from a record type - static - CDXLColDescrArray *GetColumnDescriptorsFromRecord - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - List *col_names, - List *col_types, - List *col_type_modifiers - ); - - // get column descriptors from a record type - static - CDXLColDescrArray *GetColumnDescriptorsFromRecord - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - List *col_names, - IMdIdArray *out_arg_types - ); - - // get column descriptor from a base type - static - CDXLColDescrArray *GetColumnDescriptorsFromBase - ( - CMemoryPool *mp, - CIdGenerator *id_generator, - IMDId *mdid_return_type, - INT type_modifier, - CMDName *md_name - ); - - // get column descriptors from a composite type - static - CDXLColDescrArray *GetColumnDescriptorsFromComposite - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - CIdGenerator *id_generator, - const IMDType *md_type - ); - - // expand a composite type into an array of IMDColumns - static - CMDColumnArray *ExpandCompositeType - ( - CMemoryPool *mp, - CMDAccessor *md_accessor, - const IMDType *md_type - ); - - // return the dxl representation of the set operation - static - EdxlSetOpType GetSetOpType(SetOperation setop, BOOL is_all); - - // return the GPDB frame exclusion strategy from its corresponding DXL representation - static - WindowExclusion Windowexclusion(EdxlFrameExclusionStrategy edxlfes); - - // return the GPDB frame boundary kind from its corresponding DXL representation - static - WindowBoundingKind Windowboundkind(EdxlFrameBoundary edxlfb); - - // construct a dynamic array of sets of column attnos corresponding - // to the group by clause - static - CBitSetArray *GetColumnAttnosForGroupBy(CMemoryPool *mp, List *group_clause, ULONG num_cols, UlongToUlongMap *group_col_pos, CBitSet *group_cold); - - // return a copy of the query with constant of unknown type being coerced - // to the common data type of the output target list - static - Query *FixUnknownTypeConstant(Query *query, List *target_list); - - // return the type of the nth non-resjunked target list entry - static OID GetTargetListReturnTypeOid(List *target_list, ULONG col_pos); - - // construct an array of DXL column identifiers for a target list - static - ULongPtrArray *GenerateColIds - ( - CMemoryPool *mp, - List *target_list, - IMdIdArray *input_mdids, - ULongPtrArray *input_nums, - BOOL *is_outer_ref, - CIdGenerator *colid_generator - ); - - // construct an array of DXL column descriptors for a target list - // using the column ids in the given array - static - CDXLColDescrArray *GetDXLColumnDescrArray(CMemoryPool *mp, List *target_list, ULongPtrArray *colids, BOOL keep_res_junked); - - // return the positions of the target list entries included in the output - static - ULongPtrArray *GetPosInTargetList(CMemoryPool *mp, List *target_list, BOOL keep_res_junked); - - // construct a column descriptor from the given target entry, column identifier and position in the output - static - CDXLColDescr *GetColumnDescrAt(CMemoryPool *mp, TargetEntry *target_entry, ULONG colid, ULONG pos); - - // create a dummy project element to rename the input column identifier - static - CDXLNode *CreateDummyProjectElem(CMemoryPool *mp, ULONG colid_input, ULONG colid_output, CDXLColDescr *dxl_col_descr); - - // construct a list of colids corresponding to the given target list - // using the given attno->colid map - static - ULongPtrArray *GetOutputColIdsArray(CMemoryPool *mp, List *target_list, IntToUlongMap *attno_to_colid_map); - - // construct an array of column ids for the given group by set - static - ULongPtrArray *GetGroupingColidArray(CMemoryPool *mp, CBitSet *group_by_cols, IntToUlongMap *sort_group_cols_to_colid_map); - - // return the Colid of column with given index - static - ULONG GetColId(INT index, IntToUlongMap *index_to_colid_map); - - // return the corresponding ColId for the given varno, varattno and querylevel - static - ULONG GetColId(ULONG query_level, INT varno, INT var_attno, IMDId *mdid, CMappingVarColId *var_colid_mapping); - - // check to see if the target list entry is a sorting column - static - BOOL IsSortingColumn(const TargetEntry *target_entry, List *sort_clause_list); - // check to see if the target list entry is used in the window reference - static - BOOL IsWindowSpec(const TargetEntry *target_entry, List *window_clause_list); - - // extract a matching target entry that is a window spec - static - TargetEntry *GetWindowSpecTargetEntry(Node *node, List *window_clause_list, List *target_list); - - // check if the expression has a matching target entry that is a window spec - static - BOOL IsWindowSpec(Node *node, List *window_clause_list, List *target_list); - - // create a scalar const value expression for the given int8 value - static - CDXLNode *CreateDXLProjElemFromInt8Const(CMemoryPool *mp, CMDAccessor *md_accessor, INT val); - - // check to see if the target list entry is a grouping column - static - BOOL IsGroupingColumn(const TargetEntry *target_entry, List *group_clause_list); - - // check to see if the target list entry is a grouping column - static - BOOL IsGroupingColumn(const TargetEntry *target_entry, const GroupClause *sort_group_clause); - - // check if the expression has a matching target entry that is a grouping column - static - BOOL IsGroupingColumn(Node *node, List *group_clause_list, List *target_list); - - // extract a matching target entry that is a grouping column - static - TargetEntry *GetGroupingColumnTargetEntry(Node *node, List *group_clause_list, List *target_list); - - // convert a list of column ids to a list of attribute numbers using - // the provided context with mappings - static - List *ConvertColidToAttnos(ULongPtrArray *pdrgpul, CDXLTranslateContext *dxl_translate_ctxt); - - // parse string value into a Long Integer - static - LINT GetLongFromStr(const CWStringBase *wcstr); - - // parse string value into an Integer - static - INT GetIntFromStr(const CWStringBase *wcstr); - - // check whether the given project list has a project element of the given - // operator type - static - BOOL HasProjElem(CDXLNode *project_list_dxlnode, Edxlopid dxl_op_id); - - // create a multi-byte character string from a wide character string - static - CHAR *CreateMultiByteCharStringFromWCString(const WCHAR *wcstr); - - static - UlongToUlongMap *MakeNewToOldColMapping(CMemoryPool *mp, ULongPtrArray *old_colids, ULongPtrArray *new_colids); - - // check if the given tree contains a subquery - static - BOOL HasSubquery(Node *node); - - // check if the given function is a SIRV (single row volatile) that reads - // or modifies SQL data - static - BOOL IsSirvFunc(CMemoryPool *mp, CMDAccessor *md_accessor, OID func_oid); - - // is this a motion sensitive to duplicates - static - BOOL IsDuplicateSensitiveMotion(CDXLPhysicalMotion *dxl_motion); - - // construct a project element with a const NULL expression - static - CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid, ULONG colid, const WCHAR *col_name); - - // construct a project element with a const NULL expression - static - CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, CMDAccessor *md_accessor, IMDId *mdid, ULONG colid, CHAR *alias_name); - - // create a DXL project element node with a Const NULL of type provided - // by the column descriptor - static - CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, CMDAccessor *md_accessor, CIdGenerator *colid_generator, const IMDColumn *col); - - // check required permissions for the range table - static - void CheckRTEPermissions(List *range_table_list); - - // check if an aggregate window function has either prelim or inverse prelim func - static - void CheckAggregateWindowFn(Node *node); - - // check if given column ids are outer references in the tree rooted by given node - static - void MarkOuterRefs(ULONG *colid, BOOL *is_outer_ref, ULONG num_columns, CDXLNode *node); - - // map DXL Subplan type to GPDB SubLinkType - static - SubLinkType MapDXLSubplanToSublinkType(EdxlSubPlanType dxl_subplan_type); - - // map GPDB SubLinkType to DXL Subplan type - static - EdxlSubPlanType MapSublinkTypeToDXLSubplan(SubLinkType slink); - - // check whether there are triggers for the given operation on - // the given relation - static - BOOL RelHasTriggers(CMemoryPool *mp, CMDAccessor *md_accessor, const IMDRelation *mdrel, const EdxlDmlType dml_type_dxl); - - // check whether the given trigger is applicable to the given DML operation - static - BOOL IsApplicableTrigger(CMDAccessor *md_accessor, IMDId *trigger_mdid, const EdxlDmlType dml_type_dxl); - - // check whether there are NOT NULL or CHECK constraints for the given relation - static - BOOL RelHasConstraints(const IMDRelation *rel); - - // translate the list of error messages from an assert constraint list - static - List *GetAssertErrorMsgs(CDXLNode *assert_constraint_list); - - // return the count of non-system columns in the relation - static - ULONG GetNumNonSystemColumns(const IMDRelation *mdrel); +using namespace gpopt; +//--------------------------------------------------------------------------- +// @class: +// CTranslatorUtils +// +// @doc: +// Class providing methods for translating GPDB's PlannedStmt/Query +// into DXL Tree +// +//--------------------------------------------------------------------------- +class CTranslatorUtils +{ +private: + // construct a set of column attnos corresponding to a single grouping set + static CBitSet *CreateAttnoSetForGroupingSet(CMemoryPool *mp, + List *group_elems, + ULONG num_cols, + UlongToUlongMap *group_col_pos, + CBitSet *group_cols); + + // create a set of grouping sets for a rollup + static CBitSetArray *CreateGroupingSetsForRollup( + CMemoryPool *mp, GroupingClause *grouping_clause, ULONG num_cols, + UlongToUlongMap *grouping_col_to_pos_map, CBitSet *group_cols); + + // check if the given mdid array contains any of the polymorphic + // types (ANYELEMENT, ANYARRAY) + static BOOL ContainsPolymorphicTypes(IMdIdArray *mdid_array); + + // resolve polymorphic types in the given array of type ids, replacing + // them with the actual types obtained from the query + static IMdIdArray *ResolvePolymorphicTypes(CMemoryPool *mp, + IMdIdArray *mdid_array, + List *arg_types, + FuncExpr *func_expr); + + // update grouping col position mappings + static void UpdateGrpColMapping(CMemoryPool *mp, + UlongToUlongMap *grouping_col_to_pos_map, + CBitSet *group_cols, ULONG sort_group_ref); + +public: + struct SCmptypeStrategy + { + IMDType::ECmpType comptype; + StrategyNumber strategy_no; }; -} -#endif // !GPDXL_CTranslatorUtils_H + // get the GPDB scan direction from its corresponding DXL representation + static ScanDirection GetScanDirection( + EdxlIndexScanDirection idx_scan_direction); + + // get the oid of comparison operator + static OID OidCmpOperator(Expr *expr); + + // get the opfamily for index key + static OID GetOpFamilyForIndexQual(INT attno, OID oid_index); + + // return the type for the system column with the given number + static CMDIdGPDB *GetSystemColType(CMemoryPool *mp, AttrNumber attno); + + // find the n-th column descriptor in the table descriptor + static const CDXLColDescr *GetColumnDescrAt( + const CDXLTableDescr *table_descr, ULONG pos); + + // return the name for the system column with given number + static const CWStringConst *GetSystemColName(AttrNumber attno); + + // returns the length for the system column with given attno number + static const ULONG GetSystemColLength(AttrNumber attno); + + // translate the join type from its GPDB representation into the DXL one + static EdxlJoinType ConvertToDXLJoinType(JoinType jt); + + // translate the index scan direction from its GPDB representation into the DXL one + static EdxlIndexScanDirection ConvertToDXLIndexScanDirection( + ScanDirection sd); + + // create a DXL index descriptor from an index MD id + static CDXLIndexDescr *GetIndexDescr(CMemoryPool *mp, + CMDAccessor *md_accessor, IMDId *mdid); + + // translate a RangeTableEntry into a CDXLTableDescr + static CDXLTableDescr *GetTableDescr(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *id_generator, + const RangeTblEntry *rte, + BOOL *is_distributed_table = NULL); + + // translate a RangeTableEntry into a CDXLLogicalTVF + static CDXLLogicalTVF *ConvertToCDXLLogicalTVF(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *id_generator, + const RangeTblEntry *rte); + + // get column descriptors from a record type + static CDXLColDescrArray *GetColumnDescriptorsFromRecord( + CMemoryPool *mp, CIdGenerator *id_generator, List *col_names, + List *col_types, List *col_type_modifiers); + + // get column descriptors from a record type + static CDXLColDescrArray *GetColumnDescriptorsFromRecord( + CMemoryPool *mp, CIdGenerator *id_generator, List *col_names, + IMdIdArray *out_arg_types); + + // get column descriptor from a base type + static CDXLColDescrArray *GetColumnDescriptorsFromBase( + CMemoryPool *mp, CIdGenerator *id_generator, IMDId *mdid_return_type, + INT type_modifier, CMDName *md_name); + + // get column descriptors from a composite type + static CDXLColDescrArray *GetColumnDescriptorsFromComposite( + CMemoryPool *mp, CMDAccessor *md_accessor, CIdGenerator *id_generator, + const IMDType *md_type); + + // expand a composite type into an array of IMDColumns + static CMDColumnArray *ExpandCompositeType(CMemoryPool *mp, + CMDAccessor *md_accessor, + const IMDType *md_type); + + // return the dxl representation of the set operation + static EdxlSetOpType GetSetOpType(SetOperation setop, BOOL is_all); + + // return the GPDB frame exclusion strategy from its corresponding DXL representation + static WindowExclusion Windowexclusion(EdxlFrameExclusionStrategy edxlfes); + + // return the GPDB frame boundary kind from its corresponding DXL representation + static WindowBoundingKind Windowboundkind(EdxlFrameBoundary edxlfb); + + // construct a dynamic array of sets of column attnos corresponding + // to the group by clause + static CBitSetArray *GetColumnAttnosForGroupBy( + CMemoryPool *mp, List *group_clause, ULONG num_cols, + UlongToUlongMap *group_col_pos, CBitSet *group_cold); + + // return a copy of the query with constant of unknown type being coerced + // to the common data type of the output target list + static Query *FixUnknownTypeConstant(Query *query, List *target_list); + + // return the type of the nth non-resjunked target list entry + static OID GetTargetListReturnTypeOid(List *target_list, ULONG col_pos); + + // construct an array of DXL column identifiers for a target list + static ULongPtrArray *GenerateColIds(CMemoryPool *mp, List *target_list, + IMdIdArray *input_mdids, + ULongPtrArray *input_nums, + BOOL *is_outer_ref, + CIdGenerator *colid_generator); + + // construct an array of DXL column descriptors for a target list + // using the column ids in the given array + static CDXLColDescrArray *GetDXLColumnDescrArray(CMemoryPool *mp, + List *target_list, + ULongPtrArray *colids, + BOOL keep_res_junked); + + // return the positions of the target list entries included in the output + static ULongPtrArray *GetPosInTargetList(CMemoryPool *mp, List *target_list, + BOOL keep_res_junked); + + // construct a column descriptor from the given target entry, column identifier and position in the output + static CDXLColDescr *GetColumnDescrAt(CMemoryPool *mp, + TargetEntry *target_entry, + ULONG colid, ULONG pos); + + // create a dummy project element to rename the input column identifier + static CDXLNode *CreateDummyProjectElem(CMemoryPool *mp, ULONG colid_input, + ULONG colid_output, + CDXLColDescr *dxl_col_descr); + + // construct a list of colids corresponding to the given target list + // using the given attno->colid map + static ULongPtrArray *GetOutputColIdsArray( + CMemoryPool *mp, List *target_list, IntToUlongMap *attno_to_colid_map); + + // construct an array of column ids for the given group by set + static ULongPtrArray *GetGroupingColidArray( + CMemoryPool *mp, CBitSet *group_by_cols, + IntToUlongMap *sort_group_cols_to_colid_map); + + // return the Colid of column with given index + static ULONG GetColId(INT index, IntToUlongMap *index_to_colid_map); + + // return the corresponding ColId for the given varno, varattno and querylevel + static ULONG GetColId(ULONG query_level, INT varno, INT var_attno, + IMDId *mdid, CMappingVarColId *var_colid_mapping); + + // check to see if the target list entry is a sorting column + static BOOL IsSortingColumn(const TargetEntry *target_entry, + List *sort_clause_list); + // check to see if the target list entry is used in the window reference + static BOOL IsWindowSpec(const TargetEntry *target_entry, + List *window_clause_list); + + // extract a matching target entry that is a window spec + static TargetEntry *GetWindowSpecTargetEntry(Node *node, + List *window_clause_list, + List *target_list); + + // check if the expression has a matching target entry that is a window spec + static BOOL IsWindowSpec(Node *node, List *window_clause_list, + List *target_list); + + // create a scalar const value expression for the given int8 value + static CDXLNode *CreateDXLProjElemFromInt8Const(CMemoryPool *mp, + CMDAccessor *md_accessor, + INT val); + + // check to see if the target list entry is a grouping column + static BOOL IsGroupingColumn(const TargetEntry *target_entry, + List *group_clause_list); + + // check to see if the target list entry is a grouping column + static BOOL IsGroupingColumn(const TargetEntry *target_entry, + const GroupClause *sort_group_clause); + + // check if the expression has a matching target entry that is a grouping column + static BOOL IsGroupingColumn(Node *node, List *group_clause_list, + List *target_list); + + // extract a matching target entry that is a grouping column + static TargetEntry *GetGroupingColumnTargetEntry(Node *node, + List *group_clause_list, + List *target_list); + + // convert a list of column ids to a list of attribute numbers using + // the provided context with mappings + static List *ConvertColidToAttnos(ULongPtrArray *pdrgpul, + CDXLTranslateContext *dxl_translate_ctxt); + + // parse string value into a Long Integer + static LINT GetLongFromStr(const CWStringBase *wcstr); + + // parse string value into an Integer + static INT GetIntFromStr(const CWStringBase *wcstr); + + // check whether the given project list has a project element of the given + // operator type + static BOOL HasProjElem(CDXLNode *project_list_dxlnode, Edxlopid dxl_op_id); + + // create a multi-byte character string from a wide character string + static CHAR *CreateMultiByteCharStringFromWCString(const WCHAR *wcstr); + + static UlongToUlongMap *MakeNewToOldColMapping(CMemoryPool *mp, + ULongPtrArray *old_colids, + ULongPtrArray *new_colids); + + // check if the given tree contains a subquery + static BOOL HasSubquery(Node *node); + + // check if the given function is a SIRV (single row volatile) that reads + // or modifies SQL data + static BOOL IsSirvFunc(CMemoryPool *mp, CMDAccessor *md_accessor, + OID func_oid); + + // is this a motion sensitive to duplicates + static BOOL IsDuplicateSensitiveMotion(CDXLPhysicalMotion *dxl_motion); + + // construct a project element with a const NULL expression + static CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid, ULONG colid, + const WCHAR *col_name); + + // construct a project element with a const NULL expression + static CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMDId *mdid, ULONG colid, + CHAR *alias_name); + + // create a DXL project element node with a Const NULL of type provided + // by the column descriptor + static CDXLNode *CreateDXLProjElemConstNULL(CMemoryPool *mp, + CMDAccessor *md_accessor, + CIdGenerator *colid_generator, + const IMDColumn *col); + + // check required permissions for the range table + static void CheckRTEPermissions(List *range_table_list); + + // check if an aggregate window function has either prelim or inverse prelim func + static void CheckAggregateWindowFn(Node *node); + + // check if given column ids are outer references in the tree rooted by given node + static void MarkOuterRefs(ULONG *colid, BOOL *is_outer_ref, + ULONG num_columns, CDXLNode *node); + + // map DXL Subplan type to GPDB SubLinkType + static SubLinkType MapDXLSubplanToSublinkType( + EdxlSubPlanType dxl_subplan_type); + + // map GPDB SubLinkType to DXL Subplan type + static EdxlSubPlanType MapSublinkTypeToDXLSubplan(SubLinkType slink); + + // check whether there are triggers for the given operation on + // the given relation + static BOOL RelHasTriggers(CMemoryPool *mp, CMDAccessor *md_accessor, + const IMDRelation *mdrel, + const EdxlDmlType dml_type_dxl); + + // check whether the given trigger is applicable to the given DML operation + static BOOL IsApplicableTrigger(CMDAccessor *md_accessor, + IMDId *trigger_mdid, + const EdxlDmlType dml_type_dxl); + + // check whether there are NOT NULL or CHECK constraints for the given relation + static BOOL RelHasConstraints(const IMDRelation *rel); + + // translate the list of error messages from an assert constraint list + static List *GetAssertErrorMsgs(CDXLNode *assert_constraint_list); + + // return the count of non-system columns in the relation + static ULONG GetNumNonSystemColumns(const IMDRelation *mdrel); +}; +} // namespace gpdxl + +#endif // !GPDXL_CTranslatorUtils_H // EOF diff --git a/src/include/gpopt/utils/CCatalogUtils.h b/src/include/gpopt/utils/CCatalogUtils.h index b0f629a5d4..23e8feff26 100644 --- a/src/include/gpopt/utils/CCatalogUtils.h +++ b/src/include/gpopt/utils/CCatalogUtils.h @@ -19,28 +19,23 @@ #include "gpdbdefs.h" -class CCatalogUtils { +class CCatalogUtils +{ +private: + // return list of relation oids_list in catalog + static List *GetRelationOids(); - private: - // return list of relation oids_list in catalog - static - List *GetRelationOids(); + // return list of operator oids_list in catalog + static List *GetOperatorOids(); - // return list of operator oids_list in catalog - static - List *GetOperatorOids(); + // return list of function oids_list in catalog + static List *GetFunctionOids(); - // return list of function oids_list in catalog - static - List *GetFunctionOids(); - - public: - - // return list of all object oids_list in catalog - static - List *GetAllOids(); +public: + // return list of all object oids_list in catalog + static List *GetAllOids(); }; -#endif // CCatalogUtils_H +#endif // CCatalogUtils_H // EOF diff --git a/src/include/gpopt/utils/CConstExprEvaluatorProxy.h b/src/include/gpopt/utils/CConstExprEvaluatorProxy.h index 0c5d6aa271..76f5e8b765 100644 --- a/src/include/gpopt/utils/CConstExprEvaluatorProxy.h +++ b/src/include/gpopt/utils/CConstExprEvaluatorProxy.h @@ -24,104 +24,88 @@ namespace gpdxl { - class CDXLNode; +class CDXLNode; +//--------------------------------------------------------------------------- +// @class: +// CConstExprEvaluatorProxy +// +// @doc: +// Wrapper over GPDB's expression evaluator that takes a constant expression, +// given as DXL, tries to evaluate it and returns the result as DXL. +// +// The metadata cache should have been initialized by the caller before +// creating an instance of this class and should not be released before +// the destructor of this class. +// +//--------------------------------------------------------------------------- +class CConstExprEvaluatorProxy : public gpopt::IConstDXLNodeEvaluator +{ +private: //--------------------------------------------------------------------------- // @class: - // CConstExprEvaluatorProxy + // CEmptyMappingColIdVar // // @doc: - // Wrapper over GPDB's expression evaluator that takes a constant expression, - // given as DXL, tries to evaluate it and returns the result as DXL. - // - // The metadata cache should have been initialized by the caller before - // creating an instance of this class and should not be released before - // the destructor of this class. + // Dummy class to implement an empty variable mapping. Variable lookups + // raise exceptions. // //--------------------------------------------------------------------------- - class CConstExprEvaluatorProxy : public gpopt::IConstDXLNodeEvaluator + class CEmptyMappingColIdVar : public CMappingColIdVar { - private: - //--------------------------------------------------------------------------- - // @class: - // CEmptyMappingColIdVar - // - // @doc: - // Dummy class to implement an empty variable mapping. Variable lookups - // raise exceptions. - // - //--------------------------------------------------------------------------- - class CEmptyMappingColIdVar : public CMappingColIdVar - { - public: - explicit - CEmptyMappingColIdVar - ( - CMemoryPool *mp - ) - : - CMappingColIdVar(mp) - { - } - - virtual - ~CEmptyMappingColIdVar() - { - } - - virtual - Var *VarFromDXLNodeScId(const CDXLScalarIdent *scalar_ident); - - }; - - // memory pool, not owned - CMemoryPool *m_mp; - - // empty mapping needed for the translator - CEmptyMappingColIdVar m_emptymapcidvar; - - // pointer to metadata cache accessor - CMDAccessor *m_md_accessor; - - // translator for the DXL input -> GPDB Expr - CTranslatorDXLToScalar m_dxl2scalar_translator; - - public: - // ctor - CConstExprEvaluatorProxy - ( - CMemoryPool *mp, - CMDAccessor *md_accessor - ) - : - m_mp(mp), - m_emptymapcidvar(m_mp), - m_md_accessor(md_accessor), - m_dxl2scalar_translator(m_mp, m_md_accessor, 0) - { - } - - // dtor - virtual - ~CConstExprEvaluatorProxy() - { - } - - // evaluate given constant expressionand return the DXL representation of the result. - // if the expression has variables, an error is thrown. - // caller keeps ownership of 'expr_dxlnode' and takes ownership of the returned pointer - virtual - CDXLNode *EvaluateExpr(const CDXLNode *expr); - - // returns true iff the evaluator can evaluate constant expressions without subqueries - virtual - BOOL FCanEvalExpressions() - { - return true; - } + public: + explicit CEmptyMappingColIdVar(CMemoryPool *mp) : CMappingColIdVar(mp) + { + } + + virtual ~CEmptyMappingColIdVar() + { + } + + virtual Var *VarFromDXLNodeScId(const CDXLScalarIdent *scalar_ident); }; -} -#endif // !GPDXL_CConstExprEvaluator_H + // memory pool, not owned + CMemoryPool *m_mp; + + // empty mapping needed for the translator + CEmptyMappingColIdVar m_emptymapcidvar; + + // pointer to metadata cache accessor + CMDAccessor *m_md_accessor; + + // translator for the DXL input -> GPDB Expr + CTranslatorDXLToScalar m_dxl2scalar_translator; + +public: + // ctor + CConstExprEvaluatorProxy(CMemoryPool *mp, CMDAccessor *md_accessor) + : m_mp(mp), + m_emptymapcidvar(m_mp), + m_md_accessor(md_accessor), + m_dxl2scalar_translator(m_mp, m_md_accessor, 0) + { + } + + // dtor + virtual ~CConstExprEvaluatorProxy() + { + } + + // evaluate given constant expressionand return the DXL representation of the result. + // if the expression has variables, an error is thrown. + // caller keeps ownership of 'expr_dxlnode' and takes ownership of the returned pointer + virtual CDXLNode *EvaluateExpr(const CDXLNode *expr); + + // returns true iff the evaluator can evaluate constant expressions without subqueries + virtual BOOL + FCanEvalExpressions() + { + return true; + } +}; +} // namespace gpdxl + +#endif // !GPDXL_CConstExprEvaluator_H // EOF diff --git a/src/include/gpopt/utils/CMemoryPoolPalloc.h b/src/include/gpopt/utils/CMemoryPoolPalloc.h index 2ff8113061..df234b44e8 100644 --- a/src/include/gpopt/utils/CMemoryPoolPalloc.h +++ b/src/include/gpopt/utils/CMemoryPoolPalloc.h @@ -20,50 +20,43 @@ namespace gpos { - // Memory pool that maps to a Postgres MemoryContext. - class CMemoryPoolPalloc : public CMemoryPool +// Memory pool that maps to a Postgres MemoryContext. +class CMemoryPoolPalloc : public CMemoryPool +{ +private: + MemoryContext m_cxt; + + // When destroying arrays, we need to call the destructor of each element + // To do this, we need the size of the allocation, which we then divide by the + // the size of the element to get number of elements to iterate through. + // This struct is only used for array allocations (GPOS_NEW_ARRAY()) + struct SArrayAllocHeader { - private: - - MemoryContext m_cxt; - - // When destroying arrays, we need to call the destructor of each element - // To do this, we need the size of the allocation, which we then divide by the - // the size of the element to get number of elements to iterate through. - // This struct is only used for array allocations (GPOS_NEW_ARRAY()) - struct SArrayAllocHeader - { - ULONG m_user_size; - }; - public: - - // ctor - CMemoryPoolPalloc(); + ULONG m_user_size; + }; - // allocate memory - void *NewImpl - ( - const ULONG bytes, - const CHAR *file, - const ULONG line, - CMemoryPool::EAllocationType eat - ); +public: + // ctor + CMemoryPoolPalloc(); - // free memory - static void DeleteImpl(void *ptr, CMemoryPool::EAllocationType eat); + // allocate memory + void *NewImpl(const ULONG bytes, const CHAR *file, const ULONG line, + CMemoryPool::EAllocationType eat); - // prepare the memory pool to be deleted - void TearDown(); + // free memory + static void DeleteImpl(void *ptr, CMemoryPool::EAllocationType eat); - // return total allocated size include management overhead - ULLONG TotalAllocatedSize() const; + // prepare the memory pool to be deleted + void TearDown(); - // get user requested size of allocation - static ULONG UserSizeOfAlloc(const void *ptr); + // return total allocated size include management overhead + ULLONG TotalAllocatedSize() const; - }; -} + // get user requested size of allocation + static ULONG UserSizeOfAlloc(const void *ptr); +}; +} // namespace gpos -#endif // !GPDXL_CMemoryPoolPalloc_H +#endif // !GPDXL_CMemoryPoolPalloc_H // EOF diff --git a/src/include/gpopt/utils/CMemoryPoolPallocManager.h b/src/include/gpopt/utils/CMemoryPoolPallocManager.h index 5eddab4372..6ca46af08d 100644 --- a/src/include/gpopt/utils/CMemoryPoolPallocManager.h +++ b/src/include/gpopt/utils/CMemoryPoolPallocManager.h @@ -20,34 +20,32 @@ namespace gpos { - // memory pool manager that uses GPDB memory contexts - class CMemoryPoolPallocManager : public CMemoryPoolManager - { - private: - - // private no copy ctor - CMemoryPoolPallocManager(const CMemoryPoolPallocManager&); - - public: +// memory pool manager that uses GPDB memory contexts +class CMemoryPoolPallocManager : public CMemoryPoolManager +{ +private: + // private no copy ctor + CMemoryPoolPallocManager(const CMemoryPoolPallocManager &); - // ctor - CMemoryPoolPallocManager(CMemoryPool *internal, EMemoryPoolType memory_pool_type); +public: + // ctor + CMemoryPoolPallocManager(CMemoryPool *internal, + EMemoryPoolType memory_pool_type); - // allocate new memorypool - virtual CMemoryPool *NewMemoryPool(); + // allocate new memorypool + virtual CMemoryPool *NewMemoryPool(); - // free allocation - void DeleteImpl(void* ptr, CMemoryPool::EAllocationType eat); + // free allocation + void DeleteImpl(void *ptr, CMemoryPool::EAllocationType eat); - // get user requested size of allocation - ULONG UserSizeOfAlloc(const void* ptr); + // get user requested size of allocation + ULONG UserSizeOfAlloc(const void *ptr); - static - GPOS_RESULT Init(); - }; -} + static GPOS_RESULT Init(); +}; +} // namespace gpos -#endif // !GPDXL_CMemoryPoolPallocManager_H +#endif // !GPDXL_CMemoryPoolPallocManager_H // EOF diff --git a/src/include/gpopt/utils/COptClient.h b/src/include/gpopt/utils/COptClient.h index c58f794f40..02641d9463 100644 --- a/src/include/gpopt/utils/COptClient.h +++ b/src/include/gpopt/utils/COptClient.h @@ -22,125 +22,119 @@ // forward declarations namespace gpopt { - class CMDAccessor; +class CMDAccessor; } namespace gpnaucrates { - class CCommunicator; +class CCommunicator; } namespace gpmd { - class IMDProvider; - class CMDProviderCommProxy; -} +class IMDProvider; +class CMDProviderCommProxy; +} // namespace gpmd namespace gpoptudfs { - using namespace gpos; - using namespace gpopt; - using namespace gpmd; - using namespace gpnaucrates; - - //--------------------------------------------------------------------------- - // @class: - // COptClient - // - // @doc: - // Optimizer client; - // passes optimization request to server, provides metadata and - // builds planned statement from returned query plan; - // - //--------------------------------------------------------------------------- - class COptClient - { - private: +using namespace gpos; +using namespace gpopt; +using namespace gpmd; +using namespace gpnaucrates; - // struct containing optimization request parameters; - // needs to be in sync with the argument passed by the client; - struct SOptParams - { - // path where socket is initialized - const char *m_path; - - // input query - Query *m_query; - }; +//--------------------------------------------------------------------------- +// @class: +// COptClient +// +// @doc: +// Optimizer client; +// passes optimization request to server, provides metadata and +// builds planned statement from returned query plan; +// +//--------------------------------------------------------------------------- +class COptClient +{ +private: + // struct containing optimization request parameters; + // needs to be in sync with the argument passed by the client; + struct SOptParams + { + // path where socket is initialized + const char *m_path; - // input query - Query *m_query; + // input query + Query *m_query; + }; - // path where socket is initialized - const char *m_path; + // input query + Query *m_query; - // memory pool - CMemoryPool *m_mp; + // path where socket is initialized + const char *m_path; - // communicator - CCommunicator *m_communicator; + // memory pool + CMemoryPool *m_mp; - // default id for the source system - static - const CSystemId m_default_sysid; + // communicator + CCommunicator *m_communicator; - // error severity levels + // default id for the source system + static const CSystemId m_default_sysid; - // array mapping GPOS to elog() error severity - static - ULONG elog_to_severity_map[CException::ExsevSentinel][2]; + // error severity levels - // ctor - COptClient - ( - SOptParams *op - ) - : - m_query(op->m_query), - m_path(op->m_path), - m_mp(NULL), - m_communicator(NULL) - { - GPOS_ASSERT(NULL != m_query); - GPOS_ASSERT(NULL != m_path); - } + // array mapping GPOS to elog() error severity + static ULONG elog_to_severity_map[CException::ExsevSentinel][2]; - // dtor - ~COptClient() - {} + // ctor + COptClient(SOptParams *op) + : m_query(op->m_query), + m_path(op->m_path), + m_mp(NULL), + m_communicator(NULL) + { + GPOS_ASSERT(NULL != m_query); + GPOS_ASSERT(NULL != m_path); + } - // request optimization from server - PlannedStmt *GPOPTOptimizedPlan(); + // dtor + ~COptClient() + { + } - // set traceflags - void SetTraceflags(); + // request optimization from server + PlannedStmt *GPOPTOptimizedPlan(); - // send query optimization request to server - void SendRequest(CMDAccessor *md_accessor); + // set traceflags + void SetTraceflags(); - // retrieve DXL plan - const CHAR *SzPlanDXL(IMDProvider *md_provider); + // send query optimization request to server + void SendRequest(CMDAccessor *md_accessor); - // send MD response - void SendMDResponse(CMDProviderCommProxy *md_provider_proxy, const WCHAR *req); + // retrieve DXL plan + const CHAR *SzPlanDXL(IMDProvider *md_provider); - // build planned statement from serialized plan - PlannedStmt *ConstructPlanStmt(CMDAccessor *md_accessor, const CHAR *serialized_plan); + // send MD response + void SendMDResponse(CMDProviderCommProxy *md_provider_proxy, + const WCHAR *req); - // elog wrapper - void Elog(ULONG severity, const WCHAR *msg); + // build planned statement from serialized plan + PlannedStmt *ConstructPlanStmt(CMDAccessor *md_accessor, + const CHAR *serialized_plan); - public: + // elog wrapper + void Elog(ULONG severity, const WCHAR *msg); - // invoke optimizer instance - static - void *Run(void *pv); +public: + // invoke optimizer instance + static void *Run(void *pv); - }; // class COptClient -} +}; // class COptClient +} // namespace gpoptudfs -#endif // !COptClient_H +#endif // !COptClient_H // EOF diff --git a/src/include/gpopt/utils/COptServer.h b/src/include/gpopt/utils/COptServer.h index b1711cb149..5a5356b78b 100644 --- a/src/include/gpopt/utils/COptServer.h +++ b/src/include/gpopt/utils/COptServer.h @@ -28,141 +28,119 @@ // forward declarations namespace gpopt { - class CExpression; - class CMDAccessor; - class CMiniDumperDXL; - class CQueryContext; -} +class CExpression; +class CMDAccessor; +class CMiniDumperDXL; +class CQueryContext; +} // namespace gpopt namespace gpnaucrates { - class CCommunicator; +class CCommunicator; } namespace gpoptudfs { - using namespace gpos; - using namespace gpopt; - using namespace gpnaucrates; - - //--------------------------------------------------------------------------- - // @class: - // COptServer - // - // @doc: - // Optimizer server; processes optimization requests from QDs; - // - //--------------------------------------------------------------------------- - class COptServer - { - private: - - // connection descriptor - struct SConnectionDescriptor - { - // ID - ULONG_PTR m_id; +using namespace gpos; +using namespace gpopt; +using namespace gpnaucrates; - // task - CTask *m_task; - - // socket - CSocket *m_socket; +//--------------------------------------------------------------------------- +// @class: +// COptServer +// +// @doc: +// Optimizer server; processes optimization requests from QDs; +// +//--------------------------------------------------------------------------- +class COptServer +{ +private: + // connection descriptor + struct SConnectionDescriptor + { + // ID + ULONG_PTR m_id; - // link for hashtable - SLink m_link; + // task + CTask *m_task; - // invalid connection id - static - ULONG_PTR m_invalid_id; + // socket + CSocket *m_socket; - // ctor - SConnectionDescriptor - ( - CTask *task, - CSocket *socket - ) - : - m_id((ULONG_PTR) task), - m_task(task), - m_socket(socket) - {} + // link for hashtable + SLink m_link; - }; + // invalid connection id + static ULONG_PTR m_invalid_id; - typedef CSyncHashtable - ConnectionHT; + // ctor + SConnectionDescriptor(CTask *task, CSocket *socket) + : m_id((ULONG_PTR) task), m_task(task), m_socket(socket) + { + } + }; - // path where socket is initialized - const CHAR *m_socket_path; + typedef CSyncHashtable ConnectionHT; - // memory pool for connections - CMemoryPool *m_mp; + // path where socket is initialized + const CHAR *m_socket_path; - // hashtable of connections - ConnectionHT *m_connections_ht; + // memory pool for connections + CMemoryPool *m_mp; - // default id for the source system - static - const CSystemId m_default_id; + // hashtable of connections + ConnectionHT *m_connections_ht; - // ctor - explicit - COptServer(const CHAR *path); + // default id for the source system + static const CSystemId m_default_id; - // dtor - ~COptServer(); + // ctor + explicit COptServer(const CHAR *path); - // start serving requests - void Loop(); + // dtor + ~COptServer(); - // initialize hashtable - void InitHT(); + // start serving requests + void Loop(); - // register connection for status checking - void TrackConnection(CTask *task, CSocket *socket); + // initialize hashtable + void InitHT(); - // release connection - void ReleaseConnection(CTask *task); + // register connection for status checking + void TrackConnection(CTask *task, CSocket *socket); - // connection check task - static - void * CheckConnections(void *ptr); + // release connection + void ReleaseConnection(CTask *task); - // optimization task - static - void *Optimize(void *ptr); + // connection check task + static void *CheckConnections(void *ptr); - // receive optimization request and construct query context for it - static - CQueryContext *RecvQuery(CMemoryPool *mp, CCommunicator *communicator, CMDAccessor *md_accessor); + // optimization task + static void *Optimize(void *ptr); - // extract query plan, serialize it and send it to client - static - void SendPlan - ( - CMemoryPool *mp, - CCommunicator *communicator, - CMDAccessor *md_accessor, - CQueryContext *query_ctxt, - CExpression *plan_expr - ); + // receive optimization request and construct query context for it + static CQueryContext *RecvQuery(CMemoryPool *mp, + CCommunicator *communicator, + CMDAccessor *md_accessor); - // dump collected artifacts to file - static - void FinalizeMinidump(CMiniDumperDXL *dump); + // extract query plan, serialize it and send it to client + static void SendPlan(CMemoryPool *mp, CCommunicator *communicator, + CMDAccessor *md_accessor, CQueryContext *query_ctxt, + CExpression *plan_expr); - public: + // dump collected artifacts to file + static void FinalizeMinidump(CMiniDumperDXL *dump); - // invoke optimizer instance - static - void *Run(void *ptr); +public: + // invoke optimizer instance + static void *Run(void *ptr); - }; // class COptServer -} +}; // class COptServer +} // namespace gpoptudfs -#endif // !COptServer_H +#endif // !COptServer_H // EOF diff --git a/src/include/gpopt/utils/COptTasks.h b/src/include/gpopt/utils/COptTasks.h index 11f7ebe865..93a71d8507 100644 --- a/src/include/gpopt/utils/COptTasks.h +++ b/src/include/gpopt/utils/COptTasks.h @@ -25,23 +25,23 @@ // fwd decl namespace gpos { - class CMemoryPool; - class CBitSet; -} +class CMemoryPool; +class CBitSet; +} // namespace gpos namespace gpdxl { - class CDXLNode; +class CDXLNode; } namespace gpopt { - class CExpression; - class CMDAccessor; - class CQueryContext; - class COptimizerConfig; - class ICostModel; -} +class CExpression; +class CMDAccessor; +class CQueryContext; +class COptimizerConfig; +class ICostModel; +} // namespace gpopt struct PlannedStmt; struct Query; @@ -55,16 +55,15 @@ using namespace gpopt; // context of optimizer input and output objects struct SOptContext { - // mark which pointer member should NOT be released // when calling Free() function enum EPin { - epinQueryDXL, // keep m_query_dxl - epinQuery, // keep m_query - epinPlanDXL, // keep m_plan_dxl - epinPlStmt, // keep m_plan_stmt - epinErrorMsg // keep m_error_msg + epinQueryDXL, // keep m_query_dxl + epinQuery, // keep m_query + epinPlanDXL, // keep m_plan_dxl + epinPlStmt, // keep m_plan_stmt + epinErrorMsg // keep m_error_msg }; // query object serialized to DXL @@ -102,206 +101,176 @@ struct SOptContext void Free(EPin input, EPin epinOutput); // Clone the error message in given context. - CHAR* CloneErrorMsg(struct MemoryContextData *context); + CHAR *CloneErrorMsg(struct MemoryContextData *context); // casting function - static - SOptContext *Cast(void *ptr); + static SOptContext *Cast(void *ptr); -}; // struct SOptContext +}; // struct SOptContext class COptTasks { - private: - - // context of relcache input and output objects - struct SContextRelcacheToDXL - { - // list of object oids to lookup - List *m_oid_list; - - // comparison type for tasks retrieving scalar comparisons - ULONG m_cmp_type; - - // if filename is not null, then output will be written to file - const char *m_filename; - - // if filename is null, then output will be stored here - char *m_dxl; - - // ctor - SContextRelcacheToDXL(List *oid_list, ULONG cmp_type, const char *filename); - - // casting function - static - SContextRelcacheToDXL *RelcacheConvert(void *ptr); - }; - - // Structure containing the input and output string for a task that evaluates expressions. - struct SEvalExprContext - { - // Serialized DXL of the expression to be evaluated - char *m_dxl; - - // The result of evaluating the expression - char *m_dxl_result; - - // casting function - static - SEvalExprContext *PevalctxtConvert(void *ptr); - }; - - // context of minidump load and execution - struct SOptimizeMinidumpContext - { - // the name of the file containing the minidump - char *m_szFileName; - - // the result of optimizing the minidump - char *m_dxl_result; - - // casting function - static - SOptimizeMinidumpContext *Cast(void *ptr); - }; - - // execute a task given the argument - static - void Execute ( void *(*func) (void *), void *func_arg); - - // map GPOS log severity level to GPDB, print error and delete the given error buffer - static - void LogExceptionMessageAndDelete(CHAR* err_buf, ULONG severity_level=CException::ExsevInvalid); - - // task that does the translation from xml to dxl to planned_stmt - static - void* ConvertToPlanStmtFromDXLTask(void *ptr); - - // task that does the translation from query to XML - static - void* ConvertToDXLFromQueryTask(void *ptr); - - // dump relcache info for an object into DXL - static - void* ConvertToDXLFromMDObjsTask(void *ptr); - - // dump metadata about cast objects from relcache to a string in DXL format - static - void *ConvertToDXLFromMDCast(void *ptr); - - // dump metadata about scalar comparison objects from relcache to a string in DXL format - static - void *ConvertToDXLFromMDScalarCmp(void *ptr); - - // dump relstats info for an object into DXL - static - void* ConvertToDXLFromRelStatsTask(void *ptr); - - // evaluates an expression given as a serialized DXL string and returns the serialized DXL result - static - void* EvalExprFromDXLTask(void *ptr); - - // create optimizer configuration object - static - COptimizerConfig *CreateOptimizerConfig(CMemoryPool *mp, ICostModel *cost_model); - - // optimize a query to a physical DXL - static - void* OptimizeTask(void *ptr); - - // optimize the query in a minidump and return resulting plan in DXL format - static - void* OptimizeMinidumpTask(void *ptr); - - // translate a DXL tree into a planned statement - static - PlannedStmt *ConvertToPlanStmtFromDXL(CMemoryPool *mp, CMDAccessor *md_accessor, const CDXLNode *dxlnode, bool can_set_tag); - - // load search strategy from given path - static - CSearchStageArray *LoadSearchStrategy(CMemoryPool *mp, char *path); - - // allocate memory for string - static - CHAR *SzAllocate(CMemoryPool *pmp, ULONG ulSize); - - // helper for converting wide character string to regular string - static - CHAR *CreateMultiByteCharStringFromWCString(const WCHAR *wcstr); - - // set cost model parameters - static - void SetCostModelParams(ICostModel *cost_model); - - // generate an instance of optimizer cost model - static - ICostModel *GetCostModel(CMemoryPool *mp, ULONG num_segments); - - // print warning messages for columns with missing statistics - static - void PrintMissingStatsWarning(CMemoryPool *mp, CMDAccessor *md_accessor, IMdIdArray *col_stats, MdidHashSet *phsmdidRel); - - public: - - // convert Query->DXL->LExpr->Optimize->PExpr->DXL - static - char *Optimize(Query *query); - - // optimize Query->DXL->LExpr->Optimize->PExpr->DXL->PlannedStmt - static - PlannedStmt *GPOPTOptimizedPlan - ( - Query *query, - SOptContext* gpopt_context, - BOOL *had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan - ); - - // convert query to DXL to xml string. - static - char *ConvertQueryToDXL(Query *query); - - // convert xml string to DXL and to PS - static - PlannedStmt *ConvertToiPlanStmtFromXML(char *xml_string); - - // dump metadata objects from relcache to file in DXL format - static - void DumpMDObjs(List *oids, const char *filename); - - // dump metadata objects from relcache to a string in DXL format - static - char *SzMDObjs(List *oids); - - // dump cast function from relcache to a string in DXL format - static - char *DumpMDCast(List *oids); - - // dump scalar comparison from relcache to a string in DXL format - static - char *DumpMDScalarCmp(List *oids, char *cmp_type); - - // dump statistics from relcache to a string in DXL format - static - char *DumpRelStats(List *oids); - - // enable/disable a given xforms - static - bool SetXform(char *xform_str, bool should_disable); - - // return comparison type code - static - ULONG GetComparisonType(char *cmp_type); - - // converts XML string to DXL and evaluates the expression - static - char *EvalExprFromXML(char *xml_string); - - // loads a minidump from the given file path, executes it and returns - // the serialized representation of the result as DXL - static - char *OptimizeMinidumpFromFile(char *file_name); +private: + // context of relcache input and output objects + struct SContextRelcacheToDXL + { + // list of object oids to lookup + List *m_oid_list; + + // comparison type for tasks retrieving scalar comparisons + ULONG m_cmp_type; + + // if filename is not null, then output will be written to file + const char *m_filename; + + // if filename is null, then output will be stored here + char *m_dxl; + + // ctor + SContextRelcacheToDXL(List *oid_list, ULONG cmp_type, + const char *filename); + + // casting function + static SContextRelcacheToDXL *RelcacheConvert(void *ptr); + }; + + // Structure containing the input and output string for a task that evaluates expressions. + struct SEvalExprContext + { + // Serialized DXL of the expression to be evaluated + char *m_dxl; + + // The result of evaluating the expression + char *m_dxl_result; + + // casting function + static SEvalExprContext *PevalctxtConvert(void *ptr); + }; + + // context of minidump load and execution + struct SOptimizeMinidumpContext + { + // the name of the file containing the minidump + char *m_szFileName; + + // the result of optimizing the minidump + char *m_dxl_result; + + // casting function + static SOptimizeMinidumpContext *Cast(void *ptr); + }; + + // execute a task given the argument + static void Execute(void *(*func)(void *), void *func_arg); + + // map GPOS log severity level to GPDB, print error and delete the given error buffer + static void LogExceptionMessageAndDelete( + CHAR *err_buf, ULONG severity_level = CException::ExsevInvalid); + + // task that does the translation from xml to dxl to planned_stmt + static void *ConvertToPlanStmtFromDXLTask(void *ptr); + + // task that does the translation from query to XML + static void *ConvertToDXLFromQueryTask(void *ptr); + + // dump relcache info for an object into DXL + static void *ConvertToDXLFromMDObjsTask(void *ptr); + + // dump metadata about cast objects from relcache to a string in DXL format + static void *ConvertToDXLFromMDCast(void *ptr); + + // dump metadata about scalar comparison objects from relcache to a string in DXL format + static void *ConvertToDXLFromMDScalarCmp(void *ptr); + + // dump relstats info for an object into DXL + static void *ConvertToDXLFromRelStatsTask(void *ptr); + + // evaluates an expression given as a serialized DXL string and returns the serialized DXL result + static void *EvalExprFromDXLTask(void *ptr); + + // create optimizer configuration object + static COptimizerConfig *CreateOptimizerConfig(CMemoryPool *mp, + ICostModel *cost_model); + + // optimize a query to a physical DXL + static void *OptimizeTask(void *ptr); + + // optimize the query in a minidump and return resulting plan in DXL format + static void *OptimizeMinidumpTask(void *ptr); + + // translate a DXL tree into a planned statement + static PlannedStmt *ConvertToPlanStmtFromDXL(CMemoryPool *mp, + CMDAccessor *md_accessor, + const CDXLNode *dxlnode, + bool can_set_tag); + + // load search strategy from given path + static CSearchStageArray *LoadSearchStrategy(CMemoryPool *mp, char *path); + + // allocate memory for string + static CHAR *SzAllocate(CMemoryPool *pmp, ULONG ulSize); + + // helper for converting wide character string to regular string + static CHAR *CreateMultiByteCharStringFromWCString(const WCHAR *wcstr); + + // set cost model parameters + static void SetCostModelParams(ICostModel *cost_model); + + // generate an instance of optimizer cost model + static ICostModel *GetCostModel(CMemoryPool *mp, ULONG num_segments); + + // print warning messages for columns with missing statistics + static void PrintMissingStatsWarning(CMemoryPool *mp, + CMDAccessor *md_accessor, + IMdIdArray *col_stats, + MdidHashSet *phsmdidRel); + +public: + // convert Query->DXL->LExpr->Optimize->PExpr->DXL + static char *Optimize(Query *query); + + // optimize Query->DXL->LExpr->Optimize->PExpr->DXL->PlannedStmt + static PlannedStmt *GPOPTOptimizedPlan( + Query *query, SOptContext *gpopt_context, + BOOL * + had_unexpected_failure // output : set to true if optimizer unexpectedly failed to produce plan + ); + + // convert query to DXL to xml string. + static char *ConvertQueryToDXL(Query *query); + + // convert xml string to DXL and to PS + static PlannedStmt *ConvertToiPlanStmtFromXML(char *xml_string); + + // dump metadata objects from relcache to file in DXL format + static void DumpMDObjs(List *oids, const char *filename); + + // dump metadata objects from relcache to a string in DXL format + static char *SzMDObjs(List *oids); + + // dump cast function from relcache to a string in DXL format + static char *DumpMDCast(List *oids); + + // dump scalar comparison from relcache to a string in DXL format + static char *DumpMDScalarCmp(List *oids, char *cmp_type); + + // dump statistics from relcache to a string in DXL format + static char *DumpRelStats(List *oids); + + // enable/disable a given xforms + static bool SetXform(char *xform_str, bool should_disable); + + // return comparison type code + static ULONG GetComparisonType(char *cmp_type); + + // converts XML string to DXL and evaluates the expression + static char *EvalExprFromXML(char *xml_string); + + // loads a minidump from the given file path, executes it and returns + // the serialized representation of the result as DXL + static char *OptimizeMinidumpFromFile(char *file_name); }; -#endif // COptTasks_H +#endif // COptTasks_H // EOF diff --git a/src/include/gpopt/utils/funcs.h b/src/include/gpopt/utils/funcs.h index 2b052f3a3d..4ef82ad985 100644 --- a/src/include/gpopt/utils/funcs.h +++ b/src/include/gpopt/utils/funcs.h @@ -11,8 +11,7 @@ #define GPOPT_funcs_H -extern "C" -{ +extern "C" { #include "postgres.h" #include "fmgr.h" @@ -21,8 +20,7 @@ extern "C" extern Datum DisableXform(PG_FUNCTION_ARGS); extern Datum EnableXform(PG_FUNCTION_ARGS); extern Datum LibraryVersion(); -extern const char * OptVersion(void); - +extern const char *OptVersion(void); } -#endif // GPOPT_funcs_H +#endif // GPOPT_funcs_H diff --git a/src/include/gpopt/utils/gpdbdefs.h b/src/include/gpopt/utils/gpdbdefs.h index b37afda537..65f072a889 100644 --- a/src/include/gpopt/utils/gpdbdefs.h +++ b/src/include/gpopt/utils/gpdbdefs.h @@ -67,48 +67,38 @@ extern "C" { #include "utils/faultinjector.h" #include "funcapi.h" -extern -Query *preprocess_query_optimizer(Query *query, ParamListInfo boundParams); +extern Query *preprocess_query_optimizer(Query *query, + ParamListInfo boundParams); -extern -List *pg_parse_and_rewrite(const char *query_string, Oid *paramTypes, int iNumParams); +extern List *pg_parse_and_rewrite(const char *query_string, Oid *paramTypes, + int iNumParams); -extern -PlannedStmt *pg_plan_query(Query *pqueryTree, ParamListInfo boundParams); +extern PlannedStmt *pg_plan_query(Query *pqueryTree, ParamListInfo boundParams); -extern -char * get_rel_name(Oid relid); +extern char *get_rel_name(Oid relid); -extern -Relation RelationIdGetRelation(Oid relationId); +extern Relation RelationIdGetRelation(Oid relationId); -extern -void RelationClose(Relation relation); +extern void RelationClose(Relation relation); -extern -Oid get_atttype(Oid relid, AttrNumber attnum); +extern Oid get_atttype(Oid relid, AttrNumber attnum); -extern -RegProcedure get_opcode(Oid opid); +extern RegProcedure get_opcode(Oid opid); -extern -void ExecutorStart(QueryDesc *pqueryDesc, int iEFlags); +extern void ExecutorStart(QueryDesc *pqueryDesc, int iEFlags); -extern -TupleTableSlot *ExecutorRun(QueryDesc *pqueryDesc, ScanDirection direction, long lCount); +extern TupleTableSlot *ExecutorRun(QueryDesc *pqueryDesc, + ScanDirection direction, long lCount); -extern -void ExecutorEnd(QueryDesc *pqueryDesc); +extern void ExecutorEnd(QueryDesc *pqueryDesc); -extern -void ExecCheckRTPerms(List *rangeTable); +extern void ExecCheckRTPerms(List *rangeTable); -extern -void ExecCheckRTEPerms(RangeTblEntry *rte); +extern void ExecCheckRTEPerms(RangeTblEntry *rte); -} // end extern C +} // end extern C -#endif // GPDBDefs_H +#endif // GPDBDefs_H // EOF -- GitLab