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

lihaopeng 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 f9df3bae613 [Enhancement](functions) change some nullable mode and 
clear some smooth upgrade (#25334)
f9df3bae613 is described below

commit f9df3bae6132e365140b43a580f26fd064fb4d38
Author: zclllyybb <zhaochan...@selectdb.com>
AuthorDate: Mon Oct 16 19:50:17 2023 +0800

    [Enhancement](functions) change some nullable mode and clear some smooth 
upgrade (#25334)
---
 be/src/agent/be_exec_version_manager.h             |   4 +-
 .../aggregate_function_count_old.cpp               |  51 ----
 .../aggregate_function_count_old.h                 | 280 ---------------------
 .../aggregate_function_simple_factory.cpp          |   4 -
 .../aggregate_function_sum_old.cpp                 |  33 ---
 .../aggregate_function_sum_old.h                   | 201 ---------------
 .../vec/functions/array/function_array_index.cpp   |   4 +
 be/src/vec/functions/array/function_array_index.h  |  37 ++-
 .../function_date_or_datetime_computation.cpp      |   6 -
 .../function_date_or_datetime_computation.h        |   2 -
 .../function_date_or_datetime_computation_v2.cpp   |   7 -
 be/src/vec/functions/function_map.cpp              |  13 +-
 be/src/vec/functions/function_string.cpp           |   6 +-
 be/src/vec/functions/function_string.h             |  59 +----
 be/src/vec/functions/simple_function_factory.h     |  14 +-
 be/src/vec/functions/time_of_function.cpp          |  45 ----
 be/src/vec/functions/to_time_function.cpp          |  62 -----
 .../main/java/org/apache/doris/analysis/Expr.java  |   6 +
 .../functions/scalar/ArrayContains.java            |   8 +-
 .../functions/scalar/ArrayPosition.java            |   8 +-
 .../expressions/functions/scalar/CountEqual.java   |   8 +-
 .../functions/scalar/MapContainsKey.java           |   8 +-
 .../functions/scalar/MapContainsValue.java         |   8 +-
 gensrc/script/doris_builtins_functions.py          | 114 ++++-----
 24 files changed, 153 insertions(+), 835 deletions(-)

diff --git a/be/src/agent/be_exec_version_manager.h 
b/be/src/agent/be_exec_version_manager.h
index 25de399df3e..03d6b2ec6a5 100644
--- a/be/src/agent/be_exec_version_manager.h
+++ b/be/src/agent/be_exec_version_manager.h
@@ -59,7 +59,9 @@ private:
  *    d. elt function return type change to nullable(string)
  *    e. add repeat_max_num in repeat function
  * 3: start from doris 2.1
- *    a. aggregation function do not serialize bitmap to string
+ *    a. aggregation function do not serialize bitmap to string.
+ *    b. array contains/position/countequal function return nullable in less 
situations.
+ *    c. cleared old version of Version 2.
 */
 inline const int BeExecVersionManager::max_be_exec_version = 3;
 inline const int BeExecVersionManager::min_be_exec_version = 0;
diff --git a/be/src/vec/aggregate_functions/aggregate_function_count_old.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_count_old.cpp
deleted file mode 100644
index c480c09a5a4..00000000000
--- a/be/src/vec/aggregate_functions/aggregate_function_count_old.cpp
+++ /dev/null
@@ -1,51 +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.
-// This file is copied from
-// 
https://github.com/ClickHouse/ClickHouse/blob/master/src/AggregateFunctions/AggregateFunctionCount.cpp
-// and modified by Doris
-
-#include "vec/aggregate_functions/aggregate_function_count_old.h"
-
-#include <string>
-
-#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
-#include "vec/aggregate_functions/factory_helpers.h"
-
-namespace doris::vectorized {
-
-AggregateFunctionPtr create_aggregate_function_count_old(const std::string& 
name,
-                                                         const DataTypes& 
argument_types,
-                                                         const bool 
result_is_nullable) {
-    assert_arity_at_most<1>(name, argument_types);
-
-    return std::make_shared<AggregateFunctionCountOld>(argument_types);
-}
-
-AggregateFunctionPtr create_aggregate_function_count_not_null_unary_old(
-        const std::string& name, const DataTypes& argument_types, const bool 
result_is_nullable) {
-    assert_arity_at_most<1>(name, argument_types);
-
-    return 
std::make_shared<AggregateFunctionCountNotNullUnaryOld>(argument_types);
-}
-
-void register_aggregate_function_count_old(AggregateFunctionSimpleFactory& 
factory) {
-    factory.register_alternative_function("count", 
create_aggregate_function_count_old, false);
-    factory.register_alternative_function("count",
-                                          
create_aggregate_function_count_not_null_unary_old, true);
-}
-
-} // namespace doris::vectorized
diff --git a/be/src/vec/aggregate_functions/aggregate_function_count_old.h 
b/be/src/vec/aggregate_functions/aggregate_function_count_old.h
deleted file mode 100644
index 9a191bfd646..00000000000
--- a/be/src/vec/aggregate_functions/aggregate_function_count_old.h
+++ /dev/null
@@ -1,280 +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.
-// This file is copied from
-// 
https://github.com/ClickHouse/ClickHouse/blob/master/src/AggregateFunctions/AggregateFunctionCountOld.h
-// and modified by Doris
-
-#pragma once
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <boost/iterator/iterator_facade.hpp>
-#include <memory>
-#include <vector>
-
-#include "vec/aggregate_functions/aggregate_function.h"
-#include "vec/columns/column.h"
-#include "vec/columns/column_nullable.h"
-#include "vec/columns/column_vector.h"
-#include "vec/columns/columns_number.h"
-#include "vec/common/assert_cast.h"
-#include "vec/core/types.h"
-#include "vec/data_types/data_type.h"
-#include "vec/data_types/data_type_number.h"
-#include "vec/io/var_int.h"
-
-namespace doris {
-namespace vectorized {
-class Arena;
-class BufferReadable;
-class BufferWritable;
-} // namespace vectorized
-} // namespace doris
-
-/*
- * this function is used to solve agg of sum/count is not compatibility during 
the upgrade process.
- * in PR #20370 have changed the serialize type and serialize column.
- * before is ColumnVector, now sum/count change to use ColumnFixedLengthObject.
- * so during the upgrade process, will be not compatible if exist old BE and 
Newer BE.
- */
-
-namespace doris::vectorized {
-struct AggregateFunctionCountDataOld {
-    UInt64 count = 0;
-};
-/// Simply count number of calls.
-class AggregateFunctionCountOld final
-        : public IAggregateFunctionDataHelper<AggregateFunctionCountDataOld,
-                                              AggregateFunctionCountOld> {
-public:
-    AggregateFunctionCountOld(const DataTypes& argument_types_)
-            : IAggregateFunctionDataHelper(argument_types_) {}
-
-    String get_name() const override { return "count"; }
-
-    DataTypePtr get_return_type() const override { return 
std::make_shared<DataTypeInt64>(); }
-
-    void add(AggregateDataPtr __restrict place, const IColumn**, size_t, 
Arena*) const override {
-        ++data(place).count;
-    }
-
-    void reset(AggregateDataPtr place) const override {
-        AggregateFunctionCountOld::data(place).count = 0;
-    }
-
-    void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs,
-               Arena*) const override {
-        data(place).count += data(rhs).count;
-    }
-
-    void serialize(ConstAggregateDataPtr __restrict place, BufferWritable& 
buf) const override {
-        write_var_uint(data(place).count, buf);
-    }
-
-    void deserialize(AggregateDataPtr __restrict place, BufferReadable& buf,
-                     Arena*) const override {
-        read_var_uint(data(place).count, buf);
-    }
-
-    void insert_result_into(ConstAggregateDataPtr __restrict place, IColumn& 
to) const override {
-        assert_cast<ColumnInt64&>(to).get_data().push_back(data(place).count);
-    }
-
-    void deserialize_from_column(AggregateDataPtr places, const IColumn& 
column, Arena* arena,
-                                 size_t num_rows) const override {
-        auto data = assert_cast<const ColumnUInt64&>(column).get_data().data();
-        auto* dst_data = reinterpret_cast<Data*>(places);
-        for (size_t i = 0; i != num_rows; ++i) {
-            dst_data[i].count = data[i];
-        }
-    }
-
-    void serialize_to_column(const std::vector<AggregateDataPtr>& places, 
size_t offset,
-                             MutableColumnPtr& dst, const size_t num_rows) 
const override {
-        auto& col = assert_cast<ColumnUInt64&>(*dst);
-        col.resize(num_rows);
-        auto* data = col.get_data().data();
-        for (size_t i = 0; i != num_rows; ++i) {
-            data[i] = AggregateFunctionCountOld::data(places[i] + 
offset).count;
-        }
-    }
-
-    void streaming_agg_serialize_to_column(const IColumn** columns, 
MutableColumnPtr& dst,
-                                           const size_t num_rows, Arena* 
arena) const override {
-        auto& col = assert_cast<ColumnUInt64&>(*dst);
-        col.resize(num_rows);
-        col.get_data().assign(num_rows, assert_cast<UInt64>(1UL));
-    }
-
-    void deserialize_and_merge_from_column(AggregateDataPtr __restrict place, 
const IColumn& column,
-                                           Arena* arena) const override {
-        auto data = assert_cast<const ColumnUInt64&>(column).get_data().data();
-        const size_t num_rows = column.size();
-        for (size_t i = 0; i != num_rows; ++i) {
-            AggregateFunctionCountOld::data(place).count += data[i];
-        }
-    }
-
-    void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t 
offset,
-                                   AggregateDataPtr rhs, const ColumnString* 
column, Arena* arena,
-                                   const size_t num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec(places, offset, rhs, arena, num_rows);
-    }
-
-    void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, 
size_t offset,
-                                            AggregateDataPtr rhs, const 
ColumnString* column,
-                                            Arena* arena, const size_t 
num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec_selected(places, offset, rhs, arena, num_rows);
-    }
-
-    void serialize_without_key_to_column(ConstAggregateDataPtr __restrict 
place,
-                                         IColumn& to) const override {
-        auto& col = assert_cast<ColumnUInt64&>(to);
-        col.resize(1);
-        reinterpret_cast<Data*>(col.get_data().data())->count =
-                AggregateFunctionCountOld::data(place).count;
-    }
-
-    MutableColumnPtr create_serialize_column() const override {
-        return ColumnVector<UInt64>::create();
-    }
-
-    DataTypePtr get_serialized_type() const override { return 
std::make_shared<DataTypeUInt64>(); }
-};
-
-// TODO: Maybe AggregateFunctionCountNotNullUnaryOld should be a subclass of 
AggregateFunctionCountOld
-// Simply count number of not-NULL values.
-class AggregateFunctionCountNotNullUnaryOld final
-        : public IAggregateFunctionDataHelper<AggregateFunctionCountDataOld,
-                                              
AggregateFunctionCountNotNullUnaryOld> {
-public:
-    AggregateFunctionCountNotNullUnaryOld(const DataTypes& argument_types_)
-            : IAggregateFunctionDataHelper(argument_types_) {}
-
-    String get_name() const override { return "count"; }
-
-    DataTypePtr get_return_type() const override { return 
std::make_shared<DataTypeInt64>(); }
-
-    void add(AggregateDataPtr __restrict place, const IColumn** columns, 
size_t row_num,
-             Arena*) const override {
-        data(place).count += !assert_cast<const 
ColumnNullable&>(*columns[0]).is_null_at(row_num);
-    }
-
-    void reset(AggregateDataPtr place) const override { data(place).count = 0; 
}
-
-    void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs,
-               Arena*) const override {
-        data(place).count += data(rhs).count;
-    }
-
-    void serialize(ConstAggregateDataPtr __restrict place, BufferWritable& 
buf) const override {
-        write_var_uint(data(place).count, buf);
-    }
-
-    void deserialize(AggregateDataPtr __restrict place, BufferReadable& buf,
-                     Arena*) const override {
-        read_var_uint(data(place).count, buf);
-    }
-
-    void insert_result_into(ConstAggregateDataPtr __restrict place, IColumn& 
to) const override {
-        if (to.is_nullable()) {
-            auto& null_column = assert_cast<ColumnNullable&>(to);
-            null_column.get_null_map_data().push_back(0);
-            assert_cast<ColumnInt64&>(null_column.get_nested_column())
-                    .get_data()
-                    .push_back(data(place).count);
-        } else {
-            
assert_cast<ColumnInt64&>(to).get_data().push_back(data(place).count);
-        }
-    }
-
-    void deserialize_from_column(AggregateDataPtr places, const IColumn& 
column, Arena* arena,
-                                 size_t num_rows) const override {
-        auto data = assert_cast<const ColumnUInt64&>(column).get_data().data();
-        auto* dst_data = reinterpret_cast<Data*>(places);
-        for (size_t i = 0; i != num_rows; ++i) {
-            dst_data[i].count = data[i];
-        }
-    }
-
-    void serialize_to_column(const std::vector<AggregateDataPtr>& places, 
size_t offset,
-                             MutableColumnPtr& dst, const size_t num_rows) 
const override {
-        auto& col = assert_cast<ColumnUInt64&>(*dst);
-        col.resize(num_rows);
-        auto* data = col.get_data().data();
-        for (size_t i = 0; i != num_rows; ++i) {
-            data[i] = AggregateFunctionCountNotNullUnaryOld::data(places[i] + 
offset).count;
-        }
-    }
-
-    void streaming_agg_serialize_to_column(const IColumn** columns, 
MutableColumnPtr& dst,
-                                           const size_t num_rows, Arena* 
arena) const override {
-        auto& col = assert_cast<ColumnUInt64&>(*dst);
-        col.resize(num_rows);
-        auto& data = col.get_data();
-        const ColumnNullable& input_col = assert_cast<const 
ColumnNullable&>(*columns[0]);
-        for (size_t i = 0; i < num_rows; i++) {
-            data[i] = !input_col.is_null_at(i);
-        }
-    }
-
-    void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t 
offset,
-                                   AggregateDataPtr rhs, const ColumnString* 
column, Arena* arena,
-                                   const size_t num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec(places, offset, rhs, arena, num_rows);
-    }
-
-    void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, 
size_t offset,
-                                            AggregateDataPtr rhs, const 
ColumnString* column,
-                                            Arena* arena, const size_t 
num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec_selected(places, offset, rhs, arena, num_rows);
-    }
-
-    void deserialize_and_merge_from_column(AggregateDataPtr __restrict place, 
const IColumn& column,
-                                           Arena* arena) const override {
-        auto data = assert_cast<const ColumnUInt64&>(column).get_data().data();
-        const size_t num_rows = column.size();
-        for (size_t i = 0; i != num_rows; ++i) {
-            AggregateFunctionCountNotNullUnaryOld::data(place).count += 
data[i];
-        }
-    }
-
-    void serialize_without_key_to_column(ConstAggregateDataPtr __restrict 
place,
-                                         IColumn& to) const override {
-        auto& col = assert_cast<ColumnUInt64&>(to);
-        col.resize(1);
-        reinterpret_cast<Data*>(col.get_data().data())->count =
-                AggregateFunctionCountNotNullUnaryOld::data(place).count;
-    }
-
-    MutableColumnPtr create_serialize_column() const override {
-        return ColumnVector<UInt64>::create();
-    }
-
-    DataTypePtr get_serialized_type() const override { return 
std::make_shared<DataTypeUInt64>(); }
-};
-
-} // namespace doris::vectorized
\ No newline at end of file
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
index 403bb5a117c..08e6e44311f 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
+++ b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
@@ -58,8 +58,6 @@ void 
register_aggregate_function_collect_list(AggregateFunctionSimpleFactory& fa
 void 
register_aggregate_function_sequence_match(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_avg_weighted(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_histogram(AggregateFunctionSimpleFactory& 
factory);
-void register_aggregate_function_count_old(AggregateFunctionSimpleFactory& 
factory);
-void register_aggregate_function_sum_old(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_map_agg(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_bitmap_agg(AggregateFunctionSimpleFactory& 
factory);
 
@@ -74,8 +72,6 @@ AggregateFunctionSimpleFactory& 
AggregateFunctionSimpleFactory::instance() {
         register_aggregate_function_avg(instance);
         register_aggregate_function_count(instance);
         register_aggregate_function_count_by_enum(instance);
-        register_aggregate_function_count_old(instance);
-        register_aggregate_function_sum_old(instance);
         register_aggregate_function_uniq(instance);
         register_aggregate_function_bit(instance);
         register_aggregate_function_bitmap(instance);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_sum_old.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_sum_old.cpp
deleted file mode 100644
index 9b5d3cf85a3..00000000000
--- a/be/src/vec/aggregate_functions/aggregate_function_sum_old.cpp
+++ /dev/null
@@ -1,33 +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.
-// This file is copied from
-// 
https://github.com/ClickHouse/ClickHouse/blob/master/src/AggregateFunctions/AggregateFunctionSum.cpp
-// and modified by Doris
-
-#include "vec/aggregate_functions/aggregate_function_sum_old.h"
-
-#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
-#include "vec/aggregate_functions/helpers.h"
-
-namespace doris::vectorized {
-void register_aggregate_function_sum_old(AggregateFunctionSimpleFactory& 
factory) {
-    factory.register_alternative_function(
-            "sum", creator_with_type::creator<AggregateFunctionSumSimpleOld>, 
false);
-    factory.register_alternative_function(
-            "sum", creator_with_type::creator<AggregateFunctionSumSimpleOld>, 
true);
-}
-} // namespace doris::vectorized
diff --git a/be/src/vec/aggregate_functions/aggregate_function_sum_old.h 
b/be/src/vec/aggregate_functions/aggregate_function_sum_old.h
deleted file mode 100644
index a63c3d911af..00000000000
--- a/be/src/vec/aggregate_functions/aggregate_function_sum_old.h
+++ /dev/null
@@ -1,201 +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.
-// This file is copied from
-// 
https://github.com/ClickHouse/ClickHouse/blob/master/src/AggregateFunctions/AggregateFunctionOldSum.h
-// and modified by Doris
-
-#pragma once
-
-#include <stddef.h>
-
-#include <memory>
-#include <type_traits>
-#include <vector>
-
-#include "vec/aggregate_functions/aggregate_function.h"
-#include "vec/aggregate_functions/aggregate_function_sum.h"
-#include "vec/columns/column.h"
-#include "vec/common/assert_cast.h"
-#include "vec/core/field.h"
-#include "vec/core/types.h"
-#include "vec/data_types/data_type.h"
-#include "vec/data_types/data_type_decimal.h"
-#include "vec/io/io_helper.h"
-namespace doris {
-namespace vectorized {
-class Arena;
-class BufferReadable;
-class BufferWritable;
-template <typename T>
-class ColumnDecimal;
-template <typename T>
-class DataTypeNumber;
-template <typename>
-class ColumnVector;
-} // namespace vectorized
-} // namespace doris
-
-namespace doris::vectorized {
-
-/*
- * this function is used to solve agg of sum/count is not compatibility during 
the upgrade process
- * in PR #20370 have changed the serialize type and serialize column
- * before is ColumnVector, now sum/count change to use ColumnFixedLengthObject
- * so during the upgrade process, will be not compatible if exist old BE and 
Newer BE
- */
-
-template <typename T, typename TResult, typename Data>
-class AggregateFunctionOldSum final
-        : public IAggregateFunctionDataHelper<Data, AggregateFunctionOldSum<T, 
TResult, Data>> {
-public:
-    using ResultDataType = std::conditional_t<IsDecimalNumber<T>, 
DataTypeDecimal<TResult>,
-                                              DataTypeNumber<TResult>>;
-    using ColVecType = std::conditional_t<IsDecimalNumber<T>, 
ColumnDecimal<T>, ColumnVector<T>>;
-    using ColVecResult =
-            std::conditional_t<IsDecimalNumber<T>, ColumnDecimal<TResult>, 
ColumnVector<TResult>>;
-
-    String get_name() const override { return "sum"; }
-
-    AggregateFunctionOldSum(const DataTypes& argument_types_)
-            : IAggregateFunctionDataHelper<Data, AggregateFunctionOldSum<T, 
TResult, Data>>(
-                      argument_types_),
-              scale(get_decimal_scale(*argument_types_[0])) {}
-
-    DataTypePtr get_return_type() const override {
-        if constexpr (IsDecimalNumber<T>) {
-            return 
std::make_shared<ResultDataType>(ResultDataType::max_precision(), scale);
-        } else {
-            return std::make_shared<ResultDataType>();
-        }
-    }
-
-    void add(AggregateDataPtr __restrict place, const IColumn** columns, 
size_t row_num,
-             Arena*) const override {
-        const auto& column = assert_cast<const ColVecType&>(*columns[0]);
-        this->data(place).add(column.get_data()[row_num]);
-    }
-
-    void reset(AggregateDataPtr place) const override { this->data(place).sum 
= {}; }
-
-    void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs,
-               Arena*) const override {
-        this->data(place).merge(this->data(rhs));
-    }
-
-    void serialize(ConstAggregateDataPtr __restrict place, BufferWritable& 
buf) const override {
-        this->data(place).write(buf);
-    }
-
-    void deserialize(AggregateDataPtr __restrict place, BufferReadable& buf,
-                     Arena*) const override {
-        this->data(place).read(buf);
-    }
-
-    void insert_result_into(ConstAggregateDataPtr __restrict place, IColumn& 
to) const override {
-        auto& column = assert_cast<ColVecResult&>(to);
-        column.get_data().push_back(this->data(place).get());
-    }
-
-    void deserialize_from_column(AggregateDataPtr places, const IColumn& 
column, Arena* arena,
-                                 size_t num_rows) const override {
-        auto data = assert_cast<const ColVecResult&>(column).get_data().data();
-        auto dst_data = reinterpret_cast<Data*>(places);
-        for (size_t i = 0; i != num_rows; ++i) {
-            dst_data[i].sum = data[i];
-        }
-    }
-
-    void serialize_to_column(const std::vector<AggregateDataPtr>& places, 
size_t offset,
-                             MutableColumnPtr& dst, const size_t num_rows) 
const override {
-        auto& col = assert_cast<ColVecResult&>(*dst);
-        col.resize(num_rows);
-        auto* data = col.get_data().data();
-        for (size_t i = 0; i != num_rows; ++i) {
-            data[i] = this->data(places[i] + offset).sum;
-        }
-    }
-
-    void streaming_agg_serialize_to_column(const IColumn** columns, 
MutableColumnPtr& dst,
-                                           const size_t num_rows, Arena* 
arena) const override {
-        auto& col = assert_cast<ColVecResult&>(*dst);
-        auto& src = assert_cast<const ColVecType&>(*columns[0]);
-        col.resize(num_rows);
-        auto* src_data = src.get_data().data();
-        auto* dst_data = col.get_data().data();
-        for (size_t i = 0; i != num_rows; ++i) {
-            dst_data[i] = src_data[i];
-        }
-    }
-
-    void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t 
offset,
-                                   AggregateDataPtr rhs, const ColumnString* 
column, Arena* arena,
-                                   const size_t num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec(places, offset, rhs, arena, num_rows);
-    }
-
-    void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, 
size_t offset,
-                                            AggregateDataPtr rhs, const 
ColumnString* column,
-                                            Arena* arena, const size_t 
num_rows) const override {
-        this->deserialize_from_column(rhs, *column, arena, num_rows);
-        DEFER({ this->destroy_vec(rhs, num_rows); });
-        this->merge_vec_selected(places, offset, rhs, arena, num_rows);
-    }
-
-    void deserialize_and_merge_from_column(AggregateDataPtr __restrict place, 
const IColumn& column,
-                                           Arena* arena) const override {
-        auto data = assert_cast<const ColVecResult&>(column).get_data().data();
-        const size_t num_rows = column.size();
-        for (size_t i = 0; i != num_rows; ++i) {
-            this->data(place).sum += data[i];
-        }
-    }
-
-    void serialize_without_key_to_column(ConstAggregateDataPtr __restrict 
place,
-                                         IColumn& to) const override {
-        auto& col = assert_cast<ColVecResult&>(to);
-        col.resize(1);
-        reinterpret_cast<Data*>(col.get_data().data())->sum = 
this->data(place).sum;
-    }
-
-    MutableColumnPtr create_serialize_column() const override {
-        return get_return_type()->create_column();
-    }
-
-    DataTypePtr get_serialized_type() const override { return 
get_return_type(); }
-
-private:
-    UInt32 scale;
-};
-
-template <typename T, bool level_up>
-struct OldSumSimple {
-    /// @note It uses slow Decimal128 (cause we need such a variant). 
sumWithOverflow is faster for Decimal32/64
-    using ResultType = std::conditional_t<level_up, DisposeDecimal<T, 
NearestFieldType<T>>, T>;
-    using AggregateDataType = AggregateFunctionSumData<ResultType>;
-    using Function = AggregateFunctionOldSum<T, ResultType, AggregateDataType>;
-};
-
-template <typename T>
-using AggregateFunctionSumSimpleOld = typename OldSumSimple<T, true>::Function;
-
-// do not level up return type for agg reader
-template <typename T>
-using AggregateFunctionSumSimpleReaderOld = typename OldSumSimple<T, 
false>::Function;
-
-} // namespace doris::vectorized
diff --git a/be/src/vec/functions/array/function_array_index.cpp 
b/be/src/vec/functions/array/function_array_index.cpp
index c153d6843fb..63ee5e85264 100644
--- a/be/src/vec/functions/array/function_array_index.cpp
+++ b/be/src/vec/functions/array/function_array_index.cpp
@@ -25,6 +25,10 @@ void register_function_array_index(SimpleFunctionFactory& 
factory) {
     factory.register_function<FunctionArrayIndex<ArrayContainsAction>>();
     factory.register_function<FunctionArrayIndex<ArrayPositionAction>>();
     factory.register_function<FunctionArrayIndex<ArrayCountEqual>>();
+
+    
factory.register_alternative_function<FunctionArrayIndex<ArrayContainsAction, 
true>>();
+    
factory.register_alternative_function<FunctionArrayIndex<ArrayPositionAction, 
true>>();
+    factory.register_alternative_function<FunctionArrayIndex<ArrayCountEqual, 
true>>();
 }
 
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/array/function_array_index.h 
b/be/src/vec/functions/array/function_array_index.h
index 5b4d58e29d2..27aaa24cdad 100644
--- a/be/src/vec/functions/array/function_array_index.h
+++ b/be/src/vec/functions/array/function_array_index.h
@@ -70,7 +70,7 @@ struct ArrayCountEqual {
     static constexpr void apply(ResultType& current, size_t j) noexcept { 
++current; }
 };
 
-template <typename ConcreteAction>
+template <typename ConcreteAction, bool OldVersion = false>
 class FunctionArrayIndex : public IFunction {
 public:
     using ResultType = typename ConcreteAction::ResultType;
@@ -88,13 +88,20 @@ public:
     bool use_default_implementation_for_nulls() const override { return false; 
}
 
     DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
-        // DCHECK(is_array(arguments[0]));
-        return make_nullable(std::make_shared<DataTypeNumber<ResultType>>());
+        if constexpr (OldVersion) {
+            return 
make_nullable(std::make_shared<DataTypeNumber<ResultType>>());
+        } else {
+            if (arguments[0]->is_nullable()) {
+                return 
make_nullable(std::make_shared<DataTypeNumber<ResultType>>());
+            } else {
+                return std::make_shared<DataTypeNumber<ResultType>>();
+            }
+        }
     }
 
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
                         size_t result, size_t input_rows_count) const override 
{
-        return _execute_non_nullable(block, arguments, result, 
input_rows_count);
+        return _execute_dispatch(block, arguments, result, input_rows_count);
     }
 
 private:
@@ -160,7 +167,14 @@ private:
             }
             dst_data[row] = res;
         }
