2626#include " runtime/descriptors.h"
2727#include " runtime/primitive_type.h"
2828#include " runtime/runtime_state.h"
29- #include " util/binary_cast.hpp"
3029#include " vec/columns/column_const.h"
3130#include " vec/columns/column_nullable.h"
3231#include " vec/core/column_with_type_and_name.h"
3332#include " vec/data_types/data_type_nullable.h"
3433#include " vec/data_types/serde/data_type_serde.h"
35- #include " vec/functions/function .h"
34+ #include " vec/exprs/vslot_ref .h"
3635#include " vec/functions/simple_function_factory.h"
3736#include " vec/runtime/vdatetime_value.h"
3837
@@ -52,6 +51,27 @@ class FunctionDefault : public IFunction {
5251
5352 bool use_default_implementation_for_nulls () const override { return false ; }
5453
54+ Status prepare_with_children (FunctionContext* fn_context, RuntimeState* state,
55+ const RowDescriptor& desc, VExprContext* context,
56+ const std::vector<VExprSPtr>& children) override {
57+ if (!children.empty ()) {
58+ auto default_state = std::make_shared<DefaultFunctionState>();
59+ auto * slot_ref = dynamic_cast <VSlotRef*>(children[0 ].get ());
60+ if (slot_ref != nullptr && slot_ref->slot_id () != -1 ) {
61+ const auto * slot_desc = state->desc_tbl ().get_slot_descriptor (slot_ref->slot_id ());
62+
63+ default_state->slot_id = slot_ref->slot_id ();
64+ default_state->is_nullable = slot_desc->is_nullable ();
65+ default_state->has_default_value = slot_desc->has_default_value ();
66+ if (default_state->has_default_value ) {
67+ default_state->default_value = slot_desc->col_default_value ();
68+ }
69+ }
70+ fn_context->set_function_state (FunctionContext::FRAGMENT_LOCAL, default_state);
71+ }
72+ return Status::OK ();
73+ }
74+
5575 Status execute_impl (FunctionContext* context, Block& block, const ColumnNumbers& arguments,
5676 uint32_t result, size_t input_rows_count) const override {
5777 ColumnWithTypeAndName& result_info = block.get_by_position (result);
@@ -150,10 +170,6 @@ class FunctionDefault : public IFunction {
150170 MutableColumnPtr res_col = nested_type->create_column ();
151171
152172 switch (primitive_type) {
153- case TYPE_DATE:
154- case TYPE_DATETIME:
155- insert_min_datetime_value<TYPE_DATETIME>(res_col);
156- break ;
157173 case TYPE_DATEV2:
158174 insert_min_datetime_value<TYPE_DATEV2>(res_col);
159175 break ;
@@ -175,13 +191,11 @@ class FunctionDefault : public IFunction {
175191
176192 template <PrimitiveType Type>
177193 static void insert_min_datetime_value (MutableColumnPtr& res_col) {
194+ DCHECK (Type == TYPE_DATEV2 || Type == TYPE_DATETIMEV2);
178195 using ItemType = typename PrimitiveTypeTraits<Type>::ColumnItemType;
179196 ItemType min_value;
180197
181- if constexpr (Type == TYPE_DATE || Type == TYPE_DATETIME) {
182- min_value =
183- binary_cast<VecDateTimeValue, ItemType>(VecDateTimeValue::datetime_min_value ());
184- } else if constexpr (Type == TYPE_DATEV2) {
198+ if constexpr (Type == TYPE_DATEV2) {
185199 min_value = MIN_DATE_V2;
186200 } else if constexpr (Type == TYPE_DATETIMEV2) {
187201 min_value = MIN_DATETIME_V2;
0 commit comments