This is an automated email from the ASF dual-hosted git repository.
gabriellee 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 ba026b6e99 [datev2](function) make function nullable
DEPEND_ON_ARGUMENT (#16159)
ba026b6e99 is described below
commit ba026b6e990042494363f1acca23c0c7e96a03da
Author: Gabriel <[email protected]>
AuthorDate: Wed Feb 1 13:57:43 2023 +0800
[datev2](function) make function nullable DEPEND_ON_ARGUMENT (#16159)
---
be/src/vec/functions/date_time_transforms.h | 70 +++-
be/src/vec/functions/function.h | 11 +
.../function_date_or_datetime_computation.h | 324 +++++++++++++-----
.../function_date_or_datetime_to_something.h | 16 +-
.../function_date_or_datetime_to_string.h | 35 +-
be/src/vec/functions/function_timestamp.cpp | 369 ++++++++++++++++-----
gensrc/script/doris_builtins_functions.py | 248 +++++++-------
7 files changed, 773 insertions(+), 300 deletions(-)
diff --git a/be/src/vec/functions/date_time_transforms.h
b/be/src/vec/functions/date_time_transforms.h
index 05c9d498ab..17de07fd4e 100644
--- a/be/src/vec/functions/date_time_transforms.h
+++ b/be/src/vec/functions/date_time_transforms.h
@@ -34,6 +34,7 @@
#include "vec/data_types/data_type_date_time.h"
#include "vec/data_types/data_type_string.h"
#include "vec/runtime/vdatetime_value.h"
+#include "vec/utils/util.hpp"
namespace doris::vectorized {
@@ -255,6 +256,24 @@ struct TransformerToStringOneArgument {
null_map[i] = !date_time_value.is_valid_date();
}
}
+
+ static void vector(FunctionContext* context,
+ const PaddedPODArray<typename Transform::OpArgType>& ts,
+ ColumnString::Chars& res_data, ColumnString::Offsets&
res_offsets) {
+ const auto len = ts.size();
+ res_data.resize(len * Transform::max_size);
+ res_offsets.resize(len);
+
+ size_t offset = 0;
+ for (int i = 0; i < len; ++i) {
+ const auto& t = ts[i];
+ const auto& date_time_value =
+ reinterpret_cast<const typename DateTraits<typename
Transform::OpArgType>::T&>(
+ t);
+ res_offsets[i] = Transform::execute(date_time_value, res_data,
offset);
+ DCHECK(date_time_value.is_valid_date());
+ }
+ }
};
template <typename Transform>
@@ -302,6 +321,17 @@ struct Transformer {
.is_valid_date();
}
}
+
+ static void vector(const PaddedPODArray<FromType>& vec_from,
PaddedPODArray<ToType>& vec_to) {
+ size_t size = vec_from.size();
+ vec_to.resize(size);
+
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(vec_from[i]);
+ DCHECK(((typename DateTraits<typename
Transform::OpArgType>::T&)(vec_from[i]))
+ .is_valid_date());
+ }
+ }
};
template <typename FromType, typename ToType>
@@ -324,21 +354,49 @@ struct Transformer<FromType, ToType,
ToYearImpl<FromType>> {
null_map_ptr[i] = to_ptr[i] > MAX_YEAR;
}
}
+
+ static void vector(const PaddedPODArray<FromType>& vec_from,
PaddedPODArray<ToType>& vec_to) {
+ size_t size = vec_from.size();
+ vec_to.resize(size);
+
+ auto* __restrict to_ptr = vec_to.data();
+ auto* __restrict from_ptr = vec_from.data();
+
+ for (size_t i = 0; i < size; ++i) {
+ to_ptr[i] = ToYearImpl<FromType>::execute(from_ptr[i]);
+ }
+ }
};
template <typename FromType, typename ToType, typename Transform>
struct DateTimeTransformImpl {
static Status execute(Block& block, const ColumnNumbers& arguments, size_t
result,
- size_t /*input_rows_count*/) {
+ size_t input_rows_count) {
using Op = Transformer<FromType, ToType, Transform>;
- const ColumnPtr source_col =
block.get_by_position(arguments[0]).column;
+ const auto is_nullable =
block.get_by_position(result).type->is_nullable();
+
+ const ColumnPtr source_col =
remove_nullable(block.get_by_position(arguments[0]).column);
if (const auto* sources =
check_and_get_column<ColumnVector<FromType>>(source_col.get())) {
auto col_to = ColumnVector<ToType>::create();
- auto null_map = ColumnVector<UInt8>::create();
- Op::vector(sources->get_data(), col_to->get_data(),
null_map->get_data());
- block.replace_by_position(
- result, ColumnNullable::create(std::move(col_to),
std::move(null_map)));
+ if (is_nullable) {
+ auto null_map = ColumnVector<UInt8>::create(input_rows_count);
+ Op::vector(sources->get_data(), col_to->get_data(),
null_map->get_data());
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[0]).column.get()))
{
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(col_to),
std::move(null_map)));
+ } else {
+ Op::vector(sources->get_data(), col_to->get_data());
+ block.replace_by_position(result, std::move(col_to));
+ }
} else {
return Status::RuntimeError("Illegal column {} of first argument
of function {}",
block.get_by_position(arguments[0]).column->get_name(),
diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h
index dac7700fb6..85e1f02394 100644
--- a/be/src/vec/functions/function.h
+++ b/be/src/vec/functions/function.h
@@ -29,6 +29,17 @@
namespace doris::vectorized {
+#define RETURN_REAL_TYPE_FOR_DATEV2_FUNCTION(TYPE)
\
+ bool is_nullable = false;
\
+ bool is_datev2 = false;
\
+ for (auto it : arguments) {
\
+ is_nullable = is_nullable || it.type->is_nullable();
\
+ is_datev2 = is_datev2 ||
WhichDataType(remove_nullable(it.type)).is_date_v2() || \
+ WhichDataType(remove_nullable(it.type)).is_date_time_v2();
\
+ }
\
+ return is_nullable || !is_datev2 ? make_nullable(std::make_shared<TYPE>())
\
+ : std::make_shared<TYPE>();
+
class Field;
// Only use dispose the variadic argument
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h
b/be/src/vec/functions/function_date_or_datetime_computation.h
index a4d51c972c..ff793358c9 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -31,6 +31,8 @@
#include "vec/functions/function.h"
#include "vec/functions/function_helpers.h"
#include "vec/runtime/vdatetime_value.h"
+#include "vec/utils/util.hpp"
+
namespace doris::vectorized {
template <TimeUnit unit, typename DateValueType, typename ResultDateValueType,
typename ResultType,
@@ -303,6 +305,21 @@ struct DateTimeOp {
reinterpret_cast<bool&>(null_map[i]));
}
}
+ static void vector_vector(const PaddedPODArray<FromType1>& vec_from0,
+ const PaddedPODArray<FromType2>& vec_from1,
+ PaddedPODArray<ToType>& vec_to) {
+ size_t size = vec_from0.size();
+ vec_to.resize(size);
+
+ bool valid = true;
+ for (size_t i = 0; i < size; ++i) {
+ // here reinterpret_cast is used to convert uint8& to bool&,
+ // otherwise it will be implicitly converted to bool, causing the
rvalue to fail to match the lvalue.
+ // the same goes for the following.
+ vec_to[i] = Transform::execute(vec_from0[i], vec_from1[i], valid);
+ DCHECK(valid);
+ }
+ }
// use for (DateTime, int32) -> other_type
static void vector_vector(const PaddedPODArray<FromType1>& vec_from0,
@@ -316,6 +333,18 @@ struct DateTimeOp {
vec_to[i] = Transform::execute(vec_from0[i], vec_from1[i],
reinterpret_cast<bool&>(null_map[i]));
}
+ static void vector_vector(const PaddedPODArray<FromType1>& vec_from0,
+ const PaddedPODArray<Int32>& vec_from1,
+ PaddedPODArray<ToType>& vec_to) {
+ size_t size = vec_from0.size();
+ vec_to.resize(size);
+
+ bool valid = true;
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(vec_from0[i], vec_from1[i], valid);
+ DCHECK(valid);
+ }
+ }
// use for (DateTime, const DateTime) -> other_type
static void vector_constant(const PaddedPODArray<FromType1>& vec_from,
@@ -329,6 +358,17 @@ struct DateTimeOp {
Transform::execute(vec_from[i], delta,
reinterpret_cast<bool&>(null_map[i]));
}
}
+ static void vector_constant(const PaddedPODArray<FromType1>& vec_from,
+ PaddedPODArray<ToType>& vec_to, Int128& delta)
{
+ size_t size = vec_from.size();
+ vec_to.resize(size);
+
+ bool valid = true;
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(vec_from[i], delta, valid);
+ DCHECK(valid);
+ }
+ }
// use for (DateTime, const ColumnNumber) -> other_type
static void vector_constant(const PaddedPODArray<FromType1>& vec_from,
@@ -342,6 +382,17 @@ struct DateTimeOp {
Transform::execute(vec_from[i], delta,
reinterpret_cast<bool&>(null_map[i]));
}
}
+ static void vector_constant(const PaddedPODArray<FromType1>& vec_from,
+ PaddedPODArray<ToType>& vec_to, Int64 delta) {
+ size_t size = vec_from.size();
+ vec_to.resize(size);
+ bool valid = true;
+
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(vec_from[i], delta, valid);
+ DCHECK(valid);
+ }
+ }
// use for (const DateTime, ColumnNumber) -> other_type
static void constant_vector(const FromType1& from, PaddedPODArray<ToType>&
vec_to,
@@ -355,6 +406,17 @@ struct DateTimeOp {
reinterpret_cast<bool&>(null_map[i]));
}
}
+ static void constant_vector(const FromType1& from, PaddedPODArray<ToType>&
vec_to,
+ const IColumn& delta) {
+ size_t size = delta.size();
+ vec_to.resize(size);
+ bool valid = true;
+
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(from, delta.get_int(i), valid);
+ DCHECK(valid);
+ }
+ }
static void constant_vector(const FromType1& from, PaddedPODArray<ToType>&
vec_to,
NullMap& null_map, const
PaddedPODArray<FromType2>& delta) {
@@ -366,71 +428,164 @@ struct DateTimeOp {
vec_to[i] = Transform::execute(from, delta[i],
reinterpret_cast<bool&>(null_map[i]));
}
}
+ static void constant_vector(const FromType1& from, PaddedPODArray<ToType>&
vec_to,
+ const PaddedPODArray<FromType2>& delta) {
+ size_t size = delta.size();
+ vec_to.resize(size);
+ bool valid = true;
+
+ for (size_t i = 0; i < size; ++i) {
+ vec_to[i] = Transform::execute(from, delta[i], valid);
+ DCHECK(valid);
+ }
+ }
};
template <typename FromType1, typename Transform, typename FromType2 =
FromType1>
struct DateTimeAddIntervalImpl {
- static Status execute(Block& block, const ColumnNumbers& arguments, size_t
result) {
+ static Status execute(Block& block, const ColumnNumbers& arguments, size_t
result,
+ size_t input_rows_count) {
using ToType = typename Transform::ReturnType::FieldType;
using Op = DateTimeOp<FromType1, FromType2, ToType, Transform>;
- const ColumnPtr source_col =
block.get_by_position(arguments[0]).column;
+ const ColumnPtr source_col =
remove_nullable(block.get_by_position(arguments[0]).column);
+ const auto is_nullable =
block.get_by_position(result).type->is_nullable();
if (const auto* sources =
check_and_get_column<ColumnVector<FromType1>>(source_col.get())) {
auto col_to = ColumnVector<ToType>::create();
- auto null_map = ColumnUInt8::create();
- const IColumn& delta_column =
*block.get_by_position(arguments[1]).column;
-
- if (const auto* delta_const_column = typeid_cast<const
ColumnConst*>(&delta_column)) {
- if (delta_const_column->get_field().get_type() ==
Field::Types::Int128) {
- Op::vector_constant(sources->get_data(),
col_to->get_data(),
- null_map->get_data(),
-
delta_const_column->get_field().get<Int128>());
- } else if (delta_const_column->get_field().get_type() ==
Field::Types::Int64) {
- Op::vector_constant(sources->get_data(),
col_to->get_data(),
- null_map->get_data(),
-
delta_const_column->get_field().get<Int64>());
- } else if (delta_const_column->get_field().get_type() ==
Field::Types::UInt64) {
- Op::vector_constant(sources->get_data(),
col_to->get_data(),
- null_map->get_data(),
-
delta_const_column->get_field().get<UInt64>());
+ const IColumn& delta_column =
+
*remove_nullable(block.get_by_position(arguments[1]).column);
+
+ if (is_nullable) {
+ auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ if (const auto* delta_const_column =
+ typeid_cast<const ColumnConst*>(&delta_column)) {
+ if (delta_const_column->get_field().get_type() ==
Field::Types::Int128) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+ null_map->get_data(),
+
delta_const_column->get_field().get<Int128>());
+ } else if (delta_const_column->get_field().get_type() ==
Field::Types::Int64) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+ null_map->get_data(),
+
delta_const_column->get_field().get<Int64>());
+ } else if (delta_const_column->get_field().get_type() ==
Field::Types::UInt64) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+ null_map->get_data(),
+
delta_const_column->get_field().get<UInt64>());
+ } else {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+ null_map->get_data(),
+
delta_const_column->get_field().get<Int32>());
+ }
} else {
- Op::vector_constant(sources->get_data(),
col_to->get_data(),
- null_map->get_data(),
-
delta_const_column->get_field().get<Int32>());
+ if (const auto* delta_vec_column0 =
+
check_and_get_column<ColumnVector<FromType2>>(delta_column)) {
+ Op::vector_vector(sources->get_data(),
delta_vec_column0->get_data(),
+ col_to->get_data(),
null_map->get_data());
+ } else {
+ const auto* delta_vec_column1 =
+
check_and_get_column<ColumnVector<Int32>>(delta_column);
+ DCHECK(delta_vec_column1 != nullptr);
+ Op::vector_vector(sources->get_data(),
delta_vec_column1->get_data(),
+ col_to->get_data(),
null_map->get_data());
+ }
+ }
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[0]).column.get()))
{
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
}
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[1]).column.get()))
{
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.get_by_position(result).column =
+ ColumnNullable::create(std::move(col_to),
std::move(null_map));
} else {
- if (const auto* delta_vec_column0 =
-
check_and_get_column<ColumnVector<FromType2>>(delta_column)) {
- Op::vector_vector(sources->get_data(),
delta_vec_column0->get_data(),
- col_to->get_data(),
null_map->get_data());
+ if (const auto* delta_const_column =
+ typeid_cast<const ColumnConst*>(&delta_column)) {
+ if (delta_const_column->get_field().get_type() ==
Field::Types::Int128) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+
delta_const_column->get_field().get<Int128>());
+ } else if (delta_const_column->get_field().get_type() ==
Field::Types::Int64) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+
delta_const_column->get_field().get<Int64>());
+ } else if (delta_const_column->get_field().get_type() ==
Field::Types::UInt64) {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+
delta_const_column->get_field().get<UInt64>());
+ } else {
+ Op::vector_constant(sources->get_data(),
col_to->get_data(),
+
delta_const_column->get_field().get<Int32>());
+ }
} else {
- const auto* delta_vec_column1 =
-
check_and_get_column<ColumnVector<Int32>>(delta_column);
- DCHECK(delta_vec_column1 != nullptr);
- Op::vector_vector(sources->get_data(),
delta_vec_column1->get_data(),
- col_to->get_data(),
null_map->get_data());
+ if (const auto* delta_vec_column0 =
+
check_and_get_column<ColumnVector<FromType2>>(delta_column)) {
+ Op::vector_vector(sources->get_data(),
delta_vec_column0->get_data(),
+ col_to->get_data());
+ } else {
+ const auto* delta_vec_column1 =
+
check_and_get_column<ColumnVector<Int32>>(delta_column);
+ DCHECK(delta_vec_column1 != nullptr);
+ Op::vector_vector(sources->get_data(),
delta_vec_column1->get_data(),
+ col_to->get_data());
+ }
}
+ block.replace_by_position(result, std::move(col_to));
}
-
- block.get_by_position(result).column =
- ColumnNullable::create(std::move(col_to),
std::move(null_map));
} else if (const auto* sources_const =
check_and_get_column_const<ColumnVector<FromType1>>(source_col.get())) {
auto col_to = ColumnVector<ToType>::create();
- auto null_map = ColumnUInt8::create();
-
- if (const auto* delta_vec_column =
check_and_get_column<ColumnVector<FromType2>>(
- *block.get_by_position(arguments[1]).column)) {
- Op::constant_vector(sources_const->template
get_value<FromType1>(),
- col_to->get_data(), null_map->get_data(),
- delta_vec_column->get_data());
+ if (is_nullable) {
+ auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ if (const auto* delta_vec_column =
check_and_get_column<ColumnVector<FromType2>>(
+
*remove_nullable(block.get_by_position(arguments[1]).column))) {
+ Op::constant_vector(sources_const->template
get_value<FromType1>(),
+ col_to->get_data(),
delta_vec_column->get_data());
+ } else {
+ Op::constant_vector(
+ sources_const->template get_value<FromType2>(),
col_to->get_data(),
+
*remove_nullable(block.get_by_position(arguments[1]).column));
+ }
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[0]).column.get()))
{
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[1]).column.get()))
{
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.get_by_position(result).column =
+ ColumnNullable::create(std::move(col_to),
std::move(null_map));
} else {
- Op::constant_vector(sources_const->template
get_value<FromType2>(),
- col_to->get_data(), null_map->get_data(),
-
*block.get_by_position(arguments[1]).column);
+ if (const auto* delta_vec_column =
check_and_get_column<ColumnVector<FromType2>>(
+ *block.get_by_position(arguments[1]).column)) {
+ Op::constant_vector(sources_const->template
get_value<FromType1>(),
+ col_to->get_data(),
delta_vec_column->get_data());
+ } else {
+ Op::constant_vector(sources_const->template
get_value<FromType2>(),
+ col_to->get_data(),
+
*block.get_by_position(arguments[1]).column);
+ }
+ block.replace_by_position(result, std::move(col_to));
}
- block.get_by_position(result).column =
- ColumnNullable::create(std::move(col_to),
std::move(null_map));
} else {
return Status::RuntimeError("Illegal column {} of first argument
of function {}",
block.get_by_position(arguments[0]).column->get_name(),
@@ -458,6 +613,7 @@ public:
if constexpr (has_variadic_argument) return
Transform::get_variadic_argument_types();
return {};
}
+ bool use_default_implementation_for_nulls() const override { return false;
}
DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
if (arguments.size() != 2 && arguments.size() != 3) {
@@ -468,8 +624,8 @@ public:
}
if (arguments.size() == 2) {
- if (!is_date_or_datetime(arguments[0].type) &&
- !is_date_v2_or_datetime_v2(arguments[0].type)) {
+ if (!is_date_or_datetime(remove_nullable(arguments[0].type)) &&
+
!is_date_v2_or_datetime_v2(remove_nullable(arguments[0].type))) {
LOG(FATAL) << fmt::format(
"Illegal type {} of argument of function {}. Should be
a date or a date "
"with time",
@@ -487,7 +643,7 @@ public:
get_name());
}
}
- return make_nullable(std::make_shared<typename
Transform::ReturnType>());
+ RETURN_REAL_TYPE_FOR_DATEV2_FUNCTION(typename Transform::ReturnType);
}
bool use_default_implementation_for_constants() const override { return
true; }
@@ -502,79 +658,95 @@ public:
if (which1.is_date() && which2.is_date()) {
return DateTimeAddIntervalImpl<DataTypeDate::FieldType, Transform,
DataTypeDate::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time() && which2.is_date()) {
return DateTimeAddIntervalImpl<DataTypeDateTime::FieldType,
Transform,
DataTypeDate::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_v2() && which2.is_date()) {
return DateTimeAddIntervalImpl<DataTypeDateV2::FieldType,
Transform,
DataTypeDate::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time_v2() && which2.is_date()) {
return DateTimeAddIntervalImpl<DataTypeDateTimeV2::FieldType,
Transform,
DataTypeDate::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date() && which2.is_date_time()) {
return DateTimeAddIntervalImpl<DataTypeDate::FieldType, Transform,
DataTypeDateTime::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date() && which2.is_date_v2()) {
return DateTimeAddIntervalImpl<DataTypeDate::FieldType, Transform,
DataTypeDateV2::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date() && which2.is_date_time_v2()) {
- return DateTimeAddIntervalImpl<DataTypeDate::FieldType, Transform,
-
DataTypeDateTimeV2::FieldType>::execute(block, arguments,
-
result);
+ return DateTimeAddIntervalImpl<
+ DataTypeDate::FieldType, Transform,
+ DataTypeDateTimeV2::FieldType>::execute(block, arguments,
result,
+ input_rows_count);
} else if (which1.is_date_v2() && which2.is_date_time()) {
return DateTimeAddIntervalImpl<DataTypeDateV2::FieldType,
Transform,
DataTypeDateTime::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_v2() && which2.is_date_v2()) {
return DateTimeAddIntervalImpl<DataTypeDateV2::FieldType,
Transform,
DataTypeDateV2::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time_v2() && which2.is_date_time()) {
return DateTimeAddIntervalImpl<DataTypeDateTimeV2::FieldType,
Transform,
DataTypeDateTime::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time_v2() && which2.is_date_time_v2()) {
- return DateTimeAddIntervalImpl<DataTypeDateTimeV2::FieldType,
Transform,
-
DataTypeDateTimeV2::FieldType>::execute(block, arguments,
-
result);
+ return DateTimeAddIntervalImpl<
+ DataTypeDateTimeV2::FieldType, Transform,
+ DataTypeDateTimeV2::FieldType>::execute(block, arguments,
result,
+ input_rows_count);
} else if (which1.is_date_time() && which2.is_date_time()) {
return DateTimeAddIntervalImpl<DataTypeDateTime::FieldType,
Transform,
DataTypeDateTime::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time() && which2.is_date_v2()) {
return DateTimeAddIntervalImpl<DataTypeDateTime::FieldType,
Transform,
DataTypeDateV2::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date_time() && which2.is_date_time_v2()) {
- return DateTimeAddIntervalImpl<DataTypeDateTime::FieldType,
Transform,
-
DataTypeDateTimeV2::FieldType>::execute(block, arguments,
-
result);
+ return DateTimeAddIntervalImpl<
+ DataTypeDateTime::FieldType, Transform,
+ DataTypeDateTimeV2::FieldType>::execute(block, arguments,
result,
+ input_rows_count);
} else if (which1.is_date_v2() && which2.is_date_time_v2()) {
- return DateTimeAddIntervalImpl<DataTypeDateV2::FieldType,
Transform,
-
DataTypeDateTimeV2::FieldType>::execute(block, arguments,
-
result);
+ return DateTimeAddIntervalImpl<
+ DataTypeDateV2::FieldType, Transform,
+ DataTypeDateTimeV2::FieldType>::execute(block, arguments,
result,
+ input_rows_count);
} else if (which1.is_date_time_v2() && which2.is_date_v2()) {
return DateTimeAddIntervalImpl<DataTypeDateTimeV2::FieldType,
Transform,
DataTypeDateV2::FieldType>::execute(block, arguments,
-
result);
+
result,
+
input_rows_count);
} else if (which1.is_date()) {
return DateTimeAddIntervalImpl<DataTypeDate::FieldType,
Transform>::execute(
- block, arguments, result);
+ block, arguments, result, input_rows_count);
} else if (which1.is_date_time()) {
return DateTimeAddIntervalImpl<DataTypeDateTime::FieldType,
Transform>::execute(
- block, arguments, result);
+ block, arguments, result, input_rows_count);
} else if (which1.is_date_v2()) {
return DateTimeAddIntervalImpl<DataTypeDateV2::FieldType,
Transform>::execute(
- block, arguments, result);
+ block, arguments, result, input_rows_count);
} else if (which1.is_date_time_v2()) {
return DateTimeAddIntervalImpl<DataTypeDateTimeV2::FieldType,
Transform>::execute(
- block, arguments, result);
+ block, arguments, result, input_rows_count);
} else {
return Status::RuntimeError("Illegal type {} of argument of
function {}",
block.get_by_position(arguments[0]).type->get_name(),
diff --git a/be/src/vec/functions/function_date_or_datetime_to_something.h
b/be/src/vec/functions/function_date_or_datetime_to_something.h
index dfac38dd97..5d41c2349f 100644
--- a/be/src/vec/functions/function_date_or_datetime_to_something.h
+++ b/be/src/vec/functions/function_date_or_datetime_to_something.h
@@ -47,29 +47,30 @@ public:
DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
if (arguments.size() == 1) {
- if (!is_date_or_datetime(arguments[0].type) &&
- !is_date_v2_or_datetime_v2(arguments[0].type)) {
+ if (!is_date_or_datetime(remove_nullable(arguments[0].type)) &&
+
!is_date_v2_or_datetime_v2(remove_nullable(arguments[0].type))) {
LOG(FATAL) << fmt::format(
"Illegal type {} of argument of function {}. Should be
a date or a date "
"with time",
arguments[0].type->get_name(), get_name());
}
} else if (arguments.size() == 2) {
- if (!is_date_or_datetime(arguments[0].type) &&
- !is_date_v2_or_datetime_v2(arguments[0].type)) {
+ if (!is_date_or_datetime(remove_nullable(arguments[0].type)) &&
+
!is_date_v2_or_datetime_v2(remove_nullable(arguments[0].type))) {
LOG(FATAL) << fmt::format(
"Illegal type {} of argument of function {}. Should be
a date or a date "
"with time",
arguments[0].type->get_name(), get_name());
}
- if (!is_string(arguments[1].type)) {
+ if (!is_string(remove_nullable(arguments[1].type))) {
LOG(FATAL) << fmt::format(
"Function {} supports 1 or 2 arguments. The 1st
argument must be of type "
"Date or DateTime. The 2nd argument (optional) must be
a constant string "
"with timezone name",
get_name());
}
- if (is_date(arguments[0].type) && std::is_same_v<ToDataType,
DataTypeDate>) {
+ if (is_date(remove_nullable(arguments[0].type)) &&
+ std::is_same_v<ToDataType, DataTypeDate>) {
LOG(FATAL) << fmt::format(
"The timezone argument of function {} is allowed only
when the 1st "
"argument has the type DateTime",
@@ -82,11 +83,12 @@ public:
get_name(), arguments.size());
}
- return make_nullable(std::make_shared<ToDataType>());
+ RETURN_REAL_TYPE_FOR_DATEV2_FUNCTION(ToDataType);
}
bool use_default_implementation_for_constants() const override { return
true; }
ColumnNumbers get_arguments_that_are_always_constant() const override {
return {1}; }
+ bool use_default_implementation_for_nulls() const override { return false;
}
Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
diff --git a/be/src/vec/functions/function_date_or_datetime_to_string.h
b/be/src/vec/functions/function_date_or_datetime_to_string.h
index c4f07e05b8..a48e934abd 100644
--- a/be/src/vec/functions/function_date_or_datetime_to_string.h
+++ b/be/src/vec/functions/function_date_or_datetime_to_string.h
@@ -37,9 +37,10 @@ public:
String get_name() const override { return name; }
size_t get_number_of_arguments() const override { return 1; }
+ bool use_default_implementation_for_nulls() const override { return false;
}
DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
- return make_nullable(std::make_shared<DataTypeString>());
+ RETURN_REAL_TYPE_FOR_DATEV2_FUNCTION(DataTypeString);
}
bool is_variadic() const override { return true; }
@@ -55,17 +56,33 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
const ColumnPtr source_col =
block.get_by_position(arguments[0]).column;
- const auto* sources =
- check_and_get_column<ColumnVector<typename
Transform::OpArgType>>(source_col.get());
+ const auto is_nullable =
block.get_by_position(result).type->is_nullable();
+ const auto* sources = check_and_get_column<ColumnVector<typename
Transform::OpArgType>>(
+ remove_nullable(source_col).get());
auto col_res = ColumnString::create();
- auto null_map = ColumnVector<UInt8>::create();
+
// Support all input of datetime is valind to make sure not null return
if (sources) {
- TransformerToStringOneArgument<Transform>::vector(
- context, sources->get_data(), col_res->get_chars(),
col_res->get_offsets(),
- null_map->get_data());
- block.replace_by_position(
- result, ColumnNullable::create(std::move(col_res),
std::move(null_map)));
+ if (is_nullable) {
+ auto null_map = ColumnVector<UInt8>::create(input_rows_count);
+ TransformerToStringOneArgument<Transform>::vector(
+ context, sources->get_data(), col_res->get_chars(),
col_res->get_offsets(),
+ null_map->get_data());
+ if (const auto* nullable_col =
+
check_and_get_column<ColumnNullable>(source_col.get())) {
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(col_res),
std::move(null_map)));
+ } else {
+ TransformerToStringOneArgument<Transform>::vector(
+ context, sources->get_data(), col_res->get_chars(),
col_res->get_offsets());
+ block.replace_by_position(result, std::move(col_res));
+ }
} else {
return Status::InternalError("Illegal column {} of first argument
of function {}",
block.get_by_position(arguments[0]).column->get_name(),
diff --git a/be/src/vec/functions/function_timestamp.cpp
b/be/src/vec/functions/function_timestamp.cpp
index a467d7da8d..704fc8f3ff 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -411,31 +411,30 @@ struct UnixTimeStampDateImpl {
static DataTypes get_variadic_argument_types() { return
{std::make_shared<DateType>()}; }
static DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName&
arguments) {
- return make_nullable(std::make_shared<DataTypeInt32>());
+ RETURN_REAL_TYPE_FOR_DATEV2_FUNCTION(DataTypeInt32);
}
static Status execute_impl(FunctionContext* context, Block& block,
const ColumnNumbers& arguments, size_t result,
size_t input_rows_count) {
const ColumnPtr col_source =
block.get_by_position(arguments[0]).column;
-
auto col_result = ColumnVector<Int32>::create();
auto null_map = ColumnVector<UInt8>::create();
+ auto& col_result_data = col_result->get_data();
col_result->resize(input_rows_count);
- null_map->resize(input_rows_count);
- auto& col_result_data = col_result->get_data();
- auto& null_map_data = null_map->get_data();
+ if constexpr (std::is_same_v<DateType, DataTypeDate>) {
+ null_map->resize(input_rows_count);
+ auto& null_map_data = null_map->get_data();
- for (int i = 0; i < input_rows_count; i++) {
- if (col_source->is_null_at(i)) {
- null_map_data[i] = true;
- continue;
- }
+ for (int i = 0; i < input_rows_count; i++) {
+ if (col_source->is_null_at(i)) {
+ null_map_data[i] = true;
+ continue;
+ }
- StringRef source = col_source->get_data_at(i);
- if constexpr (std::is_same_v<DateType, DataTypeDate>) {
+ StringRef source = col_source->get_data_at(i);
const VecDateTimeValue& ts_value =
reinterpret_cast<const
VecDateTimeValue&>(*source.data);
int64_t timestamp;
@@ -446,34 +445,91 @@ struct UnixTimeStampDateImpl {
null_map_data[i] = false;
col_result_data[i] =
UnixTimeStampImpl::trim_timestamp(timestamp);
}
- } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
- const DateV2Value<DateV2ValueType>& ts_value =
- reinterpret_cast<const
DateV2Value<DateV2ValueType>&>(*source.data);
- int64_t timestamp;
- if (!ts_value.unix_timestamp(×tamp,
-
context->impl()->state()->timezone_obj())) {
- null_map_data[i] = true;
- } else {
- null_map_data[i] = false;
+ }
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(col_result),
std::move(null_map)));
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
+ const auto is_nullable =
block.get_by_position(arguments[0]).type->is_nullable();
+ if (is_nullable) {
+ null_map->resize(input_rows_count);
+ auto& null_map_data = null_map->get_data();
+ for (int i = 0; i < input_rows_count; i++) {
+ if (col_source->is_null_at(i)) {
+ DCHECK(is_nullable);
+ null_map_data[i] = true;
+ continue;
+ }
+
+ StringRef source = col_source->get_data_at(i);
+ const DateV2Value<DateV2ValueType>& ts_value =
+ reinterpret_cast<const
DateV2Value<DateV2ValueType>&>(*source.data);
+ int64_t timestamp;
+ if (!ts_value.unix_timestamp(×tamp,
+
context->impl()->state()->timezone_obj())) {
+ null_map_data[i] = true;
+ } else {
+ null_map_data[i] = false;
+ col_result_data[i] =
UnixTimeStampImpl::trim_timestamp(timestamp);
+ }
+ }
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(col_result),
std::move(null_map)));
+ } else {
+ for (int i = 0; i < input_rows_count; i++) {
+ DCHECK(!col_source->is_null_at(i));
+ StringRef source = col_source->get_data_at(i);
+ const DateV2Value<DateV2ValueType>& ts_value =
+ reinterpret_cast<const
DateV2Value<DateV2ValueType>&>(*source.data);
+ int64_t timestamp;
+ const auto valid = ts_value.unix_timestamp(
+ ×tamp,
context->impl()->state()->timezone_obj());
+ DCHECK(valid);
col_result_data[i] =
UnixTimeStampImpl::trim_timestamp(timestamp);
}
+ block.replace_by_position(result, std::move(col_result));
+ }
+ } else {
+ const auto is_nullable =
block.get_by_position(arguments[0]).type->is_nullable();
+ if (is_nullable) {
+ null_map->resize(input_rows_count);
+ auto& null_map_data = null_map->get_data();
+ for (int i = 0; i < input_rows_count; i++) {
+ if (col_source->is_null_at(i)) {
+ DCHECK(is_nullable);
+ null_map_data[i] = true;
+ continue;
+ }
+
+ StringRef source = col_source->get_data_at(i);
+ const DateV2Value<DateTimeV2ValueType>& ts_value =
+ reinterpret_cast<const
DateV2Value<DateTimeV2ValueType>&>(*source.data);
+ int64_t timestamp;
+ if (!ts_value.unix_timestamp(×tamp,
+
context->impl()->state()->timezone_obj())) {
+ null_map_data[i] = true;
+ } else {
+ null_map_data[i] = false;
+ col_result_data[i] =
UnixTimeStampImpl::trim_timestamp(timestamp);
+ }
+ }
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(col_result),
std::move(null_map)));
} else {
- const DateV2Value<DateTimeV2ValueType>& ts_value =
- reinterpret_cast<const
DateV2Value<DateTimeV2ValueType>&>(*source.data);
- int64_t timestamp;
- if (!ts_value.unix_timestamp(×tamp,
-
context->impl()->state()->timezone_obj())) {
- null_map_data[i] = true;
- } else {
- null_map_data[i] = false;
+ for (int i = 0; i < input_rows_count; i++) {
+ DCHECK(!col_source->is_null_at(i));
+ StringRef source = col_source->get_data_at(i);
+ const DateV2Value<DateTimeV2ValueType>& ts_value =
+ reinterpret_cast<const
DateV2Value<DateTimeV2ValueType>&>(*source.data);
+ int64_t timestamp;
+ const auto valid = ts_value.unix_timestamp(
+ ×tamp,
context->impl()->state()->timezone_obj());
+ DCHECK(valid);
col_result_data[i] =
UnixTimeStampImpl::trim_timestamp(timestamp);
}
+ block.replace_by_position(result, std::move(col_result));
}
}
- block.replace_by_position(
- result, ColumnNullable::create(std::move(col_result),
std::move(null_map)));
-
return Status::OK();
}
};
@@ -576,7 +632,7 @@ public:
String get_name() const override { return name; }
- bool use_default_implementation_for_nulls() const override { return true; }
+ bool use_default_implementation_for_nulls() const override { return false;
}
bool use_default_implementation_for_constants() const override { return
true; }
@@ -587,11 +643,17 @@ public:
// input DateTime and Date, return Date
// input DateTimeV2 and DateV2, return DateV2
DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
+ bool is_nullable = false;
+ for (auto it : arguments) {
+ is_nullable = is_nullable || it.type->is_nullable();
+ }
+
if constexpr (std::is_same_v<DateType, DataTypeDateTime> ||
std::is_same_v<DateType, DataTypeDate>) {
return make_nullable(std::make_shared<DataTypeDate>());
} else {
- return make_nullable(std::make_shared<DataTypeDateV2>());
+ return is_nullable ?
make_nullable(std::make_shared<DataTypeDateV2>())
+ : std::make_shared<DataTypeDateV2>();
}
}
@@ -620,38 +682,66 @@ struct LastDayImpl {
static Status execute_impl(FunctionContext* context, Block& block,
const ColumnNumbers& arguments, size_t result,
size_t input_rows_count) {
- auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ const auto is_nullable =
block.get_by_position(result).type->is_nullable();
ColumnPtr res_column;
- ColumnPtr argument_column =
-
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
- if constexpr (std::is_same_v<DateType, DataTypeDateTime> ||
- std::is_same_v<DateType, DataTypeDate>) {
- auto data_col = assert_cast<const
ColumnVector<Int64>*>(argument_column.get());
- res_column = ColumnInt64::create(input_rows_count);
- execute_straight<VecDateTimeValue, Int64, Int64>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<Int64>*>(res_column->assume_mutable().get())
- ->get_data());
-
- } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
- auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
- res_column = ColumnVector<UInt32>::create(input_rows_count);
- execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
- ->get_data());
+ ColumnPtr argument_column =
remove_nullable(block.get_by_position(arguments[0]).column)
+
->convert_to_full_column_if_const();
+ if (is_nullable) {
+ auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ if constexpr (std::is_same_v<DateType, DataTypeDateTime> ||
+ std::is_same_v<DateType, DataTypeDate>) {
+ auto data_col = assert_cast<const
ColumnVector<Int64>*>(argument_column.get());
+ res_column = ColumnInt64::create(input_rows_count);
+ execute_straight<VecDateTimeValue, Int64, Int64>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<Int64>*>(res_column->assume_mutable().get())
+ ->get_data());
- } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>) {
- auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
- res_column = ColumnVector<UInt32>::create(input_rows_count);
- execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32, UInt64>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
- ->get_data());
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
+ auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>)
{
+ auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32,
UInt64>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+ }
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[0]).column.get())) {
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.replace_by_position(result,
+ ColumnNullable::create(res_column,
std::move(null_map)));
+ } else {
+ if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
+ auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
+ input_rows_count, data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>)
{
+ auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32,
UInt64>(
+ input_rows_count, data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+ }
+ block.replace_by_position(result, std::move(res_column));
}
-
- block.replace_by_position(
- result, ColumnNullable::create(std::move(res_column),
std::move(null_map)));
return Status::OK();
}
@@ -699,6 +789,31 @@ struct LastDayImpl {
}
}
+ template <typename DateValueType, typename ReturnType, typename
InputDateType>
+ static void execute_straight(size_t input_rows_count,
+ const PaddedPODArray<InputDateType>& data_col,
+ PaddedPODArray<ReturnType>& res_data) {
+ for (int i = 0; i < input_rows_count; i++) {
+ if constexpr (std::is_same_v<DateValueType,
DateV2Value<DateV2ValueType>>) {
+ const auto& cur_data = data_col[i];
+ auto ts_value = binary_cast<UInt32, DateValueType>(cur_data);
+ DCHECK(ts_value.is_valid_date());
+ int day = get_last_month_day(ts_value.year(),
ts_value.month());
+ ts_value.template set_time_unit<TimeUnit::DAY>(day);
+ res_data[i] = binary_cast<DateValueType, UInt32>(ts_value);
+ } else {
+ const auto& cur_data = data_col[i];
+ auto ts_value = binary_cast<UInt64, DateValueType>(cur_data);
+ DCHECK(ts_value.is_valid_date());
+ int day = get_last_month_day(ts_value.year(),
ts_value.month());
+ ts_value.template set_time_unit<TimeUnit::DAY>(day);
+ ts_value.set_time(ts_value.year(), ts_value.month(), day, 0,
0, 0, 0);
+ UInt64 cast_value = binary_cast<DateValueType,
UInt64>(ts_value);
+ DataTypeDateTimeV2::cast_to_date_v2(cast_value, res_data[i]);
+ }
+ }
+ }
+
static int get_last_month_day(int year, int month) {
bool is_leap_year = doris::is_leap(year);
if (month == 2) {
@@ -721,37 +836,66 @@ struct MondayImpl {
static Status execute_impl(FunctionContext* context, Block& block,
const ColumnNumbers& arguments, size_t result,
size_t input_rows_count) {
- auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ const auto is_nullable =
block.get_by_position(result).type->is_nullable();
+ ColumnPtr argument_column =
remove_nullable(block.get_by_position(arguments[0]).column)
+
->convert_to_full_column_if_const();
ColumnPtr res_column;
- ColumnPtr argument_column =
-
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
- if constexpr (std::is_same_v<DateType, DataTypeDateTime> ||
- std::is_same_v<DateType, DataTypeDate>) {
- auto data_col = assert_cast<const
ColumnVector<Int64>*>(argument_column.get());
- res_column = ColumnInt64::create(input_rows_count);
- execute_straight<VecDateTimeValue, Int64, Int64>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<Int64>*>(res_column->assume_mutable().get())
- ->get_data());
-
- } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
- auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
- res_column = ColumnVector<UInt32>::create(input_rows_count);
- execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
- ->get_data());
+ if (is_nullable) {
+ auto null_map = ColumnUInt8::create(input_rows_count, 0);
+ if constexpr (std::is_same_v<DateType, DataTypeDateTime> ||
+ std::is_same_v<DateType, DataTypeDate>) {
+ auto data_col = assert_cast<const
ColumnVector<Int64>*>(argument_column.get());
+ res_column = ColumnInt64::create(input_rows_count);
+ execute_straight<VecDateTimeValue, Int64, Int64>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<Int64>*>(res_column->assume_mutable().get())
+ ->get_data());
- } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>) {
- auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
- res_column = ColumnVector<UInt32>::create(input_rows_count);
- execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32, UInt64>(
- input_rows_count, null_map->get_data(),
data_col->get_data(),
-
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
- ->get_data());
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
+ auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>)
{
+ auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32,
UInt64>(
+ input_rows_count, null_map->get_data(),
data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+ }
+ if (const auto* nullable_col =
check_and_get_column<ColumnNullable>(
+ block.get_by_position(arguments[0]).column.get())) {
+ NullMap& result_null_map =
assert_cast<ColumnUInt8&>(*null_map).get_data();
+ const NullMap& src_null_map =
+ assert_cast<const
ColumnUInt8&>(nullable_col->get_null_map_column())
+ .get_data();
+ VectorizedUtils::update_null_map(result_null_map,
src_null_map);
+ }
+ block.replace_by_position(result,
+ ColumnNullable::create(res_column,
std::move(null_map)));
+ } else {
+ if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
+ auto data_col = assert_cast<const
ColumnVector<UInt32>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateV2ValueType>, UInt32, UInt32>(
+ input_rows_count, data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+
+ } else if constexpr (std::is_same_v<DateType, DataTypeDateTimeV2>)
{
+ auto data_col = assert_cast<const
ColumnVector<UInt64>*>(argument_column.get());
+ res_column = ColumnVector<UInt32>::create(input_rows_count);
+ execute_straight<DateV2Value<DateTimeV2ValueType>, UInt32,
UInt64>(
+ input_rows_count, data_col->get_data(),
+
static_cast<ColumnVector<UInt32>*>(res_column->assume_mutable().get())
+ ->get_data());
+ }
+ block.replace_by_position(result, std::move(res_column));
}
- block.replace_by_position(
- result, ColumnNullable::create(std::move(res_column),
std::move(null_map)));
return Status::OK();
}
@@ -826,6 +970,49 @@ struct MondayImpl {
}
}
+ template <typename DateValueType, typename ReturnType, typename
InputDateType>
+ static void execute_straight(size_t input_rows_count,
+ const PaddedPODArray<InputDateType>& data_col,
+ PaddedPODArray<ReturnType>& res_data) {
+ for (int i = 0; i < input_rows_count; i++) {
+ if constexpr (std::is_same_v<DateValueType,
DateV2Value<DateV2ValueType>>) {
+ const auto& cur_data = data_col[i];
+ auto ts_value = binary_cast<UInt32, DateValueType>(cur_data);
+ DCHECK(ts_value.is_valid_date());
+ if (is_special_day(ts_value.year(), ts_value.month(),
ts_value.day())) {
+ ts_value.template set_time_unit<TimeUnit::DAY>(1);
+ res_data[i] = binary_cast<DateValueType, UInt32>(ts_value);
+ continue;
+ }
+
+ // day_of_week, from 1(Mon) to 7(Sun)
+ int day_of_week = ts_value.weekday() + 1;
+ int gap_of_monday = day_of_week - 1;
+ TimeInterval interval(DAY, gap_of_monday, true);
+ ts_value.template date_add_interval<DAY>(interval);
+ res_data[i] = binary_cast<DateValueType, UInt32>(ts_value);
+ } else {
+ const auto& cur_data = data_col[i];
+ auto ts_value = binary_cast<UInt64, DateValueType>(cur_data);
+ DCHECK(ts_value.is_valid_date());
+ if (is_special_day(ts_value.year(), ts_value.month(),
ts_value.day())) {
+ ts_value.set_time(ts_value.year(), ts_value.month(), 1, 0,
0, 0, 0);
+ UInt64 cast_value = binary_cast<DateValueType,
UInt64>(ts_value);
+ DataTypeDateTimeV2::cast_to_date_v2(cast_value,
res_data[i]);
+ continue;
+ }
+ // day_of_week, from 1(Mon) to 7(Sun)
+ int day_of_week = ts_value.weekday() + 1;
+ int gap_of_monday = day_of_week - 1;
+ TimeInterval interval(DAY, gap_of_monday, true);
+ ts_value.template date_add_interval<DAY>(interval);
+ ts_value.set_time(ts_value.year(), ts_value.month(),
ts_value.day(), 0, 0, 0, 0);
+ UInt64 cast_value = binary_cast<DateValueType,
UInt64>(ts_value);
+ DataTypeDateTimeV2::cast_to_date_v2(cast_value, res_data[i]);
+ }
+ }
+ }
+
// specially, 1970-01-01, 1970-01-02, 1970-01-03 and 1970-01-04 return
1970-01-01
static bool is_special_day(int year, int month, int day) {
return year == 1970 && month == 1 && day > 0 && day < 5;
diff --git a/gensrc/script/doris_builtins_functions.py
b/gensrc/script/doris_builtins_functions.py
index 91ee009ccb..080f01b2ac 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -544,8 +544,8 @@ visible_functions = [
[['unix_timestamp'], 'INT', [], 'ALWAYS_NOT_NULLABLE'],
[['unix_timestamp'], 'INT', ['DATETIME'], 'ALWAYS_NULLABLE'],
[['unix_timestamp'], 'INT', ['DATE'], 'ALWAYS_NULLABLE'],
- [['unix_timestamp'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['unix_timestamp'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['unix_timestamp'], 'INT', ['DATETIMEV2'], ''],
+ [['unix_timestamp'], 'INT', ['DATEV2'], ''],
[['unix_timestamp'], 'INT', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['unix_timestamp'], 'INT', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
[['from_unixtime'], 'VARCHAR', ['INT'], 'ALWAYS_NULLABLE'],
@@ -561,10 +561,10 @@ visible_functions = [
[['from_days'], 'DATE', ['INT'], 'ALWAYS_NULLABLE'],
[['last_day'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],
[['last_day'], 'DATE', ['DATE'], 'ALWAYS_NULLABLE'],
- [['last_day'], 'DATEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['last_day'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['to_monday'], 'DATEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['to_monday'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['last_day'], 'DATEV2', ['DATETIMEV2'], ''],
+ [['last_day'], 'DATEV2', ['DATEV2'], ''],
+ [['to_monday'], 'DATEV2', ['DATETIMEV2'], ''],
+ [['to_monday'], 'DATEV2', ['DATEV2'], ''],
[['to_monday'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],
[['to_monday'], 'DATE', ['DATE'], 'ALWAYS_NULLABLE'],
[['to_days'], 'INT', ['DATE'], 'ALWAYS_NULLABLE'],
@@ -686,103 +686,97 @@ visible_functions = [
[['second_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
[['second_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
'ALWAYS_NULLABLE'],
- [['timestamp'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
-
- [['to_days'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
-
- [['year'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['month'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['quarter'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['dayofweek'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['weekday'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['day', 'dayofmonth'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['dayofyear'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['weekofyear'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['yearweek'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['yearweek'], 'INT', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['week'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['week'], 'INT', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['hour'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['minute'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['second'], 'INT', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
-
- [['year'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['month'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['quarter'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['dayofweek'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['weekday'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['day', 'dayofmonth'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['dayofyear'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['weekofyear'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['yearweek'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['yearweek'], 'INT', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['week'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['week'], 'INT', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['hour'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['minute'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['second'], 'INT', ['DATEV2'], 'ALWAYS_NULLABLE'],
-
- [['years_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['years_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['months_add', 'add_months'], 'DATETIMEV2', ['DATETIMEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['months_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['weeks_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['weeks_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['days_add', 'date_add', 'adddate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['days_sub', 'date_sub', 'subdate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['hours_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['hours_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['minutes_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['minutes_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['seconds_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['seconds_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['timestamp'], 'DATETIMEV2', ['DATETIMEV2'], ''],
+
+ [['to_days'], 'INT', ['DATEV2'], ''],
+
+ [['year'], 'INT', ['DATETIMEV2'], ''],
+ [['month'], 'INT', ['DATETIMEV2'], ''],
+ [['quarter'], 'INT', ['DATETIMEV2'], ''],
+ [['dayofweek'], 'INT', ['DATETIMEV2'], ''],
+ [['weekday'], 'INT', ['DATETIMEV2'], ''],
+ [['day', 'dayofmonth'], 'INT', ['DATETIMEV2'], ''],
+ [['dayofyear'], 'INT', ['DATETIMEV2'], ''],
+ [['weekofyear'], 'INT', ['DATETIMEV2'], ''],
+ [['yearweek'], 'INT', ['DATETIMEV2'], ''],
+ [['yearweek'], 'INT', ['DATETIMEV2', 'INT'], ''],
+ [['week'], 'INT', ['DATETIMEV2'], ''],
+ [['week'], 'INT', ['DATETIMEV2', 'INT'], ''],
+ [['hour'], 'INT', ['DATETIMEV2'], ''],
+ [['minute'], 'INT', ['DATETIMEV2'], ''],
+ [['second'], 'INT', ['DATETIMEV2'], ''],
+
+ [['year'], 'INT', ['DATEV2'], ''],
+ [['month'], 'INT', ['DATEV2'], ''],
+ [['quarter'], 'INT', ['DATEV2'], ''],
+ [['dayofweek'], 'INT', ['DATEV2'], ''],
+ [['weekday'], 'INT', ['DATEV2'], ''],
+ [['day', 'dayofmonth'], 'INT', ['DATEV2'], ''],
+ [['dayofyear'], 'INT', ['DATEV2'], ''],
+ [['weekofyear'], 'INT', ['DATEV2'], ''],
+ [['yearweek'], 'INT', ['DATEV2'], ''],
+ [['yearweek'], 'INT', ['DATEV2', 'INT'], ''],
+ [['week'], 'INT', ['DATEV2'], ''],
+ [['week'], 'INT', ['DATEV2', 'INT'], ''],
+ [['hour'], 'INT', ['DATEV2'], ''],
+ [['minute'], 'INT', ['DATEV2'], ''],
+ [['second'], 'INT', ['DATEV2'], ''],
+
+ [['years_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['years_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['months_add', 'add_months'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['months_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['weeks_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['weeks_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['days_add', 'date_add', 'adddate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'],
''],
+ [['days_sub', 'date_sub', 'subdate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'],
''],
+ [['hours_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['hours_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['minutes_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['minutes_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['seconds_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
+ [['seconds_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
[['microseconds_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
[['microseconds_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
- [['years_add'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['years_sub'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['months_add', 'add_months'], 'DATEV2', ['DATEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['months_sub'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['weeks_add'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['weeks_sub'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['days_add', 'date_add', 'adddate'], 'DATEV2', ['DATEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['days_sub', 'date_sub', 'subdate'], 'DATEV2', ['DATEV2', 'INT'],
'ALWAYS_NULLABLE'],
- [['hours_add'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['hours_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['minutes_add'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['minutes_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['seconds_add'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
- [['seconds_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['years_add'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['years_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['months_add', 'add_months'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['months_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['weeks_add'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['weeks_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['days_add', 'date_add', 'adddate'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['days_sub', 'date_sub', 'subdate'], 'DATEV2', ['DATEV2', 'INT'], ''],
+ [['hours_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
+ [['hours_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
+ [['minutes_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
+ [['minutes_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
+ [['seconds_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
+ [['seconds_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
[['microseconds_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
[['microseconds_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
- [['datediff'], 'INT', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
+ [['datediff'], 'INT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATETIMEV2'], ''],
- [['datediff'], 'INT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['datediff'], 'INT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATEV2'], ''],
- [['datediff'], 'INT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
+ [['datediff'], 'INT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['timediff'], 'TIMEV2', ['DATEV2', 'DATETIMEV2'], ''],
- [['datediff'], 'INT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
-
- [['datediff'], 'INT', ['DATETIMEV2', 'DATETIME'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATETIME'], 'ALWAYS_NULLABLE'],
-
- [['datediff'], 'INT', ['DATEV2', 'DATETIME'], 'ALWAYS_NULLABLE'],
- [['timediff'], 'TIMEV2', ['DATEV2', 'DATETIME'], 'ALWAYS_NULLABLE'],
+ [['datediff'], 'INT', ['DATEV2', 'DATEV2'], ''],
+ [['timediff'], 'TIMEV2', ['DATEV2', 'DATEV2'], ''],
[['date_format'], 'VARCHAR', ['DATETIMEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['date', 'to_date', 'datev2', 'to_datev2'], 'DATEV2', ['DATETIMEV2'],
'ALWAYS_NULLABLE'],
- [['dayname'], 'VARCHAR', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['monthname'], 'VARCHAR', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
+ [['dayname'], 'VARCHAR', ['DATETIMEV2'], ''],
+ [['monthname'], 'VARCHAR', ['DATETIMEV2'], ''],
- [['dayname'], 'VARCHAR', ['DATEV2'], 'ALWAYS_NULLABLE'],
- [['monthname'], 'VARCHAR', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['dayname'], 'VARCHAR', ['DATEV2'], ''],
+ [['monthname'], 'VARCHAR', ['DATEV2'], ''],
[['convert_tz'], 'DATETIMEV2', ['DATETIMEV2', 'VARCHAR', 'VARCHAR'],
'ALWAYS_NULLABLE'],
@@ -794,29 +788,37 @@ visible_functions = [
[['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'],
'ALWAYS_NULLABLE'],
[['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'],
'ALWAYS_NULLABLE'],
- [['years_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['months_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['days_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['hours_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
- [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
-
- [['years_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['months_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['weeks_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['days_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['hours_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
-
- [['years_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['months_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['days_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['hours_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
- [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['years_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['months_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['weeks_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['days_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['hours_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+ [['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
+
+ [['years_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['months_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['days_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['hours_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+ [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
+
+ [['years_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['months_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['weeks_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['days_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['hours_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+ [['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
+
+ [['years_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['months_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['days_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['hours_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
+ [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
[['year_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
[['year_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'],
'ALWAYS_NULLABLE'],
@@ -907,6 +909,30 @@ visible_functions = [
[['day_ceil'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
[['day_ceil'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
[['day_ceil'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['hour_floor'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['hour_floor'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['hour_floor'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['hour_floor'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
+ [['hour_ceil'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['hour_ceil'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['hour_ceil'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['hour_ceil'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
+ [['minute_floor'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['minute_floor'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['minute_floor'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['minute_floor'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
+ [['minute_ceil'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['minute_ceil'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['minute_ceil'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['minute_ceil'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
+ [['second_floor'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['second_floor'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['second_floor'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['second_floor'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
+ [['second_ceil'], 'DATETIMEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
+ [['second_ceil'], 'DATETIMEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
+ [['second_ceil'], 'DATETIMEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
+ [['second_ceil'], 'DATETIMEV2', ['DATEV2', 'INT', 'DATEV2'],
'ALWAYS_NULLABLE'],
# Math builtin functions
[['pi'], 'DOUBLE', [], 'ALWAYS_NOT_NULLABLE'],
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]