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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7d97aa194b [feature-wip](datev2) Support to use datev2 as partition 
column (#11618)
7d97aa194b is described below

commit 7d97aa194bea5f748333f36ab23f3d5ff19f77eb
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Fri Aug 12 11:54:01 2022 +0800

    [feature-wip](datev2) Support to use datev2 as partition column (#11618)
---
 be/src/exec/exec_node.cpp                          | 14 +++--
 be/src/exec/tablet_info.cpp                        | 32 ++++++++++--
 be/src/exprs/hybrid_set.h                          |  4 ++
 .../segment_v2/bloom_filter_index_writer.cpp       |  7 +++
 be/src/olap/rowset/segment_v2/segment_iterator.cpp |  4 --
 be/src/vec/columns/column.h                        |  6 ---
 be/src/vec/columns/column_nullable.h               |  3 --
 be/src/vec/data_types/data_type_time_v2.cpp        | 50 +++++++++++++-----
 be/src/vec/data_types/data_type_time_v2.h          |  4 ++
 be/src/vec/exec/volap_scan_node.cpp                | 60 ++++++++++++++--------
 be/src/vec/exec/volap_scan_node.h                  |  3 +-
 .../vec/functions/array/function_array_element.h   |  8 ---
 be/src/vec/functions/array/function_array_index.h  | 12 -----
 be/src/vec/functions/function_cast.h               |  9 +---
 .../apache/doris/analysis/FunctionCallExpr.java    |  2 +-
 gensrc/script/doris_builtins_functions.py          |  2 +
 16 files changed, 134 insertions(+), 86 deletions(-)

diff --git a/be/src/exec/exec_node.cpp b/be/src/exec/exec_node.cpp
index 0a854ba89b..be48218fb6 100644
--- a/be/src/exec/exec_node.cpp
+++ b/be/src/exec/exec_node.cpp
@@ -213,7 +213,9 @@ Status ExecNode::prepare(RuntimeState* state) {
     if (_vconjunct_ctx_ptr) {
         RETURN_IF_ERROR((*_vconjunct_ctx_ptr)->prepare(state, 
_row_descriptor));
     }
-    RETURN_IF_ERROR(Expr::prepare(_conjunct_ctxs, state, _row_descriptor));
+    if (typeid(*this) != typeid(doris::vectorized::VOlapScanNode)) {
+        RETURN_IF_ERROR(Expr::prepare(_conjunct_ctxs, state, _row_descriptor));
+    }
 
     // TODO(zc):
     // AddExprCtxsToFree(_conjunct_ctxs);
@@ -229,7 +231,11 @@ Status ExecNode::open(RuntimeState* state) {
     if (_vconjunct_ctx_ptr) {
         RETURN_IF_ERROR((*_vconjunct_ctx_ptr)->open(state));
     }
-    return Expr::open(_conjunct_ctxs, state);
+    if (typeid(*this) != typeid(doris::vectorized::VOlapScanNode)) {
+        return Expr::open(_conjunct_ctxs, state);
+    } else {
+        return Status::OK();
+    }
 }
 
 Status ExecNode::reset(RuntimeState* state) {
@@ -267,7 +273,9 @@ Status ExecNode::close(RuntimeState* state) {
     }
 
     if (_vconjunct_ctx_ptr) (*_vconjunct_ctx_ptr)->close(state);
-    Expr::close(_conjunct_ctxs, state);
+    if (typeid(*this) != typeid(doris::vectorized::VOlapScanNode)) {
+        Expr::close(_conjunct_ctxs, state);
+    }
 
     if (_buffer_pool_client.is_registered()) {
         VLOG_FILE << _id << " returning reservation " << 
_resource_profile.min_reservation;
diff --git a/be/src/exec/tablet_info.cpp b/be/src/exec/tablet_info.cpp
index 0fd5e24032..c89e03f0be 100644
--- a/be/src/exec/tablet_info.cpp
+++ b/be/src/exec/tablet_info.cpp
@@ -331,11 +331,33 @@ Status 
OlapTablePartitionParam::_create_partition_key(const TExprNode& t_expr, T
     tuple->set_not_null(slot_desc->null_indicator_offset());
     switch (t_expr.node_type) {
     case TExprNodeType::DATE_LITERAL: {
-        if (!reinterpret_cast<DateTimeValue*>(slot)->from_date_str(
-                    t_expr.date_literal.value.c_str(), 
t_expr.date_literal.value.size())) {
-            std::stringstream ss;
-            ss << "invalid date literal in partition column, date=" << 
t_expr.date_literal;
-            return Status::InternalError(ss.str());
+        if ((t_expr.type.types[0].scalar_type.type == TPrimitiveType::DATE) ||
+            (t_expr.type.types[0].scalar_type.type == 
TPrimitiveType::DATETIME)) {
+            if (!reinterpret_cast<DateTimeValue*>(slot)->from_date_str(
+                        t_expr.date_literal.value.c_str(), 
t_expr.date_literal.value.size())) {
+                std::stringstream ss;
+                ss << "invalid date literal in partition column, date=" << 
t_expr.date_literal;
+                return Status::InternalError(ss.str());
+            }
+        } else if (t_expr.type.types[0].scalar_type.type == 
TPrimitiveType::DATEV2) {
+            if (!reinterpret_cast<
+                         
doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>*>(slot)
+                         ->from_date_str(t_expr.date_literal.value.c_str(),
+                                         t_expr.date_literal.value.size())) {
+                std::stringstream ss;
+                ss << "invalid date literal in partition column, date=" << 
t_expr.date_literal;
+                return Status::InternalError(ss.str());
+            }
+        } else {
+            if (!reinterpret_cast<
+                         
doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>*>(
+                         slot)
+                         ->from_date_str(t_expr.date_literal.value.c_str(),
+                                         t_expr.date_literal.value.size())) {
+                std::stringstream ss;
+                ss << "invalid date literal in partition column, date=" << 
t_expr.date_literal;
+                return Status::InternalError(ss.str());
+            }
         }
         break;
     }
diff --git a/be/src/exprs/hybrid_set.h b/be/src/exprs/hybrid_set.h
index 16b740e951..e43b2c29ea 100644
--- a/be/src/exprs/hybrid_set.h
+++ b/be/src/exprs/hybrid_set.h
@@ -51,6 +51,8 @@ public:
     virtual Status to_vexpr_list(doris::ObjectPool* pool,
                                  std::vector<doris::vectorized::VExpr*>* 
vexpr_list, int precision,
                                  int scale) = 0;
+
+    virtual bool is_date_v2() { return false; }
     class IteratorBase {
     public:
         IteratorBase() {}
@@ -73,6 +75,8 @@ public:
 
     ~HybridSet() override = default;
 
+    bool is_date_v2() override { return T == TYPE_DATEV2; }
+
     Status to_vexpr_list(doris::ObjectPool* pool,
                          std::vector<doris::vectorized::VExpr*>* vexpr_list, 
int precision,
                          int scale) override {
diff --git a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp 
b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
index 62ee2ede53..e6376ad4c1 100644
--- a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
@@ -210,6 +210,13 @@ Status BloomFilterIndexWriter::create(const 
BloomFilterOptions& bf_options,
     case OLAP_FIELD_TYPE_DECIMAL:
         res->reset(new 
BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DECIMAL>(bf_options, type_info));
         break;
+    case OLAP_FIELD_TYPE_DATEV2:
+        res->reset(new 
BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATEV2>(bf_options, type_info));
+        break;
+    case OLAP_FIELD_TYPE_DATETIMEV2:
+        res->reset(
+                new 
BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATETIMEV2>(bf_options, type_info));
+        break;
     default:
         return Status::NotSupported("unsupported type for bitmap index: {}", 
std::to_string(type));
     }
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp 
b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index 24035a62fc..3b91bbc024 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -908,10 +908,6 @@ void SegmentIterator::_init_current_block(
                 current_columns[cid]->set_date_type();
             } else if (column_desc->type() == OLAP_FIELD_TYPE_DATETIME) {
                 current_columns[cid]->set_datetime_type();
-            } else if (column_desc->type() == OLAP_FIELD_TYPE_DATEV2) {
-                current_columns[cid]->set_date_v2_type();
-            } else if (column_desc->type() == OLAP_FIELD_TYPE_DATETIMEV2) {
-                current_columns[cid]->set_datetime_v2_type();
             } else if (column_desc->type() == OLAP_FIELD_TYPE_DECIMAL) {
                 current_columns[cid]->set_decimalv2_type();
             }
diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h
index cdc6fed9bf..002fc8eea3 100644
--- a/be/src/vec/columns/column.h
+++ b/be/src/vec/columns/column.h
@@ -513,22 +513,16 @@ public:
     virtual void replace_column_data_default(size_t self_row = 0) = 0;
 
     virtual bool is_date_type() const { return is_date; }
-    virtual bool is_date_v2_type() const { return is_date_v2; }
-    virtual bool is_datetime_v2_type() const { return is_datetime_v2; }
     virtual bool is_datetime_type() const { return is_date_time; }
     virtual bool is_decimalv2_type() const { return is_decimalv2; }
 
     virtual void set_date_type() { is_date = true; }
-    virtual void set_date_v2_type() { is_date_v2 = true; }
-    virtual void set_datetime_v2_type() { is_datetime_v2 = true; }
     virtual void set_datetime_type() { is_date_time = true; }
     virtual void set_decimalv2_type() { is_decimalv2 = true; }
 
     // todo(wb): a temporary implemention, need re-abstract here
     bool is_date = false;
     bool is_date_time = false;
-    bool is_date_v2 = false;
-    bool is_datetime_v2 = false;
     bool is_decimalv2 = false;
 
 protected:
diff --git a/be/src/vec/columns/column_nullable.h 
b/be/src/vec/columns/column_nullable.h
index 37249a858a..c9268118df 100644
--- a/be/src/vec/columns/column_nullable.h
+++ b/be/src/vec/columns/column_nullable.h
@@ -180,12 +180,9 @@ public:
     }
 
     bool is_date_type() const override { return 
get_nested_column().is_date_type(); }
-    bool is_date_v2_type() const override { return 
get_nested_column().is_date_v2_type(); }
-    bool is_datetime_v2_type() const override { return 
get_nested_column().is_datetime_v2_type(); }
     bool is_datetime_type() const override { return 
get_nested_column().is_datetime_type(); }
     bool is_decimalv2_type() const override { return 
get_nested_column().is_decimalv2_type(); }
     void set_date_type() override { get_nested_column().set_date_type(); }
-    void set_date_v2_type() override { get_nested_column().set_date_v2_type(); 
}
     void set_datetime_type() override { 
get_nested_column().set_datetime_type(); }
     void set_decimalv2_type() override { 
get_nested_column().set_decimalv2_type(); }
 
diff --git a/be/src/vec/data_types/data_type_time_v2.cpp 
b/be/src/vec/data_types/data_type_time_v2.cpp
index a9f1a27098..04e1789a45 100644
--- a/be/src/vec/data_types/data_type_time_v2.cpp
+++ b/be/src/vec/data_types/data_type_time_v2.cpp
@@ -49,20 +49,18 @@ void DataTypeDateV2::to_string(const IColumn& column, 
size_t row_num, BufferWrit
 }
 
 MutableColumnPtr DataTypeDateV2::create_column() const {
-    auto col = DataTypeNumberBase<UInt32>::create_column();
-    col->set_date_v2_type();
-    return col;
+    return DataTypeNumberBase<UInt32>::create_column();
 }
 
 void DataTypeDateV2::cast_to_date_time(const UInt32 from, Int64& to) {
-    auto& to_value = (doris::vectorized::VecDateTimeValue&)to;
-    auto& from_value = (doris::vectorized::DateV2Value<DateV2ValueType>&)from;
+    auto& to_value = (VecDateTimeValue&)to;
+    auto& from_value = (DateV2Value<DateV2ValueType>&)from;
     to_value.create_from_date_v2(from_value, TimeType::TIME_DATETIME);
 }
 
 void DataTypeDateV2::cast_to_date(const UInt32 from, Int64& to) {
-    auto& to_value = (doris::vectorized::VecDateTimeValue&)(to);
-    auto& from_value = (doris::vectorized::DateV2Value<DateV2ValueType>&)from;
+    auto& to_value = (VecDateTimeValue&)(to);
+    auto& from_value = (DateV2Value<DateV2ValueType>&)from;
     to_value.create_from_date_v2(from_value, TimeType::TIME_DATE);
 }
 
@@ -70,6 +68,18 @@ void DataTypeDateV2::cast_to_date_time_v2(const UInt32 from, 
UInt64& to) {
     to = ((UInt64)from) << TIME_PART_LENGTH;
 }
 
+void DataTypeDateV2::cast_from_date(const Int64 from, UInt32& to) {
+    auto& to_value = (DateV2Value<DateV2ValueType>&)(to);
+    auto from_value = binary_cast<Int64, VecDateTimeValue>(from);
+    to_value.set_time(from_value.year(), from_value.month(), from_value.day(), 
0, 0, 0, 0);
+}
+
+void DataTypeDateV2::cast_from_date_time(const Int64 from, UInt32& to) {
+    auto& to_value = (DateV2Value<DateV2ValueType>&)(to);
+    auto from_value = binary_cast<Int64, VecDateTimeValue>(from);
+    to_value.set_time(from_value.year(), from_value.month(), from_value.day(), 
0, 0, 0, 0);
+}
+
 bool DataTypeDateTimeV2::equals(const IDataType& rhs) const {
     return typeid(rhs) == typeid(*this);
 }
@@ -100,23 +110,35 @@ void DataTypeDateTimeV2::to_string(const IColumn& column, 
size_t row_num,
 }
 
 MutableColumnPtr DataTypeDateTimeV2::create_column() const {
-    auto col = DataTypeNumberBase<UInt64>::create_column();
-    col->set_datetime_v2_type();
-    return col;
+    return DataTypeNumberBase<UInt64>::create_column();
 }
 
 void DataTypeDateTimeV2::cast_to_date_time(const UInt64 from, Int64& to) {
-    auto& to_value = (doris::vectorized::VecDateTimeValue&)to;
-    auto& from_value = 
(doris::vectorized::DateV2Value<DateTimeV2ValueType>&)from;
+    auto& to_value = (VecDateTimeValue&)to;
+    auto& from_value = (DateV2Value<DateTimeV2ValueType>&)from;
     to_value.create_from_date_v2(from_value, TimeType::TIME_DATETIME);
 }
 
 void DataTypeDateTimeV2::cast_to_date(const UInt64 from, Int64& to) {
-    auto& to_value = (doris::vectorized::VecDateTimeValue&)(to);
-    auto& from_value = 
(doris::vectorized::DateV2Value<DateTimeV2ValueType>&)from;
+    auto& to_value = (VecDateTimeValue&)(to);
+    auto& from_value = (DateV2Value<DateTimeV2ValueType>&)from;
     to_value.create_from_date_v2(from_value, TimeType::TIME_DATE);
 }
 
+void DataTypeDateTimeV2::cast_from_date(const Int64 from, UInt64& to) {
+    auto& to_value = (DateV2Value<DateTimeV2ValueType>&)(to);
+    auto from_value = binary_cast<Int64, VecDateTimeValue>(from);
+    to_value.set_time(from_value.year(), from_value.month(), from_value.day(), 
from_value.hour(),
+                      from_value.minute(), from_value.second(), 0);
+}
+
+void DataTypeDateTimeV2::cast_from_date_time(const Int64 from, UInt64& to) {
+    auto& to_value = (DateV2Value<DateTimeV2ValueType>&)(to);
+    auto from_value = binary_cast<Int64, VecDateTimeValue>(from);
+    to_value.set_time(from_value.year(), from_value.month(), from_value.day(), 
from_value.hour(),
+                      from_value.minute(), from_value.second(), 0);
+}
+
 void DataTypeDateTimeV2::cast_to_date_v2(const UInt64 from, UInt32& to) {
     to = from >> TIME_PART_LENGTH;
 }
diff --git a/be/src/vec/data_types/data_type_time_v2.h 
b/be/src/vec/data_types/data_type_time_v2.h
index 0efff481e6..d2a6cefae6 100644
--- a/be/src/vec/data_types/data_type_time_v2.h
+++ b/be/src/vec/data_types/data_type_time_v2.h
@@ -43,6 +43,8 @@ public:
     static void cast_to_date(const UInt32 from, Int64& to);
     static void cast_to_date_time(const UInt32 from, Int64& to);
     static void cast_to_date_time_v2(const UInt32 from, UInt64& to);
+    static void cast_from_date(const Int64 from, UInt32& to);
+    static void cast_from_date_time(const Int64 from, UInt32& to);
 };
 
 class DataTypeDateTimeV2 final : public DataTypeNumberBase<UInt64> {
@@ -74,6 +76,8 @@ public:
     static void cast_to_date(const UInt64 from, Int64& to);
     static void cast_to_date_time(const UInt64 from, Int64& to);
     static void cast_to_date_v2(const UInt64 from, UInt32& to);
+    static void cast_from_date(const Int64 from, UInt64& to);
+    static void cast_from_date_time(const Int64 from, UInt64& to);
 
 private:
     UInt32 scale_;
diff --git a/be/src/vec/exec/volap_scan_node.cpp 
b/be/src/vec/exec/volap_scan_node.cpp
index 6d69643bb8..cd4b3bb42d 100644
--- a/be/src/vec/exec/volap_scan_node.cpp
+++ b/be/src/vec/exec/volap_scan_node.cpp
@@ -811,7 +811,8 @@ static bool ignore_cast(SlotDescriptor* slot, VExpr* expr) {
 template <bool IsFixed, PrimitiveType PrimitiveType, typename 
ChangeFixedValueRangeFunc>
 Status VOlapScanNode::change_value_range(ColumnValueRange<PrimitiveType>& 
temp_range, void* value,
                                          const ChangeFixedValueRangeFunc& func,
-                                         const std::string& fn_name, int 
slot_ref_child) {
+                                         const std::string& fn_name, bool 
cast_date_to_datetime,
+                                         int slot_ref_child) {
     if constexpr (PrimitiveType == TYPE_DATE) {
         DateTimeValue date_value;
         
reinterpret_cast<VecDateTimeValue*>(value)->convert_vec_dt_to_dt(&date_value);
@@ -844,27 +845,39 @@ Status 
VOlapScanNode::change_value_range(ColumnValueRange<PrimitiveType>& temp_r
                          reinterpret_cast<char*>(&date_value)));
         }
     } else if constexpr (PrimitiveType == TYPE_DATEV2) {
-        DateV2Value<DateTimeV2ValueType> datetimev2_value =
-                *reinterpret_cast<DateV2Value<DateTimeV2ValueType>*>(value);
-        if constexpr (IsFixed) {
-            if (datetimev2_value.can_cast_to_date_without_loss_accuracy()) {
-                DateV2Value<DateV2ValueType> date_v2;
+        if (cast_date_to_datetime) {
+            DateV2Value<DateTimeV2ValueType> datetimev2_value =
+                    
*reinterpret_cast<DateV2Value<DateTimeV2ValueType>*>(value);
+            if constexpr (IsFixed) {
+                if (datetimev2_value.can_cast_to_date_without_loss_accuracy()) 
{
+                    DateV2Value<DateV2ValueType> date_v2;
+                    
date_v2.set_date_uint32(binary_cast<DateV2Value<DateTimeV2ValueType>, uint64_t>(
+                                                    datetimev2_value) >>
+                                            TIME_PART_LENGTH);
+                    func(temp_range, &date_v2);
+                }
+            } else {
+                doris::vectorized::DateV2Value<DateV2ValueType> date_v2;
                 date_v2.set_date_uint32(
                         binary_cast<DateV2Value<DateTimeV2ValueType>, 
uint64_t>(datetimev2_value) >>
                         TIME_PART_LENGTH);
-                func(temp_range, &date_v2);
+                if 
(!datetimev2_value.can_cast_to_date_without_loss_accuracy()) {
+                    if (fn_name == "lt" || fn_name == "ge") {
+                        ++date_v2;
+                    }
+                }
+                func(temp_range, to_olap_filter_type(fn_name, slot_ref_child), 
&date_v2);
             }
         } else {
-            doris::vectorized::DateV2Value<DateV2ValueType> date_v2;
-            date_v2.set_date_uint32(
-                    binary_cast<DateV2Value<DateTimeV2ValueType>, 
uint64_t>(datetimev2_value) >>
-                    TIME_PART_LENGTH);
-            if (!datetimev2_value.can_cast_to_date_without_loss_accuracy()) {
-                if (fn_name == "lt" || fn_name == "ge") {
-                    ++date_v2;
-                }
+            if constexpr (IsFixed) {
+                func(temp_range,
+                     reinterpret_cast<typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(
+                             value));
+            } else {
+                func(temp_range, to_olap_filter_type(fn_name, slot_ref_child),
+                     reinterpret_cast<typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(
+                             value));
             }
-            func(temp_range, to_olap_filter_type(fn_name, slot_ref_child), 
&date_v2);
         }
     } else if constexpr ((PrimitiveType == TYPE_DECIMALV2) || (PrimitiveType 
== TYPE_CHAR) ||
                          (PrimitiveType == TYPE_VARCHAR) || (PrimitiveType == 
TYPE_HLL) ||
@@ -1503,8 +1516,9 @@ Status 
VOlapScanNode::_normalize_in_and_eq_predicate(VExpr* expr, VExprContext*
                 continue;
             }
             auto value = const_cast<void*>(iter->get_value());
-            RETURN_IF_ERROR(change_value_range<true>(
-                    temp_range, value, 
ColumnValueRange<T>::add_fixed_value_range, fn_name));
+            RETURN_IF_ERROR(change_value_range<true>(temp_range, value,
+                                                     
ColumnValueRange<T>::add_fixed_value_range,
+                                                     fn_name, 
!state->hybrid_set->is_date_v2()));
             iter->next();
         }
 
@@ -1577,10 +1591,12 @@ Status 
VOlapScanNode::_normalize_not_in_and_not_eq_predicate(VExpr* expr, VExprC
             auto value = const_cast<void*>(iter->get_value());
             if (is_fixed_range) {
                 RETURN_IF_ERROR(change_value_range<true>(
-                        range, value, 
ColumnValueRange<T>::remove_fixed_value_range, fn_name));
+                        range, value, 
ColumnValueRange<T>::remove_fixed_value_range, fn_name,
+                        !state->hybrid_set->is_date_v2()));
             } else {
                 RETURN_IF_ERROR(change_value_range<true>(
-                        not_in_range, value, 
ColumnValueRange<T>::add_fixed_value_range, fn_name));
+                        not_in_range, value, 
ColumnValueRange<T>::add_fixed_value_range, fn_name,
+                        !state->hybrid_set->is_date_v2()));
             }
             iter->next();
         }
@@ -1687,11 +1703,11 @@ Status 
VOlapScanNode::_normalize_noneq_binary_predicate(VExpr* expr, VExprContex
                     auto val = StringValue(value.data, value.size);
                     RETURN_IF_ERROR(change_value_range<false>(range, 
reinterpret_cast<void*>(&val),
                                                               
ColumnValueRange<T>::add_value_range,
-                                                              fn_name, 
slot_ref_child));
+                                                              fn_name, true, 
slot_ref_child));
                 } else {
                     RETURN_IF_ERROR(change_value_range<false>(
                             range, 
reinterpret_cast<void*>(const_cast<char*>(value.data)),
-                            ColumnValueRange<T>::add_value_range, fn_name, 
slot_ref_child));
+                            ColumnValueRange<T>::add_value_range, fn_name, 
true, slot_ref_child));
                 }
             }
         }
diff --git a/be/src/vec/exec/volap_scan_node.h 
b/be/src/vec/exec/volap_scan_node.h
index fba7fdd24a..7b3f383b62 100644
--- a/be/src/vec/exec/volap_scan_node.h
+++ b/be/src/vec/exec/volap_scan_node.h
@@ -74,7 +74,8 @@ private:
     template <bool IsFixed, PrimitiveType PrimitiveType, typename 
ChangeFixedValueRangeFunc>
     static Status change_value_range(ColumnValueRange<PrimitiveType>& range, 
void* value,
                                      const ChangeFixedValueRangeFunc& func,
-                                     const std::string& fn_name, int 
slot_ref_child = -1);
+                                     const std::string& fn_name, bool 
cast_date_to_datetime = true,
+                                     int slot_ref_child = -1);
 
     void transfer_thread(RuntimeState* state);
     void scanner_thread(VOlapScanner* scanner);
diff --git a/be/src/vec/functions/array/function_array_element.h 
b/be/src/vec/functions/array/function_array_element.h
index 53c41b19eb..d04a1b605b 100644
--- a/be/src/vec/functions/array/function_array_element.h
+++ b/be/src/vec/functions/array/function_array_element.h
@@ -199,18 +199,10 @@ private:
         if (nested_column->is_date_type()) {
             res = _execute_number<ColumnDate>(offsets, *nested_column, 
src_null_map,
                                               *arguments[1].column, 
nested_null_map, dst_null_map);
-        } else if (nested_column->is_date_v2_type()) {
-            res = _execute_number<ColumnDateV2>(offsets, *nested_column, 
src_null_map,
-                                                *arguments[1].column, 
nested_null_map,
-                                                dst_null_map);
         } else if (nested_column->is_datetime_type()) {
             res = _execute_number<ColumnDateTime>(offsets, *nested_column, 
src_null_map,
                                                   *arguments[1].column, 
nested_null_map,
                                                   dst_null_map);
-        } else if (nested_column->is_datetime_v2_type()) {
-            res = _execute_number<ColumnDateTimeV2>(offsets, *nested_column, 
src_null_map,
-                                                    *arguments[1].column, 
nested_null_map,
-                                                    dst_null_map);
         } else if (check_column<ColumnUInt8>(*nested_column)) {
             res = _execute_number<ColumnUInt8>(offsets, *nested_column, 
src_null_map,
                                                *arguments[1].column, 
nested_null_map, dst_null_map);
diff --git a/be/src/vec/functions/array/function_array_index.h 
b/be/src/vec/functions/array/function_array_index.h
index 3bb1df5003..ab81490267 100644
--- a/be/src/vec/functions/array/function_array_index.h
+++ b/be/src/vec/functions/array/function_array_index.h
@@ -174,12 +174,6 @@ private:
         } else if (right_column.is_date_type()) {
             return _execute_number<NestedColumnType, ColumnDate>(offsets, 
nested_null_map,
                                                                  
nested_column, right_column);
-        } else if (right_column.is_date_v2_type()) {
-            return _execute_number<NestedColumnType, ColumnDateV2>(offsets, 
nested_null_map,
-                                                                   
nested_column, right_column);
-        } else if (right_column.is_datetime_v2_type()) {
-            return _execute_number<NestedColumnType, 
ColumnDateTimeV2>(offsets, nested_null_map,
-                                                                       
nested_column, right_column);
         } else if (right_column.is_datetime_type()) {
             return _execute_number<NestedColumnType, ColumnDateTime>(offsets, 
nested_null_map,
                                                                      
nested_column, right_column);
@@ -257,15 +251,9 @@ private:
             if (nested_column->is_date_type()) {
                 return_column = _execute_number_expanded<ColumnDate>(offsets, 
nested_null_map,
                                                                      
*nested_column, *right_column);
-            } else if (nested_column->is_date_v2_type()) {
-                return_column = _execute_number_expanded<ColumnDateV2>(
-                        offsets, nested_null_map, *nested_column, 
*right_column);
             } else if (nested_column->is_datetime_type()) {
                 return_column = _execute_number_expanded<ColumnDateTime>(
                         offsets, nested_null_map, *nested_column, 
*right_column);
-            } else if (nested_column->is_datetime_v2_type()) {
-                return_column = _execute_number_expanded<ColumnDateTimeV2>(
-                        offsets, nested_null_map, *nested_column, 
*right_column);
             }
         }
 
diff --git a/be/src/vec/functions/function_cast.h 
b/be/src/vec/functions/function_cast.h
index b262ad7a29..11d8d7ed44 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -145,14 +145,9 @@ struct ConvertImpl {
                             DataTypeDate::cast_to_date(vec_to[i]);
                         }
                     } else if constexpr (IsDateV2Type<ToDataType>) {
-                        auto date_v2 = binary_cast<UInt32, 
DateV2Value<DateV2ValueType>>(vec_to[i]);
-                        date_v2.from_date_int64(
-                                reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64());
+                        DataTypeDateV2::cast_from_date(vec_from[i], vec_to[i]);
                     } else if constexpr (IsDateTimeV2Type<ToDataType>) {
-                        auto date_v2 =
-                                binary_cast<UInt64, 
DateV2Value<DateTimeV2ValueType>>(vec_to[i]);
-                        date_v2.from_date_int64(
-                                reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64());
+                        DataTypeDateTimeV2::cast_from_date(vec_from[i], 
vec_to[i]);
                     } else {
                         vec_to[i] =
                                 reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 6bf620e9c4..1d8be77af7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -829,7 +829,7 @@ public class FunctionCallExpr extends Expr {
      */
     public void analyzeImplForDefaultValue() throws AnalysisException {
         fn = getBuiltinFunction(fnName.getFunction(), new Type[0], 
Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
-        type = fn.getReturnType();
+        type = ScalarType.getDefaultDateType(fn.getReturnType());
         for (int i = 0; i < children.size(); ++i) {
             if (getChild(i).getType().isNull()) {
                 uncheckedCastChild(Type.BOOLEAN, i);
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index 92b3bbe7db..fb1b1ddab1 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -1826,6 +1826,8 @@ visible_functions = [
     [['if'], 'DOUBLE', ['BOOLEAN', 'DOUBLE', 'DOUBLE'], '', '', '', 'vec', 
'CUSTOM'],
     [['if'], 'DATETIME', ['BOOLEAN', 'DATETIME', 'DATETIME'], '', '', '', 
'vec', 'CUSTOM'],
     [['if'], 'DATE', ['BOOLEAN', 'DATE', 'DATE'], '', '', '', 'vec', 'CUSTOM'],
+    [['if'], 'DATETIMEV2', ['BOOLEAN', 'DATETIMEV2', 'DATETIMEV2'], '', '', 
'', 'vec', 'CUSTOM'],
+    [['if'], 'DATEV2', ['BOOLEAN', 'DATEV2', 'DATEV2'], '', '', '', 'vec', 
'CUSTOM'],
     [['if'], 'DECIMALV2', ['BOOLEAN', 'DECIMALV2', 'DECIMALV2'], '', '', '', 
'vec', 'CUSTOM'],
     [['if'], 'BITMAP', ['BOOLEAN', 'BITMAP', 'BITMAP'], '', '', '', 'vec', 
'CUSTOM'],
     # The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF 
mode.


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

Reply via email to