diff --git a/src/backend/gpopt/CGPOptimizer.cpp b/src/backend/gpopt/CGPOptimizer.cpp index 7ad9d4132d95df38072eb45c40036ff0fe30dc1c..99dd491d709a378c8896385d15158efe64bf84f0 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 979e35cab6963e85ad47845c12be4a8465c274bb..bb1f9878435ee2d37b190f1629d7a101bb905b14 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 cdeae9890381195b316c1532acd1ad5c1247d238..8cab6cae6586b6b64f19e103fc329fa7ab71805d 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 a35736b9df9e3f2f2582e7da073c97fd6caedca9..ea07bb654fe7df22ca2f9dc34fed3b98edd7a96f 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 be761aba8f8cb59ebc9f5c0fa8a39a3892daed23..641255198eef3743035acd11fa6fa3c5e43d67ad 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 cc4360a58b9bbf8c8381b6be6cd0d7b5c49ebc7d..558c61c1e68b68c23844ff75b7e4fb1a6c66647d 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 2575fc0fea5af9e65a0dde03f7003f41c413c41d..7c870054c3433eac7667a5cb1ab0c5f8c8d23550 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 991a8833ef96e251fa5845ff4b946e5af3fc9e6b..ea1649e2f53031b57ae45f6b5f6bf8c842e966f4 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 8b1bec0330f86375c0f86835cb90c68c1d5bdcbe..01fa633c9692c0b1a0a12fb19969e4288275c8f5 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 b416489c9639bb9836cae7bfc2ba6c8de863a696..869fd624d87baeef6610a00d1f60b1ab10087c97 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 1fb8647e571220110797b7acd50dfbc514efba43..443285319dc9022e1b72aff3dcc31b4693739e3c 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 fa3be1b877cb85f3ba9420042dda5e3bbac983f6..71ef5a8a0cdea2d05d974d0f72001c0cbde3d654 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 7cf1a15b8ed0969c9e18cc1411f0c255b7b38ee9..b001cc5bf6406bfa2fbbb232ca347d690bca3f06 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 46fcfa0c7296eb8e92b54020f5733c08f5c1c805..f2800147e294cc0180d76c00fce914ae527345c3 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 f09af87ae1ff008b06baf53a0272bb5445640cae..254a3cf31dd1213afc7f8a21dd0a4ceecc4ddd75 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 f98ad0f9056004d27228dedac40b260828aa9cf1..41e9134dca46f0ea9885c458d26bbbe70def5ddf 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 9d232d89723898278c4945de9555ec8394349b62..93ec2826c9078975ddc1808634f66352295929d6 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 e8f09232875218184eb1e72ff4f32e46acf196e3..9b7e33507e6e216f9e41ae919187fc2a7155f1b4 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 f84199a6dd34392affeeb6bc75ccbf93490b5d4b..4aaf26b732c51944254a06392c2ead9e7ab00f2e 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 e81af3db5aa82820657c5c77c4ab6ade04df6f43..de70131579e6af62bf8a695ad3fd2dbcb5f54965 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 260ad410b2605aa449598aedbe68f6ed6bb3d25c..a92b3169f78c732ed18871fb537058722993d503 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 8d97417f85ec68b5e018954e2b48501f10e3b20c..6c6593a4910d5928950816285c270209c90e55cc 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 e869c20ce34ff797b11032c1818d251b683ffee1..be9d12627d586fbc113f65b3fd710033daf201b5 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 7ff05f54c88590f46cc0091f8d71945f75010685..e6cbf56d0e2365c4866617f24068a81f8fc1f06b 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 39e8d0c4d42dcc5a5660fe9de5717479db148722..325136ec3707f335fb59eafdfcc32b32eb7e379f 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 1278c0ae07b0bdd400348291b8915246284c8ecd..50045f5b76a06db0bb121ea9587b0c1b8a1229b7 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 0000000000000000000000000000000000000000..5260f46eb6774ddfb85efbc1a66584c798a1c42f --- /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 1f490fe202d53f7725b488fafb49529f94273fae..34aa661f5ea9ac7f0a73c3a18035a576161122d8 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 ead5cdf36ed6927d3094b86ff1368965a0fd2cb8..b35c49c62d18e5c957a2a5abd618c7b99a134cac 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 554d3caa867c2d546a7a1b3568cae84eeb46c47a..64b0b8e025e87a00a46d72c52951580299216f7f 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 5ec9bb1223ff5ad94c78018cc11fc37c4cbff4e8..c9c4cd5a4ebe46a67660388c842dd590a354109f 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 564357037a0375c9b76f8cc01b699e388e70f698..de2aa371a7d13bca607c6a6df323517730e89eae 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 5f6370313b48ce4c0e7ebe00852b759bbfcdd732..37c422da8f462f4411891ff8235eb29f5f36355f 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 52eeb8b746d41177e401fd0ad1d49a269abef982..789d8633122ec7183d97b2cea561e1f6528a7e18 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 a6dc028598ad79b4be0f0794a2d6408b428a0e27..cf03e3f4af5f502d75899ca31a6d41cf0d3954ac 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 ed8c0b4003ceb441ad676658db341643a3fbecda..c47b0066ee57e5ac814e7104070161ac07ca6dc3 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 1deca681e424a4602d6926ace792770bc7dea79c..5e585c6ee8b799cf89ebf12cbf6151205353117b 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 3ce85b235e62b00a93a652e2e553bc12f9d36d83..0fcaf0a863ea64e6bbcfa29810d961e0d90e2d7f 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 54b626fb16b560b4d31ccb8add3da45e5c837e48..f65a8227025202aedabf3a73ebae6749a2a27674 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 faf592dbe20c5c5523f819ba7655eeda753e7fa1..14153a5929dc75cabec80fbbac20f72a8ce3b7dc 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 8ca94bf0d9c393c893fd8f43748aa9a6aad0d526..9a7cd06cc524f24128463b4bb1e9870eb7e43b36 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 cf69bb845e5ea26974c07373d25347def823703d..3da25e709f16f3306d003df3d2c46581c0ef797a 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 5238788dfe319bcef6ae58056022d411b35e90f1..57907eb7b0cf2f31607a9091f1a8c315cd105d08 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 5175842e794e4af57a0d7ba799096c75cd9e4182..cb94a7837e9b9bbf9c3f65d406c0fa57da0b4198 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 c9bc6dc6dfa9cd39df8e2ad743efc3a08dd72479..e22783d0b7db4d5a33aa46dc1beacc591acb62cd 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 8b6a017ff81a9a142d1c3cd588dee53b7eff1c28..d2b99d64ec9e180974e71a7eaa04c2d9201dfcc9 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 b32c2cc694179912f98ba99f38dcbebd3ca3453d..8a6f852194d789bd2c4b93167d6b3e5548ab80dc 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 3cd5769d8bf1899b7e09452f95f151cc4e5895f1..a95be4faabcd7ece01cca88ba44e877963333351 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 8d35c59fa0f8313d0d9398051b8735c6142a465b..86cc6eb9d9d85387f1cba3b7260585809d691614 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 cb55ebe68503aa7e09fb28d408f94485a06f497b..3d2ce673b6a474893124557a422f8f9327268961 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 e7f225aeb26c54934d97baf9bea4f4b53fb29a6e..09232e1f3c064e16bb5efafd2bb56d1fc4acf050 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 b0f629a5d4e927158772141c8766cba7c9d48fd9..23e8feff2623f848dfeb68590180505f06d9af88 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 0c5d6aa271d17a94123e63ff097e3ac12dd06f82..76f5e8b765ec12ad15a295274cb407bf4cddced6 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 2ff8113061c1d81537bfb26a61c126c8ed7139aa..df234b44e8890d011e918b6ee6bd2969b828a235 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 5eddab4372eabb25bd4a3816c1ebadd1b4382327..6ca46af08d3a5d788089875011fb54c31b6cd6ec 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 c58f794f406e718c1bbca1586581b47bc3b37741..02641d9463ea292344c9519d873b486626533308 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 b1711cb1496359f31db8777460add93c3b0ce7c1..5a5356b78bc3f089917bf56eee64a396a930f2df 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 11f7ebe865775ce14111e897b6ba54a137ca41f0..93a71d85077e5890d785ef032a3ccd875e2dfa4d 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 2b052f3a3d0e76f7b8414be5bc9ecad96ac68828..4ef82ad9852773dd69b1174a142fe954e38f055b 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 b37afda537dbd1a76038436f360320767960e1bf..65f072a88987f57503a0b33c99f5799145204103 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