diff --git a/src/backend/codegen/codegen_wrapper.cc b/src/backend/codegen/codegen_wrapper.cc index 2fd8411ff81f911602b7d0a0f7d7a89250bdc6f5..82612c7e9df65eefe83e34f987fc84de9f09951c 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 fdf42219a317f0cfd184205e4b59d2e4b72ab1ae..7865a6706bea91067f0b9969d48b435f97eb2ef0 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 2cfb6533725a1ae5c26267803bd2da4469a46f35..8e7e84b042921b9a3cbf6d4ad4a717aadeefcf7f 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 0016d9771a415028ff2bb2d1e4471d7c42e7b65b..b0d78366d577ef5147461a804cef83b3e26863e8 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