diff --git a/be/src/vec/exprs/vcase_expr.cpp b/be/src/vec/exprs/vcase_expr.cpp index bd93cb8226..e09d62bfb2 100644 --- a/be/src/vec/exprs/vcase_expr.cpp +++ b/be/src/vec/exprs/vcase_expr.cpp @@ -95,6 +95,9 @@ void VCaseExpr::close(VExprContext* context, FunctionContext::FunctionStateScope } Status VCaseExpr::execute(VExprContext* context, Block* block, int* result_column_id) { + if (is_const_and_have_executed()) { // const have execute in open function + return get_result_from_const(block, _expr_name, result_column_id); + } ColumnNumbers arguments(_children.size()); for (int i = 0; i < _children.size(); i++) { int column_id = -1; diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp b/be/src/vec/exprs/vectorized_fn_call.cpp index 58083a486f..48522b3550 100644 --- a/be/src/vec/exprs/vectorized_fn_call.cpp +++ b/be/src/vec/exprs/vectorized_fn_call.cpp @@ -138,6 +138,10 @@ void VectorizedFnCall::close(VExprContext* context, FunctionContext::FunctionSta Status VectorizedFnCall::execute(VExprContext* context, vectorized::Block* block, int* result_column_id) { + if (is_const_and_have_executed()) { // const have execute in open function + return get_result_from_const(block, _expr_name, result_column_id); + } + // TODO: not execute const expr again, but use the const column in function context vectorized::ColumnNumbers arguments(_children.size()); for (int i = 0; i < _children.size(); ++i) { diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp index 3f06dbb7f5..7270126e56 100644 --- a/be/src/vec/exprs/vexpr.cpp +++ b/be/src/vec/exprs/vexpr.cpp @@ -554,4 +554,12 @@ Status VExpr::check_constant(const Block& block, ColumnNumbers arguments) const return Status::OK(); } +Status VExpr::get_result_from_const(vectorized::Block* block, const std::string& expr_name, + int* result_column_id) { + *result_column_id = block->columns(); + auto column = ColumnConst::create(_constant_col->column_ptr, block->rows()); + block->insert({std::move(column), _data_type, expr_name}); + return Status::OK(); +} + } // namespace doris::vectorized diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h index 708b57ab63..b6a2b4ac6b 100644 --- a/be/src/vec/exprs/vexpr.h +++ b/be/src/vec/exprs/vexpr.h @@ -220,6 +220,11 @@ protected: return res; } + bool is_const_and_have_executed() { return (is_constant() && (_constant_col != nullptr)); } + + Status get_result_from_const(vectorized::Block* block, const std::string& expr_name, + int* result_column_id); + Status check_constant(const Block& block, ColumnNumbers arguments) const; /// Helper function that calls ctx->register(), sets fn_context_index_, and returns the diff --git a/be/src/vec/exprs/vin_predicate.cpp b/be/src/vec/exprs/vin_predicate.cpp index 55e999af47..9a25d3a223 100644 --- a/be/src/vec/exprs/vin_predicate.cpp +++ b/be/src/vec/exprs/vin_predicate.cpp @@ -94,6 +94,9 @@ void VInPredicate::close(VExprContext* context, FunctionContext::FunctionStateSc } Status VInPredicate::execute(VExprContext* context, Block* block, int* result_column_id) { + if (is_const_and_have_executed()) { // const have execute in open function + return get_result_from_const(block, _expr_name, result_column_id); + } // TODO: not execute const expr again, but use the const column in function context doris::vectorized::ColumnNumbers arguments(_children.size()); for (int i = 0; i < _children.size(); ++i) {