-        return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        if constexpr (OldVersion) {
+            return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        } else {
+            if (outer_null_map == nullptr) {
+                return dst;
+            }
+            return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        }
     }
 
     template <typename NestedColumnType, typename RightColumnType>
@@ -217,7 +231,14 @@ private:
             }
             dst_data[row] = res;
         }
-        return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        if constexpr (OldVersion) {
+            return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        } else {
+            if (outer_null_map == nullptr) {
+                return dst;
+            }
+            return ColumnNullable::create(std::move(dst), 
std::move(dst_null_column));
+        }
     }
 
     template <typename NestedColumnType>
@@ -234,8 +255,8 @@ private:
         return nullptr;
     }
 
-    Status _execute_non_nullable(Block& block, const ColumnNumbers& arguments, 
size_t result,
-                                 size_t input_rows_count) const {
+    Status _execute_dispatch(Block& block, const ColumnNumbers& arguments, 
size_t result,
+                             size_t input_rows_count) const {
         // extract array offsets and nested data
         auto left_column =
                 
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.cpp 
b/be/src/vec/functions/function_date_or_datetime_computation.cpp
index bbeb3df5588..8fdfad86465 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_computation.cpp
@@ -128,10 +128,6 @@ using FunctionMicroSecToDateTime = 
TimestampToDateTime<MicroSec>;
 using FunctionMilliSecToDateTime = TimestampToDateTime<MilliSec>;
 using FunctionSecToDateTime = TimestampToDateTime<Sec>;
 
-/// @TEMPORARY: for be_exec_version=2
-using FunctionToWeekTwoArgsOld =
-        
FunctionDateOrDateTimeComputation<ToWeekTwoArgsImplOld<DataTypeDateTime>>;
-
 void register_function_date_time_computation(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionAddSeconds>();
     factory.register_function<FunctionAddMinutes>();
@@ -190,8 +186,6 @@ void 
register_function_date_time_computation(SimpleFunctionFactory& factory) {
     factory.register_alias("days_add", "date_add");
     factory.register_alias("days_add", "adddate");
     factory.register_alias("months_add", "add_months");
-    /// @TEMPORARY: for be_exec_version=2
-    factory.register_alternative_function<FunctionToWeekTwoArgsOld>();
 }
 
 } // namespace doris::vectorized
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 cf0304e188f..bb3f7db8c6f 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -370,8 +370,6 @@ TIME_DIFF_FUNCTION_IMPL(MicroSecondsDiffImpl, 
microseconds_diff, MICROSECOND);
 TIME_FUNCTION_TWO_ARGS_IMPL(ToYearWeekTwoArgsImpl, yearweek, 
year_week(mysql_week_mode(mode)),
                             DataTypeInt32);
 TIME_FUNCTION_TWO_ARGS_IMPL(ToWeekTwoArgsImpl, week, 
week(mysql_week_mode(mode)), DataTypeInt8);
-/// @TEMPORARY: for be_exec_version=2
-TIME_FUNCTION_TWO_ARGS_IMPL(ToWeekTwoArgsImplOld, week, 
week(mysql_week_mode(mode)), DataTypeInt32);
 
 template <typename FromType1, typename FromType2, typename ToType, typename 
Transform>
 struct DateTimeOp {
diff --git a/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp 
b/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
index ee8a9bdd65b..ec9560456c1 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
@@ -113,10 +113,6 @@ using FunctionDatetimeV2ToYearWeekTwoArgs =
 using FunctionDatetimeV2ToWeekTwoArgs =
         
FunctionDateOrDateTimeComputation<ToWeekTwoArgsImpl<DataTypeDateTimeV2>>;
 
-/// @TEMPORARY: for be_exec_version=2
-using FunctionDatetimeV2ToWeekTwoArgsOld =
-        
FunctionDateOrDateTimeComputation<ToWeekTwoArgsImplOld<DataTypeDateTimeV2>>;
-
 void register_function_date_time_computation_v2(SimpleFunctionFactory& 
factory) {
     factory.register_function<FunctionAddSecondsV2>();
     factory.register_function<FunctionAddMinutesV2>();
@@ -183,9 +179,6 @@ void 
register_function_date_time_computation_v2(SimpleFunctionFactory& factory)
     factory.register_function<FunctionToWeekTwoArgsV2>();
     factory.register_function<FunctionDatetimeV2ToYearWeekTwoArgs>();
     factory.register_function<FunctionDatetimeV2ToWeekTwoArgs>();
-
-    /// @TEMPORARY: for be_exec_version=2
-    
factory.register_alternative_function<FunctionDatetimeV2ToWeekTwoArgsOld>();
 }
 
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/function_map.cpp 
b/be/src/vec/functions/function_map.cpp
index dd342a07862..3ed681b1181 100644
--- a/be/src/vec/functions/function_map.cpp
+++ b/be/src/vec/functions/function_map.cpp
@@ -146,7 +146,7 @@ public:
     }
 };
 
-template <bool is_key>
+template <bool is_key, bool OldVersion = false>
 class FunctionMapContains : public IFunction {
 public:
     static constexpr auto name = is_key ? "map_contains_key" : 
"map_contains_value";
@@ -170,7 +170,16 @@ public:
         }
         DCHECK(is_map(datatype)) << "first argument for function: " << name
                                  << " should be DataTypeMap";
-        return make_nullable(std::make_shared<DataTypeNumber<UInt8>>());
+
+        if constexpr (OldVersion) {
+            return make_nullable(std::make_shared<DataTypeNumber<UInt8>>());
+        } else {
+            if (arguments[0]->is_nullable()) {
+                return 
make_nullable(std::make_shared<DataTypeNumber<UInt8>>());
+            } else {
+                return std::make_shared<DataTypeNumber<UInt8>>();
+            }
+        }
     }
 
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
diff --git a/be/src/vec/functions/function_string.cpp 
b/be/src/vec/functions/function_string.cpp
index bc0d40fa9ef..6179d64e47d 100644
--- a/be/src/vec/functions/function_string.cpp
+++ b/be/src/vec/functions/function_string.cpp
@@ -967,7 +967,7 @@ void register_function_string(SimpleFunctionFactory& 
factory) {
     factory.register_function<FunctionStringElt>();
     factory.register_function<FunctionStringConcatWs>();
     factory.register_function<FunctionStringAppendTrailingCharIfAbsent>();
-    factory.register_function<FunctionStringRepeat<false>>();
+    factory.register_function<FunctionStringRepeat>();
     factory.register_function<FunctionStringLPad>();
     factory.register_function<FunctionStringRPad>();
     factory.register_function<FunctionToBase64>();
@@ -1001,10 +1001,6 @@ void register_function_string(SimpleFunctionFactory& 
factory) {
     factory.register_alias(FunctionStringUTF8Length::name, "character_length");
     factory.register_alias(FunctionStringDigestOneArg<SM3Sum>::name, "sm3");
     factory.register_alias(FunctionStringDigestSHA1::name, "sha");
-
-    /// @TEMPORARY: for be_exec_version=2
-    factory.register_alternative_function<FunctionStringEltOld>();
-    factory.register_alternative_function<FunctionStringRepeat<true>>();
 }
 
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/function_string.h 
b/be/src/vec/functions/function_string.h
index 6fc611fc83a..69c2e3a5286 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -915,48 +915,6 @@ public:
     }
 };
 
