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

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


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 430d74bb7cd [Chore](pick) pick #59906 #59786 (#60050)
430d74bb7cd is described below

commit 430d74bb7cd211a8a278d006a1fc06deb432a02b
Author: Pxl <[email protected]>
AuthorDate: Fri Jan 30 16:26:43 2026 +0800

    [Chore](pick) pick #59906 #59786 (#60050)
    
    https://github.com/apache/doris/pull/59906
    https://github.com/apache/doris/pull/59786
---
 be/CMakeLists.txt                                  |  2 --
 be/src/exprs/function_filter.h                     |  2 +-
 be/src/exprs/math_functions.cpp                    |  2 +-
 be/src/olap/like_column_predicate.cpp              |  2 +-
 be/src/olap/tablet_schema.h                        |  1 -
 .../exec/multi_cast_data_stream_source.cpp         |  4 ++-
 be/src/pipeline/exec/scan_operator.cpp             | 25 ++++++++++++---
 be/src/pipeline/exec/scan_operator.h               | 14 ++++++---
 .../runtime_filter_consumer_helper.cpp             | 24 ++++-----------
 .../runtime_filter_consumer_helper.h               | 11 +++----
 be/src/udf/CMakeLists.txt                          | 26 ----------------
 be/src/util/bitmap_value.h                         |  1 -
 be/src/util/counts.h                               |  1 -
 be/src/vec/columns/column_const.h                  |  1 +
 be/src/vec/common/schema_util.cpp                  |  2 +-
 be/src/vec/common/schema_util.h                    |  1 -
 be/src/vec/common/string_buffer.hpp                |  1 +
 be/src/vec/exec/scan/file_scanner.cpp              |  8 ++---
 be/src/vec/exec/scan/scanner.cpp                   | 18 +++--------
 be/src/vec/exec/scan/scanner.h                     | 14 +--------
 .../udf.cpp => vec/exprs/function_context.cpp}     |  7 ++---
 be/src/{udf/udf.h => vec/exprs/function_context.h} | 36 ++++++++++------------
 be/src/vec/exprs/vbitmap_predicate.h               |  2 +-
 be/src/vec/exprs/vbloom_predicate.h                |  2 +-
 be/src/vec/exprs/vcase_expr.h                      |  2 +-
 be/src/vec/exprs/vcast_expr.h                      |  2 +-
 be/src/vec/exprs/vcondition_expr.cpp               |  2 +-
 be/src/vec/exprs/vcondition_expr.h                 |  2 +-
 be/src/vec/exprs/vectorized_fn_call.cpp            |  2 +-
 be/src/vec/exprs/vectorized_fn_call.h              |  2 +-
 be/src/vec/exprs/vexpr.h                           |  2 +-
 be/src/vec/exprs/vexpr_context.cpp                 |  2 +-
 be/src/vec/exprs/vexpr_context.h                   |  2 +-
 be/src/vec/exprs/vin_predicate.h                   |  2 +-
 be/src/vec/exprs/vmatch_predicate.h                |  2 +-
 be/src/vec/exprs/vruntimefilter_wrapper.h          |  2 +-
 be/src/vec/functions/date_time_transforms.h        |  2 +-
 be/src/vec/functions/function.h                    |  2 +-
 be/src/vec/functions/function_convert_tz.cpp       |  3 +-
 .../function_date_or_datetime_computation.h        |  3 +-
 be/src/vec/functions/function_java_udf.h           |  2 +-
 be/src/vec/functions/function_jsonb.cpp            |  2 +-
 be/src/vec/functions/function_multi_same_args.h    |  2 +-
 .../vec/functions/function_other_types_to_date.cpp |  3 +-
 be/src/vec/functions/function_regexp.cpp           |  2 +-
 be/src/vec/functions/function_rpc.h                |  2 +-
 be/src/vec/functions/function_string.h             |  2 +-
 be/src/vec/functions/function_tokenize.h           |  2 +-
 be/src/vec/functions/functions_geo.h               |  2 +-
 be/src/vec/functions/in.h                          |  2 +-
 be/src/vec/functions/like.h                        |  2 +-
 be/src/vec/functions/random.cpp                    |  2 +-
 be/src/vec/functions/simple_function_factory.h     |  2 +-
 be/src/vec/functions/uniform.cpp                   |  2 +-
 be/src/vec/sink/vmysql_result_writer.cpp           |  1 -
 be/src/vec/sink/writer/vhive_table_writer.h        |  1 +
 be/src/vec/utils/stringop_substring.h              |  1 -
 .../operator/analytic_sink_operator_test.cpp       |  1 -
 be/test/pipeline/thrift_builder.h                  |  1 -
 .../runtime_filter_consumer_helper_test.cpp        |  2 +-
 be/test/testutil/function_utils.cpp                |  2 +-
 be/test/vec/exec/exchange_sink_test.h              |  1 -
 be/test/vec/exprs/try_cast_expr_test.cpp           |  2 +-
 be/test/vec/function/function_eq_for_null_test.cpp |  2 +-
 be/test/vec/function/function_jsonb_test.cpp       |  2 +-
 be/test/vec/function/function_test_util.h          |  2 +-
 66 files changed, 116 insertions(+), 172 deletions(-)

diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt
index 2946f13a595..71eec4cb1ce 100644
--- a/be/CMakeLists.txt
+++ b/be/CMakeLists.txt
@@ -520,7 +520,6 @@ set(DORIS_LINK_LIBS
     Runtime
     RuntimeFilter
     Service
-    Udf
     Util
     DorisGen
     Webserver
@@ -829,7 +828,6 @@ add_subdirectory(${SRC_DIR}/olap)
 add_subdirectory(${SRC_DIR}/runtime)
 add_subdirectory(${SRC_DIR}/runtime_filter)
 add_subdirectory(${SRC_DIR}/service) # this include doris_be
-add_subdirectory(${SRC_DIR}/udf)
 add_subdirectory(${SRC_DIR}/cloud)
 
 option(BUILD_META_TOOL "Build meta tool" OFF)
diff --git a/be/src/exprs/function_filter.h b/be/src/exprs/function_filter.h
index f48010623a0..f91fb8682e6 100644
--- a/be/src/exprs/function_filter.h
+++ b/be/src/exprs/function_filter.h
@@ -18,8 +18,8 @@
 
 #include <memory>
 
-#include "udf/udf.h"
 #include "vec/common/string_ref.h" // IWYU pragma: keep
+#include "vec/exprs/function_context.h"
 
 namespace doris {
 
diff --git a/be/src/exprs/math_functions.cpp b/be/src/exprs/math_functions.cpp
index 6b1d060e06b..b39a263799a 100644
--- a/be/src/exprs/math_functions.cpp
+++ b/be/src/exprs/math_functions.cpp
@@ -29,8 +29,8 @@
 #include <limits>
 #include <string_view>
 
-#include "udf/udf.h"
 #include "util/string_parser.hpp"
+#include "vec/exprs/function_context.h"
 
 namespace doris {
 
diff --git a/be/src/olap/like_column_predicate.cpp 
b/be/src/olap/like_column_predicate.cpp
index 813acaabca6..ca9d45c3af5 100644
--- a/be/src/olap/like_column_predicate.cpp
+++ b/be/src/olap/like_column_predicate.cpp
@@ -18,9 +18,9 @@
 #include "olap/like_column_predicate.h"
 
 #include "runtime/define_primitive_type.h"
-#include "udf/udf.h"
 #include "vec/columns/predicate_column.h"
 #include "vec/common/string_ref.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/like.h"
 
 namespace doris {
diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h
index fca6645bee8..57da8305590 100644
--- a/be/src/olap/tablet_schema.h
+++ b/be/src/olap/tablet_schema.h
@@ -42,7 +42,6 @@
 #include "runtime/define_primitive_type.h"
 #include "runtime/descriptors.h"
 #include "runtime/memory/lru_cache_policy.h"
-#include "udf/udf.h"
 #include "util/debug_points.h"
 #include "util/string_parser.hpp"
 #include "util/string_util.h"
diff --git a/be/src/pipeline/exec/multi_cast_data_stream_source.cpp 
b/be/src/pipeline/exec/multi_cast_data_stream_source.cpp
index 6933937737c..936199ad20b 100644
--- a/be/src/pipeline/exec/multi_cast_data_stream_source.cpp
+++ b/be/src/pipeline/exec/multi_cast_data_stream_source.cpp
@@ -97,8 +97,10 @@ Status 
MultiCastDataStreamerSourceOperatorX::get_block(RuntimeState* state,
     }
 
     int arrived_rf_num = 0;
+    // No lock needed here because this is single-threaded execution without 
scanners
+    // and no concurrent access to _conjuncts
     RETURN_IF_ERROR(local_state._helper.try_append_late_arrival_runtime_filter(
-            state, &arrived_rf_num, local_state._conjuncts, 
_multi_cast_output_row_descriptor));
+            state, _multi_cast_output_row_descriptor, arrived_rf_num, 
local_state._conjuncts));
 
     if (!local_state._conjuncts.empty() && !output_block->empty()) {
         SCOPED_TIMER(local_state._filter_timer);
diff --git a/be/src/pipeline/exec/scan_operator.cpp 
b/be/src/pipeline/exec/scan_operator.cpp
index 6a4d34ac6d5..143fb9cab8b 100644
--- a/be/src/pipeline/exec/scan_operator.cpp
+++ b/be/src/pipeline/exec/scan_operator.cpp
@@ -73,6 +73,24 @@ bool ScanLocalState<Derived>::should_run_serial() const {
     return _parent->cast<typename Derived::Parent>()._should_run_serial;
 }
 
+Status ScanLocalStateBase::update_late_arrival_runtime_filter(RuntimeState* 
state,
+                                                              int& 
arrived_rf_num) {
+    // Lock needed because _conjuncts can be accessed concurrently by multiple 
scanner threads
+    std::unique_lock lock(_conjuncts_lock);
+    return _helper.try_append_late_arrival_runtime_filter(state, 
_parent->row_descriptor(),
+                                                          arrived_rf_num, 
_conjuncts);
+}
+
+Status ScanLocalStateBase::clone_conjunct_ctxs(vectorized::VExprContextSPtrs& 
scanner_conjuncts) {
+    // Lock needed because _conjuncts can be accessed concurrently by multiple 
scanner threads
+    std::unique_lock lock(_conjuncts_lock);
+    scanner_conjuncts.resize(_conjuncts.size());
+    for (size_t i = 0; i != _conjuncts.size(); ++i) {
+        RETURN_IF_ERROR(_conjuncts[i]->clone(_state, scanner_conjuncts[i]));
+    }
+    return Status::OK();
+}
+
 int ScanLocalStateBase::max_scanners_concurrency(RuntimeState* state) const {
     // For select * from table limit 10; should just use one thread.
     if (should_run_serial()) {
@@ -151,10 +169,6 @@ Status ScanLocalState<Derived>::open(RuntimeState* state) {
                 p._common_expr_ctxs_push_down[i]->clone(state, 
_common_expr_ctxs_push_down[i]));
     }
     RETURN_IF_ERROR(_helper.acquire_runtime_filter(state, _conjuncts, 
p.row_descriptor()));
-    _stale_expr_ctxs.resize(p._stale_expr_ctxs.size());
-    for (size_t i = 0; i < _stale_expr_ctxs.size(); i++) {
-        RETURN_IF_ERROR(p._stale_expr_ctxs[i]->clone(state, 
_stale_expr_ctxs[i]));
-    }
     RETURN_IF_ERROR(_process_conjuncts(state));
 
     auto status = _eos ? Status::OK() : _prepare_scanners();
@@ -274,7 +288,8 @@ Status 
ScanLocalState<Derived>::_normalize_conjuncts(RuntimeState* state) {
                     continue;
                 }
             } else { // All conjuncts are pushed down as predicate column
-                _stale_expr_ctxs.emplace_back(conjunct);
+                _stale_expr_ctxs.emplace_back(
+                        conjunct); // avoid function context and constant str 
being freed
                 it = _conjuncts.erase(it);
                 continue;
             }
diff --git a/be/src/pipeline/exec/scan_operator.h 
b/be/src/pipeline/exec/scan_operator.h
index 2b695479e71..3f98ad83c12 100644
--- a/be/src/pipeline/exec/scan_operator.h
+++ b/be/src/pipeline/exec/scan_operator.h
@@ -18,6 +18,7 @@
 #pragma once
 
 #include <cstdint>
+#include <mutex>
 #include <string>
 
 #include "common/status.h"
@@ -85,6 +86,10 @@ public:
 
     [[nodiscard]] std::string get_name() { return _parent->get_name(); }
 
+    Status update_late_arrival_runtime_filter(RuntimeState* state, int& 
arrived_rf_num);
+
+    Status clone_conjunct_ctxs(vectorized::VExprContextSPtrs& 
scanner_conjuncts);
+
 protected:
     friend class vectorized::ScannerContext;
     friend class vectorized::Scanner;
@@ -118,6 +123,7 @@ protected:
     RuntimeProfile::Counter* _scan_rows = nullptr;
     RuntimeProfile::Counter* _scan_bytes = nullptr;
 
+    std::mutex _conjuncts_lock;
     RuntimeFilterConsumerHelper _helper;
 };
 
@@ -301,8 +307,9 @@ protected:
 
     Status _get_topn_filters(RuntimeState* state);
 
-    // Every time vconjunct_ctx_ptr is updated, the old ctx will be stored in 
this vector
-    // so that it will be destroyed uniformly at the end of the query.
+    // Stores conjuncts that have been fully pushed down to the storage layer 
as predicate columns.
+    // These expr contexts are kept alive to prevent their FunctionContext and 
constant strings
+    // from being freed prematurely.
     vectorized::VExprContextSPtrs _stale_expr_ctxs;
     vectorized::VExprContextSPtrs _common_expr_ctxs_push_down;
 
@@ -411,9 +418,6 @@ protected:
     // single scanner to avoid too many scanners which will cause lots of 
useless read.
     bool _should_run_serial = false;
 
-    // Every time vconjunct_ctx_ptr is updated, the old ctx will be stored in 
this vector
-    // so that it will be destroyed uniformly at the end of the query.
-    vectorized::VExprContextSPtrs _stale_expr_ctxs;
     vectorized::VExprContextSPtrs _common_expr_ctxs_push_down;
 
     // If sort info is set, push limit to each scanner;
diff --git a/be/src/runtime_filter/runtime_filter_consumer_helper.cpp 
b/be/src/runtime_filter/runtime_filter_consumer_helper.cpp
index bf871d34fec..3e920b33a6d 100644
--- a/be/src/runtime_filter/runtime_filter_consumer_helper.cpp
+++ b/be/src/runtime_filter/runtime_filter_consumer_helper.cpp
@@ -96,10 +96,10 @@ Status 
RuntimeFilterConsumerHelper::_append_rf_into_conjuncts(
 }
 
 Status RuntimeFilterConsumerHelper::try_append_late_arrival_runtime_filter(
-        RuntimeState* state, int* arrived_rf_num, 
vectorized::VExprContextSPtrs& conjuncts,
-        const RowDescriptor& row_descriptor) {
+        RuntimeState* state, const RowDescriptor& row_descriptor, int& 
arrived_rf_num,
+        vectorized::VExprContextSPtrs& arrived_conjuncts) {
     if (_is_all_rf_applied) {
-        *arrived_rf_num = cast_set<int>(_runtime_filter_descs.size());
+        arrived_rf_num = cast_set<int>(_runtime_filter_descs.size());
         return Status::OK();
     }
 
@@ -107,7 +107,7 @@ Status 
RuntimeFilterConsumerHelper::try_append_late_arrival_runtime_filter(
     // So need to add lock
     std::unique_lock l(_rf_locks);
     if (_is_all_rf_applied) {
-        *arrived_rf_num = cast_set<int>(_runtime_filter_descs.size());
+        arrived_rf_num = cast_set<int>(_runtime_filter_descs.size());
         return Status::OK();
     }
 
@@ -120,24 +120,12 @@ Status 
RuntimeFilterConsumerHelper::try_append_late_arrival_runtime_filter(
     }
     // 2. Append unapplied runtime filters to _conjuncts
     if (!exprs.empty()) {
-        RETURN_IF_ERROR(_append_rf_into_conjuncts(state, exprs, conjuncts, 
row_descriptor));
+        RETURN_IF_ERROR(_append_rf_into_conjuncts(state, exprs, 
arrived_conjuncts, row_descriptor));
     }
     if (current_arrived_rf_num == _runtime_filter_descs.size()) {
         _is_all_rf_applied = true;
     }
-
-    *arrived_rf_num = current_arrived_rf_num;
-    return Status::OK();
-}
-
-Status RuntimeFilterConsumerHelper::clone_conjunct_ctxs(
-        RuntimeState* state, vectorized::VExprContextSPtrs& scanner_conjuncts,
-        vectorized::VExprContextSPtrs& local_state_conjuncts) {
-    std::unique_lock l(_rf_locks);
-    scanner_conjuncts.resize(local_state_conjuncts.size());
-    for (size_t i = 0; i != local_state_conjuncts.size(); ++i) {
-        RETURN_IF_ERROR(local_state_conjuncts[i]->clone(state, 
scanner_conjuncts[i]));
-    }
+    arrived_rf_num = current_arrived_rf_num;
     return Status::OK();
 }
 
diff --git a/be/src/runtime_filter/runtime_filter_consumer_helper.h 
b/be/src/runtime_filter/runtime_filter_consumer_helper.h
index 6b077ac3885..e69fff0e7c5 100644
--- a/be/src/runtime_filter/runtime_filter_consumer_helper.h
+++ b/be/src/runtime_filter/runtime_filter_consumer_helper.h
@@ -44,13 +44,10 @@ public:
     // The un-arrival filters will be checked every time the scanner is 
scheduled.
     // And once new runtime filters arrived, we will use it to do operator's 
filtering.
     // Called by Scanner.
-    Status try_append_late_arrival_runtime_filter(RuntimeState* state, int* 
arrived_rf_num,
-                                                  
vectorized::VExprContextSPtrs& conjuncts,
-                                                  const RowDescriptor& 
row_descriptor);
-
-    Status clone_conjunct_ctxs(RuntimeState* state,
-                               vectorized::VExprContextSPtrs& 
scanner_conjuncts,
-                               vectorized::VExprContextSPtrs& 
local_state_conjuncts);
+    Status try_append_late_arrival_runtime_filter(RuntimeState* state,
+                                                  const RowDescriptor& 
row_descriptor,
+                                                  int& arrived_rf_num,
+                                                  
vectorized::VExprContextSPtrs& arrived_conjuncts);
 
     // Called by XXXLocalState::close()
     // parent_operator_profile is owned by LocalState so update it is safe at 
here.
diff --git a/be/src/udf/CMakeLists.txt b/be/src/udf/CMakeLists.txt
deleted file mode 100755
index 60ea86cf761..00000000000
--- a/be/src/udf/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-set(LIBRARY_OUTPUT_PATH "${BUILD_DIR}/src/udf")
-
-# where to put generated binaries
-set(EXECUTABLE_OUTPUT_PATH "${BUILD_DIR}/src/udf")
-
-# Build this library twice. Once to be linked into the main Doris. This version
-# can have dependencies on our other libs. The second version is shipped as 
part
-# of the UDF sdk, which can't use other libs.
-add_library(Udf STATIC udf.cpp)
\ No newline at end of file
diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h
index dbdd1ff84c1..77a1a9a0b1d 100644
--- a/be/src/util/bitmap_value.h
+++ b/be/src/util/bitmap_value.h
@@ -39,7 +39,6 @@
 #include "common/config.h"
 #include "common/exception.h"
 #include "common/logging.h"
-#include "udf/udf.h"
 #include "util/coding.h"
 #include "vec/common/pod_array.h"
 #include "vec/common/pod_array_fwd.h"
diff --git a/be/src/util/counts.h b/be/src/util/counts.h
index 178481e7c90..5954ef31cb4 100644
--- a/be/src/util/counts.h
+++ b/be/src/util/counts.h
@@ -23,7 +23,6 @@
 #include <cmath>
 #include <queue>
 
-#include "udf/udf.h"
 #include "vec/common/pod_array.h"
 #include "vec/common/string_buffer.hpp"
 #include "vec/io/io_helper.h"
diff --git a/be/src/vec/columns/column_const.h 
b/be/src/vec/columns/column_const.h
index f3d20836581..cbb39867441 100644
--- a/be/src/vec/columns/column_const.h
+++ b/be/src/vec/columns/column_const.h
@@ -34,6 +34,7 @@
 
 #include "vec/columns/column.h"
 #include "vec/columns/column_nullable.h"
+#include "vec/common/arena.h"
 #include "vec/common/assert_cast.h"
 #include "vec/common/cow.h"
 #include "vec/common/string_ref.h"
diff --git a/be/src/vec/common/schema_util.cpp 
b/be/src/vec/common/schema_util.cpp
index 27e3c3ec7f4..7f49dc1dd02 100644
--- a/be/src/vec/common/schema_util.cpp
+++ b/be/src/vec/common/schema_util.cpp
@@ -60,7 +60,6 @@
 #include "runtime/exec_env.h"
 #include "runtime/primitive_type.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
 #include "util/defer_op.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_array.h"
@@ -84,6 +83,7 @@
 #include "vec/data_types/data_type_string.h"
 #include "vec/data_types/data_type_variant.h"
 #include "vec/data_types/get_least_supertype.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
 #include "vec/json/json_parser.h"
diff --git a/be/src/vec/common/schema_util.h b/be/src/vec/common/schema_util.h
index 8e738ee3c10..849f0ae4e1e 100644
--- a/be/src/vec/common/schema_util.h
+++ b/be/src/vec/common/schema_util.h
@@ -29,7 +29,6 @@
 #include "common/status.h"
 #include "olap/tablet_fwd.h"
 #include "olap/tablet_schema.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_variant.h"
diff --git a/be/src/vec/common/string_buffer.hpp 
b/be/src/vec/common/string_buffer.hpp
index 15d4f933db9..809bdffcd58 100644
--- a/be/src/vec/common/string_buffer.hpp
+++ b/be/src/vec/common/string_buffer.hpp
@@ -21,6 +21,7 @@
 #include <cstring>
 
 #include "vec/columns/column_string.h"
+#include "vec/common/arena.h"
 #include "vec/common/string_ref.h"
 
 namespace doris::vectorized {
diff --git a/be/src/vec/exec/scan/file_scanner.cpp 
b/be/src/vec/exec/scan/file_scanner.cpp
index 872f2b51c22..be471a85438 100644
--- a/be/src/vec/exec/scan/file_scanner.cpp
+++ b/be/src/vec/exec/scan/file_scanner.cpp
@@ -362,13 +362,9 @@ Status FileScanner::_process_late_arrival_conjuncts(bool* 
changed,
     *changed = false;
     if (_push_down_conjuncts.size() < _conjuncts.size()) {
         *changed = true;
-        _push_down_conjuncts.clear();
-        _push_down_conjuncts.resize(_conjuncts.size());
-        for (size_t i = 0; i != _conjuncts.size(); ++i) {
-            RETURN_IF_ERROR(_conjuncts[i]->clone(_state, 
_push_down_conjuncts[i]));
-        }
+        _push_down_conjuncts = _conjuncts;
+        _conjuncts.clear();
         RETURN_IF_ERROR(_process_conjuncts());
-        _discard_conjuncts();
         new_push_down_conjuncts = _push_down_conjuncts;
     }
     if (_applied_rf_num == _total_rf_num) {
diff --git a/be/src/vec/exec/scan/scanner.cpp b/be/src/vec/exec/scan/scanner.cpp
index 517c45d14cc..483aa545eec 100644
--- a/be/src/vec/exec/scan/scanner.cpp
+++ b/be/src/vec/exec/scan/scanner.cpp
@@ -193,27 +193,17 @@ Status Scanner::try_append_late_arrival_runtime_filter() {
         return Status::OK();
     }
     DCHECK(_applied_rf_num < _total_rf_num);
-
     int arrived_rf_num = 0;
-    
RETURN_IF_ERROR(_local_state->_helper.try_append_late_arrival_runtime_filter(
-            _state, &arrived_rf_num, _local_state->_conjuncts,
-            _local_state->_parent->row_descriptor()));
+    RETURN_IF_ERROR(_local_state->update_late_arrival_runtime_filter(_state, 
arrived_rf_num));
 
     if (arrived_rf_num == _applied_rf_num) {
         // No newly arrived runtime filters, just return;
         return Status::OK();
     }
 
-    // There are newly arrived runtime filters,
-    // renew the _conjuncts
-    if (!_conjuncts.empty()) {
-        _discard_conjuncts();
-    }
-    // Notice that the number of runtime filters may be larger than 
_applied_rf_num.
-    // But it is ok because it will be updated at next time.
-    RETURN_IF_ERROR(_local_state->_helper.clone_conjunct_ctxs(_state, 
_conjuncts,
-                                                              
_local_state->_conjuncts));
-    _applied_rf_num = arrived_rf_num;
+    // avoid conjunct destroy in used by storage layer
+    _conjuncts.clear();
+    RETURN_IF_ERROR(_local_state->clone_conjunct_ctxs(_conjuncts));
     return Status::OK();
 }
 
diff --git a/be/src/vec/exec/scan/scanner.h b/be/src/vec/exec/scan/scanner.h
index f48be266bb4..060c5db9449 100644
--- a/be/src/vec/exec/scan/scanner.h
+++ b/be/src/vec/exec/scan/scanner.h
@@ -70,7 +70,6 @@ public:
         _projections.clear();
         _origin_block.clear();
         _common_expr_ctxs_push_down.clear();
-        _stale_expr_ctxs.clear();
         DorisMetrics::instance()->scanner_cnt->increment(-1);
     }
 
@@ -144,7 +143,7 @@ public:
 
     RuntimeState* runtime_state() { return _state; }
 
-    bool is_open() { return _is_open; }
+    bool is_open() const { return _is_open; }
     void set_opened() { _is_open = true; }
 
     virtual doris::TabletStorageType get_storage_type() {
@@ -173,13 +172,6 @@ public:
     void update_block_avg_bytes(size_t block_avg_bytes) { _block_avg_bytes = 
block_avg_bytes; }
 
 protected:
-    void _discard_conjuncts() {
-        for (auto& conjunct : _conjuncts) {
-            _stale_expr_ctxs.emplace_back(conjunct);
-        }
-        _conjuncts.clear();
-    }
-
     RuntimeState* _state = nullptr;
     pipeline::ScanLocalStateBase* _local_state = nullptr;
 
@@ -213,10 +205,6 @@ protected:
     vectorized::Block _origin_block;
 
     VExprContextSPtrs _common_expr_ctxs_push_down;
-    // Late arriving runtime filters will update _conjuncts.
-    // The old _conjuncts will be temporarily placed in _stale_expr_ctxs
-    // and will be destroyed at the end.
-    VExprContextSPtrs _stale_expr_ctxs;
 
     // num of rows read from scanner
     int64_t _num_rows_read = 0;
diff --git a/be/src/udf/udf.cpp b/be/src/vec/exprs/function_context.cpp
similarity index 96%
rename from be/src/udf/udf.cpp
rename to be/src/vec/exprs/function_context.cpp
index 185ad46edd6..391ba9142ad 100644
--- a/be/src/udf/udf.cpp
+++ b/be/src/vec/exprs/function_context.cpp
@@ -14,16 +14,13 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-// This file is copied from
-// https://github.com/apache/impala/blob/branch-2.9.0/be/src/udf/udf.cpp
-// and modified by Doris
 
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 
 #include <iostream>
 #include <utility>
 
-// Be careful what this includes since this needs to be linked into the UDF's
+// Be careful what this includes since this needs to be linked into UDF's
 // binary. For example, it would be unfortunate if they had a random dependency
 // on libhdfs.
 #include "common/cast_set.h"
diff --git a/be/src/udf/udf.h b/be/src/vec/exprs/function_context.h
similarity index 86%
rename from be/src/udf/udf.h
rename to be/src/vec/exprs/function_context.h
index 95106d1fc53..09ea5cd478e 100644
--- a/be/src/udf/udf.h
+++ b/be/src/vec/exprs/function_context.h
@@ -14,9 +14,6 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-// This file is copied from
-// https://github.com/apache/impala/blob/branch-2.9.0/be/src/udf/udf.h
-// and modified by Doris
 
 #pragma once
 
@@ -43,25 +40,25 @@ class IDataType;
 using DataTypePtr = std::shared_ptr<const IDataType>;
 } // namespace vectorized
 
-// The FunctionContext is passed to every UDF/UDA and is the interface for the 
UDF to the
-// rest of the system. It contains APIs to examine the system state, report 
errors
+// The FunctionContext is passed to every UDF/UDA and is the interface for UDF 
to
+// rest of system. It contains APIs to examine system state, report errors
 // and manage memory.
 class FunctionContext {
 public:
     enum FunctionStateScope {
-        /// Indicates that the function state for this FunctionContext's UDF 
is shared across
-        /// the plan fragment (a query is divided into multiple plan 
fragments, each of which
-        /// is responsible for a part of the query execution). Within the plan 
fragment, there
-        /// may be multiple instances of the UDF executing concurrently with 
multiple
+        /// Indicates that function state for this FunctionContext's UDF is 
shared across
+        /// plan fragment (a query is divided into multiple plan fragments, 
each of which
+        /// is responsible for a part of query execution). Within plan 
fragment, there
+        /// may be multiple instances of UDF executing concurrently with 
multiple
         /// FunctionContexts sharing this state, meaning that the state must be
-        /// thread-safe. The Prepare() function for the UDF may be called with 
this scope
-        /// concurrently on a single host if the UDF will be evaluated in 
multiple plan
+        /// thread-safe. The Prepare() function for UDF may be called with 
this scope
+        /// concurrently on a single host if UDF will be evaluated in multiple 
plan
         /// fragments on that host. In general, read-only state that doesn't 
need to be
         /// recomputed for every UDF call should be fragment-local.
         /// TODO: not yet implemented
         FRAGMENT_LOCAL,
 
-        /// Indicates that the function state is local to the execution 
thread. This state
+        /// Indicates that function state is local to execution thread. This 
state
         /// does not need to be thread-safe. However, this state will be 
initialized (via the
         /// Prepare() function) once for every execution thread, so 
fragment-local state
         /// should be used when possible for better performance. In general, 
inexpensive
@@ -120,10 +117,10 @@ public:
     // instead just insert a string literal
     bool jsonb_string_as_string() const { return _jsonb_string_as_string; }
 
-    // Sets an error for this UDF. If this is called, this will trigger the
+    // Sets an error for this UDF. If this is called, this will trigger a
     // query to fail.
-    // Note: when you set error for the UDFs used in Data Load, you should
-    // ensure the function return value is null.
+    // Note: when you set an error for UDFs used in Data Load, you should
+    // ensure that the function return value is null.
     void set_error(const char* error_msg);
 
     // Adds a warning that is returned to the user. This can include things 
like
@@ -149,12 +146,12 @@ public:
     // argument).
     int get_num_args() const;
 
-    // Returns the type information for the arg_idx-th argument (0-indexed, 
not including
+    // Returns type information for the arg_idx-th argument (0-indexed, not 
including
     // the FunctionContext* argument). Returns nullptr if arg_idx is invalid.
     const vectorized::DataTypePtr get_arg_type(int arg_idx) const;
 
-    // Returns true if the arg_idx-th input argument (0 indexed, not including 
the
-    // FunctionContext* argument) is a constant (e.g. 5, "string", 1 + 1).
+    // Returns true if the arg_idx-th input argument (0 indexed, not including
+    // the FunctionContext* argument) is a constant (e.g. 5, "string", 1 + 1).
     bool is_col_constant(int arg_idx) const;
 
     // Returns a pointer to the value of the arg_idx-th input argument (0 
indexed, not
@@ -200,7 +197,7 @@ private:
 
     std::vector<std::shared_ptr<doris::ColumnPtrWrapper>> _constant_cols;
 
-    //udf execute timer
+    // UDF execute timer
     RuntimeProfile::Counter* _udf_execute_timer = nullptr;
     bool _check_overflow_for_decimal = false;
     bool _enable_strict_mode = false;
@@ -216,4 +213,5 @@ private:
 };
 
 using doris::FunctionContext;
+
 } // namespace doris
diff --git a/be/src/vec/exprs/vbitmap_predicate.h 
b/be/src/vec/exprs/vbitmap_predicate.h
index e753b56001d..0bd02c6c8cf 100644
--- a/be/src/vec/exprs/vbitmap_predicate.h
+++ b/be/src/vec/exprs/vbitmap_predicate.h
@@ -24,7 +24,7 @@
 
 #include "common/object_pool.h"
 #include "common/status.h"
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris {
diff --git a/be/src/vec/exprs/vbloom_predicate.h 
b/be/src/vec/exprs/vbloom_predicate.h
index 4c2fd980fa4..3a6f5a0160a 100644
--- a/be/src/vec/exprs/vbloom_predicate.h
+++ b/be/src/vec/exprs/vbloom_predicate.h
@@ -22,7 +22,7 @@
 
 #include "common/object_pool.h"
 #include "common/status.h"
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris {
diff --git a/be/src/vec/exprs/vcase_expr.h b/be/src/vec/exprs/vcase_expr.h
index 1013aea3d97..db31a42a457 100644
--- a/be/src/vec/exprs/vcase_expr.h
+++ b/be/src/vec/exprs/vcase_expr.h
@@ -23,7 +23,6 @@
 #include "common/status.h"
 #include "runtime/define_primitive_type.h"
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
 #include "vec/columns/column_array.h"
 #include "vec/columns/column_complex.h"
 #include "vec/columns/column_const.h"
@@ -32,6 +31,7 @@
 #include "vec/columns/column_nullable.h"
 #include "vec/columns/column_struct.h"
 #include "vec/columns/column_variant.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/functions/function.h"
 
diff --git a/be/src/vec/exprs/vcast_expr.h b/be/src/vec/exprs/vcast_expr.h
index fb652848fd5..c0c8dff508d 100644
--- a/be/src/vec/exprs/vcast_expr.h
+++ b/be/src/vec/exprs/vcast_expr.h
@@ -21,10 +21,10 @@
 #include "common/object_pool.h"
 #include "common/status.h"
 #include "runtime/define_primitive_type.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/core/column_with_type_and_name.h"
 #include "vec/data_types/data_type.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/functions/function.h"
 
diff --git a/be/src/vec/exprs/vcondition_expr.cpp 
b/be/src/vec/exprs/vcondition_expr.cpp
index 60f699ca548..18c18aa68ae 100644
--- a/be/src/vec/exprs/vcondition_expr.cpp
+++ b/be/src/vec/exprs/vcondition_expr.cpp
@@ -19,10 +19,10 @@
 
 #include <glog/logging.h>
 
-#include "udf/udf.h"
 #include "util/simd/bits.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_const.h"
+#include "vec/exprs/function_context.h"
 
 namespace doris::vectorized {
 
diff --git a/be/src/vec/exprs/vcondition_expr.h 
b/be/src/vec/exprs/vcondition_expr.h
index 3605aab2094..c1a274e6112 100644
--- a/be/src/vec/exprs/vcondition_expr.h
+++ b/be/src/vec/exprs/vcondition_expr.h
@@ -20,8 +20,8 @@
 
 #include "common/status.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
 #include "vec/core/column_numbers.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/exprs/vexpr_context.h"
 #include "vec/exprs/vliteral.h"
diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp 
b/be/src/vec/exprs/vectorized_fn_call.cpp
index 5cdb46a802f..c0762f37d8f 100644
--- a/be/src/vec/exprs/vectorized_fn_call.cpp
+++ b/be/src/vec/exprs/vectorized_fn_call.cpp
@@ -37,7 +37,6 @@
 #include "olap/rowset/segment_v2/virtual_column_iterator.h"
 #include "pipeline/pipeline_task.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_array.h"
 #include "vec/columns/column_nullable.h"
@@ -48,6 +47,7 @@
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_agg_state.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/varray_literal.h"
 #include "vec/exprs/vcast_expr.h"
 #include "vec/exprs/vexpr_context.h"
diff --git a/be/src/vec/exprs/vectorized_fn_call.h 
b/be/src/vec/exprs/vectorized_fn_call.h
index f5cc630f8e9..b48b2612a73 100644
--- a/be/src/vec/exprs/vectorized_fn_call.h
+++ b/be/src/vec/exprs/vectorized_fn_call.h
@@ -24,8 +24,8 @@
 #include "common/status.h"
 #include "olap/rowset/segment_v2/ann_index/ann_range_search_runtime.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
 #include "vec/core/column_numbers.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/exprs/vexpr_context.h"
 #include "vec/exprs/vliteral.h"
diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h
index 283d0a0608d..452150d5b8a 100644
--- a/be/src/vec/exprs/vexpr.h
+++ b/be/src/vec/exprs/vexpr.h
@@ -39,7 +39,6 @@
 #include "runtime/define_primitive_type.h"
 #include "runtime/large_int_value.h"
 #include "runtime/types.h"
-#include "udf/udf.h"
 #include "util/date_func.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
@@ -49,6 +48,7 @@
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_ipv6.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr_context.h"
 #include "vec/exprs/vexpr_fwd.h"
 #include "vec/functions/cast/cast_to_string.h"
diff --git a/be/src/vec/exprs/vexpr_context.cpp 
b/be/src/vec/exprs/vexpr_context.cpp
index e885ec6cde7..7146355d532 100644
--- a/be/src/vec/exprs/vexpr_context.cpp
+++ b/be/src/vec/exprs/vexpr_context.cpp
@@ -29,13 +29,13 @@
 #include "olap/olap_common.h"
 #include "runtime/runtime_state.h"
 #include "runtime/thread_context.h"
-#include "udf/udf.h"
 #include "util/simd/bits.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_const.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/column_with_type_and_name.h"
 #include "vec/core/columns_with_type_and_name.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris {
diff --git a/be/src/vec/exprs/vexpr_context.h b/be/src/vec/exprs/vexpr_context.h
index 70d686dc1ec..ed0683069de 100644
--- a/be/src/vec/exprs/vexpr_context.h
+++ b/be/src/vec/exprs/vexpr_context.h
@@ -34,10 +34,10 @@
 #include "olap/rowset/segment_v2/inverted_index_reader.h"
 #include "runtime/runtime_state.h"
 #include "runtime/types.h"
-#include "udf/udf.h"
 #include "vec/columns/column.h"
 #include "vec/core/block.h"
 #include "vec/core/column_with_type_and_name.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr_fwd.h"
 
 namespace doris {
diff --git a/be/src/vec/exprs/vin_predicate.h b/be/src/vec/exprs/vin_predicate.h
index a44efc5f34f..12624692fbe 100644
--- a/be/src/vec/exprs/vin_predicate.h
+++ b/be/src/vec/exprs/vin_predicate.h
@@ -21,7 +21,7 @@
 
 #include "common/object_pool.h"
 #include "common/status.h"
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/functions/function.h"
 
diff --git a/be/src/vec/exprs/vmatch_predicate.h 
b/be/src/vec/exprs/vmatch_predicate.h
index 326a76a05f4..1a3368261c8 100644
--- a/be/src/vec/exprs/vmatch_predicate.h
+++ b/be/src/vec/exprs/vmatch_predicate.h
@@ -22,7 +22,7 @@
 #include "common/object_pool.h"
 #include "common/status.h"
 #include "olap/inverted_index_parser.h"
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 #include "vec/functions/function.h"
 
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.h 
b/be/src/vec/exprs/vruntimefilter_wrapper.h
index 567899adc7f..fb7c2da0478 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.h
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.h
@@ -26,8 +26,8 @@
 
 #include "common/config.h"
 #include "common/status.h"
-#include "udf/udf.h"
 #include "util/runtime_profile.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris {
diff --git a/be/src/vec/functions/date_time_transforms.h 
b/be/src/vec/functions/date_time_transforms.h
index ae85ede97d5..35eaed51fa9 100644
--- a/be/src/vec/functions/date_time_transforms.h
+++ b/be/src/vec/functions/date_time_transforms.h
@@ -25,7 +25,6 @@
 
 #include "common/status.h"
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
 #include "util/binary_cast.hpp"
 #include "vec/columns/column_nullable.h"
 #include "vec/columns/column_string.h"
@@ -38,6 +37,7 @@
 #include "vec/data_types/data_type_date_time.h"
 #include "vec/data_types/data_type_decimal.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/date_format_type.h"
 #include "vec/runtime/time_value.h"
 #include "vec/runtime/vdatetime_value.h"
diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h
index 05d98e5bcb1..ca872a147a7 100644
--- a/be/src/vec/functions/function.h
+++ b/be/src/vec/functions/function.h
@@ -33,7 +33,6 @@
 #include "common/status.h"
 #include "olap/rowset/segment_v2/inverted_index_iterator.h" // IWYU pragma: 
keep
 #include "runtime/define_primitive_type.h"
-#include "udf/udf.h"
 #include "vec/core/block.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/column_with_type_and_name.h"
@@ -44,6 +43,7 @@
 #include "vec/data_types/data_type_map.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_struct.h"
+#include "vec/exprs/function_context.h"
 
 namespace doris {
 struct InvertedIndexAnalyzerCtx;
diff --git a/be/src/vec/functions/function_convert_tz.cpp 
b/be/src/vec/functions/function_convert_tz.cpp
index 70d5d8bf8b1..364a0925714 100644
--- a/be/src/vec/functions/function_convert_tz.cpp
+++ b/be/src/vec/functions/function_convert_tz.cpp
@@ -26,7 +26,7 @@
 #include "common/status.h"
 #include "runtime/define_primitive_type.h"
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
+#include "util/binary_cast.hpp"
 #include "util/timezone_utils.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
@@ -46,6 +46,7 @@
 #include "vec/data_types/data_type_date_time.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/datetime_errors.h"
 #include "vec/functions/function.h"
 #include "vec/functions/function_helpers.h"
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h 
b/be/src/vec/functions/function_date_or_datetime_computation.h
index ba6e50b0535..5772bd835d3 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -36,7 +36,7 @@
 #include "runtime/define_primitive_type.h"
 #include "runtime/primitive_type.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
+#include "util/binary_cast.hpp"
 #include "util/string_parser.hpp"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
@@ -57,6 +57,7 @@
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_time.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/datetime_errors.h"
 #include "vec/functions/function.h"
 #include "vec/functions/function_helpers.h"
diff --git a/be/src/vec/functions/function_java_udf.h 
b/be/src/vec/functions/function_java_udf.h
index f0d41e73740..84c44e1cce6 100644
--- a/be/src/vec/functions/function_java_udf.h
+++ b/be/src/vec/functions/function_java_udf.h
@@ -27,13 +27,13 @@
 
 #include "common/logging.h"
 #include "common/status.h"
-#include "udf/udf.h"
 #include "util/jni-util.h"
 #include "vec/core/block.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/columns_with_type_and_name.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris::vectorized {
diff --git a/be/src/vec/functions/function_jsonb.cpp 
b/be/src/vec/functions/function_jsonb.cpp
index 4594fd6e668..c5f45b1fb59 100644
--- a/be/src/vec/functions/function_jsonb.cpp
+++ b/be/src/vec/functions/function_jsonb.cpp
@@ -32,7 +32,6 @@
 #include "runtime/define_primitive_type.h"
 #include "runtime/jsonb_value.h"
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
 #include "util/jsonb_document.h"
 #include "util/jsonb_stream.h"
 #include "util/jsonb_utils.h"
@@ -57,6 +56,7 @@
 #include "vec/data_types/data_type_jsonb.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/like.h"
 #include "vec/functions/simple_function_factory.h"
diff --git a/be/src/vec/functions/function_multi_same_args.h 
b/be/src/vec/functions/function_multi_same_args.h
index 5ceedfa11e9..fd8bc8a157b 100644
--- a/be/src/vec/functions/function_multi_same_args.h
+++ b/be/src/vec/functions/function_multi_same_args.h
@@ -17,7 +17,7 @@
 
 #pragma once
 
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function_helpers.h"
 #include "vec/functions/simple_function_factory.h"
 #include "vec/utils/template_helpers.hpp"
diff --git a/be/src/vec/functions/function_other_types_to_date.cpp 
b/be/src/vec/functions/function_other_types_to_date.cpp
index 5b16f44ce76..6ff9749df4c 100644
--- a/be/src/vec/functions/function_other_types_to_date.cpp
+++ b/be/src/vec/functions/function_other_types_to_date.cpp
@@ -34,7 +34,7 @@
 #include "runtime/define_primitive_type.h"
 #include "runtime/primitive_type.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
+#include "util/binary_cast.hpp"
 #include "util/time_lut.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
@@ -59,6 +59,7 @@
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/datetime_errors.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
diff --git a/be/src/vec/functions/function_regexp.cpp 
b/be/src/vec/functions/function_regexp.cpp
index bd66900b348..bc51ddb21a6 100644
--- a/be/src/vec/functions/function_regexp.cpp
+++ b/be/src/vec/functions/function_regexp.cpp
@@ -30,7 +30,6 @@
 
 #include "common/status.h"
 #include "exprs/string_functions.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_const.h"
@@ -46,6 +45,7 @@
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
 #include "vec/utils/stringop_substring.h"
diff --git a/be/src/vec/functions/function_rpc.h 
b/be/src/vec/functions/function_rpc.h
index 862654c73a4..56b723b984a 100644
--- a/be/src/vec/functions/function_rpc.h
+++ b/be/src/vec/functions/function_rpc.h
@@ -26,13 +26,13 @@
 #include <vector>
 
 #include "common/status.h"
-#include "udf/udf.h"
 #include "vec/core/block.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/column_with_type_and_name.h"
 #include "vec/core/columns_with_type_and_name.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris {
diff --git a/be/src/vec/functions/function_string.h 
b/be/src/vec/functions/function_string.h
index 2cce9b2f4af..41f9794f42f 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -91,7 +91,6 @@
 
 #include "exprs/math_functions.h"
 #include "pugixml.hpp"
-#include "udf/udf.h"
 #include "util/md5.h"
 #include "util/simd/vstring_function.h"
 #include "util/sm3.h"
@@ -109,6 +108,7 @@
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/function_helpers.h"
 #include "vec/utils/stringop_substring.h"
diff --git a/be/src/vec/functions/function_tokenize.h 
b/be/src/vec/functions/function_tokenize.h
index 6748784ed8f..9e1eeae9cea 100644
--- a/be/src/vec/functions/function_tokenize.h
+++ b/be/src/vec/functions/function_tokenize.h
@@ -26,13 +26,13 @@
 #include "common/status.h"
 #include "olap/inverted_index_parser.h"
 #include "olap/rowset/segment_v2/inverted_index_reader.h"
-#include "udf/udf.h"
 #include "vec/columns/column_array.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_array.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
 
diff --git a/be/src/vec/functions/functions_geo.h 
b/be/src/vec/functions/functions_geo.h
index 437f032abdc..6aba2c4acf7 100644
--- a/be/src/vec/functions/functions_geo.h
+++ b/be/src/vec/functions/functions_geo.h
@@ -24,10 +24,10 @@
 #include <vector>
 
 #include "common/status.h"
-#include "udf/udf.h"
 #include "vec/core/column_numbers.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris {
diff --git a/be/src/vec/functions/in.h b/be/src/vec/functions/in.h
index 34c11cac7cf..7a730f1eb00 100644
--- a/be/src/vec/functions/in.h
+++ b/be/src/vec/functions/in.h
@@ -32,7 +32,6 @@
 #include "olap/rowset/segment_v2/index_reader_helper.h"
 #include "runtime/define_primitive_type.h"
 #include "runtime/types.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_const.h"
@@ -46,6 +45,7 @@
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_number.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris::vectorized {
diff --git a/be/src/vec/functions/like.h b/be/src/vec/functions/like.h
index 26a2f2a96bb..4383888ab38 100644
--- a/be/src/vec/functions/like.h
+++ b/be/src/vec/functions/like.h
@@ -33,7 +33,6 @@
 #include "common/status.h"
 #include "runtime/define_primitive_type.h"
 #include "runtime/string_search.hpp"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column_string.h"
 #include "vec/columns/predicate_column.h"
@@ -41,6 +40,7 @@
 #include "vec/core/column_numbers.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type_number.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris::vectorized {
diff --git a/be/src/vec/functions/random.cpp b/be/src/vec/functions/random.cpp
index 4b9301ab36e..f86d9af5ac1 100644
--- a/be/src/vec/functions/random.cpp
+++ b/be/src/vec/functions/random.cpp
@@ -27,7 +27,6 @@
 #include <utility>
 
 #include "common/status.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_vector.h"
@@ -36,6 +35,7 @@
 #include "vec/core/column_numbers.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type_number.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
 
diff --git a/be/src/vec/functions/simple_function_factory.h 
b/be/src/vec/functions/simple_function_factory.h
index b52ed3ac158..14b2e148383 100644
--- a/be/src/vec/functions/simple_function_factory.h
+++ b/be/src/vec/functions/simple_function_factory.h
@@ -24,7 +24,7 @@
 #include <string>
 
 #include "agent/be_exec_version_manager.h"
-#include "udf/udf.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris::vectorized {
diff --git a/be/src/vec/functions/uniform.cpp b/be/src/vec/functions/uniform.cpp
index a6124bae400..5b2af2f4d2a 100644
--- a/be/src/vec/functions/uniform.cpp
+++ b/be/src/vec/functions/uniform.cpp
@@ -27,7 +27,6 @@
 
 #include "common/status.h"
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_vector.h"
@@ -36,6 +35,7 @@
 #include "vec/core/column_numbers.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type_number.h" // IWYU pragma: keep
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/simple_function_factory.h"
 
diff --git a/be/src/vec/sink/vmysql_result_writer.cpp 
b/be/src/vec/sink/vmysql_result_writer.cpp
index 6ac496f311e..c9bec0e863b 100644
--- a/be/src/vec/sink/vmysql_result_writer.cpp
+++ b/be/src/vec/sink/vmysql_result_writer.cpp
@@ -37,7 +37,6 @@
 #include "runtime/result_block_buffer.h"
 #include "runtime/runtime_state.h"
 #include "runtime/types.h"
-#include "udf/udf.h"
 #include "util/mysql_global.h"
 #include "vec/aggregate_functions/aggregate_function.h"
 #include "vec/columns/column.h"
diff --git a/be/src/vec/sink/writer/vhive_table_writer.h 
b/be/src/vec/sink/writer/vhive_table_writer.h
index 18380eca35e..62dfff93628 100644
--- a/be/src/vec/sink/writer/vhive_table_writer.h
+++ b/be/src/vec/sink/writer/vhive_table_writer.h
@@ -21,6 +21,7 @@
 
 #include "util/runtime_profile.h"
 #include "vec/columns/column.h"
+#include "vec/data_types/data_type.h"
 #include "vec/exprs/vexpr_fwd.h"
 #include "vec/sink/writer/async_result_writer.h"
 
diff --git a/be/src/vec/utils/stringop_substring.h 
b/be/src/vec/utils/stringop_substring.h
index 34e886eff3a..5bafe5f0f73 100644
--- a/be/src/vec/utils/stringop_substring.h
+++ b/be/src/vec/utils/stringop_substring.h
@@ -56,7 +56,6 @@
 #include <cstdint>
 #include <string_view>
 
-#include "udf/udf.h"
 #include "util/simd/vstring_function.h"
 #include "vec/columns/column_decimal.h"
 #include "vec/columns/column_nullable.h"
diff --git a/be/test/pipeline/operator/analytic_sink_operator_test.cpp 
b/be/test/pipeline/operator/analytic_sink_operator_test.cpp
index b29bc8676d8..994227d4177 100644
--- a/be/test/pipeline/operator/analytic_sink_operator_test.cpp
+++ b/be/test/pipeline/operator/analytic_sink_operator_test.cpp
@@ -30,7 +30,6 @@
 #include "testutil/mock/mock_descriptors.h"
 #include "testutil/mock/mock_runtime_state.h"
 #include "testutil/mock/mock_slot_ref.h"
-#include "udf/udf.h"
 #include "vec/core/block.h"
 #include "vec/data_types/data_type.h"
 namespace doris::pipeline {
diff --git a/be/test/pipeline/thrift_builder.h 
b/be/test/pipeline/thrift_builder.h
index cf03d609f0c..7f3f6de840e 100644
--- a/be/test/pipeline/thrift_builder.h
+++ b/be/test/pipeline/thrift_builder.h
@@ -24,7 +24,6 @@
 #include "pipeline/exec/exchange_sink_buffer.h"
 #include "pipeline/exec/exchange_sink_operator.h"
 #include "runtime/runtime_state.h"
-#include "udf/udf.h"
 #include "vec/sink/writer/vhive_utils.h"
 
 namespace doris {
diff --git a/be/test/runtime_filter/runtime_filter_consumer_helper_test.cpp 
b/be/test/runtime_filter/runtime_filter_consumer_helper_test.cpp
index e0dbc33e716..1590af89780 100644
--- a/be/test/runtime_filter/runtime_filter_consumer_helper_test.cpp
+++ b/be/test/runtime_filter/runtime_filter_consumer_helper_test.cpp
@@ -102,7 +102,7 @@ TEST_F(RuntimeFilterConsumerHelperTest, basic) {
     int arrived_rf_num = -1;
     helper._consumers[1]->signal(producer.get());
     
FAIL_IF_ERROR_OR_CATCH_EXCEPTION(helper.try_append_late_arrival_runtime_filter(
-            _runtime_states[0].get(), &arrived_rf_num, conjuncts, row_desc));
+            _runtime_states[0].get(), row_desc, arrived_rf_num, conjuncts));
     ASSERT_EQ(conjuncts.size(), 1);
     ASSERT_EQ(arrived_rf_num, 2);
 }
diff --git a/be/test/testutil/function_utils.cpp 
b/be/test/testutil/function_utils.cpp
index b82c86ed5b3..809b1d505b6 100644
--- a/be/test/testutil/function_utils.cpp
+++ b/be/test/testutil/function_utils.cpp
@@ -22,8 +22,8 @@
 #include <memory>
 #include <vector>
 
-#include "udf/udf.h"
 #include "vec/data_types/data_type.h"
+#include "vec/exprs/function_context.h"
 
 namespace doris {
 
diff --git a/be/test/vec/exec/exchange_sink_test.h 
b/be/test/vec/exec/exchange_sink_test.h
index 2891ad1da53..3adab7fe034 100644
--- a/be/test/vec/exec/exchange_sink_test.h
+++ b/be/test/vec/exec/exchange_sink_test.h
@@ -25,7 +25,6 @@
 #include "pipeline/exec/exchange_sink_operator.h"
 #include "runtime/runtime_state.h"
 #include "testutil/mock/mock_runtime_state.h"
-#include "udf/udf.h"
 #include "vec/sink/writer/vhive_utils.h"
 
 namespace doris::pipeline {
diff --git a/be/test/vec/exprs/try_cast_expr_test.cpp 
b/be/test/vec/exprs/try_cast_expr_test.cpp
index eac351d29d9..e39fb52425f 100644
--- a/be/test/vec/exprs/try_cast_expr_test.cpp
+++ b/be/test/vec/exprs/try_cast_expr_test.cpp
@@ -20,11 +20,11 @@
 #include <memory>
 
 #include "runtime/primitive_type.h"
-#include "udf/udf.h"
 #include "vec/columns/column_nothing.h"
 #include "vec/columns/column_nullable.h"
 #include "vec/core/field.h"
 #include "vec/core/types.h"
+#include "vec/exprs/function_context.h"
 #include "vec/exprs/vcast_expr.h"
 
 namespace doris::vectorized {
diff --git a/be/test/vec/function/function_eq_for_null_test.cpp 
b/be/test/vec/function/function_eq_for_null_test.cpp
index cf7880fe958..736507b21fa 100644
--- a/be/test/vec/function/function_eq_for_null_test.cpp
+++ b/be/test/vec/function/function_eq_for_null_test.cpp
@@ -25,13 +25,13 @@
 #include "common/status.h"
 #include "function_test_util.h"
 #include "gtest/gtest_pred_impl.h"
-#include "udf/udf.h"
 #include "vec/columns/column_const.h"
 #include "vec/columns/column_nullable.h"
 #include "vec/core/column_with_type_and_name.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/data_types/data_type_string.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 #include "vec/functions/function_helpers.h"
 
diff --git a/be/test/vec/function/function_jsonb_test.cpp 
b/be/test/vec/function/function_jsonb_test.cpp
index 8c3aaae0285..aeef39a45ec 100644
--- a/be/test/vec/function/function_jsonb_test.cpp
+++ b/be/test/vec/function/function_jsonb_test.cpp
@@ -27,7 +27,6 @@
 #include "runtime/primitive_type.h"
 #include "testutil/any_type.h"
 #include "testutil/column_helper.h"
-#include "udf/udf.h"
 #include "util/jsonb_writer.h"
 #include "vec/columns/column_const.h"
 #include "vec/core/types.h"
@@ -36,6 +35,7 @@
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
 #include "vec/data_types/serde/data_type_serde.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/function.h"
 
 namespace doris::vectorized {
diff --git a/be/test/vec/function/function_test_util.h 
b/be/test/vec/function/function_test_util.h
index 711c56fb888..abe896572d2 100644
--- a/be/test/vec/function/function_test_util.h
+++ b/be/test/vec/function/function_test_util.h
@@ -35,7 +35,6 @@
 #include "testutil/any_type.h"
 #include "testutil/function_utils.h"
 #include "testutil/test_util.h"
-#include "udf/udf.h"
 #include "util/bitmap_value.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_const.h"
@@ -60,6 +59,7 @@
 #include "vec/data_types/data_type_struct.h"
 #include "vec/data_types/data_type_time.h"
 #include "vec/data_types/data_type_varbinary.h"
+#include "vec/exprs/function_context.h"
 #include "vec/functions/simple_function_factory.h"
 
 namespace doris::vectorized {


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

Reply via email to