This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ca9942407b [refine](expr)Mark expr's execution function as const. 
(#57668)
4ca9942407b is described below

commit 4ca9942407bd50d4d7c440d35c57bb918cc2051d
Author: Mryange <[email protected]>
AuthorDate: Thu Nov 6 19:26:28 2025 +0800

    [refine](expr)Mark expr's execution function as const. (#57668)
    
    ### What problem does this PR solve?
    
    
    Our expr is actually a const function; any mutable data must be stored
    in VExprContext. Currently only VRuntimeFilterWrapper contains mutable
    data (because it needs to check the filter rate).
    
    ### Release note
    
    None
    
    ### Check List (For Author)
    
    - Test <!-- At least one of them must be included. -->
        - [ ] Regression test
        - [ ] Unit Test
        - [ ] Manual test (add detailed scripts or steps below)
        - [x] No need to test or manual test. Explain why:
    - [x] This is a refactor/code format and no logic has been changed.
            - [ ] Previous test can cover this change.
            - [ ] No code files have been changed.
            - [ ] Other reason <!-- Add your reason?  -->
    
    - Behavior changed:
        - [x] No.
        - [ ] Yes. <!-- Explain the behavior change -->
    
    - Does this need documentation?
        - [x] No.
    - [ ] Yes. <!-- Add document PR link here. eg:
    https://github.com/apache/doris-website/pull/1214 -->
    
    ### Check List (For Reviewer who merge this PR)
    
    - [ ] Confirm the release note
    - [ ] Confirm test cases
    - [ ] Confirm document
    - [ ] Add branch pick label <!-- Add branch pick label that this PR
    should merge into -->
---
 be/src/vec/exprs/lambda_function/lambda_function.h          |  2 +-
 be/src/vec/exprs/lambda_function/varray_filter_function.cpp |  2 +-
 be/src/vec/exprs/lambda_function/varray_map_function.cpp    | 11 ++++++-----
 be/src/vec/exprs/vbitmap_predicate.cpp                      |  2 +-
 be/src/vec/exprs/vbitmap_predicate.h                        |  2 +-
 be/src/vec/exprs/vbloom_predicate.cpp                       |  2 +-
 be/src/vec/exprs/vbloom_predicate.h                         |  2 +-
 be/src/vec/exprs/vcase_expr.cpp                             |  2 +-
 be/src/vec/exprs/vcase_expr.h                               |  4 ++--
 be/src/vec/exprs/vcast_expr.cpp                             |  8 ++++----
 be/src/vec/exprs/vcast_expr.h                               |  8 ++++----
 be/src/vec/exprs/vcolumn_ref.h                              |  2 +-
 be/src/vec/exprs/vcompound_pred.h                           |  2 +-
 be/src/vec/exprs/vdirect_in_predicate.h                     |  4 ++--
 be/src/vec/exprs/vectorized_fn_call.cpp                     |  4 ++--
 be/src/vec/exprs/vectorized_fn_call.h                       |  4 ++--
 be/src/vec/exprs/vexpr.cpp                                  |  4 ++--
 be/src/vec/exprs/vexpr.h                                    | 10 ++++++----
 be/src/vec/exprs/vin_predicate.cpp                          |  2 +-
 be/src/vec/exprs/vin_predicate.h                            |  2 +-
 be/src/vec/exprs/vinfo_func.cpp                             |  3 ++-
 be/src/vec/exprs/vinfo_func.h                               |  2 +-
 be/src/vec/exprs/virtual_slot_ref.cpp                       |  2 +-
 be/src/vec/exprs/virtual_slot_ref.h                         |  2 +-
 be/src/vec/exprs/vlambda_function_call_expr.h               |  2 +-
 be/src/vec/exprs/vlambda_function_expr.h                    |  2 +-
 be/src/vec/exprs/vliteral.cpp                               |  3 ++-
 be/src/vec/exprs/vliteral.h                                 |  2 +-
 be/src/vec/exprs/vmatch_predicate.cpp                       |  2 +-
 be/src/vec/exprs/vmatch_predicate.h                         |  2 +-
 be/src/vec/exprs/vruntimefilter_wrapper.cpp                 |  3 ++-
 be/src/vec/exprs/vruntimefilter_wrapper.h                   | 12 ++++++------
 be/src/vec/exprs/vsearch.cpp                                |  2 +-
 be/src/vec/exprs/vsearch.h                                  |  2 +-
 be/src/vec/exprs/vslot_ref.cpp                              |  2 +-
 be/src/vec/exprs/vslot_ref.h                                |  2 +-
 be/src/vec/exprs/vtopn_pred.h                               |  2 +-
 be/test/exprs/mock_vexpr.h                                  |  4 ++--
 be/test/exprs/virtual_slot_ref_test.cpp                     |  6 +++---
 be/test/olap/collection_statistics_test.cpp                 |  2 +-
 be/test/testutil/mock/mock_fn_call.h                        |  2 +-
 be/test/testutil/mock/mock_in_expr.h                        |  2 +-
 be/test/testutil/mock/mock_slot_ref.h                       |  2 +-
 be/test/vec/exprs/try_cast_expr_test.cpp                    |  2 +-
 be/test/vec/exprs/vsearch_expr_test.cpp                     |  2 +-
 45 files changed, 77 insertions(+), 71 deletions(-)

diff --git a/be/src/vec/exprs/lambda_function/lambda_function.h 
b/be/src/vec/exprs/lambda_function/lambda_function.h
index 07302954688..9e141549042 100644
--- a/be/src/vec/exprs/lambda_function/lambda_function.h
+++ b/be/src/vec/exprs/lambda_function/lambda_function.h
@@ -38,7 +38,7 @@ public:
 
     virtual doris::Status execute(VExprContext* context, 
doris::vectorized::Block* block,
                                   int* result_column_id, const DataTypePtr& 
result_type,
-                                  const VExprSPtrs& children) = 0;
+                                  const VExprSPtrs& children) const = 0;
 
     int batch_size;
 };