-class FunctionStringEltOld : public IFunction {
-public:
-    static constexpr auto name = "elt";
-    static FunctionPtr create() { return 
std::make_shared<FunctionStringEltOld>(); }
-    String get_name() const override { return name; }
-    size_t get_number_of_arguments() const override { return 0; }
-    bool is_variadic() const override { return true; }
-
-    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
-        return std::make_shared<DataTypeString>();
-    }
-    bool use_default_implementation_for_nulls() const override { return true; }
-    bool use_default_implementation_for_constants() const override { return 
true; }
-
-    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
-                        size_t result, size_t input_rows_count) const override 
{
-        int arguent_size = arguments.size();
-        auto pos_col =
-                
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
-        if (auto* nullable = check_and_get_column<const 
ColumnNullable>(*pos_col)) {
-            pos_col = nullable->get_nested_column_ptr();
-        }
-        auto& pos_data = assert_cast<const 
ColumnInt32*>(pos_col.get())->get_data();
-        auto pos = pos_data[0];
-        int num_children = arguent_size - 1;
-        if (pos < 1 || num_children == 0 || pos > num_children) {
-            auto null_map = ColumnUInt8::create(input_rows_count, 1);
-            auto res = ColumnString::create();
-            auto& res_data = res->get_chars();
-            auto& res_offset = res->get_offsets();
-            res_offset.resize(input_rows_count);
-            for (size_t i = 0; i < input_rows_count; ++i) {
-                res_offset[i] = res_data.size();
-            }
-            block.get_by_position(result).column =
-                    ColumnNullable::create(std::move(res), 
std::move(null_map));
-            return Status::OK();
-        }
-        block.get_by_position(result).column = 
block.get_by_position(arguments[pos]).column;
-        return Status::OK();
-    }
-};
 // concat_ws (string,string....) or (string, Array)
 // TODO: avoid use fmtlib
 class FunctionStringConcatWs : public IFunction {
@@ -1166,7 +1124,7 @@ private:
         }
     }
 };
