zclllyybb commented on code in PR #24069:
URL: https://github.com/apache/doris/pull/24069#discussion_r1331541419
##########
be/src/vec/runtime/vdatetime_value.cpp:
##########
@@ -3812,4 +3812,32 @@ template bool
DateV2Value<DateTimeV2ValueType>::datetime_trunc<TimeUnit::YEAR>()
template bool
DateV2Value<DateTimeV2ValueType>::datetime_trunc<TimeUnit::QUARTER>();
template bool
DateV2Value<DateTimeV2ValueType>::datetime_trunc<TimeUnit::WEEK>();
+CalcFirstWeekPolicy* CalcFirstWeekPolicy::get_policy_by_code(uint8_t code) {
+ static std::unordered_map<uint8_t, CalcFirstWeekPolicy*> instances;
Review Comment:
when multithreads hits the if branch below, there's data racing problem.
this function could be refactor. consider preload it or remove this cache?
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -41,20 +41,81 @@
#include "vec/functions/date_time_transforms.h"
#include "vec/functions/function.h"
+#define GET_COLUMN_CONST_RETURN_IF_ERROR(Index, ColumnType)
\
Review Comment:
it seems no need to use Marco here. please use a function to replace it.
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -41,20 +41,81 @@
#include "vec/functions/date_time_transforms.h"
#include "vec/functions/function.h"
+#define GET_COLUMN_CONST_RETURN_IF_ERROR(Index, ColumnType)
\
+ const IColumn& source_col##Index =
*block.get_by_position(arguments[Index]).column; \
+ const auto* delta_const_column##Index = typeid_cast<const
ColumnType*>(&source_col##Index); \
+ if (!delta_const_column##Index) {
\
+ return Status::InternalError("Illegal column " +
\
+ block.get_by_position(arguments[Index]).column->get_name() +
"(index=" + \
+ std::to_string(Index) + ", type=" +
typeid(source_col##Index).name() + \
+ ") is not const " + name);
\
+ }
\
+
namespace doris {
class FunctionContext;
} // namespace doris
namespace doris::vectorized {
template <typename Transform>
-class FunctionDateTimeStringToString : public IFunction {
+class FunctionDateTimeStringToStringOneArg : public IFunction {
+public:
+ static constexpr auto name = Transform::name;
+ static constexpr bool has_variadic_argument =
+
!std::is_void_v<decltype(has_variadic_argument_types(std::declval<Transform>()))>;
+ static FunctionPtr create() { return
std::make_shared<FunctionDateTimeStringToStringOneArg>(); }
+ String get_name() const override { return name; }
+ size_t get_number_of_arguments() const override { return 0; }
+ bool is_variadic() const override { return true; }
+ DataTypes get_variadic_argument_types_impl() const override {
+ if constexpr (has_variadic_argument) return
Transform::get_variadic_argument_types();
Review Comment:
this will break format rule. please use builtin clang-format file to format
your pr.
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -117,4 +178,85 @@ class FunctionDateTimeStringToString : public IFunction {
}
};
+template <typename Transform>
+class FunctionDateTimeStringToStringFourArgs : public IFunction {
+public:
+ static constexpr auto name = Transform::name;
+ static constexpr bool has_variadic_argument =
+
!std::is_void_v<decltype(has_variadic_argument_types(std::declval<Transform>()))>;
+
+ static FunctionPtr create() { return
std::make_shared<FunctionDateTimeStringToStringFourArgs>(); }
+
+ String get_name() const override { return name; }
+
+ size_t get_number_of_arguments() const override { return 4; }
+ bool is_variadic() const override { return true; }
+ DataTypes get_variadic_argument_types_impl() const override {
+ if constexpr (has_variadic_argument) return
Transform::get_variadic_argument_types();
+ return {};
+ }
+
+ DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
+ return make_nullable(std::make_shared<DataTypeString>());
+ }
+
+ bool use_default_implementation_for_nulls() const override { return false;
}
+ bool use_default_implementation_for_constants() const override { return
true; }
+ ColumnNumbers get_arguments_that_are_always_constant() const override {
return {1, 2, 3}; }
+
+ 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* nullable_column =
check_and_get_column<ColumnNullable>(source_col.get());
+ const auto* sources = check_and_get_column<ColumnVector<typename
Transform::FromType>>(
+ nullable_column ?
nullable_column->get_nested_column_ptr().get()
+ : source_col.get());
+
+ if (sources) {
+ auto col_res = ColumnString::create();
+ ColumnUInt8::MutablePtr col_null_map_to;
+ col_null_map_to = ColumnUInt8::create();
+ auto& vec_null_map_to = col_null_map_to->get_data();
+
+ if(arguments.size() == 4) {
+ GET_COLUMN_CONST_RETURN_IF_ERROR(1, ColumnConst);
+ GET_COLUMN_CONST_RETURN_IF_ERROR(2, ColumnConst);
+ GET_COLUMN_CONST_RETURN_IF_ERROR(3, ColumnConst);
+
+ Int32 first_day_of_week =
delta_const_column1->get_field().get<Int32>();
Review Comment:
`delta_const_column##x` changed. then change this to elimate virtual
function call.
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -41,20 +41,81 @@
#include "vec/functions/date_time_transforms.h"
#include "vec/functions/function.h"
+#define GET_COLUMN_CONST_RETURN_IF_ERROR(Index, ColumnType)
\
+ const IColumn& source_col##Index =
*block.get_by_position(arguments[Index]).column; \
+ const auto* delta_const_column##Index = typeid_cast<const
ColumnType*>(&source_col##Index); \
Review Comment:
```suggestion
const auto& delta_const_column##Index = assert_cast<const
ColumnType&>(assert_cast<const
ColumnConst*>(source_col##Index.get())->get_data_column_ptr())\
```
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -117,4 +178,85 @@ class FunctionDateTimeStringToString : public IFunction {
}
};
+template <typename Transform>
+class FunctionDateTimeStringToStringFourArgs : public IFunction {
+public:
+ static constexpr auto name = Transform::name;
+ static constexpr bool has_variadic_argument =
+
!std::is_void_v<decltype(has_variadic_argument_types(std::declval<Transform>()))>;
+
+ static FunctionPtr create() { return
std::make_shared<FunctionDateTimeStringToStringFourArgs>(); }
+
+ String get_name() const override { return name; }
+
+ size_t get_number_of_arguments() const override { return 4; }
+ bool is_variadic() const override { return true; }
+ DataTypes get_variadic_argument_types_impl() const override {
+ if constexpr (has_variadic_argument) return
Transform::get_variadic_argument_types();
+ return {};
+ }
+
+ DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
+ return make_nullable(std::make_shared<DataTypeString>());
+ }
+
+ bool use_default_implementation_for_nulls() const override { return false;
}
+ bool use_default_implementation_for_constants() const override { return
true; }
Review Comment:
when use its' default value, no need to override it again.
##########
regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy:
##########
@@ -719,4 +719,16 @@ suite("test_date_function") {
assertFalse(res.contains("date_trunc"))
qt_sql """ select date_add("2023-08-17T01:41:18Z", interval 8 hour) """
+
+ // YEAR_WEEK_FORMAT
Review Comment:
please add some testcases which data is from table.
##########
be/src/vec/functions/function_datetime_string_to_string.h:
##########
@@ -41,20 +41,81 @@
#include "vec/functions/date_time_transforms.h"
#include "vec/functions/function.h"
+#define GET_COLUMN_CONST_RETURN_IF_ERROR(Index, ColumnType)
\
+ const IColumn& source_col##Index =
*block.get_by_position(arguments[Index]).column; \
+ const auto* delta_const_column##Index = typeid_cast<const
ColumnType*>(&source_col##Index); \
+ if (!delta_const_column##Index) {
\
+ return Status::InternalError("Illegal column " +
\
+ block.get_by_position(arguments[Index]).column->get_name() +
"(index=" + \
+ std::to_string(Index) + ", type=" +
typeid(source_col##Index).name() + \
+ ") is not const " + name);
\
+ }
\
+
namespace doris {
class FunctionContext;
} // namespace doris
namespace doris::vectorized {
template <typename Transform>
-class FunctionDateTimeStringToString : public IFunction {
+class FunctionDateTimeStringToStringOneArg : public IFunction {
+public:
+ static constexpr auto name = Transform::name;
+ static constexpr bool has_variadic_argument =
+
!std::is_void_v<decltype(has_variadic_argument_types(std::declval<Transform>()))>;
+ static FunctionPtr create() { return
std::make_shared<FunctionDateTimeStringToStringOneArg>(); }
+ String get_name() const override { return name; }
+ size_t get_number_of_arguments() const override { return 0; }
+ bool is_variadic() const override { return true; }
+ DataTypes get_variadic_argument_types_impl() const override {
+ if constexpr (has_variadic_argument) return
Transform::get_variadic_argument_types();
+ return {};
+ }
+ DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments)
const override {
+ return make_nullable(std::make_shared<DataTypeString>());
+ }
+ bool use_default_implementation_for_nulls() const override { return false;
}
+ bool use_default_implementation_for_constants() const override { return
true; }
+ ColumnNumbers get_arguments_that_are_always_constant() const override {
return {}; }
+ 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* nullable_column =
check_and_get_column<ColumnNullable>(source_col.get());
+ const auto* sources = check_and_get_column<ColumnVector<typename
Transform::FromType>>(
+ nullable_column ?
nullable_column->get_nested_column_ptr().get()
+ : source_col.get());
+ if (sources) {
+ auto col_res = ColumnString::create();
+ ColumnUInt8::MutablePtr col_null_map_to;
+ col_null_map_to = ColumnUInt8::create();
Review Comment:
why divide it to two statements?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]