diff --git a/be/src/vec/exprs/lambda_function/varray_filter_function.cpp 
b/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
index 981b1c7bd46..4c3021a76be 100644
--- a/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
+++ b/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
@@ -54,7 +54,7 @@ public:
 
     doris::Status execute(VExprContext* context, doris::vectorized::Block* 
block,
                           int* result_column_id, const DataTypePtr& 
result_type,
-                          const VExprSPtrs& children) override {
+                          const VExprSPtrs& children) const override {
         ///* array_filter(array, array<boolean>) *///
 
         //1. child[0:end]->execute(src_block)
diff --git a/be/src/vec/exprs/lambda_function/varray_map_function.cpp 
b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
index dae6cda07e1..0b94568b84a 100644
--- a/be/src/vec/exprs/lambda_function/varray_map_function.cpp
+++ b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
@@ -77,7 +77,7 @@ public:
     std::string get_name() const override { return name; }
 
     Status execute(VExprContext* context, vectorized::Block* block, int* 
result_column_id,
-                   const DataTypePtr& result_type, const VExprSPtrs& children) 
override {
+                   const DataTypePtr& result_type, const VExprSPtrs& children) 
const override {
         LambdaArgs args_info;
         // collect used slot ref in lambda function body
         std::vector<int>& output_slot_ref_indexs = 
args_info.output_slot_ref_indexs;
@@ -340,12 +340,12 @@ public:
     }
 
 private:
-    bool _contains_column_id(const std::vector<int>& output_slot_ref_indexs, 
int id) {
+    bool _contains_column_id(const std::vector<int>& output_slot_ref_indexs, 
int id) const {
         const auto it = std::find(output_slot_ref_indexs.begin(), 
output_slot_ref_indexs.end(), id);
         return it != output_slot_ref_indexs.end();
     }
 
-    void _set_column_ref_column_id(VExprSPtr expr, int gap) {
+    void _set_column_ref_column_id(VExprSPtr expr, int gap) const {
         for (const auto& child : expr->children()) {
             if (child->is_column_ref()) {
                 auto* ref = static_cast<VColumnRef*>(child.get());
@@ -356,7 +356,8 @@ private:
         }
     }
 
-    void _collect_slot_ref_column_id(VExprSPtr expr, std::vector<int>& 
output_slot_ref_indexs) {
+    void _collect_slot_ref_column_id(VExprSPtr expr,
+                                     std::vector<int>& output_slot_ref_indexs) 
const {
         for (const auto& child : expr->children()) {
             if (child->is_slot_ref()) {
                 const auto* ref = static_cast<VSlotRef*>(child.get());
@@ -369,7 +370,7 @@ private:
 
     void _extend_data(std::vector<MutableColumnPtr>& columns, Block* block,
                       int current_repeat_times, int size, int64_t 
current_row_idx,
-                      const std::vector<int>& output_slot_ref_indexs) {
+                      const std::vector<int>& output_slot_ref_indexs) const {
         if (!current_repeat_times || !size) {
             return;
         }
diff --git a/be/src/vec/exprs/vbitmap_predicate.cpp 
b/be/src/vec/exprs/vbitmap_predicate.cpp
index 78bfb6853b1..f2744106f72 100644
--- a/be/src/vec/exprs/vbitmap_predicate.cpp
+++ b/be/src/vec/exprs/vbitmap_predicate.cpp
@@ -77,7 +77,7 @@ doris::Status 
vectorized::VBitmapPredicate::open(doris::RuntimeState* state,
 
 doris::Status vectorized::VBitmapPredicate::execute(vectorized::VExprContext* 
context,
                                                     doris::vectorized::Block* 
block,
-                                                    int* result_column_id) {
+                                                    int* result_column_id) 
const {
     DCHECK(_open_finished || _getting_const_col);
     doris::vectorized::ColumnNumbers arguments(_children.size());
     for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vbitmap_predicate.h 
b/be/src/vec/exprs/vbitmap_predicate.h
index 90531151207..9432418b405 100644
--- a/be/src/vec/exprs/vbitmap_predicate.h
+++ b/be/src/vec/exprs/vbitmap_predicate.h
@@ -49,7 +49,7 @@ public:
 
     ~VBitmapPredicate() override = default;
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
 
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
 
diff --git a/be/src/vec/exprs/vbloom_predicate.cpp 
b/be/src/vec/exprs/vbloom_predicate.cpp
index e3e61ddde9a..9f89a0f5f0c 100644
--- a/be/src/vec/exprs/vbloom_predicate.cpp
+++ b/be/src/vec/exprs/vbloom_predicate.cpp
@@ -70,7 +70,7 @@ void VBloomPredicate::close(VExprContext* context, 
FunctionContext::FunctionStat
     VExpr::close(context, scope);
 }
 
-Status VBloomPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VBloomPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     DCHECK(_open_finished || _getting_const_col);
     doris::vectorized::ColumnNumbers arguments(_children.size());
     for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vbloom_predicate.h 
b/be/src/vec/exprs/vbloom_predicate.h
index 56cb86245e8..35ddf07cab1 100644
--- a/be/src/vec/exprs/vbloom_predicate.h
+++ b/be/src/vec/exprs/vbloom_predicate.h
@@ -43,7 +43,7 @@ class VBloomPredicate final : public VExpr {
 public:
     VBloomPredicate(const TExprNode& node);
     ~VBloomPredicate() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
diff --git a/be/src/vec/exprs/vcase_expr.cpp b/be/src/vec/exprs/vcase_expr.cpp
index 05f793d0a78..534abad613d 100644
--- a/be/src/vec/exprs/vcase_expr.cpp
+++ b/be/src/vec/exprs/vcase_expr.cpp
@@ -76,7 +76,7 @@ void VCaseExpr::close(VExprContext* context, 
FunctionContext::FunctionStateScope
     VExpr::close(context, scope);
 }
 
-Status VCaseExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VCaseExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     if (is_const_and_have_executed()) { // const have execute in open function
         return get_result_from_const(block, EXPR_NAME, result_column_id);
     }
diff --git a/be/src/vec/exprs/vcase_expr.h b/be/src/vec/exprs/vcase_expr.h
index 3cef1704bd0..e267f216127 100644
--- a/be/src/vec/exprs/vcase_expr.h
+++ b/be/src/vec/exprs/vcase_expr.h
@@ -52,7 +52,7 @@ class VCaseExpr final : public VExpr {
 public:
     VCaseExpr(const TExprNode& node);
     ~VCaseExpr() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
@@ -224,7 +224,7 @@ private:
 
     template <typename IndexType>
     ColumnPtr _execute_impl(const std::vector<ColumnPtr>& when_columns,
-                            std::vector<ColumnPtr>& then_columns, size_t 
rows_count) {
+                            std::vector<ColumnPtr>& then_columns, size_t 
rows_count) const {
         std::vector<IndexType> then_idx(rows_count, 0);
         IndexType* __restrict then_idx_ptr = then_idx.data();
         for (IndexType i = 0; i < when_columns.size(); i++) {
diff --git a/be/src/vec/exprs/vcast_expr.cpp b/be/src/vec/exprs/vcast_expr.cpp
index cc45fff40b9..c4fffb7264f 100644
--- a/be/src/vec/exprs/vcast_expr.cpp
+++ b/be/src/vec/exprs/vcast_expr.cpp
@@ -105,7 +105,7 @@ void VCastExpr::close(VExprContext* context, 
FunctionContext::FunctionStateScope
 }
 
 doris::Status VCastExpr::execute(VExprContext* context, 
doris::vectorized::Block* block,
-                                 int* result_column_id) {
+                                 int* result_column_id) const {
     DCHECK(_open_finished || _getting_const_col)
             << _open_finished << _getting_const_col << _expr_name;
     if (is_const_and_have_executed()) { // const have executed in open function
@@ -135,7 +135,7 @@ bool cast_error_code(Status& st) {
     }
 }
 
-DataTypePtr TryCastExpr::original_cast_return_type() {
+DataTypePtr TryCastExpr::original_cast_return_type() const {
     if (_original_cast_return_is_nullable) {
         return _data_type;
     } else {
@@ -143,7 +143,7 @@ DataTypePtr TryCastExpr::original_cast_return_type() {
     }
 }
 
-Status TryCastExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status TryCastExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     DCHECK(_open_finished || _getting_const_col)
             << _open_finished << _getting_const_col << _expr_name;
     if (is_const_and_have_executed()) { // const have executed in open function
@@ -203,7 +203,7 @@ Status TryCastExpr::execute(VExprContext* context, Block* 
block, int* result_col
 template <bool original_cast_reutrn_is_nullable>
 Status TryCastExpr::single_row_execute(VExprContext* context,
                                        const ColumnWithTypeAndName& input_info,
-                                       ColumnPtr& return_column) {
+                                       ColumnPtr& return_column) const {
     auto input_column = input_info.column;
     const auto& input_type = input_info.type;
     const auto& input_name = input_info.name;
diff --git a/be/src/vec/exprs/vcast_expr.h b/be/src/vec/exprs/vcast_expr.h
index afcd4e687a4..344d30e8c31 100644
--- a/be/src/vec/exprs/vcast_expr.h
+++ b/be/src/vec/exprs/vcast_expr.h
@@ -48,7 +48,7 @@ public:
 #endif
     VCastExpr(const TExprNode& node) : VExpr(node) {}
     ~VCastExpr() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
@@ -82,15 +82,15 @@ public:
 
     TryCastExpr(const TExprNode& node)
             : VCastExpr(node), 
_original_cast_return_is_nullable(node.is_cast_nullable) {}
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     ~TryCastExpr() override = default;
     std::string cast_name() const override { return "TRY CAST"; }
 
 private:
-    DataTypePtr original_cast_return_type();
+    DataTypePtr original_cast_return_type() const;
     template <bool original_cast_reutrn_is_nullable>
     Status single_row_execute(VExprContext* context, const 
ColumnWithTypeAndName& input_info,
-                              ColumnPtr& return_column);
+                              ColumnPtr& return_column) const;
 
     //Try_cast always returns nullable,
     // but we also need the information of whether the return value of the 
original cast is nullable.
diff --git a/be/src/vec/exprs/vcolumn_ref.h b/be/src/vec/exprs/vcolumn_ref.h
index d58e1375291..b04064accca 100644
--- a/be/src/vec/exprs/vcolumn_ref.h
+++ b/be/src/vec/exprs/vcolumn_ref.h
@@ -57,7 +57,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         DCHECK(_open_finished || _getting_const_col);
         *result_column_id = _column_id + _gap;
         return Status::OK();
diff --git a/be/src/vec/exprs/vcompound_pred.h 
b/be/src/vec/exprs/vcompound_pred.h
index f357f8780ae..0eeb2355bf2 100644
--- a/be/src/vec/exprs/vcompound_pred.h
+++ b/be/src/vec/exprs/vcompound_pred.h
@@ -155,7 +155,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         if (fast_execute(context, block, result_column_id)) {
             return Status::OK();
         }
diff --git a/be/src/vec/exprs/vdirect_in_predicate.h 
b/be/src/vec/exprs/vdirect_in_predicate.h
index 71b10990e55..c9fbee5a48a 100644
--- a/be/src/vec/exprs/vdirect_in_predicate.h
+++ b/be/src/vec/exprs/vdirect_in_predicate.h
@@ -54,7 +54,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         ColumnNumbers arguments;
         return _do_execute(context, block, result_column_id, arguments);
     }
@@ -111,7 +111,7 @@ public:
 
 private:
     Status _do_execute(VExprContext* context, Block* block, int* 
result_column_id,
-                       ColumnNumbers& arguments) {
+                       ColumnNumbers& arguments) const {
         DCHECK(_open_finished || _getting_const_col);
         arguments.resize(_children.size());
         for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp 
b/be/src/vec/exprs/vectorized_fn_call.cpp
index dfaa1e8a212..582d6832283 100644
--- a/be/src/vec/exprs/vectorized_fn_call.cpp
+++ b/be/src/vec/exprs/vectorized_fn_call.cpp
@@ -186,7 +186,7 @@ Status 
VectorizedFnCall::evaluate_inverted_index(VExprContext* context, uint32_t
 
 Status VectorizedFnCall::_do_execute(doris::vectorized::VExprContext* context,
                                      doris::vectorized::Block* block, int* 
result_column_id,
-                                     ColumnNumbers& args) {
+                                     ColumnNumbers& args) const {
     if (is_const_and_have_executed()) { // const have executed in open function
         return get_result_from_const(block, _expr_name, result_column_id);
     }
@@ -267,7 +267,7 @@ Status 
VectorizedFnCall::execute_runtime_filter(doris::vectorized::VExprContext*
 }
 
 Status VectorizedFnCall::execute(VExprContext* context, vectorized::Block* 
block,
-                                 int* result_column_id) {
+                                 int* result_column_id) const {
     ColumnNumbers arguments;
     return _do_execute(context, block, result_column_id, arguments);
 }
diff --git a/be/src/vec/exprs/vectorized_fn_call.h 
b/be/src/vec/exprs/vectorized_fn_call.h
index fb247cf0fab..06328b00019 100644
--- a/be/src/vec/exprs/vectorized_fn_call.h
+++ b/be/src/vec/exprs/vectorized_fn_call.h
@@ -52,7 +52,7 @@ public:
     VectorizedFnCall() = default;
 #endif
     VectorizedFnCall(const TExprNode& node);
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status execute_runtime_filter(doris::vectorized::VExprContext* context,
                                   doris::vectorized::Block* block, int* 
result_column_id,
                                   ColumnNumbers& args) override;
@@ -102,7 +102,7 @@ protected:
 
 private:
     Status _do_execute(doris::vectorized::VExprContext* context, 
doris::vectorized::Block* block,
-                       int* result_column_id, ColumnNumbers& args);
+                       int* result_column_id, ColumnNumbers& args) const;
 };
 
 #include "common/compile_check_end.h"
diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp
index 4944f3f805b..5752090674d 100644
--- a/be/src/vec/exprs/vexpr.cpp
+++ b/be/src/vec/exprs/vexpr.cpp
@@ -823,7 +823,7 @@ uint64_t VExpr::get_digest(uint64_t seed) const {
 }
 
 Status VExpr::get_result_from_const(vectorized::Block* block, const 
std::string& expr_name,
-                                    int* result_column_id) {
+                                    int* result_column_id) const {
     *result_column_id = block->columns();
     auto column = ColumnConst::create(_constant_col->column_ptr, 
block->rows());
     block->insert({std::move(column), _data_type, expr_name});
@@ -974,7 +974,7 @@ size_t VExpr::estimate_memory(const size_t rows) {
 }
 
 bool VExpr::fast_execute(doris::vectorized::VExprContext* context, 
doris::vectorized::Block* block,
-                         int* result_column_id) {
+                         int* result_column_id) const {
     if (context->get_inverted_index_context() &&
         
context->get_inverted_index_context()->get_inverted_index_result_column().contains(this))
 {
         uint32_t num_columns_without_result = block->columns();
diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h
index 9668edb8263..86a6ed6bde1 100644
--- a/be/src/vec/exprs/vexpr.h
+++ b/be/src/vec/exprs/vexpr.h
@@ -130,7 +130,7 @@ public:
         return Status::InternalError(expr_name() + " is not ready when 
execute");
     }
 
-    virtual Status execute(VExprContext* context, Block* block, int* 
result_column_id) = 0;
+    virtual Status execute(VExprContext* context, Block* block, int* 
result_column_id) const = 0;
     // `is_blockable` means this expr will be blocked in `execute` (e.g. AI 
Function, Remote Function)
     [[nodiscard]] virtual bool is_blockable() const {
         return std::any_of(_children.begin(), _children.end(),
@@ -279,7 +279,7 @@ public:
 
     // fast_execute can direct copy expr filter result which build by apply 
index in segment_iterator
     bool fast_execute(doris::vectorized::VExprContext* context, 
doris::vectorized::Block* block,
-                      int* result_column_id);
+                      int* result_column_id) const;
 
     virtual bool can_push_down_to_index() const { return false; }
     virtual bool equals(const VExpr& other);
@@ -348,10 +348,12 @@ protected:
         return res;
     }
 
-    bool is_const_and_have_executed() { return (is_constant() && 
(_constant_col != nullptr)); }
+    bool is_const_and_have_executed() const {
+        return (is_constant() && (_constant_col != nullptr));
+    }
 
     Status get_result_from_const(vectorized::Block* block, const std::string& 
expr_name,
-                                 int* result_column_id);
+                                 int* result_column_id) const;
 
     Status check_constant(const Block& block, ColumnNumbers arguments) const;
 
diff --git a/be/src/vec/exprs/vin_predicate.cpp 
b/be/src/vec/exprs/vin_predicate.cpp
index 7570b98481b..f6f50b0ca6b 100644
--- a/be/src/vec/exprs/vin_predicate.cpp
+++ b/be/src/vec/exprs/vin_predicate.cpp
@@ -114,7 +114,7 @@ Status VInPredicate::evaluate_inverted_index(VExprContext* 
context, uint32_t seg
     return _evaluate_inverted_index(context, _function, segment_num_rows);
 }
 
-Status VInPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VInPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     if (is_const_and_have_executed()) { // const have execute in open function
         return get_result_from_const(block, _expr_name, result_column_id);
     }
diff --git a/be/src/vec/exprs/vin_predicate.h b/be/src/vec/exprs/vin_predicate.h
index b7cfc2ef6c8..af444e3e5ab 100644
--- a/be/src/vec/exprs/vin_predicate.h
+++ b/be/src/vec/exprs/vin_predicate.h
@@ -45,7 +45,7 @@ public:
     VInPredicate() = default;
 #endif
     ~VInPredicate() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     size_t estimate_memory(const size_t rows) override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
diff --git a/be/src/vec/exprs/vinfo_func.cpp b/be/src/vec/exprs/vinfo_func.cpp
index cdfe7de2289..3c18fbe1bf8 100644
--- a/be/src/vec/exprs/vinfo_func.cpp
+++ b/be/src/vec/exprs/vinfo_func.cpp
@@ -55,7 +55,8 @@ VInfoFunc::VInfoFunc(const TExprNode& node) : VExpr(node) {
     this->_column_ptr = _data_type->create_column_const(1, field);
 }
 
-Status VInfoFunc::execute(VExprContext* context, vectorized::Block* block, 
int* result_column_id) {
+Status VInfoFunc::execute(VExprContext* context, vectorized::Block* block,
+                          int* result_column_id) const {
     // Info function should return least one row, e.g. select current_user().
     size_t row_size = std::max(block->rows(), 1UL);
     *result_column_id = VExpr::insert_param(block, {_column_ptr, _data_type, 
_expr_name}, row_size);
diff --git a/be/src/vec/exprs/vinfo_func.h b/be/src/vec/exprs/vinfo_func.h
index c21ef6bf07f..d804e697045 100644
--- a/be/src/vec/exprs/vinfo_func.h
+++ b/be/src/vec/exprs/vinfo_func.h
@@ -39,7 +39,7 @@ public:
     ~VInfoFunc() override = default;
 
     const std::string& expr_name() const override { return _expr_name; }
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
 
 private:
     const std::string _expr_name = "vinfofunc expr";
diff --git a/be/src/vec/exprs/virtual_slot_ref.cpp 
b/be/src/vec/exprs/virtual_slot_ref.cpp
index 8a83dca3b6f..eed6b56ef9a 100644
--- a/be/src/vec/exprs/virtual_slot_ref.cpp
+++ b/be/src/vec/exprs/virtual_slot_ref.cpp
@@ -110,7 +110,7 @@ Status VirtualSlotRef::open(RuntimeState* state, 
VExprContext* context,
     return Status::OK();
 }
 
-Status VirtualSlotRef::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VirtualSlotRef::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     if (_column_id >= 0 && _column_id >= block->columns()) {
         return Status::Error<ErrorCode::INTERNAL_ERROR>(
                 "input block not contain slot column {}, column_id={}, 
block={}", *_column_name,
diff --git a/be/src/vec/exprs/virtual_slot_ref.h 
b/be/src/vec/exprs/virtual_slot_ref.h
index 85ca13d1ae4..3640542e713 100644
--- a/be/src/vec/exprs/virtual_slot_ref.h
+++ b/be/src/vec/exprs/virtual_slot_ref.h
@@ -31,7 +31,7 @@ public:
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     const std::string& expr_name() const override;
     std::string expr_label() override;
     std::string debug_string() const override;
diff --git a/be/src/vec/exprs/vlambda_function_call_expr.h 
b/be/src/vec/exprs/vlambda_function_call_expr.h
index cd35ff67558..655097ca3df 100644
--- a/be/src/vec/exprs/vlambda_function_call_expr.h
+++ b/be/src/vec/exprs/vlambda_function_call_expr.h
@@ -63,7 +63,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         DCHECK(_open_finished || _getting_const_col);
         return _lambda_function->execute(context, block, result_column_id, 
_data_type, _children);
     }
diff --git a/be/src/vec/exprs/vlambda_function_expr.h 
b/be/src/vec/exprs/vlambda_function_expr.h
index 9382aa78148..8b8d79bf866 100644
--- a/be/src/vec/exprs/vlambda_function_expr.h
+++ b/be/src/vec/exprs/vlambda_function_expr.h
@@ -42,7 +42,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         DCHECK(_open_finished || _getting_const_col);
         return get_child(0)->execute(context, block, result_column_id);
     }
diff --git a/be/src/vec/exprs/vliteral.cpp b/be/src/vec/exprs/vliteral.cpp
index 0d9647c770f..6ded1b15a56 100644
--- a/be/src/vec/exprs/vliteral.cpp
+++ b/be/src/vec/exprs/vliteral.cpp
@@ -49,7 +49,8 @@ Status VLiteral::prepare(RuntimeState* state, const 
RowDescriptor& desc, VExprCo
     return Status::OK();
 }
 
-Status VLiteral::execute(VExprContext* context, vectorized::Block* block, int* 
result_column_id) {
+Status VLiteral::execute(VExprContext* context, vectorized::Block* block,
+                         int* result_column_id) const {
     // Literal expr should return least one row.
     // sometimes we just use a VLiteral without open or prepare. so can't 
check it at this moment
     size_t row_size = std::max(block->rows(), _column_ptr->size());
diff --git a/be/src/vec/exprs/vliteral.h b/be/src/vec/exprs/vliteral.h
index 99a190a77f8..e3b7084765a 100644
--- a/be/src/vec/exprs/vliteral.h
+++ b/be/src/vec/exprs/vliteral.h
@@ -48,7 +48,7 @@ public:
 #endif
 
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
 
     const std::string& expr_name() const override { return _expr_name; }
     std::string debug_string() const override;
diff --git a/be/src/vec/exprs/vmatch_predicate.cpp 
b/be/src/vec/exprs/vmatch_predicate.cpp
index cfa99cffe0e..1b561ad1909 100644
--- a/be/src/vec/exprs/vmatch_predicate.cpp
+++ b/be/src/vec/exprs/vmatch_predicate.cpp
@@ -135,7 +135,7 @@ Status 
VMatchPredicate::evaluate_inverted_index(VExprContext* context, uint32_t
     return _evaluate_inverted_index(context, _function, segment_num_rows);
 }
 
-Status VMatchPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VMatchPredicate::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     DCHECK(_open_finished || _getting_const_col);
     if (fast_execute(context, block, result_column_id)) {
         return Status::OK();
diff --git a/be/src/vec/exprs/vmatch_predicate.h 
b/be/src/vec/exprs/vmatch_predicate.h
index af3f0d1ddf5..68ddb4c6a9e 100644
--- a/be/src/vec/exprs/vmatch_predicate.h
+++ b/be/src/vec/exprs/vmatch_predicate.h
@@ -49,7 +49,7 @@ class VMatchPredicate final : public VExpr {
 public:
     VMatchPredicate(const TExprNode& node);
     ~VMatchPredicate() override;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.cpp 
b/be/src/vec/exprs/vruntimefilter_wrapper.cpp
index 9b2a40cced0..55b61309979 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.cpp
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.cpp
@@ -87,7 +87,8 @@ void VRuntimeFilterWrapper::close(VExprContext* context,
     _impl->close(context, scope);
 }
 
-Status VRuntimeFilterWrapper::execute(VExprContext* context, Block* block, 
int* result_column_id) {
+Status VRuntimeFilterWrapper::execute(VExprContext* context, Block* block,
+                                      int* result_column_id) const {
     DCHECK(_open_finished || _getting_const_col);
     if (_judge_counter.fetch_sub(1) == 0) {
         reset_judge_selectivity();
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.h 
b/be/src/vec/exprs/vruntimefilter_wrapper.h
index 2fbdf4a2043..c0947efac77 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.h
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.h
@@ -53,7 +53,7 @@ public:
     VRuntimeFilterWrapper(const TExprNode& node, VExprSPtr impl, double 
ignore_thredhold,
                           bool null_aware, int filter_id);
     ~VRuntimeFilterWrapper() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
@@ -119,7 +119,7 @@ public:
     }
 
 private:
-    void reset_judge_selectivity() {
+    void reset_judge_selectivity() const {
         _always_true = false;
         _judge_counter = config::runtime_filter_sampling_frequency;
         _judge_input_rows = 0;
@@ -135,10 +135,10 @@ private:
     // is evaluated as true, the logic for always_true is applied for the rest 
of that period
     // without recalculating. At the beginning of the next period,
     // reset_judge_selectivity is used to reset these variables.
-    std::atomic_int _judge_counter = 0;
-    std::atomic_uint64_t _judge_input_rows = 0;
-    std::atomic_uint64_t _judge_filter_rows = 0;
-    std::atomic_int _always_true = false;
+    mutable std::atomic_int _judge_counter = 0;
+    mutable std::atomic_uint64_t _judge_input_rows = 0;
+    mutable std::atomic_uint64_t _judge_filter_rows = 0;
+    mutable std::atomic_int _always_true = false;
 
     std::shared_ptr<RuntimeProfile::Counter> _rf_input_rows =
             std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
diff --git a/be/src/vec/exprs/vsearch.cpp b/be/src/vec/exprs/vsearch.cpp
index 1786aa73fa2..def87bccc81 100644
--- a/be/src/vec/exprs/vsearch.cpp
+++ b/be/src/vec/exprs/vsearch.cpp
@@ -125,7 +125,7 @@ const std::string& VSearchExpr::expr_name() const {
     return name;
 }
 
-Status VSearchExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VSearchExpr::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     if (fast_execute(context, block, result_column_id)) {
         return Status::OK();
     }
diff --git a/be/src/vec/exprs/vsearch.h b/be/src/vec/exprs/vsearch.h
index d9b5e40985c..ede53c6872a 100644
--- a/be/src/vec/exprs/vsearch.h
+++ b/be/src/vec/exprs/vsearch.h
@@ -26,7 +26,7 @@ class VSearchExpr : public VExpr {
 public:
     VSearchExpr(const TExprNode& node);
     ~VSearchExpr() override = default;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
     const std::string& expr_name() const override;
     Status evaluate_inverted_index(VExprContext* context, uint32_t 
segment_num_rows) override;
 
diff --git a/be/src/vec/exprs/vslot_ref.cpp b/be/src/vec/exprs/vslot_ref.cpp
index e35e9a5f958..dadc394633e 100644
--- a/be/src/vec/exprs/vslot_ref.cpp
+++ b/be/src/vec/exprs/vslot_ref.cpp
@@ -88,7 +88,7 @@ Status VSlotRef::open(RuntimeState* state, VExprContext* 
context,
     return Status::OK();
 }
 
-Status VSlotRef::execute(VExprContext* context, Block* block, int* 
result_column_id) {
+Status VSlotRef::execute(VExprContext* context, Block* block, int* 
result_column_id) const {
     if (_column_id >= 0 && _column_id >= block->columns()) {
         return Status::Error<ErrorCode::INTERNAL_ERROR>(
                 "input block not contain slot column {}, column_id={}, 
block={}", *_column_name,
diff --git a/be/src/vec/exprs/vslot_ref.h b/be/src/vec/exprs/vslot_ref.h
index 7a4315c7ba0..4b60fab75a5 100644
--- a/be/src/vec/exprs/vslot_ref.h
+++ b/be/src/vec/exprs/vslot_ref.h
@@ -46,7 +46,7 @@ public:
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
     Status open(RuntimeState* state, VExprContext* context,
                 FunctionContext::FunctionStateScope scope) override;
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override;
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override;
 
     const std::string& expr_name() const override;
     std::string expr_label() override;
diff --git a/be/src/vec/exprs/vtopn_pred.h b/be/src/vec/exprs/vtopn_pred.h
index 6a21e62125b..953ec914817 100644
--- a/be/src/vec/exprs/vtopn_pred.h
+++ b/be/src/vec/exprs/vtopn_pred.h
@@ -81,7 +81,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         if (!_predicate->has_value()) {
             block->insert({create_always_true_column(block->rows(), 
_data_type->is_nullable()),
                            _data_type, _expr_name});
diff --git a/be/test/exprs/mock_vexpr.h b/be/test/exprs/mock_vexpr.h
index b8260dba657..720e2f0dd62 100644
--- a/be/test/exprs/mock_vexpr.h
+++ b/be/test/exprs/mock_vexpr.h
@@ -29,8 +29,8 @@ class MockVExpr : public VExpr {
 public:
     MOCK_CONST_METHOD0(clone, VExprSPtr());
     MOCK_CONST_METHOD0(expr_name, const std::string&());
-    MOCK_METHOD3(execute,
-                 Status(VExprContext* context, vectorized::Block* block, int* 
result_column_id));
+    MOCK_CONST_METHOD3(execute, Status(VExprContext* context, 
vectorized::Block* block,
+                                       int* result_column_id));
 }; // class MockVExpr
 
 } // namespace vectorized
diff --git a/be/test/exprs/virtual_slot_ref_test.cpp 
b/be/test/exprs/virtual_slot_ref_test.cpp
index 069ade32430..420b44c32d3 100644
--- a/be/test/exprs/virtual_slot_ref_test.cpp
+++ b/be/test/exprs/virtual_slot_ref_test.cpp
@@ -168,7 +168,7 @@ TEST_F(VirtualSlotRefTest, 
EqualsFunction_WithDifferentTypes) {
     class MockVExpr : public VExpr {
     public:
         MockVExpr() : VExpr(std::make_shared<DataTypeString>(), false) {}
-        Status execute(VExprContext* context, Block* block, int* 
result_column_id) override {
+        Status execute(VExprContext* context, Block* block, int* 
result_column_id) const override {
             return Status::OK();
         }
         const std::string& expr_name() const override {
@@ -283,7 +283,7 @@ TEST_F(VirtualSlotRefTest, EqualsFunction_TestAllBranches) {
         DifferentVExpr() : VExpr(std::make_shared<DataTypeString>(), false) {
             _node_type = TExprNodeType::SLOT_REF; // Different from 
VIRTUAL_SLOT_REF
         }
-        Status execute(VExprContext* context, Block* block, int* 
result_column_id) override {
+        Status execute(VExprContext* context, Block* block, int* 
result_column_id) const override {
             return Status::OK();
         }
         const std::string& expr_name() const override {
@@ -303,7 +303,7 @@ TEST_F(VirtualSlotRefTest, EqualsFunction_TestAllBranches) {
         NonVirtualSlotRefExpr() : VExpr(std::make_shared<DataTypeString>(), 
false) {
             _node_type = TExprNodeType::VIRTUAL_SLOT_REF; // Same type but 
different class
         }
-        Status execute(VExprContext* context, Block* block, int* 
result_column_id) override {
+        Status execute(VExprContext* context, Block* block, int* 
result_column_id) const override {
             return Status::OK();
         }
         const std::string& expr_name() const override {
diff --git a/be/test/olap/collection_statistics_test.cpp 
b/be/test/olap/collection_statistics_test.cpp
index c9fafd960b0..669f041fc2f 100644
--- a/be/test/olap/collection_statistics_test.cpp
+++ b/be/test/olap/collection_statistics_test.cpp
@@ -48,7 +48,7 @@ public:
     TExprNodeType::type node_type() const override { return _mock_node_type; }
 
     Status execute(vectorized::VExprContext* context, vectorized::Block* block,
-                   int32_t* result_column_id) override {
+                   int32_t* result_column_id) const override {
         return Status::OK();
     }
 
diff --git a/be/test/testutil/mock/mock_fn_call.h 
b/be/test/testutil/mock/mock_fn_call.h
index f574a8373dc..59578909144 100644
--- a/be/test/testutil/mock/mock_fn_call.h
+++ b/be/test/testutil/mock/mock_fn_call.h
@@ -40,7 +40,7 @@ public:
         return Status::OK();
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         return Status::OK();
     }
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override {
diff --git a/be/test/testutil/mock/mock_in_expr.h 
b/be/test/testutil/mock/mock_in_expr.h
index 6976568c4ef..7f31d99c6cd 100644
--- a/be/test/testutil/mock/mock_in_expr.h
+++ b/be/test/testutil/mock/mock_in_expr.h
@@ -32,7 +32,7 @@ class MockInExpr final : public VInPredicate {
 public:
     MockInExpr() = default;
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         return Status::OK();
     }
     Status prepare(RuntimeState* state, const RowDescriptor& desc, 
VExprContext* context) override;
diff --git a/be/test/testutil/mock/mock_slot_ref.h 
b/be/test/testutil/mock/mock_slot_ref.h
index ca61c6debcd..87c909748d3 100644
--- a/be/test/testutil/mock/mock_slot_ref.h
+++ b/be/test/testutil/mock/mock_slot_ref.h
@@ -47,7 +47,7 @@ public:
         _data_type = data_type;
     }
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         *result_column_id = _column_id;
         return Status::OK();
     }
diff --git a/be/test/vec/exprs/try_cast_expr_test.cpp 
b/be/test/vec/exprs/try_cast_expr_test.cpp
index 2021df577c0..acf66dfb4a7 100644
--- a/be/test/vec/exprs/try_cast_expr_test.cpp
+++ b/be/test/vec/exprs/try_cast_expr_test.cpp
@@ -127,7 +127,7 @@ public:
     MOCK_CONST_METHOD0(clone, VExprSPtr());
     MOCK_CONST_METHOD0(expr_name, const std::string&());
 
-    Status execute(VExprContext* context, Block* block, int* result_column_id) 
override {
+    Status execute(VExprContext* context, Block* block, int* result_column_id) 
const override {
         auto int_type = std::make_shared<DataTypeInt32>();
         auto int_column = int_type->create_column();
         for (int i = 0; i < 3; i++) {
diff --git a/be/test/vec/exprs/vsearch_expr_test.cpp 
b/be/test/vec/exprs/vsearch_expr_test.cpp
index d356958cb87..e342b7b1645 100644
--- a/be/test/vec/exprs/vsearch_expr_test.cpp
+++ b/be/test/vec/exprs/vsearch_expr_test.cpp
@@ -69,7 +69,7 @@ public:
         return kName;
     }
 
-    Status execute(VExprContext*, Block*, int*) override { return 
Status::OK(); }
+    Status execute(VExprContext*, Block*, int*) const override { return 
Status::OK(); }
 };
 
 const std::string& intern_column_name(const std::string& name) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to