-template <bool use_old_function>
+
 class FunctionStringRepeat : public IFunction {
 public:
     static constexpr auto name = "repeat";
@@ -1199,12 +1157,8 @@ public:
             } else if (auto* col2_const = 
check_and_get_column<ColumnConst>(*argument_ptr[1])) {
                 
DCHECK(check_and_get_column<ColumnInt32>(col2_const->get_data_column()));
                 int repeat = 0;
-                if constexpr (use_old_function) {
-                    repeat = col2_const->get_int(0);
-                } else {
-                    repeat = std::min<int>(col2_const->get_int(0),
-                                           context->state()->repeat_max_num());
-                }
+                repeat = std::min<int>(col2_const->get_int(0), 
context->state()->repeat_max_num());
+
                 if (repeat <= 0) {
                     null_map->get_data().resize_fill(input_rows_count, 0);
                     res->insert_many_defaults(input_rows_count);
@@ -1236,11 +1190,8 @@ public:
             const char* raw_str = reinterpret_cast<const 
char*>(&data[offsets[i - 1]]);
             size_t size = offsets[i] - offsets[i - 1];
             int repeat = 0;
-            if constexpr (use_old_function) {
-                repeat = repeats[i];
-            } else {
-                repeat = std::min<int>(repeats[i], repeat_max_num);
-            }
+            repeat = std::min<int>(repeats[i], repeat_max_num);
+
             if (repeat <= 0) {
                 StringOP::push_empty_string(i, res_data, res_offsets);
             } else if (repeat * size > DEFAULT_MAX_STRING_SIZE) {
diff --git a/be/src/vec/functions/simple_function_factory.h 
b/be/src/vec/functions/simple_function_factory.h
index 86d4d45b1ff..8d64e9da34b 100644
--- a/be/src/vec/functions/simple_function_factory.h
+++ b/be/src/vec/functions/simple_function_factory.h
@@ -106,8 +106,8 @@ class SimpleFunctionFactory {
     using Creator = std::function<FunctionBuilderPtr()>;
     using FunctionCreators = phmap::flat_hash_map<std::string, Creator>;
     using FunctionIsVariadic = phmap::flat_hash_set<std::string>;
-    /// @TEMPORARY: for be_exec_version=2
-    constexpr static int DATETIME_FUNCTION_NEW = 2;
+    /// @TEMPORARY: for be_exec_version=3
+    constexpr static int NEWEST_VERSION_FUNCTION_SUBSTITUTE = 3;
 
 public:
     void register_function(const std::string& name, const Creator& ptr) {
@@ -143,10 +143,10 @@ public:
         function_alias[alias] = name;
     }
 
-    /// @TEMPORARY: for be_exec_version=2
+    /// @TEMPORARY: for be_exec_version=3
     template <class Function>
     void register_alternative_function() {
-        static std::string suffix {"_old_for_version_before_2_0"};
+        static std::string suffix {"_old_for_version_before_3_0"};
         function_to_replace[Function::name] = Function::name + suffix;
         register_function(Function::name + suffix, 
&createDefaultFunction<Function>);
     }
@@ -186,7 +186,7 @@ private:
     FunctionCreators function_creators;
     FunctionIsVariadic function_variadic_set;
     std::unordered_map<std::string, std::string> function_alias;
-    /// @TEMPORARY: for be_exec_version=2. replace function to old version.
+    /// @TEMPORARY: for be_exec_version=3. replace function to old version.
     std::unordered_map<std::string, std::string> function_to_replace;
 
     template <typename Function>
@@ -194,10 +194,10 @@ private:
         return std::make_shared<DefaultFunctionBuilder>(Function::create());
     }
 
-    /// @TEMPORARY: for be_exec_version=2
+    /// @TEMPORARY: for be_exec_version=3
     void temporary_function_update(int fe_version_now, std::string& name) {
         // replace if fe is old version.
-        if (fe_version_now < DATETIME_FUNCTION_NEW &&
+        if (fe_version_now < NEWEST_VERSION_FUNCTION_SUBSTITUTE &&
             function_to_replace.find(name) != function_to_replace.end()) {
             name = function_to_replace[name];
         }
diff --git a/be/src/vec/functions/time_of_function.cpp 
b/be/src/vec/functions/time_of_function.cpp
index 8e2f5d73a99..ff01e1e0eaf 100644
--- a/be/src/vec/functions/time_of_function.cpp
+++ b/be/src/vec/functions/time_of_function.cpp
@@ -60,34 +60,6 @@ using FunctionDateTimeV2YearWeek =
 using FunctionDateTimeV2WeekDay =
         FunctionDateOrDateTimeToSomething<DataTypeInt8, WeekDayImpl<UInt64>>;
 
-/// @TEMPORARY: for be_exec_version=2
-using FunctionWeekOfYearOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
WeekOfYearImpl<Int64>>;
-using FunctionWeekOfYearV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
WeekOfYearImpl<UInt32>>;
-using FunctionDayOfYearOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfYearImpl<Int64>>;
-using FunctionDayOfYearV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfYearImpl<UInt32>>;
-using FunctionDayOfWeekOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfWeekImpl<Int64>>;
-using FunctionDayOfWeekV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfWeekImpl<UInt32>>;
-using FunctionDayOfMonthOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfMonthImpl<Int64>>;
-using FunctionDayOfMonthV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfMonthImpl<UInt32>>;
-using FunctionWeekDayOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
WeekDayImpl<Int64>>;
-using FunctionWeekDayV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
WeekDayImpl<UInt32>>;
-using FunctionDateTimeV2WeekOfYearOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
WeekOfYearImpl<UInt64>>;
-using FunctionDateTimeV2DayOfYearOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfYearImpl<UInt64>>;
-using FunctionDateTimeV2DayOfWeekOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfWeekImpl<UInt64>>;
-using FunctionDateTimeV2DayOfMonthOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
DayOfMonthImpl<UInt64>>;
-using FunctionDateTimeV2WeekDayOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, WeekDayImpl<UInt64>>;
-
 void register_function_time_of_function(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionDayOfWeek>();
     factory.register_function<FunctionDayOfMonth>();
@@ -107,22 +79,5 @@ void 
register_function_time_of_function(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionDateTimeV2DayOfMonth>();
     factory.register_function<FunctionDateTimeV2YearWeek>();
     factory.register_function<FunctionDateTimeV2WeekDay>();
-
-    /// @TEMPORARY: for be_exec_version=2
-    factory.register_alternative_function<FunctionWeekOfYearOld>();
-    factory.register_alternative_function<FunctionWeekOfYearV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2WeekOfYearOld>();
-    factory.register_alternative_function<FunctionDayOfYearOld>();
-    factory.register_alternative_function<FunctionDayOfYearV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2DayOfYearOld>();
-    factory.register_alternative_function<FunctionDayOfWeekOld>();
-    factory.register_alternative_function<FunctionDayOfWeekV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2DayOfWeekOld>();
-    factory.register_alternative_function<FunctionDayOfMonthOld>();
-    factory.register_alternative_function<FunctionDayOfMonthV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2DayOfMonthOld>();
-    factory.register_alternative_function<FunctionWeekDayOld>();
-    factory.register_alternative_function<FunctionWeekDayV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2WeekDayOld>();
 }
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/to_time_function.cpp 
b/be/src/vec/functions/to_time_function.cpp
index e3676a4aea9..126296fc40a 100644
--- a/be/src/vec/functions/to_time_function.cpp
+++ b/be/src/vec/functions/to_time_function.cpp
@@ -81,42 +81,6 @@ using FunctionTimeStamp = 
FunctionDateOrDateTimeToSomething<DataTypeDateTime, Ti
 using FunctionTimeStampV2 =
         FunctionDateOrDateTimeToSomething<DataTypeDateTimeV2, 
TimeStampImpl<UInt64>>;
 
-/// @TEMPORARY: for be_exec_version=2
-using FunctionYearOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToYearImpl<Int64>>;
-using FunctionYearV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToYearImpl<UInt32>>;
-using FunctionQuarterOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToQuarterImpl<Int64>>;
-using FunctionQuarterV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToQuarterImpl<UInt32>>;
-using FunctionMonthOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToMonthImpl<Int64>>;
-using FunctionMonthV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToMonthImpl<UInt32>>;
-using FunctionWeekOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToWeekOneArgImpl<Int64>>;
-using FunctionWeekV2Old =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToWeekOneArgImpl<UInt32>>;
-using FunctionDayOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToDayImpl<Int64>>;
-using FunctionDayV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToDayImpl<UInt32>>;
-using FunctionHourOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToHourImpl<Int64>>;
-using FunctionHourV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToHourImpl<UInt32>>;
-using FunctionMinuteOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToMinuteImpl<Int64>>;
-using FunctionMinuteV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToMinuteImpl<UInt32>>;
-using FunctionSecondOld = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToSecondImpl<Int64>>;
-using FunctionSecondV2Old = FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToSecondImpl<UInt32>>;
-using FunctionDateTimeV2YearOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToYearImpl<UInt64>>;
-using FunctionDateTimeV2QuarterOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToQuarterImpl<UInt64>>;
-using FunctionDateTimeV2MonthOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToMonthImpl<UInt64>>;
-using FunctionDateTimeV2WeekOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, 
ToWeekOneArgImpl<UInt64>>;
-using FunctionDateTimeV2DayOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToDayImpl<UInt64>>;
-using FunctionDateTimeV2HourOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToHourImpl<UInt64>>;
-using FunctionDateTimeV2MinuteOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToMinuteImpl<UInt64>>;
-using FunctionDateTimeV2SecondOld =
-        FunctionDateOrDateTimeToSomething<DataTypeInt32, ToSecondImpl<UInt64>>;
-
 void register_function_to_time_function(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionSecond>();
     factory.register_function<FunctionMinute>();
@@ -156,32 +120,6 @@ void 
register_function_to_time_function(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionDateTimeV2Date>();
     factory.register_alias("date", "datev2");
     factory.register_alias("to_date", "to_datev2");
-
-    /// @TEMPORARY: for be_exec_version=2
-    factory.register_alternative_function<FunctionYearOld>();
-    factory.register_alternative_function<FunctionQuarterOld>();
-    factory.register_alternative_function<FunctionMonthOld>();
-    factory.register_alternative_function<FunctionDayOld>();
-    factory.register_alternative_function<FunctionWeekOld>();
-    factory.register_alternative_function<FunctionHourOld>();
-    factory.register_alternative_function<FunctionMinuteOld>();
-    factory.register_alternative_function<FunctionSecondOld>();
-    factory.register_alternative_function<FunctionYearV2Old>();
-    factory.register_alternative_function<FunctionQuarterV2Old>();
-    factory.register_alternative_function<FunctionMonthV2Old>();
-    factory.register_alternative_function<FunctionWeekV2Old>();
-    factory.register_alternative_function<FunctionDayV2Old>();
-    factory.register_alternative_function<FunctionHourV2Old>();
-    factory.register_alternative_function<FunctionMinuteV2Old>();
-    factory.register_alternative_function<FunctionSecondV2Old>();
-    factory.register_alternative_function<FunctionDateTimeV2YearOld>();
-    factory.register_alternative_function<FunctionDateTimeV2QuarterOld>();
-    factory.register_alternative_function<FunctionDateTimeV2MonthOld>();
-    factory.register_alternative_function<FunctionDateTimeV2WeekOld>();
-    factory.register_alternative_function<FunctionDateTimeV2DayOld>();
-    factory.register_alternative_function<FunctionDateTimeV2HourOld>();
-    factory.register_alternative_function<FunctionDateTimeV2MinuteOld>();
-    factory.register_alternative_function<FunctionDateTimeV2SecondOld>();
 }
 
 } // namespace doris::vectorized
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index 22d1c7e150f..d8749ad6cca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -2387,6 +2387,12 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
             }
             return false;
         }
+        if (fn.functionName().equalsIgnoreCase("array_contains") || 
fn.functionName().equalsIgnoreCase("array_position")
+                || fn.functionName().equalsIgnoreCase("countequal")
+                || fn.functionName().equalsIgnoreCase("map_contains_key")
+                || fn.functionName().equalsIgnoreCase("map_contains_value")) {
+            return children.get(0).isNullable();
+        }
         return true;
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayContains.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayContains.java
index 9b02b6ce76e..494a4a863c5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayContains.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayContains.java
@@ -19,7 +19,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'array_contains'. This class is generated by 
GenerateFunction.
  */
 public class ArrayContains extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BooleanType.INSTANCE)
@@ -60,6 +59,11 @@ public class ArrayContains extends ScalarFunction
         return new ArrayContains(children.get(0), children.get(1));
     }
 
+    @Override
+    public boolean nullable() {
+        return child(0).nullable();
+    }
+
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitArrayContains(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPosition.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPosition.java
index ecaac29e7c4..3a94e84d511 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPosition.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPosition.java
@@ -19,7 +19,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'array_position'. This class is generated by 
GenerateFunction.
  */
 public class ArrayPosition extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -60,6 +59,11 @@ public class ArrayPosition extends ScalarFunction
         return new ArrayPosition(children.get(0), children.get(1));
     }
 
+    @Override
+    public boolean nullable() {
+        return child(0).nullable();
+    }
+
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitArrayPosition(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CountEqual.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CountEqual.java
index 95b5b5b29e8..2ba0c907243 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CountEqual.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CountEqual.java
@@ -19,7 +19,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'countequal'. This class is generated by GenerateFunction.
  */
 public class CountEqual extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -60,6 +59,11 @@ public class CountEqual extends ScalarFunction
         return new CountEqual(children.get(0), children.get(1));
     }
 
+    @Override
+    public boolean nullable() {
+        return child(0).nullable();
+    }
+
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitCountEqual(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsKey.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsKey.java
index 94e1718f3f7..b489bd47963 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsKey.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsKey.java
@@ -19,7 +19,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'map_contains_key'. This class is generated by 
GenerateFunction.
  */
 public class MapContainsKey extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BooleanType.INSTANCE)
@@ -61,6 +60,11 @@ public class MapContainsKey extends ScalarFunction
         return new MapContainsKey(children.get(0), children.get(1));
     }
 
+    @Override
+    public boolean nullable() {
+        return child(0).nullable();
+    }
+
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMapContainsKey(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsValue.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsValue.java
index 196a07e136e..de77386c889 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsValue.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapContainsValue.java
@@ -19,7 +19,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'map_contains_value'. This class is generated by 
GenerateFunction.
  */
 public class MapContainsValue extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BooleanType.INSTANCE)
@@ -61,6 +60,11 @@ public class MapContainsValue extends ScalarFunction
         return new MapContainsValue(children.get(0), children.get(1));
     }
 
