You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/15 06:32:45 UTC

[doris] branch master updated: [feature-wip] Support in predicate for datev2 type (#10810)

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 ad4751972c [feature-wip] Support in predicate for datev2 type (#10810)
ad4751972c is described below

commit ad4751972cfa345834aa92425477e4fbdf14986c
Author: Gabriel <ga...@gmail.com>
AuthorDate: Fri Jul 15 14:32:40 2022 +0800

    [feature-wip] Support in predicate for datev2 type (#10810)
---
 be/src/exprs/anyval_util.cpp                       |  6 ++
 be/src/exprs/anyval_util.h                         | 16 +++++
 be/src/exprs/cast_functions.cpp                    | 81 ++++++++++++++++++++++
 be/src/exprs/cast_functions.h                      | 18 +++++
 be/src/exprs/create_predicate_function.h           |  2 +
 be/src/exprs/expr.cpp                              | 17 ++++-
 be/src/exprs/expr.h                                |  1 +
 be/src/exprs/expr_context.cpp                      | 13 +++-
 be/src/exprs/expr_context.h                        |  1 +
 be/src/exprs/expr_value.h                          |  1 +
 be/src/exprs/literal.cpp                           | 11 ++-
 be/src/exprs/literal.h                             |  1 +
 be/src/exprs/scalar_fn_call.cpp                    | 13 +++-
 be/src/exprs/scalar_fn_call.h                      |  1 +
 be/src/exprs/slot_ref.cpp                          | 13 ++++
 be/src/exprs/slot_ref.h                            |  1 +
 be/src/runtime/primitive_type.h                    |  5 ++
 be/src/udf/udf.h                                   | 27 ++++++++
 be/src/util/symbols_util.cpp                       |  4 ++
 be/src/vec/exprs/vliteral.cpp                      |  3 +-
 be/src/vec/runtime/vdatetime_value.h               | 10 +++
 .../java/org/apache/doris/analysis/CastExpr.java   |  6 +-
 .../org/apache/doris/analysis/DateLiteral.java     |  7 +-
 .../java/org/apache/doris/catalog/Function.java    |  6 +-
 .../java/org/apache/doris/catalog/FunctionSet.java | 25 ++++++-
 .../java/org/apache/doris/catalog/ScalarType.java  | 13 ++--
 .../org/apache/doris/catalog/ColumnTypeTest.java   |  6 +-
 27 files changed, 283 insertions(+), 25 deletions(-)

diff --git a/be/src/exprs/anyval_util.cpp b/be/src/exprs/anyval_util.cpp
index 4c8a96e498..f92419123f 100644
--- a/be/src/exprs/anyval_util.cpp
+++ b/be/src/exprs/anyval_util.cpp
@@ -37,6 +37,7 @@ using doris_udf::DecimalV2Val;
 using doris_udf::DateTimeVal;
 using doris_udf::StringVal;
 using doris_udf::AnyVal;
+using doris_udf::DateV2Val;
 
 Status allocate_any_val(RuntimeState* state, MemPool* pool, const TypeDescriptor& type,
                         const std::string& mem_limit_exceeded_msg, AnyVal** result) {
@@ -105,7 +106,11 @@ AnyVal* create_any_val(ObjectPool* pool, const TypeDescriptor& type) {
     case TYPE_DATE:
         return pool->add(new DateTimeVal);
 
+    case TYPE_DATEV2:
+        return pool->add(new DateV2Val);
+
     case TYPE_DATETIME:
+    case TYPE_DATETIMEV2:
         return pool->add(new DateTimeVal);
 
     case TYPE_ARRAY:
@@ -149,6 +154,7 @@ FunctionContext::TypeDesc AnyValUtil::column_type_to_type_desc(const TypeDescrip
         out.type = FunctionContext::TYPE_DATE;
         break;
     case TYPE_DATETIME:
+    case TYPE_DATETIMEV2:
         out.type = FunctionContext::TYPE_DATETIME;
         break;
     case TYPE_DATEV2:
diff --git a/be/src/exprs/anyval_util.h b/be/src/exprs/anyval_util.h
index a6b8063be3..207d610f25 100644
--- a/be/src/exprs/anyval_util.h
+++ b/be/src/exprs/anyval_util.h
@@ -183,6 +183,10 @@ public:
             DecimalV2Val val;
             type_limit<DecimalV2Value>::min().to_decimal_val(&val);
             return val;
+        } else if constexpr (std::is_same_v<Val, DateV2Val>) {
+            DateV2Val val;
+            type_limit<doris::vectorized::DateV2Value>::min().to_datev2_val(&val);
+            return val;
         } else {
             return Val(type_limit<decltype(std::declval<Val>().val)>::min());
         }
@@ -206,6 +210,10 @@ public:
             DecimalV2Val val;
             type_limit<DecimalV2Value>::max().to_decimal_val(&val);
             return val;
+        } else if constexpr (std::is_same_v<Val, DateV2Val>) {
+            DateV2Val val;
+            type_limit<doris::vectorized::DateV2Value>::max().to_datev2_val(&val);
+            return val;
         } else {
             return Val(type_limit<decltype(std::declval<Val>().val)>::max());
         }
@@ -246,6 +254,8 @@ public:
         case TYPE_STRING:
             return sizeof(doris_udf::StringVal);
 
+        case TYPE_DATEV2:
+            return sizeof(doris_udf::DateV2Val);
         case TYPE_DATE:
         case TYPE_DATETIME:
             return sizeof(doris_udf::DateTimeVal);
@@ -291,6 +301,8 @@ public:
         case TYPE_DATETIME:
         case TYPE_DATE:
             return alignof(DateTimeVal);
+        case TYPE_DATEV2:
+            return alignof(DateV2Val);
         case TYPE_DECIMALV2:
             return alignof(DecimalV2Val);
         case TYPE_ARRAY:
@@ -411,6 +423,10 @@ public:
         case TYPE_DATETIME:
             reinterpret_cast<const DateTimeValue*>(slot)->to_datetime_val(
                     reinterpret_cast<doris_udf::DateTimeVal*>(dst));
+
+        case TYPE_DATEV2:
+            reinterpret_cast<const doris::vectorized::DateV2Value*>(slot)->to_datev2_val(
+                    reinterpret_cast<doris_udf::DateV2Val*>(dst));
             return;
         case TYPE_ARRAY:
             reinterpret_cast<const CollectionValue*>(slot)->to_collection_val(
diff --git a/be/src/exprs/cast_functions.cpp b/be/src/exprs/cast_functions.cpp
index 65cf27d6d4..16a2b47a6a 100644
--- a/be/src/exprs/cast_functions.cpp
+++ b/be/src/exprs/cast_functions.cpp
@@ -32,6 +32,7 @@
 #include "util/mysql_global.h"
 #include "util/string_parser.hpp"
 #include "vec/data_types/data_type_decimal.h"
+#include "vec/runtime/vdatetime_value.h"
 
 namespace doris {
 
@@ -609,6 +610,86 @@ Decimal64Val CastFunctions::cast_to_decimal64_val(FunctionContext* ctx, const De
     }
 }
 
+DateTimeVal CastFunctions::cast_to_date_val(FunctionContext* ctx, const DateV2Val& val) {
+    if (val.is_null) {
+        return DateTimeVal::null();
+    }
+    vectorized::DateV2Value datev2_val = vectorized::DateV2Value::from_datev2_val(val);
+    DateTimeValue datetime_value;
+    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    DateTimeVal result;
+    datetime_value.to_datetime_val(&result);
+    return result;
+}
+
+DateTimeVal CastFunctions::cast_to_datetime_val(FunctionContext* ctx, const DateV2Val& val) {
+    if (val.is_null) {
+        return DateTimeVal::null();
+    }
+    vectorized::DateV2Value datev2_val = vectorized::DateV2Value::from_datev2_val(val);
+    DateTimeValue datetime_value;
+    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    datetime_value.set_type(TYPE_DATETIME);
+    DateTimeVal result;
+    datetime_value.to_datetime_val(&result);
+    return result;
+}
+
+#define CAST_TO_DATEV2(from_type)                                                             \
+    DateV2Val CastFunctions::cast_to_datev2_val(FunctionContext* ctx, const from_type& val) { \
+        if (val.is_null) return DateV2Val::null();                                            \
+        doris::vectorized::DateV2Value date_value;                                            \
+        if (!date_value.from_date_int64(val.val)) return DateV2Val::null();                   \
+        DateV2Val result;                                                                     \
+        date_value.to_datev2_val(&result);                                                    \
+        return result;                                                                        \
+    }
+
+#define CAST_NUMERIC_TYPES_TO_DATEV2() \
+    CAST_TO_DATEV2(TinyIntVal);        \
+    CAST_TO_DATEV2(SmallIntVal);       \
+    CAST_TO_DATEV2(IntVal);            \
+    CAST_TO_DATEV2(BigIntVal);         \
+    CAST_TO_DATEV2(LargeIntVal);       \
+    CAST_TO_DATEV2(FloatVal);          \
+    CAST_TO_DATEV2(DoubleVal);
+
+CAST_NUMERIC_TYPES_TO_DATEV2();
+
+DateV2Val CastFunctions::cast_to_datev2_val(FunctionContext* ctx, const DateV2Val& val) {
+    if (val.is_null) {
+        return DateV2Val::null();
+    }
+    return val;
+}
+
+DateV2Val CastFunctions::cast_to_datev2_val(FunctionContext* ctx, const StringVal& val) {
+    if (val.is_null) {
+        return DateV2Val::null();
+    }
+    doris::vectorized::DateV2Value date_value;
+    if (!date_value.from_date_str((char*)val.ptr, val.len)) {
+        return DateV2Val::null();
+    }
+    // Return null if 'val' did not parse
+    DateV2Val result;
+    date_value.to_datev2_val(&result);
+    return result;
+}
+
+DateV2Val CastFunctions::cast_to_datev2_val(FunctionContext* ctx, const DateTimeVal& val) {
+    if (val.is_null) {
+        return DateV2Val::null();
+    }
+    vectorized::VecDateTimeValue date_value = vectorized::VecDateTimeValue::from_datetime_val(val);
+
+    doris::vectorized::DateV2Value datev2_val;
+    datev2_val.from_date(date_value.to_date_v2());
+    DateV2Val result;
+    datev2_val.to_datev2_val(&result);
+    return result;
+}
+
 CollectionVal CastFunctions::cast_to_array_val(FunctionContext* context, const StringVal& val) {
     CollectionVal array_val;
     Status status = ArrayParser::parse(array_val, context, val);
diff --git a/be/src/exprs/cast_functions.h b/be/src/exprs/cast_functions.h
index 497f49bf80..5beecf8e62 100644
--- a/be/src/exprs/cast_functions.h
+++ b/be/src/exprs/cast_functions.h
@@ -128,6 +128,8 @@ public:
     static DateTimeVal cast_to_datetime_val(FunctionContext* context, const DoubleVal& val);
     static DateTimeVal cast_to_datetime_val(FunctionContext* context, const DateTimeVal& val);
     static DateTimeVal cast_to_datetime_val(FunctionContext* context, const StringVal& val);
+    static DateTimeVal cast_to_datetime_val(FunctionContext* context,
+                                            const doris_udf::DateV2Val& val);
 
     static DateTimeVal cast_to_date_val(FunctionContext* context, const TinyIntVal& val);
     static DateTimeVal cast_to_date_val(FunctionContext* context, const SmallIntVal& val);
@@ -138,6 +140,22 @@ public:
     static DateTimeVal cast_to_date_val(FunctionContext* context, const DoubleVal& val);
     static DateTimeVal cast_to_date_val(FunctionContext* context, const DateTimeVal& val);
     static DateTimeVal cast_to_date_val(FunctionContext* context, const StringVal& val);
+    static DateTimeVal cast_to_date_val(FunctionContext* context, const doris_udf::DateV2Val& val);
+
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const TinyIntVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context,
+                                                   const SmallIntVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const IntVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const BigIntVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context,
+                                                   const LargeIntVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const FloatVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const DoubleVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context,
+                                                   const doris_udf::DateV2Val& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context, const StringVal& val);
+    static doris_udf::DateV2Val cast_to_datev2_val(FunctionContext* context,
+                                                   const DateTimeVal& val);
 
 #define DECLARE_CAST_TO_DECIMAL(width)                                                             \
     static Decimal##width##Val cast_to_decimal##width##_val(FunctionContext*, const TinyIntVal&);  \
diff --git a/be/src/exprs/create_predicate_function.h b/be/src/exprs/create_predicate_function.h
index 36fed51383..6795777cc6 100644
--- a/be/src/exprs/create_predicate_function.h
+++ b/be/src/exprs/create_predicate_function.h
@@ -95,6 +95,8 @@ typename Traits::BasePtr create_predicate_function(PrimitiveType type) {
         return Creator::template create<TYPE_DATETIME>();
     case TYPE_DATEV2:
         return Creator::template create<TYPE_DATEV2>();
+    case TYPE_DATETIMEV2:
+        return Creator::template create<TYPE_DATETIMEV2>();
 
     case TYPE_CHAR:
         return Creator::template create<TYPE_CHAR>();
diff --git a/be/src/exprs/expr.cpp b/be/src/exprs/expr.cpp
index 1cbacf3445..283eb81fca 100644
--- a/be/src/exprs/expr.cpp
+++ b/be/src/exprs/expr.cpp
@@ -132,6 +132,8 @@ Expr::Expr(const TypeDescriptor& type)
 
     case TYPE_DATE:
     case TYPE_DATETIME:
+    case TYPE_DATEV2:
+    case TYPE_DATETIMEV2:
         _node_type = (TExprNodeType::DATE_LITERAL);
         break;
 
@@ -191,6 +193,8 @@ Expr::Expr(const TypeDescriptor& type, bool is_slotref)
             break;
 
         case TYPE_DATETIME:
+        case TYPE_DATEV2:
+        case TYPE_DATETIMEV2:
             _node_type = (TExprNodeType::DATE_LITERAL);
             break;
 
@@ -692,11 +696,17 @@ doris_udf::AnyVal* Expr::get_const_val(ExprContext* context) {
         break;
     }
     case TYPE_DATE:
-    case TYPE_DATETIME: {
+    case TYPE_DATETIME:
+    case TYPE_DATETIMEV2: {
         _constant_val.reset(new DateTimeVal(get_datetime_val(context, nullptr)));
         break;
     }
 
+    case TYPE_DATEV2: {
+        _constant_val.reset(new DateV2Val(get_datev2_val(context, nullptr)));
+        break;
+    }
+
     case TYPE_DECIMALV2: {
         _constant_val.reset(new DecimalV2Val(get_decimalv2_val(context, nullptr)));
         break;
@@ -806,6 +816,11 @@ DateTimeVal Expr::get_datetime_val(ExprContext* context, TupleRow* row) {
     return val;
 }
 
+DateV2Val Expr::get_datev2_val(ExprContext* context, TupleRow* row) {
+    DateV2Val val;
+    return val;
+}
+
 DecimalV2Val Expr::get_decimalv2_val(ExprContext* context, TupleRow* row) {
     DecimalV2Val val;
     return val;
diff --git a/be/src/exprs/expr.h b/be/src/exprs/expr.h
index 9b114b664b..6d65910b7f 100644
--- a/be/src/exprs/expr.h
+++ b/be/src/exprs/expr.h
@@ -105,6 +105,7 @@ public:
     // virtual ArrayVal GetArrayVal(ExprContext* context, TupleRow*);
     virtual DateTimeVal get_datetime_val(ExprContext* context, TupleRow*);
     virtual DecimalV2Val get_decimalv2_val(ExprContext* context, TupleRow*);
+    virtual DateV2Val get_datev2_val(ExprContext* context, TupleRow*);
     virtual CollectionVal get_array_val(ExprContext* context, TupleRow*);
 
     virtual Decimal32Val get_decimal32_val(ExprContext* context, TupleRow*);
diff --git a/be/src/exprs/expr_context.cpp b/be/src/exprs/expr_context.cpp
index 139127b5c8..007372d786 100644
--- a/be/src/exprs/expr_context.cpp
+++ b/be/src/exprs/expr_context.cpp
@@ -257,7 +257,6 @@ void* ExprContext::get_value(Expr* e, TupleRow* row, int precision, int scale) {
     }
     case TYPE_DATE:
     case TYPE_DATETIME:
-    case TYPE_DATEV2:
     case TYPE_DATETIMEV2: {
         doris_udf::DateTimeVal v = e->get_datetime_val(this, row);
         if (v.is_null) {
@@ -266,6 +265,14 @@ void* ExprContext::get_value(Expr* e, TupleRow* row, int precision, int scale) {
         _result.datetime_val = DateTimeValue::from_datetime_val(v);
         return &_result.datetime_val;
     }
+    case TYPE_DATEV2: {
+        doris_udf::DateV2Val v = e->get_datev2_val(this, row);
+        if (v.is_null) {
+            return nullptr;
+        }
+        _result.datev2_val = doris::vectorized::DateV2Value::from_datev2_val(v);
+        return &_result.datev2_val;
+    }
     case TYPE_DECIMALV2: {
         DecimalV2Val v = e->get_decimalv2_val(this, row);
         if (v.is_null) {
@@ -370,6 +377,10 @@ DateTimeVal ExprContext::get_datetime_val(TupleRow* row) {
     return _root->get_datetime_val(this, row);
 }
 
+DateV2Val ExprContext::get_datev2_val(TupleRow* row) {
+    return _root->get_datev2_val(this, row);
+}
+
 DecimalV2Val ExprContext::get_decimalv2_val(TupleRow* row) {
     return _root->get_decimalv2_val(this, row);
 }
diff --git a/be/src/exprs/expr_context.h b/be/src/exprs/expr_context.h
index 14cfa86df2..b8bda8fa48 100644
--- a/be/src/exprs/expr_context.h
+++ b/be/src/exprs/expr_context.h
@@ -126,6 +126,7 @@ public:
     // TODO(zc):
     // ArrayVal GetArrayVal(TupleRow* row);
     DateTimeVal get_datetime_val(TupleRow* row);
+    DateV2Val get_datev2_val(TupleRow* row);
     DecimalV2Val get_decimalv2_val(TupleRow* row);
 
     /// Frees all local allocations made by fn_contexts_. This can be called when result
diff --git a/be/src/exprs/expr_value.h b/be/src/exprs/expr_value.h
index ede221147e..12cc1dba6f 100644
--- a/be/src/exprs/expr_value.h
+++ b/be/src/exprs/expr_value.h
@@ -45,6 +45,7 @@ struct ExprValue {
     std::string string_data;
     StringValue string_val;
     DateTimeValue datetime_val;
+    doris::vectorized::DateV2Value datev2_val;
     DecimalV2Value decimalv2_val;
     CollectionValue array_val;
 
diff --git a/be/src/exprs/literal.cpp b/be/src/exprs/literal.cpp
index de0e214bfe..83db5f6ae0 100644
--- a/be/src/exprs/literal.cpp
+++ b/be/src/exprs/literal.cpp
@@ -81,11 +81,14 @@ Literal::Literal(const TExprNode& node) : Expr(node) {
         break;
     case TYPE_DATE:
     case TYPE_DATETIME:
-    case TYPE_DATEV2:
     case TYPE_DATETIMEV2:
         _value.datetime_val.from_date_str(node.date_literal.value.c_str(),
                                           node.date_literal.value.size());
         break;
+    case TYPE_DATEV2:
+        _value.datev2_val.from_date_str(node.date_literal.value.c_str(),
+                                        node.date_literal.value.size());
+        break;
     case TYPE_CHAR:
     case TYPE_VARCHAR:
     case TYPE_STRING:
@@ -210,6 +213,12 @@ DateTimeVal Literal::get_datetime_val(ExprContext* context, TupleRow* row) {
     return dt_val;
 }
 
+DateV2Val Literal::get_datev2_val(ExprContext* context, TupleRow* row) {
+    DateV2Val dt_val;
+    _value.datev2_val.to_datev2_val(&dt_val);
+    return dt_val;
+}
+
 StringVal Literal::get_string_val(ExprContext* context, TupleRow* row) {
     DCHECK(_type.is_string_type()) << _type;
     StringVal str_val;
diff --git a/be/src/exprs/literal.h b/be/src/exprs/literal.h
index 87372b1590..9637b3038c 100644
--- a/be/src/exprs/literal.h
+++ b/be/src/exprs/literal.h
@@ -44,6 +44,7 @@ public:
     virtual DoubleVal get_double_val(ExprContext* context, TupleRow*) override;
     virtual DecimalV2Val get_decimalv2_val(ExprContext* context, TupleRow*) override;
     virtual DateTimeVal get_datetime_val(ExprContext* context, TupleRow*) override;
+    virtual DateV2Val get_datev2_val(ExprContext* context, TupleRow*) override;
     virtual StringVal get_string_val(ExprContext* context, TupleRow* row) override;
     virtual CollectionVal get_array_val(ExprContext* context, TupleRow*) override;
     virtual Decimal32Val get_decimal32_val(ExprContext* context, TupleRow*) override;
diff --git a/be/src/exprs/scalar_fn_call.cpp b/be/src/exprs/scalar_fn_call.cpp
index c5e2b61b0f..86140761d4 100644
--- a/be/src/exprs/scalar_fn_call.cpp
+++ b/be/src/exprs/scalar_fn_call.cpp
@@ -355,6 +355,7 @@ typedef FloatVal (*FloatWrapper)(ExprContext*, TupleRow*);
 typedef DoubleVal (*DoubleWrapper)(ExprContext*, TupleRow*);
 typedef StringVal (*StringWrapper)(ExprContext*, TupleRow*);
 typedef DateTimeVal (*DatetimeWrapper)(ExprContext*, TupleRow*);
+typedef DateV2Val (*DateV2Wrapper)(ExprContext*, TupleRow*);
 typedef DecimalV2Val (*DecimalV2Wrapper)(ExprContext*, TupleRow*);
 typedef Decimal32Val (*Decimal32Wrapper)(ExprContext*, TupleRow*);
 typedef Decimal64Val (*Decimal64Wrapper)(ExprContext*, TupleRow*);
@@ -454,7 +455,7 @@ StringVal ScalarFnCall::get_string_val(ExprContext* context, TupleRow* row) {
 }
 
 DateTimeVal ScalarFnCall::get_datetime_val(ExprContext* context, TupleRow* row) {
-    DCHECK(_type.is_date_type());
+    DCHECK(_type.is_date_type() || _type.is_date_v2_type());
     DCHECK(context != nullptr);
     if (_scalar_fn_wrapper == nullptr) {
         return interpret_eval<DateTimeVal>(context, row);
@@ -463,6 +464,16 @@ DateTimeVal ScalarFnCall::get_datetime_val(ExprContext* context, TupleRow* row)
     return fn(context, row);
 }
 
+DateV2Val ScalarFnCall::get_datev2_val(ExprContext* context, TupleRow* row) {
+    DCHECK(_type.is_date_v2_type());
+    DCHECK(context != nullptr);
+    if (_scalar_fn_wrapper == nullptr) {
+        return interpret_eval<DateV2Val>(context, row);
+    }
+    DateV2Wrapper fn = reinterpret_cast<DateV2Wrapper>(_scalar_fn_wrapper);
+    return fn(context, row);
+}
+
 DecimalV2Val ScalarFnCall::get_decimalv2_val(ExprContext* context, TupleRow* row) {
     DCHECK_EQ(_type.type, TYPE_DECIMALV2);
     DCHECK(context != nullptr);
diff --git a/be/src/exprs/scalar_fn_call.h b/be/src/exprs/scalar_fn_call.h
index 97287c37c7..0e4f297c57 100644
--- a/be/src/exprs/scalar_fn_call.h
+++ b/be/src/exprs/scalar_fn_call.h
@@ -84,6 +84,7 @@ protected:
     virtual doris_udf::DoubleVal get_double_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::StringVal get_string_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::DateTimeVal get_datetime_val(ExprContext* context, TupleRow*) override;
+    virtual doris_udf::DateV2Val get_datev2_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::DecimalV2Val get_decimalv2_val(ExprContext* context, TupleRow*) override;
     virtual CollectionVal get_array_val(ExprContext* context, TupleRow*) override;
 
diff --git a/be/src/exprs/slot_ref.cpp b/be/src/exprs/slot_ref.cpp
index 666b427565..d6893eedce 100644
--- a/be/src/exprs/slot_ref.cpp
+++ b/be/src/exprs/slot_ref.cpp
@@ -225,6 +225,19 @@ DateTimeVal SlotRef::get_datetime_val(ExprContext* context, TupleRow* row) {
     return result;
 }
 
+DateV2Val SlotRef::get_datev2_val(ExprContext* context, TupleRow* row) {
+    DCHECK(_type.is_date_type());
+    Tuple* t = row->get_tuple(_tuple_idx);
+    if (t == nullptr || t->is_null(_null_indicator_offset)) {
+        return DateV2Val::null();
+    }
+    doris::vectorized::DateV2Value* tv =
+            reinterpret_cast<doris::vectorized::DateV2Value*>(t->get_slot(_slot_offset));
+    DateV2Val result;
+    tv->to_datev2_val(&result);
+    return result;
+}
+
 DecimalV2Val SlotRef::get_decimalv2_val(ExprContext* context, TupleRow* row) {
     DCHECK_EQ(_type.type, TYPE_DECIMALV2);
     Tuple* t = row->get_tuple(_tuple_idx);
diff --git a/be/src/exprs/slot_ref.h b/be/src/exprs/slot_ref.h
index 0e916dff9f..009b841e56 100644
--- a/be/src/exprs/slot_ref.h
+++ b/be/src/exprs/slot_ref.h
@@ -69,6 +69,7 @@ public:
     virtual doris_udf::DoubleVal get_double_val(ExprContext* context, TupleRow* row) override;
     virtual doris_udf::StringVal get_string_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::DateTimeVal get_datetime_val(ExprContext* context, TupleRow*) override;
+    virtual doris_udf::DateV2Val get_datev2_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::DecimalV2Val get_decimalv2_val(ExprContext* context, TupleRow*) override;
     virtual doris_udf::CollectionVal get_array_val(ExprContext* context, TupleRow*) override;
     virtual Decimal32Val get_decimal32_val(ExprContext* context, TupleRow*) override;
diff --git a/be/src/runtime/primitive_type.h b/be/src/runtime/primitive_type.h
index bbe473e212..adf1acadd4 100644
--- a/be/src/runtime/primitive_type.h
+++ b/be/src/runtime/primitive_type.h
@@ -147,6 +147,11 @@ struct PrimitiveTypeTraits<TYPE_DATETIME> {
     using ColumnType = vectorized::ColumnVector<vectorized::DateTime>;
 };
 template <>
+struct PrimitiveTypeTraits<TYPE_DATETIMEV2> {
+    using CppType = doris::DateTimeValue;
+    using ColumnType = vectorized::ColumnVector<vectorized::DateTime>;
+};
+template <>
 struct PrimitiveTypeTraits<TYPE_DATEV2> {
     using CppType = doris::vectorized::DateV2Value;
     using ColumnType = vectorized::ColumnVector<vectorized::DateV2>;
diff --git a/be/src/udf/udf.h b/be/src/udf/udf.h
index c74d566d42..d0ce5eb264 100644
--- a/be/src/udf/udf.h
+++ b/be/src/udf/udf.h
@@ -52,6 +52,7 @@ struct IntVal;
 struct BigIntVal;
 struct StringVal;
 struct DateTimeVal;
+struct DateV2Val;
 struct DecimalV2Val;
 struct HllVal;
 struct CollectionVal;
@@ -680,6 +681,32 @@ struct DateTimeVal : public AnyVal {
     bool operator!=(const DateTimeVal& other) const { return !(*this == other); }
 };
 
+struct DateV2Val : public AnyVal {
+    uint32_t datev2_value;
+
+    DateV2Val() {}
+    DateV2Val(uint32_t val) : datev2_value(val) {}
+
+    static DateV2Val null() {
+        DateV2Val result;
+        result.is_null = true;
+        return result;
+    }
+
+    bool operator==(const DateV2Val& other) const {
+        if (is_null && other.is_null) {
+            return true;
+        }
+
+        if (is_null || other.is_null) {
+            return false;
+        }
+
+        return datev2_value == other.datev2_value;
+    }
+    bool operator!=(const DateV2Val& other) const { return !(*this == other); }
+};
+
 // Note: there is a difference between a nullptr string (is_null == true) and an
 // empty string (len == 0).
 struct StringVal : public AnyVal {
diff --git a/be/src/util/symbols_util.cpp b/be/src/util/symbols_util.cpp
index c5ff9b8b37..d60de4224b 100644
--- a/be/src/util/symbols_util.cpp
+++ b/be/src/util/symbols_util.cpp
@@ -159,8 +159,12 @@ static void append_any_val_type(int namespace_id, const TypeDescriptor& type,
         break;
     case TYPE_DATE:
     case TYPE_DATETIME:
+    case TYPE_DATETIMEV2:
         append_mangled_token("DateTimeVal", s);
         break;
+    case TYPE_DATEV2:
+        append_mangled_token("DateV2Val", s);
+        break;
     case TYPE_DECIMALV2:
         append_mangled_token("DecimalV2Val", s);
         break;
diff --git a/be/src/vec/exprs/vliteral.cpp b/be/src/vec/exprs/vliteral.cpp
index 9936733c5c..514f6df070 100644
--- a/be/src/vec/exprs/vliteral.cpp
+++ b/be/src/vec/exprs/vliteral.cpp
@@ -102,7 +102,8 @@ void VLiteral::init(const TExprNode& node) {
             field = value.to_date_uint32();
             break;
         }
-        case TYPE_DATETIME: {
+        case TYPE_DATETIME:
+        case TYPE_DATETIMEV2: {
             VecDateTimeValue value;
             value.from_date_str(node.date_literal.value.c_str(), node.date_literal.value.size());
             value.to_datetime();
diff --git a/be/src/vec/runtime/vdatetime_value.h b/be/src/vec/runtime/vdatetime_value.h
index b437d409c5..9d0c58d70c 100644
--- a/be/src/vec/runtime/vdatetime_value.h
+++ b/be/src/vec/runtime/vdatetime_value.h
@@ -934,6 +934,16 @@ public:
 
     bool get_date_from_daynr(uint64_t);
 
+    void to_datev2_val(doris_udf::DateV2Val* tv) const {
+        tv->datev2_value = this->to_date_uint32();
+    }
+
+    static DateV2Value from_datev2_val(const doris_udf::DateV2Val& tv) {
+        DateV2Value value;
+        value.from_date(tv.datev2_value);
+        return value;
+    }
+
 private:
     static uint8_t calc_week(const uint32_t& day_nr, const uint16_t& year, const uint8_t& month,
                              const uint8_t& day, uint8_t mode, uint16_t* to_year);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index 1ada8c8e4c..26c2b473e9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -167,10 +167,12 @@ public class CastExpr extends Expr {
                 }
                 String typeName = Function.getUdfTypeName(toType.getPrimitiveType());
                 // only refactor date/datetime for vectorized engine.
-                if (toType.getPrimitiveType() == PrimitiveType.DATE
-                        || toType.getPrimitiveType() == PrimitiveType.DATEV2) {
+                if (toType.getPrimitiveType() == PrimitiveType.DATE) {
                     typeName = "date_val";
                 }
+                if (toType.getPrimitiveType() == PrimitiveType.DATEV2) {
+                    typeName = "datev2_val";
+                }
                 String beSymbol = "doris::" + beClass + "::cast_to_"
                         + typeName;
                 functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltin(getFnName(toType),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index fffa15adf4..b3ddb4a692 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -175,7 +175,7 @@ public class DateLiteral extends LiteralExpr {
     public DateLiteral(Type type, boolean isMax) throws AnalysisException {
         super();
         this.type = type;
-        if (type.equals(Type.DATE)) {
+        if (type.equals(Type.DATE) || type.equals(Type.DATEV2)) {
             if (isMax) {
                 copy(MAX_DATE);
             } else {
@@ -479,9 +479,10 @@ public class DateLiteral extends LiteralExpr {
                 return this;
             }
             if (targetType.equals(Type.DATE) || targetType.equals(Type.DATEV2)) {
-                return new DateLiteral(this.year, this.month, this.day);
+                return new DateLiteral(this.year, this.month, this.day, targetType);
             } else if (targetType.equals(Type.DATETIME)) {
-                return new DateLiteral(this.year, this.month, this.day, this.hour, this.minute, this.second);
+                return new DateLiteral(this.year, this.month, this.day, this.hour, this.minute, this.second,
+                        targetType);
             } else if (targetType.isDatetimeV2()) {
                 return new DateLiteral(this.year, this.month, this.day, this.hour, this.minute, this.microsecond,
                         targetType);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
index 652b81519c..3d01355ca0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
@@ -519,9 +519,10 @@ public class Function implements Writable {
                 return "string_val";
             case DATE:
             case DATETIME:
-            case DATEV2:
             case DATETIMEV2:
                 return "datetime_val";
+            case DATEV2:
+                return "datev2_val";
             case DECIMALV2:
                 return "decimalv2_val";
             case DECIMAL32:
@@ -567,9 +568,10 @@ public class Function implements Writable {
                 return "StringVal";
             case DATE:
             case DATETIME:
-            case DATEV2:
             case DATETIMEV2:
                 return "DateTimeVal";
+            case DATEV2:
+                return "DateV2Val";
             case DECIMALV2:
                 return "DecimalV2Val";
             case DECIMAL32:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
index 8a1a4b0c81..ed895641bb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
@@ -1388,6 +1388,19 @@ public class FunctionSet<T> {
                 "",
                 "",
                 true, false, true, true));
+        addBuiltin(AggregateFunction.createBuiltin(FunctionSet.WINDOW_FUNNEL,
+                Lists.newArrayList(Type.BIGINT, Type.STRING, Type.DATEV2, Type.BOOLEAN),
+                Type.INT,
+                Type.VARCHAR,
+                true,
+                "",
+                "",
+                "",
+                "",
+                "",
+                "",
+                "",
+                true, false, true, true));
 
         for (Type t : Type.getSupportedTypes()) {
             if (t.isNull()) {
@@ -2328,7 +2341,7 @@ public class FunctionSet<T> {
         // collect_list
         Type[] arraySubTypes = {Type.BOOLEAN, Type.SMALLINT, Type.TINYINT, Type.INT, Type.BIGINT, Type.LARGEINT,
                 Type.FLOAT, Type.DOUBLE, Type.DATE, Type.DATETIME, Type.DECIMALV2, Type.DECIMAL32, Type.DECIMAL64,
-                Type.DECIMAL128, Type.VARCHAR, Type.STRING};
+                Type.DECIMAL128, Type.VARCHAR, Type.STRING, Type.DATEV2};
         for (Type t : arraySubTypes) {
             addBuiltin(AggregateFunction.createBuiltin(COLLECT_LIST, Lists.newArrayList(t), new ArrayType(t), t,
                     "", "", "", "", "", true, false, true, true));
@@ -2462,6 +2475,16 @@ public class FunctionSet<T> {
                 prefix + "20timestamp_avg_removeEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
                 prefix + "22timestamp_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
                 false, true, false, true));
+        addBuiltin(AggregateFunction.createBuiltin("avg",
+                Lists.<Type>newArrayList(Type.DATEV2), Type.DATEV2, Type.DATEV2,
+                prefix + "8avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+                prefix + "20timestamp_avg_updateEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
+                prefix + "9avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+                stringValSerializeOrFinalize,
+                prefix + "23timestamp_avg_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+                prefix + "20timestamp_avg_removeEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
+                prefix + "22timestamp_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+                false, true, false, true));
 
         // Group_concat(string)
         addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.VARCHAR), Type.VARCHAR,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
index 1bf64eb011..88231ba22d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
@@ -730,15 +730,6 @@ public class ScalarType extends Type {
             return false;
         }
         ScalarType other = (ScalarType) o;
-        if ((this.isDate() && other.isDateV2()) || (this.isDateV2() && other.isDate())) {
-            return true;
-        }
-        if ((this.isDatetime() && other.isDatetimeV2()) || (this.isTime() && other.isTimeV2())) {
-            return other.decimalScale() == 0;
-        }
-        if ((this.isDatetimeV2() && other.isDatetime()) || (this.isTimeV2() && other.isTime())) {
-            return this.decimalScale() == 0;
-        }
         if ((this.isDatetimeV2() && other.isDatetimeV2()) || (this.isTimeV2() && other.isTimeV2())) {
             return this.decimalScale() == other.decimalScale();
         }
@@ -757,6 +748,10 @@ public class ScalarType extends Type {
         if (type.isDecimalV2Type() || type == PrimitiveType.DATETIMEV2 || type == PrimitiveType.TIMEV2) {
             return precision == other.precision && scale == other.scale;
         }
+        if (type == PrimitiveType.DATETIMEV2 || type == PrimitiveType.TIMEV2) {
+            return precision == other.precision && scale == other.scale
+                    && type == ((ScalarType) o).getPrimitiveType();
+        }
         return true;
     }
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColumnTypeTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColumnTypeTest.java
index 98cb7b3b92..1e267a3258 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColumnTypeTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColumnTypeTest.java
@@ -141,7 +141,7 @@ public class ColumnTypeTest {
 
         TypeDef type5 = TypeDef.createDatetimeV2(0);
         TypeDef type6 = TypeDef.create(PrimitiveType.DATETIME);
-        Assert.assertEquals(type5.getType(), type6.getType());
+        Assert.assertNotEquals(type5.getType(), type6.getType());
         Assert.assertNotEquals(type.getType(), type6.getType());
     }
 
@@ -150,7 +150,7 @@ public class ColumnTypeTest {
         TypeDef type = TypeDef.create(PrimitiveType.DATE);
         TypeDef type2 = TypeDef.create(PrimitiveType.DATEV2);
         type.analyze(null);
-        Assert.assertEquals(type.getType(), type2.getType());
+        Assert.assertNotEquals(type.getType(), type2.getType());
 
         // different type
         TypeDef type3 = TypeDef.createDatetimeV2(6);
@@ -182,7 +182,7 @@ public class ColumnTypeTest {
 
         TypeDef type5 = TypeDef.createTimeV2(0);
         TypeDef type6 = TypeDef.create(PrimitiveType.TIME);
-        Assert.assertEquals(type5.getType(), type6.getType());
+        Assert.assertNotEquals(type5.getType(), type6.getType());
         Assert.assertNotEquals(type.getType(), type6.getType());
     }
 


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