This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 2b427c316a2 [feature](functions) impl scalar functions
normal_cdf,to_iso8601,from_iso8601_date (#40695) (#41049)
2b427c316a2 is described below
commit 2b427c316a230e5d89d2634eec757b6d35ecce6e
Author: daidai <[email protected]>
AuthorDate: Tue Sep 24 09:52:39 2024 +0800
[feature](functions) impl scalar functions
normal_cdf,to_iso8601,from_iso8601_date (#40695) (#41049)
bp #40695
---
be/src/vec/functions/date_time_transforms.h | 23 ++
.../function_date_or_datetime_to_string.cpp | 5 +
be/src/vec/functions/function_timestamp.cpp | 253 ++++++++++++++++++++-
be/src/vec/functions/math.cpp | 74 ++++++
.../doris/catalog/BuiltinScalarFunctions.java | 6 +
.../functions/scalar/FromIso8601Date.java | 72 ++++++
.../expressions/functions/scalar/NormalCdf.java | 69 ++++++
.../expressions/functions/scalar/ToIso8601.java | 76 +++++++
.../expressions/visitor/ScalarFunctionVisitor.java | 15 ++
.../datetime_functions/test_from_iso8601_date.out | 244 ++++++++++++++++++++
.../datetime_functions/test_to_iso8601.out | 194 ++++++++++++++++
.../math_functions/test_normal_cdf.out | 201 ++++++++++++++++
.../test_from_iso8601_date.groovy | 149 ++++++++++++
.../datetime_functions/test_to_iso8601.groovy | 150 ++++++++++++
.../math_functions/test_normal_cdf.groovy | 93 ++++++++
15 files changed, 1623 insertions(+), 1 deletion(-)
diff --git a/be/src/vec/functions/date_time_transforms.h
b/be/src/vec/functions/date_time_transforms.h
index 266c9b5d272..eb1791e9177 100644
--- a/be/src/vec/functions/date_time_transforms.h
+++ b/be/src/vec/functions/date_time_transforms.h
@@ -156,6 +156,29 @@ struct DayNameImpl {
}
};
+template <typename ArgType>
+struct ToIso8601Impl {
+ using OpArgType = ArgType;
+ static constexpr auto name = "to_iso8601";
+ static constexpr auto max_size = std::is_same_v<ArgType, UInt32> ? 10 : 26;
+
+ static inline auto execute(const typename DateTraits<ArgType>::T& dt,
+ ColumnString::Chars& res_data, size_t& offset) {
+ auto length = dt.to_buffer((char*)res_data.data() + offset,
+ std::is_same_v<ArgType, UInt32> ? -1 : 6);
+ if (std::is_same_v<ArgType, UInt64>) {
+ res_data[offset + 10] = 'T';
+ }
+
+ offset += length;
+ return offset;
+ }
+
+ static DataTypes get_variadic_argument_types() {
+ return {std::make_shared<typename DateTraits<ArgType>::DateType>()};
+ }
+};
+
template <typename ArgType>
struct MonthNameImpl {
using OpArgType = ArgType;
diff --git a/be/src/vec/functions/function_date_or_datetime_to_string.cpp
b/be/src/vec/functions/function_date_or_datetime_to_string.cpp
index b8f1c320663..8c3fd755a0f 100644
--- a/be/src/vec/functions/function_date_or_datetime_to_string.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_to_string.cpp
@@ -33,6 +33,9 @@ using FunctionMonthNameV2 =
FunctionDateOrDateTimeToString<MonthNameImpl<UInt32>
using FunctionDateTimeV2DayName =
FunctionDateOrDateTimeToString<DayNameImpl<UInt64>>;
using FunctionDateTimeV2MonthName =
FunctionDateOrDateTimeToString<MonthNameImpl<UInt64>>;
+using FunctionDateIso8601 =
FunctionDateOrDateTimeToString<ToIso8601Impl<UInt32>>;
+using FunctionDateTimeIso8601 =
FunctionDateOrDateTimeToString<ToIso8601Impl<UInt64>>;
+
void register_function_date_time_to_string(SimpleFunctionFactory& factory) {
factory.register_function<FunctionDayName>();
factory.register_function<FunctionMonthName>();
@@ -40,6 +43,8 @@ void
register_function_date_time_to_string(SimpleFunctionFactory& factory) {
factory.register_function<FunctionMonthNameV2>();
factory.register_function<FunctionDateTimeV2DayName>();
factory.register_function<FunctionDateTimeV2MonthName>();
+ factory.register_function<FunctionDateIso8601>();
+ factory.register_function<FunctionDateTimeIso8601>();
}
} // namespace doris::vectorized
diff --git a/be/src/vec/functions/function_timestamp.cpp
b/be/src/vec/functions/function_timestamp.cpp
index 483f8cf9928..7bc16f36b96 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -77,6 +77,8 @@ struct StrToDate {
static bool is_variadic() { return false; }
+ static size_t get_number_of_arguments() { return 2; }
+
static DataTypes get_variadic_argument_types() {
return {std::make_shared<DataTypeString>(),
std::make_shared<DataTypeString>()};
}
@@ -245,6 +247,8 @@ struct MakeDateImpl {
static bool is_variadic() { return false; }
+ static size_t get_number_of_arguments() { return 2; }
+
static DataTypes get_variadic_argument_types() { return {}; }
static DataTypePtr get_return_type_impl(const DataTypes& arguments) {
@@ -408,6 +412,8 @@ struct DateTrunc {
static bool is_variadic() { return true; }
+ static size_t get_number_of_arguments() { return 2; }
+
static DataTypes get_variadic_argument_types() {
return {std::make_shared<DateType>(),
std::make_shared<DataTypeString>()};
}
@@ -1332,7 +1338,7 @@ public:
String get_name() const override { return name; }
- size_t get_number_of_arguments() const override { return 2; }
+ size_t get_number_of_arguments() const override { return
Impl::get_number_of_arguments(); }
bool is_variadic() const override { return Impl::is_variadic(); }
@@ -1364,6 +1370,249 @@ public:
}
};
+struct FromIso8601DateV2 {
+ static constexpr auto name = "from_iso8601_date";
+
+ static size_t get_number_of_arguments() { return 1; }
+
+ static bool is_variadic() { return false; }
+
+ static DataTypes get_variadic_argument_types() { return
{std::make_shared<DataTypeString>()}; }
+
+ static DataTypePtr get_return_type_impl(const DataTypes& arguments) {
+ return make_nullable(std::make_shared<DataTypeDateV2>());
+ }
+
+ static Status execute(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
+ size_t result, size_t input_rows_count) {
+ const auto* src_column_ptr =
block.get_by_position(arguments[0]).column.get();
+
+ auto null_map = ColumnUInt8::create(input_rows_count, 0);
+
+ ColumnDateV2::MutablePtr res = ColumnDateV2::create(input_rows_count);
+ auto& result_data = res->get_data();
+
+ static const std::tuple<std::vector<int>, int, std::string>
ISO_STRING_FORMAT[] = {
+ {{
+ 8,
+ },
+ 1,
+ "%04d%02d%02d"}, //YYYYMMDD
+ {{4, -1, 2, -1, 2}, 1, "%04d-%02d-%02d"}, //YYYY-MM-DD
+ {{4, -1, 2}, 2, "%04d-%02d"}, //YYYY-MM
+ {
+ {
+ 4,
+ },
+ 3,
+ "%04d",
+ }, //YYYY
+ {
+ {4, -1, 3},
+ 4,
+ "%04d-%03d",
+ }, //YYYY-DDD
+ {
+ {
+ 7,
+ },
+ 4,
+ "%04d%03d",
+ }, //YYYYDDD
+ {
+ {4, -1, -2, 2},
+ 5,
+ "%04d-W%02d",
+ }, //YYYY-Www
+ {
+ {4, -2, 2},
+ 5,
+ "%04dW%02d",
+ }, //YYYYWww
+ {
+ {4, -1, -2, 2, -1, 1},
+ 6,
+ "%04d-W%02d-%1d",
+ }, //YYYY-Www-D
+ {
+ {4, -2, 3},
+ 6,
+ "%04dW%02d%1d",
+ }, //YYYYWwwD
+ };
+
+ for (size_t i = 0; i < input_rows_count; ++i) {
+ int year, month, day, week, day_of_year;
+ int weekday = 1; // YYYYWww YYYY-Www default D = 1
+ auto src_string = src_column_ptr->get_data_at(i).to_string_view();
+
+ int iso_string_format_value = 0;
+
+ vector<int> src_string_values;
+ src_string_values.reserve(10);
+
+ //The maximum length of the current iso8601 format is 10.
+ if (src_string.size() <= 10) {
+ // The calculation string corresponds to the iso8601 format.
+ // The integer represents the number of consecutive numbers.
+ // -1 represent char '-'.
+ // -2 represent char 'W'.
+ // The calculated vector `src_string_values` will be
compared with `ISO_STRING_FORMAT[]` later.
+ for (int idx = 0; idx < src_string.size();) {
+ char current = src_string[idx];
+ if (current == '-') {
+ src_string_values.emplace_back(-1);
+ idx++;
+ continue;
+ } else if (current == 'W') {
+ src_string_values.emplace_back(-2);
+ idx++;
+ continue;
+ } else if (!isdigit(current)) {
+ iso_string_format_value = -1;
+ break;
+ }
+ int currLen = 0;
+ for (; idx < src_string.size() &&
isdigit(src_string[idx]); ++idx) {
+ ++currLen;
+ }
+ src_string_values.emplace_back(currLen);
+ }
+ } else {
+ iso_string_format_value = -1;
+ }
+
+ std::string_view iso_format_string;
+ if (iso_string_format_value != -1) {
+ for (const auto& j : ISO_STRING_FORMAT) {
+ const auto& v = std::get<0>(j);
+ if (v == src_string_values) {
+ iso_string_format_value = std::get<1>(j);
+ iso_format_string = std::get<2>(j);
+ break;
+ }
+ }
+ }
+
+ auto& ts_value =
*reinterpret_cast<DateV2Value<DateV2ValueType>*>(&result_data[i]);
+ if (iso_string_format_value == 1) {
+ if (sscanf(src_string.data(), iso_format_string.data(), &year,
&month, &day) != 3)
+ [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ if (!(ts_value.template set_time_unit<YEAR>(year) &&
+ ts_value.template set_time_unit<MONTH>(month) &&
+ ts_value.template set_time_unit<DAY>(day))) [[unlikely]]
{
+ null_map->get_data().data()[i] = true;
+ }
+ } else if (iso_string_format_value == 2) {
+ if (sscanf(src_string.data(), iso_format_string.data(), &year,
&month) != 2)
+ [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ if (!(ts_value.template set_time_unit<YEAR>(year) &&
+ ts_value.template set_time_unit<MONTH>(month) &&
+ ts_value.template set_time_unit<DAY>(1))) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ }
+
+ } else if (iso_string_format_value == 3) {
+ if (sscanf(src_string.data(), iso_format_string.data(), &year)
!= 1) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ if (!(ts_value.template set_time_unit<YEAR>(year) &&
+ ts_value.template set_time_unit<MONTH>(1) &&
+ ts_value.template set_time_unit<DAY>(1))) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ }
+
+ } else if (iso_string_format_value == 5 || iso_string_format_value
== 6) {
+ if (iso_string_format_value == 5) {
+ if (sscanf(src_string.data(), iso_format_string.data(),
&year, &week) != 2)
+ [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+ } else {
+ if (sscanf(src_string.data(), iso_format_string.data(),
&year, &week,
+ &weekday) != 3) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+ }
+ // weekday [1,7] week [1,53]
+ if (weekday < 1 || weekday > 7 || week < 1 || week > 53)
[[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ auto first_day_of_week = getFirstDayOfISOWeek(year);
+ if (!(ts_value.template set_time_unit<YEAR>(
+ first_day_of_week.year().operator int()) &&
+ ts_value.template set_time_unit<MONTH>(
+ first_day_of_week.month().operator unsigned
int()) &&
+ ts_value.template set_time_unit<DAY>(
+ first_day_of_week.day().operator unsigned
int()))) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ auto day_diff = (week - 1) * 7 + weekday - 1;
+ TimeInterval interval(DAY, day_diff, false);
+
+ ts_value.date_add_interval<DAY>(interval);
+ } else if (iso_string_format_value == 4) {
+ if (sscanf(src_string.data(), iso_format_string.data(), &year,
&day_of_year) != 2)
+ [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ if (is_leap(year)) {
+ if (day_of_year < 0 || day_of_year > 366) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ }
+ } else {
+ if (day_of_year < 0 || day_of_year > 365) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ }
+ }
+ if (!(ts_value.template set_time_unit<YEAR>(year) &&
+ ts_value.template set_time_unit<MONTH>(1) &&
+ ts_value.template set_time_unit<DAY>(1))) [[unlikely]] {
+ null_map->get_data().data()[i] = true;
+ continue;
+ }
+
+ TimeInterval interval(DAY, day_of_year - 1, false);
+ ts_value.template date_add_interval<DAY>(interval);
+ } else {
+ null_map->get_data().data()[i] = true;
+ }
+ }
+ block.get_by_position(result).column =
+ ColumnNullable::create(std::move(res), std::move(null_map));
+ return Status::OK();
+ }
+
+private:
+ //Get the date corresponding to Monday of the first week of the year
according to the ISO8601 standard.
+ static std::chrono::year_month_day getFirstDayOfISOWeek(int year) {
+ using namespace std::chrono;
+ auto jan4 = year_month_day {std::chrono::year(year) / January / 4};
+ auto jan4_sys_days = sys_days {jan4};
+ auto weekday_of_jan4 = weekday {jan4_sys_days};
+ auto first_day_of_week = jan4_sys_days - days
{(weekday_of_jan4.iso_encoding() - 1)};
+ return year_month_day {floor<days>(first_day_of_week)};
+ }
+};
+
using FunctionStrToDate =
FunctionOtherTypesToDateType<StrToDate<DataTypeDate>>;
using FunctionStrToDatetime =
FunctionOtherTypesToDateType<StrToDate<DataTypeDateTime>>;
using FunctionStrToDateV2 =
FunctionOtherTypesToDateType<StrToDate<DataTypeDateV2>>;
@@ -1373,6 +1622,7 @@ using FunctionDateTruncDate =
FunctionOtherTypesToDateType<DateTrunc<DataTypeDat
using FunctionDateTruncDateV2 =
FunctionOtherTypesToDateType<DateTrunc<DataTypeDateV2>>;
using FunctionDateTruncDatetime =
FunctionOtherTypesToDateType<DateTrunc<DataTypeDateTime>>;
using FunctionDateTruncDatetimeV2 =
FunctionOtherTypesToDateType<DateTrunc<DataTypeDateTimeV2>>;
+using FunctionFromIso8601DateV2 =
FunctionOtherTypesToDateType<FromIso8601DateV2>;
void register_function_timestamp(SimpleFunctionFactory& factory) {
factory.register_function<FunctionStrToDate>();
@@ -1385,6 +1635,7 @@ void register_function_timestamp(SimpleFunctionFactory&
factory) {
factory.register_function<FunctionDateTruncDateV2>();
factory.register_function<FunctionDateTruncDatetime>();
factory.register_function<FunctionDateTruncDatetimeV2>();
+ factory.register_function<FunctionFromIso8601DateV2>();
factory.register_function<FunctionUnixTimestamp<UnixTimeStampImpl>>();
factory.register_function<FunctionUnixTimestamp<UnixTimeStampDateImpl<DataTypeDate>>>();
diff --git a/be/src/vec/functions/math.cpp b/be/src/vec/functions/math.cpp
index 7c55866e2c4..ff864cdcb07 100644
--- a/be/src/vec/functions/math.cpp
+++ b/be/src/vec/functions/math.cpp
@@ -329,6 +329,79 @@ struct PowName {
};
using FunctionPow = FunctionBinaryArithmetic<PowImpl, PowName, false>;
+class FunctionNormalCdf : public IFunction {
+public:
+ static constexpr auto name = "normal_cdf";
+
+ String get_name() const override { return name; }
+
+ static FunctionPtr create() { return
std::make_shared<FunctionNormalCdf>(); }
+
+ DataTypePtr get_return_type_impl(const DataTypes& arguments) const
override {
+ return make_nullable(std::make_shared<DataTypeFloat64>());
+ }
+
+ DataTypes get_variadic_argument_types_impl() const override {
+ return {std::make_shared<DataTypeFloat64>(),
std::make_shared<DataTypeFloat64>(),
+ std::make_shared<DataTypeFloat64>()};
+ }
+ size_t get_number_of_arguments() const override { return 3; }
+
+ Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
+ size_t result, size_t input_rows_count) const override
{
+ auto result_column = ColumnFloat64::create(input_rows_count);
+ auto result_null_map_column = ColumnUInt8::create(input_rows_count, 0);
+
+ auto& result_data = result_column->get_data();
+ NullMap& result_null_map =
+
assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data();
+
+ ColumnPtr argument_columns[3];
+ bool col_const[3];
+ size_t argument_size = arguments.size();
+ for (int i = 0; i < argument_size; ++i) {
+ argument_columns[i] = block.get_by_position(arguments[i]).column;
+ col_const[i] = is_column_const(*argument_columns[i]);
+ if (col_const[i]) {
+ argument_columns[i] =
+ static_cast<const
ColumnConst&>(*argument_columns[i]).get_data_column_ptr();
+ }
+ }
+
+ auto* mean_col = assert_cast<const
ColumnFloat64*>(argument_columns[0].get());
+ auto* sd_col = assert_cast<const
ColumnFloat64*>(argument_columns[1].get());
+ auto* value_col = assert_cast<const
ColumnFloat64*>(argument_columns[2].get());
+
+ result_column->reserve(input_rows_count);
+ for (size_t i = 0; i < input_rows_count; ++i) {
+ double mean = mean_col->get_element(index_check_const(i,
col_const[0]));
+ double sd = sd_col->get_element(index_check_const(i,
col_const[1]));
+ double v = value_col->get_element(index_check_const(i,
col_const[2]));
+
+ if (!check_argument(sd)) [[unlikely]] {
+ result_null_map[i] = true;
+ continue;
+ }
+ result_data[i] = calculate_cell(mean, sd, v);
+ }
+
+ block.get_by_position(result).column =
+ ColumnNullable::create(std::move(result_column),
std::move(result_null_map_column));
+ return Status::OK();
+ }
+
+ static bool check_argument(double sd) { return sd > 0; }
+ static double calculate_cell(double mean, double sd, double v) {
+#ifdef __APPLE__
+ const double sqrt2 = std::sqrt(2);
+#else
+ constexpr double sqrt2 = std::numbers::sqrt2;
+#endif
+
+ return 0.5 * (std::erf((v - mean) / (sd * sqrt2)) + 1);
+ }
+};
+
// TODO: Now math may cause one thread compile time too long, because the
function in math
// so mush. Split it to speed up compile time in the future
void register_function_math(SimpleFunctionFactory& factory) {
@@ -365,5 +438,6 @@ void register_function_math(SimpleFunctionFactory& factory)
{
factory.register_function<FunctionRadians>();
factory.register_function<FunctionDegrees>();
factory.register_function<FunctionBin>();
+ factory.register_function<FunctionNormalCdf>();
}
} // namespace doris::vectorized
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
index 4210a645784..aec39e9df20 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
@@ -171,6 +171,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Fmod;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Fpow;
import org.apache.doris.nereids.trees.expressions.functions.scalar.FromBase64;
import org.apache.doris.nereids.trees.expressions.functions.scalar.FromDays;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromIso8601Date;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromMicrosecond;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromMillisecond;
import org.apache.doris.nereids.trees.expressions.functions.scalar.FromSecond;
@@ -307,6 +308,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364
import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NgramSearch;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NonNullable;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NormalCdf;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.NotNullOrEmpty;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Now;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
@@ -414,6 +416,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv4OrNull;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6OrDefault;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6OrNull;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.ToIso8601;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToMonday;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToQuantileState;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Tokenize;
@@ -614,6 +617,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(Fpow.class, "fpow"),
scalar(FromBase64.class, "from_base64"),
scalar(FromDays.class, "from_days"),
+ scalar(FromIso8601Date.class, "from_iso8601_date"),
scalar(FromUnixtime.class, "from_unixtime"),
scalar(G.class, "g"),
scalar(GetJsonBigInt.class, "get_json_bigint"),
@@ -764,6 +768,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(MurmurHash364.class, "murmur_hash3_64"),
scalar(Negative.class, "negative"),
scalar(NonNullable.class, "non_nullable"),
+ scalar(NormalCdf.class, "normal_cdf"),
scalar(NotNullOrEmpty.class, "not_null_or_empty"),
scalar(NgramSearch.class, "ngram_search"),
scalar(Now.class, "now", "current_timestamp", "localtime",
"localtimestamp"),
@@ -877,6 +882,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(ToIpv6.class, "to_ipv6"),
scalar(ToIpv6OrDefault.class, "to_ipv6_or_default"),
scalar(ToIpv6OrNull.class, "to_ipv6_or_null"),
+ scalar(ToIso8601.class, "to_iso8601"),
scalar(Tokenize.class, "tokenize"),
scalar(ToMonday.class, "to_monday"),
scalar(ToQuantileState.class, "to_quantile_state"),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromIso8601Date.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromIso8601Date.java
new file mode 100644
index 00000000000..e0e3e41548a
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromIso8601Date.java
@@ -0,0 +1,72 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DateV2Type;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'from_iso8601_date'. This class is generated by
GenerateFunction.
+ */
+public class FromIso8601Date extends ScalarFunction
+ implements UnaryExpression, ExplicitlyCastableSignature,
AlwaysNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(DateV2Type.INSTANCE).args(VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(DateV2Type.INSTANCE).args(StringType.INSTANCE)
+ );
+
+ /**
+ * constructor with 1 argument.
+ */
+ public FromIso8601Date(Expression arg0) {
+ super("from_iso8601_date", arg0);
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public FromIso8601Date withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new FromIso8601Date(children.get(0));
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitFromIso8601Date(this, context);
+ }
+
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NormalCdf.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NormalCdf.java
new file mode 100644
index 00000000000..c68e610679c
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NormalCdf.java
@@ -0,0 +1,69 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.TernaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DoubleType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'normal_cdf'. This class is generated by GenerateFunction.
+ */
+public class NormalCdf extends ScalarFunction
+ implements TernaryExpression, ExplicitlyCastableSignature,
AlwaysNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+ FunctionSignature.ret(DoubleType.INSTANCE)
+ .args(DoubleType.INSTANCE, DoubleType.INSTANCE,
DoubleType.INSTANCE)
+ );
+
+ /**
+ * constructor with 3 arguments.
+ */
+ public NormalCdf(Expression arg0, Expression arg1, Expression arg2) {
+ super("normal_cdf", arg0, arg1, arg2);
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public NormalCdf withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 3);
+ return new NormalCdf(children.get(0), children.get(1),
children.get(2));
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitNormalCdf(this, context);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ToIso8601.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ToIso8601.java
new file mode 100644
index 00000000000..d676157977d
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ToIso8601.java
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
+import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DateTimeType;
+import org.apache.doris.nereids.types.DateTimeV2Type;
+import org.apache.doris.nereids.types.DateType;
+import org.apache.doris.nereids.types.DateV2Type;
+import org.apache.doris.nereids.types.StringType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'to_iso8601'. This class is generated by GenerateFunction.
+ */
+public class ToIso8601 extends ScalarFunction
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(StringType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT),
+
FunctionSignature.ret(StringType.INSTANCE).args(DateV2Type.INSTANCE),
+
FunctionSignature.ret(StringType.INSTANCE).args(DateTimeType.INSTANCE),
+ FunctionSignature.ret(StringType.INSTANCE).args(DateType.INSTANCE)
+ );
+
+ /**
+ * constructor with 1 argument.
+ */
+ public ToIso8601(Expression arg0) {
+ super("to_iso8601", arg0);
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public ToIso8601 withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new ToIso8601(children.get(0));
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitToIso8601(this, context);
+ }
+
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
index 38aad42d3c5..0641a76ac21 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
@@ -179,6 +179,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Fmod;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Fpow;
import org.apache.doris.nereids.trees.expressions.functions.scalar.FromBase64;
import org.apache.doris.nereids.trees.expressions.functions.scalar.FromDays;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromIso8601Date;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromUnixtime;
import org.apache.doris.nereids.trees.expressions.functions.scalar.G;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.GetJsonBigInt;
@@ -307,6 +308,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash332
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NgramSearch;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NormalCdf;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.NotNullOrEmpty;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Now;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
@@ -411,6 +413,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv4OrNull;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6OrDefault;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToIpv6OrNull;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.ToIso8601;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToMonday;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToQuantileState;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Tokenize;
@@ -1130,6 +1133,10 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(fromDays, context);
}
+ default R visitFromIso8601Date(FromIso8601Date fromIso8601Date, C context)
{
+ return visitScalarFunction(fromIso8601Date, context);
+ }
+
default R visitFromUnixtime(FromUnixtime fromUnixtime, C context) {
return visitScalarFunction(fromUnixtime, context);
}
@@ -1574,6 +1581,10 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(ngramSearch, context);
}
+ default R visitNormalCdf(NormalCdf normalCdf, C context) {
+ return visitScalarFunction(normalCdf, context);
+ }
+
default R visitNotNullOrEmpty(NotNullOrEmpty notNullOrEmpty, C context) {
return visitScalarFunction(notNullOrEmpty, context);
}
@@ -1990,6 +2001,10 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(toIpv6OrNull, context);
}
+ default R visitToIso8601(ToIso8601 toIso8601, C context) {
+ return visitScalarFunction(toIso8601, context);
+ }
+
default R visitToMonday(ToMonday toMonday, C context) {
return visitScalarFunction(toMonday, context);
}
diff --git
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.out
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.out
new file mode 100644
index 00000000000..43a4f0bd496
--- /dev/null
+++
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.out
@@ -0,0 +1,244 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !test_31 --
+0000-01-01
+
+-- !test_32 --
+0001-01-01
+
+-- !test_33 --
+1900-01-01
+
+-- !test_34 --
+1970-01-01
+
+-- !test_35 --
+9999-01-01
+
+-- !test_36 --
+0000-01-01
+
+-- !test_37 --
+0000-02-28
+
+-- !test_38 --
+0001-02-28
+
+-- !test_39 --
+1900-02-28
+
+-- !test_40 --
+1970-01-01
+
+-- !test_41 --
+9999-12-31
+
+-- !test_42 --
+0000-02-28
+
+-- !test_43 --
+0001-02-28
+
+-- !test_44 --
+1900-02-28
+
+-- !test_45 --
+1970-01-01
+
+-- !test_46 --
+9999-12-31
+
+-- !test_47 --
+0000-01-01
+
+-- !test_48 --
+0000-02-01
+
+-- !test_49 --
+0001-03-01
+
+-- !test_50 --
+1900-03-01
+
+-- !test_51 --
+1970-01-01
+
+-- !test_52 --
+9999-12-01
+
+-- !test_53 --
+0000-01-03
+
+-- !test_54 --
+0000-02-28
+
+-- !test_55 --
+0001-02-26
+
+-- !test_56 --
+1900-02-19
+
+-- !test_57 --
+1969-12-29
+
+-- !test_58 --
+9999-12-27
+
+-- !test_59 --
+0000-01-03
+
+-- !test_60 --
+0000-03-05
+
+-- !test_61 --
+0001-03-03
+
+-- !test_62 --
+1900-02-25
+
+-- !test_63 --
+1969-12-29
+
+-- !test_64 --
+9999-12-31
+
+-- !test_65 --
+0000-02-28
+
+-- !test_66 --
+0001-03-01
+
+-- !test_67 --
+1900-02-28
+
+-- !test_68 --
+1970-01-01
+
+-- !test_69 --
+9999-12-31
+
+-- !test_70 --
+0000-03-01
+
+-- !test_71 --
+0000-03-02
+
+-- !test_72 --
+0000-03-03
+
+-- !test_73 --
+\N
+
+-- !test_74 --
+0000-03-01
+
+-- !test_75 --
+\N
+
+-- !test_76 --
+0001-03-01
+
+-- !test_77 --
+\N
+
+-- !test_78 --
+1900-03-01
+
+-- !test_79 --
+1970-02-28
+
+-- !test_80 --
+1970-03-01
+
+-- !test_81 --
+\N
+
+-- !test_82 --
+9999-03-01
+
+-- !test_83 --
+2008-12-29
+
+-- !test_84 --
+2010-01-03
+
+-- !test_85 --
+\N
+
+-- !test_86 --
+2023-04-05
+
+-- !test_101 --
+\N
+
+-- !test_102 --
+0230-01-01
+
+-- !test_103 --
+\N
+
+-- !test_104 --
+\N
+
+-- !test_105 --
+\N
+
+-- !test_106 --
+\N
+
+-- !test_107 --
+\N
+
+-- !test_108 --
+\N
+
+-- !test_109 --
+\N
+
+-- !test_110 --
+\N
+
+-- !test_111 --
+\N
+
+-- !test_112 --
+\N
+
+-- !test_113 --
+\N
+
+-- !test_114 --
+\N
+
+-- !test_115 --
+5555-01-01
+
+-- !test_116 --
+\N
+
+-- !test_116 --
+5555-01-01
+
+-- !test_117 --
+\N
+
+-- !test_118 --
+\N
+
+-- !test_119 --
+\N
+
+-- !test_120 --
+\N
+
+-- !test_87 --
+2023-02-03 2023-02-03 2023-02-03 2023-02-03 2023-02-03
2023-02-03
+\N \N \N 2023-02-03 2023-02-03 2023-02-03
+
+-- !test_88 --
+2023-02-03 2023-02-03 2023-02-03 2023-02-03 2023-02-03
2023-02-03
+\N \N \N 2023-02-03 2023-02-03 2023-02-03
+
+-- !test_89 --
+\N
+\N
+
diff --git
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_to_iso8601.out
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_to_iso8601.out
new file mode 100644
index 00000000000..358249891a1
--- /dev/null
+++
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_to_iso8601.out
@@ -0,0 +1,194 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !test_1 --
+2023-04-05
+2023-04-05
+2023-04-05
+0000-01-03
+9999-12-31
+\N
+
+-- !test_2 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.000000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.000000
+\N
+
+-- !test_3 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.100000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.900000
+\N
+
+-- !test_4 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.120000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.990000
+\N
+
+-- !test_5 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999000
+\N
+
+-- !test_6 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123400
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999900
+\N
+
+-- !test_7 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123456
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999999
+\N
+
+-- !test_8 --
+2023-04-05
+2023-04-05
+2023-04-05
+0000-01-03
+9999-12-31
+9999-12-31
+
+-- !test_9 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.000000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.000000
+9999-12-31T23:59:59.000000
+
+-- !test_10 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.100000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.900000
+9999-12-31T23:59:59.900000
+
+-- !test_11 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.120000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.990000
+9999-12-31T23:59:59.990000
+
+-- !test_12 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123000
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999000
+9999-12-31T23:59:59.999000
+
+-- !test_13 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123400
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999900
+9999-12-31T23:59:59.999900
+
+-- !test_14 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123456
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999999
+9999-12-31T23:59:59.999999
+
+-- !test_7_2 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123456
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999999
+\N
+
+-- !test_14_2 --
+2023-04-05T03:04:05.000000
+2023-04-05T03:04:05.123456
+2023-04-05T03:04:05.100000
+0000-01-03T00:00:00.000000
+9999-12-31T23:59:59.999999
+9999-12-31T23:59:59.999999
+
+-- !test_14_2 --
+\N
+\N
+\N
+\N
+\N
+\N
+
+-- !test_15 --
+2023-01-03
+
+-- !test_16 --
+2023-01-03T00:00:00.000000
+
+-- !test_17 --
+0000-01-03
+
+-- !test_18 --
+0000-01-03T00:00:00.000000
+
+-- !test_19 --
+0000-12-31
+
+-- !test_20 --
+0000-12-31T23:59:59.000000
+
+-- !test_21 --
+0000-02-28
+
+-- !test_22 --
+0000-02-28T00:00:00.000000
+
+-- !test_23 --
+\N
+
+-- !test_24 --
+\N
+
+-- !test_25 --
+1900-02-28
+
+-- !test_26 --
+1900-02-28T00:00:00.000000
+
+-- !test_27 --
+9999-12-31
+
+-- !test_28 --
+9999-12-31T23:59:59.000000
+
+-- !test_29 --
+1970-01-01
+
+-- !test_30 --
+1970-01-01T00:00:00.000000
+
+-- !test_31 --
+1970-01-01
+
+-- !test_32 --
+\N
+
+-- !test_33 --
+\N
+
diff --git
a/regression-test/data/query_p0/sql_functions/math_functions/test_normal_cdf.out
b/regression-test/data/query_p0/sql_functions/math_functions/test_normal_cdf.out
new file mode 100644
index 00000000000..7b500151a9a
--- /dev/null
+++
b/regression-test/data/query_p0/sql_functions/math_functions/test_normal_cdf.out
@@ -0,0 +1,201 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !test_1 --
+0.9750021048517796 0.9750021048517796
+0.5 0.5
+0.0013498980316301035 0.0013498980316301035
+\N \N
+\N \N
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+
+-- !test_2 --
+0.9750021048517796 0.9750021048517796
+0.185839346177947 0.185839346177947
+0.9502845653746862 0.9502845653746862
+\N \N
+\N \N
+\N 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+
+-- !test_3 --
+0.9750021048517796 0.9750021048517796
+0.8667397370974945 0.8667397370974945
+1.0188922978077164E-4 1.0188922978077164E-4
+\N \N
+\N \N
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+
+-- !test_4 --
+0.9750021048517796 0.9750021048517796
+0.5 0.5
+1.488228429380456E-10 1.488228429380456E-10
+0.8413447460685429 0.8413447460685429
+0.8413447460685429 0.8413447460685429
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+
+-- !test_5 --
+0.9750021048517796 0.9750021048517796
+1.0 1.0
+3.1086244689504383E-15 3.1086244689504383E-15
+0.8413447460685429 0.8413447460685429
+0.8413447460685429 0.8413447460685429
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+
+-- !test_6 --
+0.9750021048517796 0.9750021048517796
+4.440892098500626E-16 4.440892098500626E-16
+0.9997299123060366 0.9997299123060366
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+\N 0.9750021048517796
+
+-- !test_7 --
+0.9750021048517796 0.9750021048517796
+0.5861988701119502 0.5861988701119502
+0.8246760551477705 0.8246760551477705
+\N \N
+\N \N
+\N \N
+\N \N
+0.9750021048517796 0.9750021048517796
+\N \N
+\N \N
+\N \N
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+0.9750021048517796 0.9750021048517796
+
+-- !test_8 --
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+
+-- !test_9 --
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+
+-- !test_10 --
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+
+-- !test_11 --
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+\N \N
+
+-- !test_12 --
+1 0.0 1.0 0.9750021048517796 0.9750021048517796
0.9750021048517796
+
+-- !test_13 --
+0.9750021048517796
+
+-- !test_14 --
+0.9750021048517796
+
+-- !test_15 --
+0.9750021048517796
+
+-- !test_16 --
+\N
+
+-- !test_17 --
+\N
+
+-- !test_18 --
+\N
+
+-- !test_19 --
+\N
+
diff --git
a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.groovy
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.groovy
new file mode 100644
index 00000000000..52c7bb0da34
--- /dev/null
+++
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_from_iso8601_date.groovy
@@ -0,0 +1,149 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_from_iso8601_date") {
+
+ def dbName = "test_from_iso8601_date"
+ sql "DROP DATABASE IF EXISTS ${dbName}"
+ sql "CREATE DATABASE ${dbName}"
+ sql "USE $dbName"
+
+
+ qt_test_31 """SELECT from_iso8601_date('0000');""" // 0000-01-01
+ qt_test_32 """SELECT from_iso8601_date('0001');""" // 0001-01-01
+ qt_test_33 """SELECT from_iso8601_date('1900');""" // 1900-01-01
+ qt_test_34 """SELECT from_iso8601_date('1970');""" // 1970-01-01
+ qt_test_35 """SELECT from_iso8601_date('9999');""" // 9999-01-01
+
+ qt_test_36 """SELECT from_iso8601_date('0000-01-01');""" // 0000-01-01
+ qt_test_37 """SELECT from_iso8601_date('0000-02-28');""" // 0000-02-28
+ qt_test_38 """SELECT from_iso8601_date('0001-02-28');""" // 0001-02-28
+ qt_test_39 """SELECT from_iso8601_date('1900-02-28');""" // 1900-02-28
+ qt_test_40 """SELECT from_iso8601_date('1970-01-01');""" // 1970-01-01
+ qt_test_41 """SELECT from_iso8601_date('9999-12-31');""" // 9999-12-31
+
+ qt_test_42 """SELECT from_iso8601_date('00000228');""" // 0000-02-28
+ qt_test_43 """SELECT from_iso8601_date('00010228');""" // 0001-02-28
+ qt_test_44 """SELECT from_iso8601_date('19000228');""" // 1900-02-28
+ qt_test_45 """SELECT from_iso8601_date('19700101');""" // 1970-01-01
+ qt_test_46 """SELECT from_iso8601_date('99991231');""" // 9999-12-31
+
+ qt_test_47 """SELECT from_iso8601_date('0000-01');""" // 0000-01-01
+ qt_test_48 """SELECT from_iso8601_date('0000-02');""" // 0000-02-01
+ qt_test_49 """SELECT from_iso8601_date('0001-03');""" // 0001-03-01
+ qt_test_50 """SELECT from_iso8601_date('1900-03');""" // 1900-03-01
+ qt_test_51 """SELECT from_iso8601_date('1970-01');""" // 1970-01-01
+ qt_test_52 """SELECT from_iso8601_date('9999-12');""" // 9999-12-01
+
+ qt_test_53 """SELECT from_iso8601_date('0000-W01');""" // 0000-01-03
+ qt_test_54 """SELECT from_iso8601_date('0000-W09');""" // 0000-02-28
+ qt_test_55 """SELECT from_iso8601_date('0001-W09');""" // 0001-02-26
+ qt_test_56 """SELECT from_iso8601_date('1900-W08');""" // 1900-02-19
+ qt_test_57 """SELECT from_iso8601_date('1970-W01');""" // 1969-12-29
+ qt_test_58 """SELECT from_iso8601_date('9999-W52');""" // 9999-12-27
+
+
+ qt_test_59 """SELECT from_iso8601_date('0000-W01-1');""" // 0000-01-03
+ qt_test_60 """SELECT from_iso8601_date('0000-W09-6');""" // 0000-03-04
0000-03-05
+ qt_test_61 """SELECT from_iso8601_date('0001-W09-6');""" // 0001-03-03
+ qt_test_62 """SELECT from_iso8601_date('1900-W08-7');""" // 1900-02-25
+ qt_test_63 """SELECT from_iso8601_date('1970-W01-1');""" // 1969-12-29
+ qt_test_64 """SELECT from_iso8601_date('9999-W52-5');""" // 9999-12-31
+
+
+
+
+ qt_test_65 """SELECT from_iso8601_date('0000-059');""" // 0000-02-28
+ qt_test_66 """SELECT from_iso8601_date('0001-060');""" // 0001-03-01
+ qt_test_67 """SELECT from_iso8601_date('1900-059');""" // 1900-02-28
+ qt_test_68 """SELECT from_iso8601_date('1970-001');""" // 1970-01-01
+ qt_test_69 """SELECT from_iso8601_date('9999-365');""" // 9999-12-31
+
+ qt_test_70 """SELECT from_iso8601_date('0000-060');""" // 0000-02-29
0000-03-01
+ qt_test_71 """SELECT from_iso8601_date('0000-061');""" // 0000-03-01
0000-03-02
+ qt_test_72 """SELECT from_iso8601_date('0000-062');""" // 0000-03-02
0000-03-03
+
+ qt_test_73 """SELECT from_iso8601_date('0000-02-29');""" // 0000-02-29
NULL
+ qt_test_74 """SELECT from_iso8601_date('0000-03-01');""" // 0000-03-01
+ qt_test_75 """SELECT from_iso8601_date('0001-02-29');""" // NULL
+ qt_test_76 """SELECT from_iso8601_date('0001-03-01');""" // 0001-03-01
+
+ qt_test_77 """SELECT from_iso8601_date('1900-02-29');""" // NULL
+ qt_test_78 """SELECT from_iso8601_date('1900-03-01');""" // 1900-03-01
+ qt_test_79 """SELECT from_iso8601_date('1970-02-28');""" // 1970-02-28
+ qt_test_80 """SELECT from_iso8601_date('1970-03-01');""" // 1970-03-01
+ qt_test_81 """SELECT from_iso8601_date('9999-02-29');""" // NULL
+ qt_test_82 """SELECT from_iso8601_date('9999-03-01');""" // 9999-03-01
+
+ qt_test_83 """SELECT from_iso8601_date('2009-W01-1');""" // 2008-12-29
+ qt_test_84 """SELECT from_iso8601_date('2009-W53-7')""" //
2010-01-03
+
+ qt_test_85 """SELECT from_iso8601_date(NULL);"""
+ qt_test_86 """SELECT from_iso8601_date(nullable("2023-04-05"));"""
+
+
+ qt_test_101 """ SELECT from_iso8601_date("20230");"""
+ qt_test_102 """ SELECT from_iso8601_date("0230");"""
+ qt_test_103 """ SELECT from_iso8601_date("202334");"""
+ qt_test_104 """ SELECT from_iso8601_date("902030");"""
+ qt_test_105 """ SELECT from_iso8601_date("2003--33");"""
+ qt_test_106 """ SELECT from_iso8601_date("abcdd");"""
+ qt_test_107 """ SELECT from_iso8601_date("7855462");"""
+ qt_test_108 """ SELECT from_iso8601_date("010-03-02");"""
+ qt_test_109 """ SELECT from_iso8601_date("2021/03/04");"""
+ qt_test_110 """ SELECT from_iso8601_date("2121W1");"""
+ qt_test_111 """ SELECT from_iso8601_date("2121W00");"""
+ qt_test_112 """ SELECT from_iso8601_date("ssss");"""
+ qt_test_113 """ SELECT from_iso8601_date("5555555");"""
+ qt_test_114 """ SELECT from_iso8601_date("555500");"""
+ qt_test_115 """ SELECT from_iso8601_date("5555001");"""
+ qt_test_116 """ SELECT from_iso8601_date("5555W001");"""
+ qt_test_116 """ SELECT from_iso8601_date("5555-001");"""
+ qt_test_117 """ SELECT from_iso8601_date("5555-W001");"""
+ qt_test_118 """ SELECT from_iso8601_date("555-001");"""
+ qt_test_119 """ SELECT from_iso8601_date("99999-02-01");"""
+ qt_test_120 """ SELECT from_iso8601_date("");"""
+
+
+
+ sql """
+ CREATE TABLE IF NOT EXISTS `tb2` (
+ `k0` int null comment "",
+
+ `k1` string,
+ `k2` char(10),
+ `k3` varchar(10),
+
+ `k11` string not null ,
+ `k22` char(10) not null ,
+ `k33` varchar(10) not null
+
+ ) engine=olap
+ DISTRIBUTED BY HASH(`k0`) BUCKETS 5 properties("replication_num" = "1")
+ """
+ sql """insert into tb2 values (1, "2023-02-03","2023-02-03","2023-02-03" ,
"2023-02-03","2023-02-03","2023-02-03" );"""
+ sql """insert into tb2 values (2, null,null,null,
"2023-02-03","2023-02-03","2023-02-03" );"""
+
+ qt_test_87 """ select
from_iso8601_date(k1),from_iso8601_date(k2),from_iso8601_date(k3),from_iso8601_date(k11),from_iso8601_date(k22),from_iso8601_date(k33)
from tb2 order by k0;"""
+ qt_test_88 """ select
from_iso8601_date(nullable(k1)),from_iso8601_date(k2),from_iso8601_date(k3),from_iso8601_date(nullable(k11)),from_iso8601_date(k22),from_iso8601_date(k33)
from tb2 order by k0; """
+ qt_test_89 """ select from_iso8601_date(NULL) from tb2 order by k0; """
+
+
+
+ sql """ drop table tb2 """
+
+}
\ No newline at end of file
diff --git
a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_to_iso8601.groovy
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_to_iso8601.groovy
new file mode 100644
index 00000000000..55931bd1071
--- /dev/null
+++
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_to_iso8601.groovy
@@ -0,0 +1,150 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_to_iso8601") {
+
+ def dbName = "test_iso8601"
+ sql "DROP DATABASE IF EXISTS ${dbName}"
+ sql "CREATE DATABASE ${dbName}"
+ sql "USE $dbName"
+
+ sql """
+ CREATE TABLE IF NOT EXISTS `tb` (
+ `id` int null comment "",
+
+ `k1` date null comment "",
+ `k2` DATETIME null comment "",
+ `k3` DATETIME(1) null comment "",
+ `k4` DATETIME(2) null comment "",
+ `k5` DATETIME(3) null comment "",
+ `k6` DATETIME(4) null comment "",
+ `k7` DATETIME(6) null comment "",
+
+ `k11` date not null comment "",
+ `k22` DATETIME not null comment "",
+ `k33` DATETIME(1) not null comment "",
+ `k44` DATETIME(2) not null comment "",
+ `k55` DATETIME(3) not null comment "",
+ `k66` DATETIME(4) not null comment "",
+ `k77` DATETIME(6) not null comment ""
+ ) engine=olap
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 5 properties("replication_num" = "1")
+ """
+
+ sql """ insert into tb values (1, cast( '2023-04-05' as date ),
+ cast( '2023-04-05 03:04:05' as DATETIME), cast( '2023-04-05
03:04:05' as DATETIME(1) ),cast( '2023-04-05 03:04:05' as DATETIME(2) ),cast(
'2023-04-05 03:04:05' as DATETIME(3) ),
+ cast( '2023-04-05 03:04:05' as DATETIME(4) ),cast( '2023-04-05
03:04:05' as DATETIME(6) ),
+ cast( '2023-04-05' as date ),
+ cast( '2023-04-05 03:04:05' as DATETIME), cast( '2023-04-05
03:04:05' as DATETIME(1) ),cast( '2023-04-05 03:04:05' as DATETIME(2) ),cast(
'2023-04-05 03:04:05' as DATETIME(3) ),
+ cast( '2023-04-05 03:04:05' as DATETIME(4) ),cast( '2023-04-05
03:04:05' as DATETIME(6) )
+ );
+ """
+
+ sql """
+ insert into tb values (2,cast( '2023-04-05' as date ),cast(
'2023-04-05 03:04:05' as DATETIME ),cast( '2023-04-05 03:04:05.1' as
DATETIME(1) ),cast( '2023-04-05 03:04:05.12' as DATETIME(2) ),
+ cast( '2023-04-05 03:04:05.123' as DATETIME(3) ),cast( '2023-04-05
03:04:05.1234' as DATETIME(4) ),cast( '2023-04-05 03:04:05.123456' as
DATETIME(6) ),cast( '2023-04-05' as date ),cast( '2023-04-05 03:04:05' as
DATETIME ),
+ cast( '2023-04-05 03:04:05.1' as DATETIME(1) ),cast( '2023-04-05
03:04:05.12' as DATETIME(2) ),cast( '2023-04-05 03:04:05.123' as DATETIME(3)
),cast( '2023-04-05 03:04:05.1234' as DATETIME(4) ),
+ cast( '2023-04-05 03:04:05.123456' as DATETIME(6) )
+ ); """
+
+
+ sql """
+ insert into tb values (3,cast( '2023-04-05' as date ),cast(
'2023-04-05 03:04:05' as DATETIME ),
+ cast( '2023-04-05 03:04:05.1' as DATETIME(1) ),cast( '2023-04-05
03:04:05.1' as DATETIME(2) ),cast( '2023-04-05 03:04:05.1' as DATETIME(3) ),
+ cast( '2023-04-05 03:04:05.1' as DATETIME(4) ),cast( '2023-04-05
03:04:05.1' as DATETIME(6) ),cast( '2023-04-05' as date ),cast( '2023-04-05
03:04:05' as DATETIME ),
+ cast( '2023-04-05 03:04:05.1' as DATETIME(1) ),cast( '2023-04-05
03:04:05.1' as DATETIME(2) ),cast( '2023-04-05 03:04:05.1' as DATETIME(3) ),
+ cast( '2023-04-05 03:04:05.1' as DATETIME(4) ),cast( '2023-04-05
03:04:05.1' as DATETIME(6) )
+ );"""
+
+ sql """
+ insert into tb values (4,CAST('0000-01-03' AS DATE),CAST('0000-01-03
00:00:00' AS DATETIME),CAST('0000-01-03 00:00:00' AS
DATETIME(1)),CAST('0000-01-03 00:00:00' AS DATETIME(2)),
+ CAST('0000-01-03 00:00:00' AS DATETIME(3)),CAST('0000-01-03 00:00:00'
AS DATETIME(4)),CAST('0000-01-03 00:00:00' AS DATETIME(6)),CAST('0000-01-03' AS
DATE),CAST('0000-01-03 00:00:00' AS DATETIME),
+ CAST('0000-01-03 00:00:00' AS DATETIME(1)),CAST('0000-01-03 00:00:00'
AS DATETIME(2)),CAST('0000-01-03 00:00:00' AS DATETIME(3)),CAST('0000-01-03
00:00:00' AS DATETIME(4)),CAST('0000-01-03 00:00:00' AS DATETIME(6))
+ );"""
+
+ sql """
+ insert into tb values (5,CAST('9999-12-31' AS DATE),CAST('9999-12-31
23:59:59' AS DATETIME),CAST('9999-12-31 23:59:59.9' AS DATETIME(1)),
+ CAST('9999-12-31 23:59:59.99' AS DATETIME(2)),CAST('9999-12-31
23:59:59.999' AS DATETIME(3)),CAST('9999-12-31 23:59:59.9999' AS DATETIME(4)),
+ CAST('9999-12-31 23:59:59.999999' AS DATETIME(6)),CAST('9999-12-31' AS
DATE),CAST('9999-12-31 23:59:59' AS DATETIME),CAST('9999-12-31 23:59:59.9' AS
DATETIME(1)),
+ CAST('9999-12-31 23:59:59.99' AS DATETIME(2)),CAST('9999-12-31
23:59:59.999' AS DATETIME(3)),CAST('9999-12-31 23:59:59.9999' AS
DATETIME(4)),CAST('9999-12-31 23:59:59.999999' AS DATETIME(6))
+ ); """
+
+ sql """
+ insert into tb values
(6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,CAST('9999-12-31' AS
DATE),CAST('9999-12-31 23:59:59' AS DATETIME),CAST('9999-12-31 23:59:59.9' AS
DATETIME(1)),
+ CAST('9999-12-31 23:59:59.99' AS DATETIME(2)),CAST('9999-12-31
23:59:59.999' AS DATETIME(3)),CAST('9999-12-31 23:59:59.9999' AS
DATETIME(4)),CAST('9999-12-31 23:59:59.999999' AS DATETIME(6))
+ );
+ """
+
+
+ qt_test_1 """select to_iso8601(k1) from tb order by id;"""
+ qt_test_2 """select to_iso8601(k2) from tb order by id;"""
+ qt_test_3 """select to_iso8601(k3) from tb order by id;"""
+ qt_test_4 """select to_iso8601(k4) from tb order by id;"""
+ qt_test_5 """select to_iso8601(k5) from tb order by id;"""
+ qt_test_6 """select to_iso8601(k6) from tb order by id;"""
+ qt_test_7 """select to_iso8601(k7) from tb order by id;"""
+
+ qt_test_8 """select to_iso8601(k11) from tb order by id;"""
+ qt_test_9 """select to_iso8601(k22) from tb order by id;"""
+ qt_test_10 """select to_iso8601(k33) from tb order by id;"""
+ qt_test_11 """select to_iso8601(k44) from tb order by id;"""
+ qt_test_12 """select to_iso8601(k55) from tb order by id;"""
+ qt_test_13 """select to_iso8601(k66) from tb order by id;"""
+ qt_test_14 """select to_iso8601(k77) from tb order by id;"""
+
+ qt_test_7_2 """select to_iso8601(nullable(k7)) from tb order by id;"""
+ qt_test_14_2 """select to_iso8601(nullable(k77)) from tb order by id;"""
+ qt_test_14_2 """select to_iso8601(NULL) from tb order by id;"""
+
+
+
+ sql """ drop table tb """
+
+
+
+ qt_test_15 """SELECT to_iso8601(CAST('2023-01-03' AS DATE));"""
+ qt_test_16 """SELECT to_iso8601(CAST('2023-01-03 00:00:00' AS
DATETIME));"""
+
+ qt_test_17 """SELECT to_iso8601(CAST('0000-01-03' AS DATE));"""
+ qt_test_18 """SELECT to_iso8601(CAST('0000-01-03 00:00:00' AS
DATETIME));"""
+
+ qt_test_19 """SELECT to_iso8601(CAST('0000-12-31' AS DATE));"""
+ qt_test_20 """SELECT to_iso8601(CAST('0000-12-31 23:59:59' AS
DATETIME));"""
+
+ qt_test_21 """SELECT to_iso8601(CAST('0000-02-28' AS DATE));"""
+ qt_test_22 """SELECT to_iso8601(CAST('0000-02-28 00:00:00' AS
DATETIME));"""
+
+ // master : CAST('0000-02-29' AS DATE) -> NULL
+ // 2.1 : CAST('0000-02-29' AS DATE) -> Exception
+ // qt_test_23 """SELECT to_iso8601(CAST('0000-02-29' AS DATE));"""
+ // qt_test_24 """SELECT to_iso8601(CAST('0000-02-29 00:00:00' AS
DATETIME));"""
+
+ qt_test_25 """SELECT to_iso8601(CAST('1900-02-28' AS DATE));"""
+ qt_test_26 """SELECT to_iso8601(CAST('1900-02-28 00:00:00' AS
DATETIME));"""
+
+ qt_test_27 """SELECT to_iso8601(CAST('9999-12-31' AS DATE));"""
+ qt_test_28 """SELECT to_iso8601(CAST('9999-12-31 23:59:59' AS
DATETIME));"""
+
+ qt_test_29 """SELECT to_iso8601(CAST('1970-01-01' AS DATE));"""
+ qt_test_30 """SELECT to_iso8601(CAST('1970-01-01 00:00:00' AS
DATETIME));"""
+
+ qt_test_31 """ SELECT to_iso8601(nullable(CAST('1970-01-01' AS DATE))); """
+ qt_test_32 """ SELECT to_iso8601(nullable(NULL)); """
+ qt_test_33 """ SELECT to_iso8601(NULL); """
+
+
+}
diff --git
a/regression-test/suites/query_p0/sql_functions/math_functions/test_normal_cdf.groovy
b/regression-test/suites/query_p0/sql_functions/math_functions/test_normal_cdf.groovy
new file mode 100644
index 00000000000..8fcd7b0d23d
--- /dev/null
+++
b/regression-test/suites/query_p0/sql_functions/math_functions/test_normal_cdf.groovy
@@ -0,0 +1,93 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_normal_cdf") {
+ def dbName = "test_normal_cdf"
+ sql "DROP DATABASE IF EXISTS ${dbName}"
+ sql "CREATE DATABASE ${dbName}"
+ sql "USE $dbName"
+
+
+
+ sql """DROP TABLE IF EXISTS `tb`"""
+ sql """ CREATE TABLE `tb` (
+ `id` int ,
+
+ `k1` double ,
+ `k2` double ,
+ `k3` double ,
+
+ `k11` double not NULL,
+ `k22` double not NULL,
+ `k33` double not NULL
+ )
+ DISTRIBUTED BY HASH(`id`) BUCKETS 5 properties("replication_num" =
"1");
+ """
+
+
+
+ sql """ insert into `tb` values( 1, 0, 1, 1.96, 0, 1, 1.96 )
""" // 0.9750021048517796
+ sql """ insert into `tb` values( 2, 10, 9, 10, 10, 9, 10 )
""" // 0.5
+ sql """ insert into `tb` values( 3, -1.5, 2.1, -7.8, -1.5, 2.1,
-7.8) """ // 0.0013498980316301035
+
+ sql """ insert into `tb` values( 4, 0 , 0 , 1, 0 , 0 , 1 )
""" // NULL
+ sql """ insert into `tb` values( 5, 0 , -1 , 1, 0 , -1 , 1 )
""" // NULL
+
+
+ sql """ insert into `tb` values( 6, NULL, NULL, NULL, 0, 1,
1.96 ) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 7, 0, NULL, NULL, 0, 1, 1.96
) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 8, 0, 1 , NULL, 0, 1, 1.96 )
""" // 0.9750021048517796
+
+
+ sql """ insert into `tb` values( 9, 0, NULL, 1.96, 0, 1,
1.96 ) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 10, 0, NULL, NULL, 0, 1,
1.96 ) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 11, 0, NULL , 1.96, 0, 1,
1.96 ) """ // 0.9750021048517796
+
+
+ sql """ insert into `tb` values( 12, NULL, 1, 1.96, 0, 1,
1.96 ) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 13, NULL, 1, NULL, 0, 1,
1.96 ) """ // 0.9750021048517796
+ sql """ insert into `tb` values( 14, NULL, 1 , 1.96, 0, 1,
1.96 ) """ // 0.9750021048517796
+
+
+ qt_test_1 """ select normal_cdf(k1,k2,k3),normal_cdf(k11,k22,k33) from tb
order by id """
+
+ qt_test_2 """ select normal_cdf(k1,k2,1.96),normal_cdf(k11,k22,1.96) from
tb order by id """
+ qt_test_3 """ select normal_cdf(0,k2,k3),normal_cdf(0,k22,k33) from tb
order by id """
+ qt_test_4 """ select normal_cdf(k1,1,k3),normal_cdf(k11,1,k33) from tb
order by id """
+
+ qt_test_5 """ select normal_cdf(0,1,k3),normal_cdf(0,1,k33) from tb order
by id """
+ qt_test_6 """ select normal_cdf(k1,1,1.96),normal_cdf(k11,1,1.96) from tb
order by id """
+ qt_test_7 """ select normal_cdf(0,k2,1.96),normal_cdf(0,k2,1.96) from tb
order by id """
+
+ qt_test_8 """ select normal_cdf(k1,k2,NULL),normal_cdf(k11,k22,NULL) from
tb order by id """
+ qt_test_9 """ select normal_cdf(NULL,k2,k3),normal_cdf(NULL,k22,k33) from
tb order by id """
+ qt_test_10 """ select normal_cdf(k1,NULL,k3),normal_cdf(k1,NULL,k33) from
tb order by id """
+
+ qt_test_11 """ select
normal_cdf(nullable(k1),NULL,k3),normal_cdf(nullable(0),NULL,k33) from tb
order by id """
+
+ qt_test_12 """ select
id,k1,k2,normal_cdf(0,1,1.96),normal_cdf(k1,k2,1.96),normal_cdf(k11,k22,1.96)
from tb where id =1 ;"""
+
+ qt_test_13 """ select normal_cdf( 0, 1, 1.96 ) ; """
+ qt_test_14 """ select normal_cdf( nullable(0), 1, 1.96 ) ; """
+ qt_test_15 """ select normal_cdf( nullable(0), nullable(1), 1.96 ) ; """
+ qt_test_16 """ select normal_cdf( nullable(0), NULL , 1.96 ) ; """
+ qt_test_17 """ select normal_cdf( nullable(0), NULL , 1.96 ) ; """
+ qt_test_18 """ select normal_cdf( 0, 1 , NULL ) ; """
+ qt_test_19 """ select normal_cdf( 0, -1,1 ) ; """
+
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]