+    @Override
+    public boolean nullable() {
+        return child(0).nullable();
+    }
+
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMapContainsValue(this, context);
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index 991caa9e531..bdddde58036 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -76,8 +76,8 @@ visible_functions = {
         [['map'], 'MAP<K, V>', ['K', 'V', '...'], 'ALWAYS_NOT_NULLABLE', ['K', 
'V']],
         [['element_at', '%element_extract%'], 'V', ['MAP<K, V>', 'K'], 
'ALWAYS_NULLABLE', ['K', 'V']],
         [['size', 'map_size'], 'BIGINT', ['MAP<K, V>'], '', ['K', 'V']],
-        [['map_contains_key'], 'BOOLEAN', ['MAP<K, V>', 'K'], 
'ALWAYS_NULLABLE', ['K', 'V']],
-        [['map_contains_value'], 'BOOLEAN', ['MAP<K, V>', 'V'], 
'ALWAYS_NULLABLE', ['K', 'V']],
+        [['map_contains_key'], 'BOOLEAN', ['MAP<K, V>', 'K'], 'CUSTOM', ['K', 
'V']],
+        [['map_contains_value'], 'BOOLEAN', ['MAP<K, V>', 'V'], 'CUSTOM', 
['K', 'V']],
         #[['map_contains_key_like'], 'BOOLEAN', ['MAP<K, V>', 'K'], '', ['K', 
'V']],
         [['map_keys'], 'ARRAY<K>', ['MAP<K, V>'], '', ['K', 'V']],
         [['map_values'], 'ARRAY<V>', ['MAP<K, V>'], '', ['K', 'V']],
