diff --git a/be/src/vec/functions/date_time_transforms.h b/be/src/vec/functions/date_time_transforms.h index 84824d74ff1208..73155afae3a996 100644 --- a/be/src/vec/functions/date_time_transforms.h +++ b/be/src/vec/functions/date_time_transforms.h @@ -157,6 +157,29 @@ struct DayNameImpl { } }; +template +struct ToIso8601Impl { + using OpArgType = ArgType; + static constexpr auto name = "to_iso8601"; + static constexpr auto max_size = std::is_same_v ? 10 : 26; + + static inline auto execute(const typename DateTraits::T& dt, + ColumnString::Chars& res_data, size_t& offset) { + auto length = dt.to_buffer((char*)res_data.data() + offset, + std::is_same_v ? -1 : 6); + if (std::is_same_v) { + res_data[offset + 10] = 'T'; + } + + offset += length; + return offset; + } + + static DataTypes get_variadic_argument_types() { + return {std::make_shared::DateType>()}; + } +}; + template 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 b8f1c3206632c5..8c3fd755a0f4f4 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 using FunctionDateTimeV2DayName = FunctionDateOrDateTimeToString>; using FunctionDateTimeV2MonthName = FunctionDateOrDateTimeToString>; +using FunctionDateIso8601 = FunctionDateOrDateTimeToString>; +using FunctionDateTimeIso8601 = FunctionDateOrDateTimeToString>; + void register_function_date_time_to_string(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); @@ -40,6 +43,8 @@ void register_function_date_time_to_string(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); + factory.register_function(); + factory.register_function(); } } // namespace doris::vectorized diff --git a/be/src/vec/functions/function_timestamp.cpp b/be/src/vec/functions/function_timestamp.cpp index 1edb014e99a9ee..428f8c2893fc57 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(), std::make_shared()}; } @@ -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) { @@ -409,6 +413,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(), std::make_shared()}; } @@ -1150,7 +1156,7 @@ class FunctionOtherTypesToDateType : public IFunction { 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(); } @@ -1182,6 +1188,240 @@ class FunctionOtherTypesToDateType : public IFunction { } }; +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()}; } + + static DataTypePtr get_return_type_impl(const DataTypes& arguments) { + return make_nullable(std::make_shared()); + } + + 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, 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 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*>(&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) && + ts_value.template set_time_unit(month) && + ts_value.template set_time_unit(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) && + ts_value.template set_time_unit(month))) [[unlikely]] { + null_map->get_data().data()[i] = true; + } + ts_value.template unchecked_set_time_unit(1); + } 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)) [[unlikely]] { + null_map->get_data().data()[i] = true; + } + ts_value.template unchecked_set_time_unit(1); + ts_value.template unchecked_set_time_unit(1); + + } 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); + ts_value.template unchecked_set_time_unit( + first_day_of_week.year().operator int()); + ts_value.template unchecked_set_time_unit( + first_day_of_week.month().operator unsigned int()); + ts_value.template unchecked_set_time_unit( + first_day_of_week.day().operator unsigned int()); + + auto day_diff = (week - 1) * 7 + weekday - 1; + TimeInterval interval(DAY, day_diff, false); + ts_value.date_add_interval(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; + } + } + ts_value.template unchecked_set_time_unit(year); + ts_value.template unchecked_set_time_unit(1); + ts_value.template unchecked_set_time_unit(1); + TimeInterval interval(DAY, day_of_year - 1, false); + ts_value.template date_add_interval(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(first_day_of_week)}; + } +}; + using FunctionStrToDate = FunctionOtherTypesToDateType>; using FunctionStrToDatetime = FunctionOtherTypesToDateType>; using FunctionStrToDateV2 = FunctionOtherTypesToDateType>; @@ -1191,6 +1431,7 @@ using FunctionDateTruncDate = FunctionOtherTypesToDateType>; using FunctionDateTruncDatetime = FunctionOtherTypesToDateType>; using FunctionDateTruncDatetimeV2 = FunctionOtherTypesToDateType>; +using FunctionFromIso8601DateV2 = FunctionOtherTypesToDateType; void register_function_timestamp(SimpleFunctionFactory& factory) { factory.register_function(); @@ -1203,6 +1444,7 @@ void register_function_timestamp(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); + factory.register_function(); factory.register_function>(); factory.register_function>>(); diff --git a/be/src/vec/functions/math.cpp b/be/src/vec/functions/math.cpp index af2e68ec9822c8..2d9faaf19bc492 100644 --- a/be/src/vec/functions/math.cpp +++ b/be/src/vec/functions/math.cpp @@ -350,6 +350,79 @@ struct PowName { }; using FunctionPow = FunctionBinaryArithmetic; +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(); } + + DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { + return make_nullable(std::make_shared()); + } + + DataTypes get_variadic_argument_types_impl() const override { + return {std::make_shared(), std::make_shared(), + std::make_shared()}; + } + 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(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(*argument_columns[i]).get_data_column_ptr(); + } + } + + auto* mean_col = assert_cast(argument_columns[0].get()); + auto* sd_col = assert_cast(argument_columns[1].get()); + auto* value_col = assert_cast(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) { @@ -386,5 +459,6 @@ void register_function_math(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); + factory.register_function(); } } // 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 ddcd559758742a..58c367fe86829c 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 @@ -179,6 +179,7 @@ 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; @@ -315,6 +316,7 @@ 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; @@ -424,6 +426,7 @@ 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; @@ -630,6 +633,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"), @@ -781,6 +785,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"), @@ -895,6 +900,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 00000000000000..e0e3e41548a479 --- /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 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 getSignatures() { + return SIGNATURES; + } + + /** + * withChildren. + */ + @Override + public FromIso8601Date withChildren(List children) { + Preconditions.checkArgument(children.size() == 1); + return new FromIso8601Date(children.get(0)); + } + + @Override + public R accept(ExpressionVisitor 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 00000000000000..c68e610679c52d --- /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 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 getSignatures() { + return SIGNATURES; + } + + /** + * withChildren. + */ + @Override + public NormalCdf withChildren(List children) { + Preconditions.checkArgument(children.size() == 3); + return new NormalCdf(children.get(0), children.get(1), children.get(2)); + } + + @Override + public R accept(ExpressionVisitor 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 00000000000000..d676157977d284 --- /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 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 getSignatures() { + return SIGNATURES; + } + + /** + * withChildren. + */ + @Override + public ToIso8601 withChildren(List children) { + Preconditions.checkArgument(children.size() == 1); + return new ToIso8601(children.get(0)); + } + + @Override + public R accept(ExpressionVisitor 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 b0ef71c0e949da..5ae78a8e351b49 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 @@ -187,6 +187,7 @@ 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; @@ -315,6 +316,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.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; @@ -421,6 +423,7 @@ 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; @@ -1167,6 +1170,10 @@ default R visitFromDays(FromDays fromDays, C context) { 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); } @@ -1615,6 +1622,10 @@ default R visitNgramSearch(NgramSearch ngramSearch, C context) { 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); } @@ -2031,6 +2042,10 @@ default R visitToIpv6OrNull(ToIpv6OrNull toIpv6OrNull, C context) { 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 00000000000000..43a4f0bd496c38 --- /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 00000000000000..358249891a132b --- /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 00000000000000..7b500151a9ac79 --- /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 00000000000000..52c7bb0da34cca --- /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 00000000000000..0fc795e348e800 --- /dev/null +++ b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_to_iso8601.groovy @@ -0,0 +1,148 @@ +// 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));""" + + 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); """ + + +} \ No newline at end of file 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 00000000000000..8fcd7b0d23d7cd --- /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 ) ; """ + + +}