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