@@ -165,24 +165,24 @@ visible_functions = {
         [['arrays_overlap'], 'BOOLEAN', ['ARRAY_VARCHAR', 'ARRAY_VARCHAR'], 
'ALWAYS_NULLABLE'],
         [['arrays_overlap'], 'BOOLEAN', ['ARRAY_STRING', 'ARRAY_STRING'], 
'ALWAYS_NULLABLE'],
 
-        [['array_contains'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_TINYINT', 'TINYINT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_SMALLINT', 'SMALLINT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_INT', 'INT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_BIGINT', 'BIGINT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_LARGEINT', 'LARGEINT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIME', 'DATETIME'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DATE', 'DATE'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DATEV2', 'DATEV2'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_FLOAT', 'FLOAT'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DOUBLE', 'DOUBLE'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'DECIMALV2'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL32', 'DECIMAL32'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL64', 'DECIMAL64'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_VARCHAR', 'VARCHAR'], 
'ALWAYS_NULLABLE'],
-        [['array_contains'], 'BOOLEAN', ['ARRAY_STRING', 'STRING'], 
'ALWAYS_NULLABLE'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_TINYINT', 'TINYINT'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_SMALLINT', 'SMALLINT'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_INT', 'INT'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_BIGINT', 'BIGINT'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_LARGEINT', 'LARGEINT'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIME', 'DATETIME'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DATE', 'DATE'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DATEV2', 'DATEV2'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_FLOAT', 'FLOAT'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DOUBLE', 'DOUBLE'], 'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'DECIMALV2'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL32', 'DECIMAL32'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL64', 'DECIMAL64'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_VARCHAR', 'VARCHAR'], 
'CUSTOM'],
+        [['array_contains'], 'BOOLEAN', ['ARRAY_STRING', 'STRING'], 'CUSTOM'],
 
         [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_TINYINT'], ''],
         [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_SMALLINT'], ''],
@@ -234,43 +234,43 @@ visible_functions = {
         [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_VARCHAR', '...'], 
''],
         [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_STRING', '...'], 
''],
 
-        [['countequal'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 
'ALWAYS_NULLABLE'],
-        [['countequal'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 
'ALWAYS_NULLABLE'],
-
-        [['array_position'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_INT', 'INT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 
'ALWAYS_NULLABLE'],
-        [['array_position'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 
'ALWAYS_NULLABLE'],
+        [['countequal'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_INT', 'INT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 'CUSTOM'],
+        [['countequal'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 'CUSTOM'],
+
+        [['array_position'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_INT', 'INT'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 
'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 'CUSTOM'],
+        [['array_position'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 'CUSTOM'],
 
         [['cardinality', 'size', 'array_size'], 'BIGINT', ['ARRAY'], ''],
         [['array_distinct'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to