From 1b26fbfcae9ded32110cd6ce9d70965b55fe17fd Mon Sep 17 00:00:00 2001 From: Nikos Armenatzoglou Date: Fri, 17 Jun 2016 14:12:08 -0700 Subject: [PATCH] Enrolled targetlist for scan and aggregate Signed-off-by: Karthikeyan Jambu Rajaraman --- src/backend/codegen/codegen_wrapper.cc | 2 + src/backend/codegen/op_expr_tree_generator.cc | 12 +-- src/backend/executor/execProcnode.c | 96 ++++++++++++++++--- src/include/codegen/codegen_wrapper.h | 1 + 4 files changed, 93 insertions(+), 18 deletions(-) diff --git a/src/backend/codegen/codegen_wrapper.cc b/src/backend/codegen/codegen_wrapper.cc index 2fd8411ff8..82612c7e9d 100644 --- a/src/backend/codegen/codegen_wrapper.cc +++ b/src/backend/codegen/codegen_wrapper.cc @@ -129,3 +129,5 @@ void* ExecEvalExprCodegenEnroll( return generator; } + + diff --git a/src/backend/codegen/op_expr_tree_generator.cc b/src/backend/codegen/op_expr_tree_generator.cc index fdf42219a3..7865a6706b 100644 --- a/src/backend/codegen/op_expr_tree_generator.cc +++ b/src/backend/codegen/op_expr_tree_generator.cc @@ -45,16 +45,16 @@ void OpExprTreeGenerator::InitializeSupportedFunction() { int32_t, int32_t>(1088, "date_le", &IRBuilder<>::CreateICmpSLE)); supported_function_[177] = std::unique_ptr( - new PGGenericFuncGenerator( - 141, "int4pl", &PGArithFuncGenerator::AddWithOverflow)); + new PGGenericFuncGenerator( + 177, "int4pl", &PGArithFuncGenerator::AddWithOverflow)); supported_function_[181] = std::unique_ptr( - new PGGenericFuncGenerator( - 141, "int4mi", &PGArithFuncGenerator::SubWithOverflow)); + new PGGenericFuncGenerator( + 181, "int4mi", &PGArithFuncGenerator::SubWithOverflow)); supported_function_[141] = std::unique_ptr( - new PGGenericFuncGenerator( - 141, "int4mul", &PGArithFuncGenerator::MulWithOverflow)); + new PGGenericFuncGenerator( + 141, "int4mul", &PGArithFuncGenerator::MulWithOverflow)); } OpExprTreeGenerator::OpExprTreeGenerator( diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 2cfb653372..8e7e84b042 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -162,6 +162,12 @@ static void ExecCdbTraceNode(PlanState *node, bool entry, TupleTableSlot *result void *context, int flags); + void + EnrollQualList(PlanState* result); + + void + EnrollProjInfoTargetList(ProjectionInfo* ProjInfo); + /* * setSubplanSliceId * Set the slice id info for the given subplan. @@ -336,20 +342,17 @@ ExecInitNode(Plan *node, EState *estate, int eflags) { result = (PlanState *) ExecInitTableScan((TableScan *) node, estate, eflags); - } - END_MEMORY_ACCOUNT(); -#ifdef USE_CODEGEN - /* Enroll quals' expression evaluation functions in codegen_manager */ - if (result && NULL != result->qual) + /* + * Enroll targetlist & quals' expression evaluation functions + * in codegen_manager + */ + EnrollQualList(result); + if (NULL !=result) { - ListCell *l; - foreach(l, result->qual) - { - ExprState *exprstate = (ExprState *) lfirst(l); - enroll_ExecEvalExpr_codegen(exprstate->evalfunc, &exprstate->evalfunc, exprstate, result->ps_ExprContext); - } + EnrollProjInfoTargetList(result->ps_ProjInfo); } -#endif + } + END_MEMORY_ACCOUNT(); break; case T_DynamicTableScan: @@ -573,6 +576,20 @@ ExecInitNode(Plan *node, EState *estate, int eflags) { result = (PlanState *) ExecInitAgg((Agg *) node, estate, eflags); + /* + * Enroll targetlist & quals' expression evaluation functions + * in codegen_manager + */ + EnrollQualList(result); + if (NULL != result) + { + AggState* aggstate = (AggState*)result; + for (int aggno = 0; aggno < aggstate->numaggs; aggno++) + { + AggStatePerAgg peraggstate = &aggstate->peragg[aggno]; + EnrollProjInfoTargetList(peraggstate->evalproj); + } + } } END_MEMORY_ACCOUNT(); break; @@ -752,6 +769,61 @@ ExecInitNode(Plan *node, EState *estate, int eflags) return result; } +/* ---------------------------------------------------------------- + * EnrollTargetAndQualList + * + * Enroll Target and Qual List from PlanState to Codegen + * ---------------------------------------------------------------- + */ +void +EnrollQualList(PlanState* result) +{ +#ifdef USE_CODEGEN + if (NULL == result || + NULL == result->qual) + { + return; + } + + ListCell *l; + foreach(l, result->qual) + { + ExprState *exprstate = (ExprState*) lfirst(l); + enroll_ExecEvalExpr_codegen(exprstate->evalfunc, + &exprstate->evalfunc, + exprstate, result->ps_ExprContext); + } + +#endif +} + +void +EnrollProjInfoTargetList(ProjectionInfo* ProjInfo) +{ +#ifdef USE_CODEGEN + if (NULL == ProjInfo || + NULL == ProjInfo->pi_targetlist) + { + return; + } + ListCell *l; + foreach(l, ProjInfo->pi_targetlist) + { + GenericExprState *gstate = (GenericExprState *) lfirst(l); + if (NULL == gstate->arg || + NULL == gstate->arg->evalfunc) { + continue; + } + enroll_ExecEvalExpr_codegen(gstate->arg->evalfunc, + &gstate->arg->evalfunc, + gstate->arg, + ProjInfo->pi_exprContext); + + } +#endif +} + + /* ---------------------------------------------------------------- * ExecSliceDependencyNode * diff --git a/src/include/codegen/codegen_wrapper.h b/src/include/codegen/codegen_wrapper.h index 0016d9771a..b0d78366d5 100644 --- a/src/include/codegen/codegen_wrapper.h +++ b/src/include/codegen/codegen_wrapper.h @@ -151,6 +151,7 @@ ExecEvalExprCodegenEnroll(ExecEvalExprFn regular_func_ptr, struct ExprState *exprstate, struct ExprContext *econtext); + #ifdef __cplusplus } // extern "C" #endif -- GitLab