From 41947c73eb5fee54ff5258acb4a757538ac6990c Mon Sep 17 00:00:00 2001 From: abmdocrt Date: Wed, 8 Feb 2023 12:51:07 +0800 Subject: [PATCH] [Feature](array-function) Support array functions for nested type datev2 and datetimev2 (#16382) --- .../aggregate_function_collect.cpp | 4 + be/src/vec/data_types/data_type_time_v2.cpp | 23 ++ be/src/vec/data_types/data_type_time_v2.h | 2 + .../functions/array/function_array_distinct.h | 6 + .../functions/array/function_array_element.h | 9 + .../functions/array/function_array_index.h | 17 ++ .../vec/functions/array/function_array_join.h | 6 + .../functions/array/function_array_remove.h | 18 +- .../vec/functions/array/function_array_set.h | 2 + .../vec/functions/array/function_array_sort.h | 6 + .../functions/array/function_arrays_overlap.h | 8 + .../doris/analysis/FunctionCallExpr.java | 64 +++-- gensrc/script/doris_builtins_functions.py | 10 + .../test_array_aggregation_functions.out | 28 +- .../array_functions/test_array_functions.out | 259 +++++++++++++++++- .../test_array_functions_by_literal.out | 96 +++++++ .../test_cast_string_to_array.out | 6 + .../test_array_aggregation_functions.groovy | 16 +- .../test_array_functions.groovy | 48 +++- .../test_array_functions_by_literal.groovy | 34 ++- .../test_cast_string_to_array.groovy | 6 + 21 files changed, 607 insertions(+), 61 deletions(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_collect.cpp b/be/src/vec/aggregate_functions/aggregate_function_collect.cpp index b0e713c87f..c1937cc06e 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_collect.cpp +++ b/be/src/vec/aggregate_functions/aggregate_function_collect.cpp @@ -76,6 +76,10 @@ AggregateFunctionPtr create_aggregate_function_collect(const std::string& name, return create_agg_function_collect(distinct, argument_types); } else if (type.is_date_time()) { return create_agg_function_collect(distinct, argument_types); + } else if (type.is_date_v2()) { + return create_agg_function_collect(distinct, argument_types); + } else if (type.is_date_time_v2()) { + return create_agg_function_collect(distinct, argument_types); } else if (type.is_string()) { return create_agg_function_collect(distinct, argument_types); } diff --git a/be/src/vec/data_types/data_type_time_v2.cpp b/be/src/vec/data_types/data_type_time_v2.cpp index ed52721ee7..a6405e1d5b 100644 --- a/be/src/vec/data_types/data_type_time_v2.cpp +++ b/be/src/vec/data_types/data_type_time_v2.cpp @@ -19,6 +19,7 @@ #include "util/binary_cast.hpp" #include "vec/columns/columns_number.h" +#include "vec/io/io_helper.h" #include "vec/runtime/vdatetime_value.h" namespace doris::vectorized { @@ -48,6 +49,17 @@ void DataTypeDateV2::to_string(const IColumn& column, size_t row_num, BufferWrit ostr.write(buf, pos - buf - 1); } +Status DataTypeDateV2::from_string(ReadBuffer& rb, IColumn* column) const { + auto* column_data = static_cast(column); + UInt32 val = 0; + if (!read_date_v2_text_impl(val, rb)) { + return Status::InvalidArgument("parse date fail, string: '{}'", + std::string(rb.position(), rb.count()).c_str()); + } + column_data->insert_value(val); + return Status::OK(); +} + MutableColumnPtr DataTypeDateV2::create_column() const { return DataTypeNumberBase::create_column(); } @@ -110,6 +122,17 @@ void DataTypeDateTimeV2::to_string(const IColumn& column, size_t row_num, ostr.write(buf, pos - buf - 1); } +Status DataTypeDateTimeV2::from_string(ReadBuffer& rb, IColumn* column) const { + auto* column_data = static_cast(column); + UInt64 val = 0; + if (!read_datetime_v2_text_impl(val, rb)) { + return Status::InvalidArgument("parse date fail, string: '{}'", + std::string(rb.position(), rb.count()).c_str()); + } + column_data->insert_value(val); + return Status::OK(); +} + MutableColumnPtr DataTypeDateTimeV2::create_column() const { return DataTypeNumberBase::create_column(); } diff --git a/be/src/vec/data_types/data_type_time_v2.h b/be/src/vec/data_types/data_type_time_v2.h index 236e0887ba..11ecaf91b8 100644 --- a/be/src/vec/data_types/data_type_time_v2.h +++ b/be/src/vec/data_types/data_type_time_v2.h @@ -37,6 +37,7 @@ public: bool equals(const IDataType& rhs) const override; std::string to_string(const IColumn& column, size_t row_num) const override; void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override; + Status from_string(ReadBuffer& rb, IColumn* column) const override; MutableColumnPtr create_column() const override; @@ -74,6 +75,7 @@ public: bool equals(const IDataType& rhs) const override; std::string to_string(const IColumn& column, size_t row_num) const override; void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override; + Status from_string(ReadBuffer& rb, IColumn* column) const override; MutableColumnPtr create_column() const override; diff --git a/be/src/vec/functions/array/function_array_distinct.h b/be/src/vec/functions/array/function_array_distinct.h index 40e369e4ab..e19368d6df 100644 --- a/be/src/vec/functions/array/function_array_distinct.h +++ b/be/src/vec/functions/array/function_array_distinct.h @@ -259,6 +259,12 @@ private: } else if (which.is_date_time()) { res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, src_null_map, dest_null_map); + } else if (which.is_date_v2()) { + res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, + src_null_map, dest_null_map); + } else if (which.is_date_time_v2()) { + res = _execute_number(src_column, src_offsets, dest_column, + dest_offsets, src_null_map, dest_null_map); } else if (which.is_decimal128()) { res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, src_null_map, dest_null_map); diff --git a/be/src/vec/functions/array/function_array_element.h b/be/src/vec/functions/array/function_array_element.h index 6722e09e9c..1a68c68827 100644 --- a/be/src/vec/functions/array/function_array_element.h +++ b/be/src/vec/functions/array/function_array_element.h @@ -21,6 +21,7 @@ #include +#include "vec/columns/column.h" #include "vec/columns/column_array.h" #include "vec/columns/column_const.h" #include "vec/columns/column_string.h" @@ -203,6 +204,14 @@ private: res = _execute_number(offsets, *nested_column, src_null_map, *arguments[1].column, nested_null_map, dst_null_map); + } else if (check_column(nested_column)) { + res = _execute_number(offsets, *nested_column, src_null_map, + *arguments[1].column, nested_null_map, + dst_null_map); + } else if (check_column(nested_column)) { + res = _execute_number(offsets, *nested_column, src_null_map, + *arguments[1].column, nested_null_map, + dst_null_map); } else if (check_column(*nested_column)) { res = _execute_number(offsets, *nested_column, src_null_map, *arguments[1].column, nested_null_map, dst_null_map); diff --git a/be/src/vec/functions/array/function_array_index.h b/be/src/vec/functions/array/function_array_index.h index bce8eb2caf..d8d9dbe4b5 100644 --- a/be/src/vec/functions/array/function_array_index.h +++ b/be/src/vec/functions/array/function_array_index.h @@ -21,6 +21,7 @@ #include +#include "vec/columns/column.h" #include "vec/columns/column_array.h" #include "vec/columns/column_string.h" #include "vec/data_types/data_type_array.h" @@ -233,6 +234,14 @@ private: return _execute_number( offsets, nested_null_map, nested_column, right_column, right_nested_null_map, outer_null_map); + } else if (check_column(right_column)) { + return _execute_number( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); + } else if (check_column(right_column)) { + return _execute_number( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column(right_column)) { return _execute_number( offsets, nested_null_map, nested_column, right_column, right_nested_null_map, @@ -337,6 +346,14 @@ private: return_column = _execute_number_expanded( offsets, nested_null_map, *nested_column, *right_column, right_nested_null_map, array_null_map); + } else if (check_column(*nested_column)) { + return_column = _execute_number_expanded( + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); + } else if (check_column(*nested_column)) { + return_column = _execute_number_expanded( + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } } diff --git a/be/src/vec/functions/array/function_array_join.h b/be/src/vec/functions/array/function_array_join.h index 6524507490..05b69901cc 100644 --- a/be/src/vec/functions/array/function_array_join.h +++ b/be/src/vec/functions/array/function_array_join.h @@ -235,6 +235,12 @@ private: } else if (which.is_date_time()) { res = _execute_number(src_column, src_offsets, src_null_map, sep_str, null_replace_str, nested_type, dest_column_ptr); + } else if (which.is_date_v2()) { + res = _execute_number(src_column, src_offsets, src_null_map, sep_str, + null_replace_str, nested_type, dest_column_ptr); + } else if (which.is_date_time_v2()) { + res = _execute_number(src_column, src_offsets, src_null_map, sep_str, + null_replace_str, nested_type, dest_column_ptr); } else if (which.is_decimal128()) { res = _execute_number(src_column, src_offsets, src_null_map, sep_str, null_replace_str, nested_type, dest_column_ptr); diff --git a/be/src/vec/functions/array/function_array_remove.h b/be/src/vec/functions/array/function_array_remove.h index 6565102fb7..cb8ef46a0a 100644 --- a/be/src/vec/functions/array/function_array_remove.h +++ b/be/src/vec/functions/array/function_array_remove.h @@ -17,8 +17,10 @@ #pragma once +#include "vec/columns/column.h" #include "vec/columns/column_array.h" #include "vec/columns/column_const.h" +#include "vec/data_types/data_type.h" #include "vec/data_types/data_type_array.h" #include "vec/data_types/data_type_number.h" #include "vec/functions/function.h" @@ -245,6 +247,12 @@ private: } else if (right_column.is_datetime_type()) { return _execute_number(offsets, nested_column, right_column, nested_null_map); + } else if (check_column(right_column)) { + return _execute_number(offsets, nested_column, + right_column, nested_null_map); + } else if (check_column(right_column)) { + return _execute_number( + offsets, nested_column, right_column, nested_null_map); } else if (check_column(right_column)) { return _execute_number(offsets, nested_column, right_column, nested_null_map); @@ -330,8 +338,16 @@ private: res = _execute_number_expanded(offsets, *nested_column, *right_column, nested_null_map); } + } else if (is_date_v2_or_datetime_v2(right_type) && + is_date_v2_or_datetime_v2(left_element_type)) { + if (check_column(*nested_column)) { + res = _execute_number_expanded(offsets, *nested_column, *right_column, + nested_null_map); + } else if (check_column(*nested_column)) { + res = _execute_number_expanded(offsets, *nested_column, + *right_column, nested_null_map); + } } - return res; } }; diff --git a/be/src/vec/functions/array/function_array_set.h b/be/src/vec/functions/array/function_array_set.h index df311131df..aeb895e07d 100644 --- a/be/src/vec/functions/array/function_array_set.h +++ b/be/src/vec/functions/array/function_array_set.h @@ -161,6 +161,8 @@ public: if (_execute_internal(dst, left_data, right_data) || _execute_internal(dst, left_data, right_data) || _execute_internal(dst, left_data, right_data) || + _execute_internal(dst, left_data, right_data) || + _execute_internal(dst, left_data, right_data) || _execute_internal(dst, left_data, right_data) || _execute_internal(dst, left_data, right_data) || _execute_internal(dst, left_data, right_data) || diff --git a/be/src/vec/functions/array/function_array_sort.h b/be/src/vec/functions/array/function_array_sort.h index 2637e31429..5b1b78fed0 100644 --- a/be/src/vec/functions/array/function_array_sort.h +++ b/be/src/vec/functions/array/function_array_sort.h @@ -270,6 +270,12 @@ private: } else if (which.is_date_time()) { res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, src_null_map, dest_null_map); + } else if (which.is_date_v2()) { + res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, + src_null_map, dest_null_map); + } else if (which.is_date_time_v2()) { + res = _execute_number(src_column, src_offsets, dest_column, + dest_offsets, src_null_map, dest_null_map); } else if (which.is_decimal128()) { res = _execute_number(src_column, src_offsets, dest_column, dest_offsets, src_null_map, dest_null_map); diff --git a/be/src/vec/functions/array/function_arrays_overlap.h b/be/src/vec/functions/array/function_arrays_overlap.h index 72a33e4240..21eb10e24e 100644 --- a/be/src/vec/functions/array/function_arrays_overlap.h +++ b/be/src/vec/functions/array/function_arrays_overlap.h @@ -140,6 +140,14 @@ public: ret = _execute_internal(left_exec_data, right_exec_data, dst_null_map_data, dst_nested_col->get_data().data()); + } else if (check_column(left_exec_data.nested_col)) { + ret = _execute_internal(left_exec_data, right_exec_data, + dst_null_map_data, + dst_nested_col->get_data().data()); + } else if (check_column(left_exec_data.nested_col)) { + ret = _execute_internal(left_exec_data, right_exec_data, + dst_null_map_data, + dst_nested_col->get_data().data()); } else if (left_exec_data.nested_col->is_numeric()) { if (check_column(*left_exec_data.nested_col)) { ret = _execute_internal(left_exec_data, right_exec_data, diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 3632c3577a..f4d6ea358c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -120,6 +120,19 @@ public class FunctionCallExpr extends Expr { return returnType; } }; + java.util.function.BiFunction, Type, Type> arrayDateTimeV2OrDecimalV3Rule + = (children, returnType) -> { + Preconditions.checkArgument(children != null && children.size() > 0); + if (children.get(0).getType().isArrayType() && ( + ((ArrayType) children.get(0).getType()).getItemType().isDecimalV3() + || ((ArrayType) children.get(0) + .getType()).getItemType().isDecimalV2() || ((ArrayType) children.get(0) + .getType()).getItemType().isDatetimeV2())) { + return ((ArrayType) children.get(0).getType()).getItemType(); + } else { + return returnType; + } + }; PRECISION_INFER_RULE = new HashMap<>(); PRECISION_INFER_RULE.put("sum", sumRule); PRECISION_INFER_RULE.put("multi_distinct_sum", sumRule); @@ -150,29 +163,10 @@ public class FunctionCallExpr extends Expr { } }); - PRECISION_INFER_RULE.put("array_min", (children, returnType) -> { - Preconditions.checkArgument(children != null && children.size() > 0); - if (children.get(0).getType().isArrayType() && ( - ((ArrayType) children.get(0).getType()).getItemType().isDecimalV3() || ((ArrayType) children.get(0) - .getType()).getItemType().isDecimalV2() || ((ArrayType) children.get(0) - .getType()).getItemType().isDatetimeV2())) { - return ((ArrayType) children.get(0).getType()).getItemType(); - } else { - return returnType; - } - }); - - PRECISION_INFER_RULE.put("array_max", (children, returnType) -> { - Preconditions.checkArgument(children != null && children.size() > 0); - if (children.get(0).getType().isArrayType() && ( - ((ArrayType) children.get(0).getType()).getItemType().isDecimalV3() || ((ArrayType) children.get(0) - .getType()).getItemType().isDecimalV2() || ((ArrayType) children.get(0) - .getType()).getItemType().isDatetimeV2())) { - return ((ArrayType) children.get(0).getType()).getItemType(); - } else { - return returnType; - } - }); + PRECISION_INFER_RULE.put("array_min", arrayDateTimeV2OrDecimalV3Rule); + PRECISION_INFER_RULE.put("array_max", arrayDateTimeV2OrDecimalV3Rule); + PRECISION_INFER_RULE.put("element_at", arrayDateTimeV2OrDecimalV3Rule); + PRECISION_INFER_RULE.put("%element_extract%", arrayDateTimeV2OrDecimalV3Rule); PRECISION_INFER_RULE.put("round", roundRule); PRECISION_INFER_RULE.put("round_bankers", roundRule); @@ -1372,7 +1366,7 @@ public class FunctionCallExpr extends Expr { || children.get(0).getType().isDatetimeV2() && args[ix].isDatetimeV2())) { continue; } else if ((fnName.getFunction().equalsIgnoreCase("array_min") || fnName.getFunction() - .equalsIgnoreCase("array_max")) + .equalsIgnoreCase("array_max") || fnName.getFunction().equalsIgnoreCase("element_at")) && (( children.get(0).getType().isDecimalV3() && ((ArrayType) args[ix]).getItemType() .isDecimalV3()) @@ -1460,6 +1454,28 @@ public class FunctionCallExpr extends Expr { if (children.size() > 0) { this.type = new ArrayType(children.get(0).getType()); } + } else if (fnName.getFunction().equalsIgnoreCase("if")) { + if (children.get(1).getType().isArrayType() && ( + ((ArrayType) children.get(1).getType()).getItemType().isDecimalV3() + || ((ArrayType) children.get(1) + .getType()).getItemType().isDecimalV2() || ((ArrayType) children.get(1) + .getType()).getItemType().isDatetimeV2())) { + this.type = children.get(1).getType(); + } + } else if (fnName.getFunction().equalsIgnoreCase("array_distinct") || fnName.getFunction() + .equalsIgnoreCase("array_remove") || fnName.getFunction().equalsIgnoreCase("array_sort") + || fnName.getFunction().equalsIgnoreCase("array_overlap") + || fnName.getFunction().equalsIgnoreCase("array_union") + || fnName.getFunction().equalsIgnoreCase("array_intersect") + || fnName.getFunction().equalsIgnoreCase("array_compact") + || fnName.getFunction().equalsIgnoreCase("array_slice") + || fnName.getFunction().equalsIgnoreCase("array_popback") + || fnName.getFunction().equalsIgnoreCase("reverse") + || fnName.getFunction().equalsIgnoreCase("%element_slice%") + || fnName.getFunction().equalsIgnoreCase("array_except")) { + if (children.size() > 0) { + this.type = children.get(0).getType(); + } } if (this.type instanceof ArrayType) { diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 5222b6ce8d..fd6a47529e 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -456,6 +456,8 @@ visible_functions = [ [['array_slice', '%element_slice%'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DATETIME', ['ARRAY_DATETIME', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DATE', ['ARRAY_DATE', 'BIGINT'], ''], + [['array_slice', '%element_slice%'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT'], ''], + [['array_slice', '%element_slice%'], 'ARRAY_DATEV2', ['ARRAY_DATEV2', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_FLOAT', ['ARRAY_FLOAT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT'], ''], @@ -473,6 +475,8 @@ visible_functions = [ [['array_slice', '%element_slice%'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'BIGINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DATETIME', ['ARRAY_DATETIME', 'BIGINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DATE', ['ARRAY_DATE', 'BIGINT', 'BIGINT'], ''], + [['array_slice', '%element_slice%'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT', 'BIGINT'], ''], + [['array_slice', '%element_slice%'], 'ARRAY_DATEV2', ['ARRAY_DATEV2', 'BIGINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_FLOAT', ['ARRAY_FLOAT', 'BIGINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE', 'BIGINT', 'BIGINT'], ''], [['array_slice', '%element_slice%'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT', 'BIGINT'], ''], @@ -490,6 +494,8 @@ visible_functions = [ [['array_popback'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT'], ''], [['array_popback'], 'ARRAY_DATETIME', ['ARRAY_DATETIME'], ''], [['array_popback'], 'ARRAY_DATE', ['ARRAY_DATE'], ''], + [['array_popback'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2'], ''], + [['array_popback'], 'ARRAY_DATEV2', ['ARRAY_DATEV2'], ''], [['array_popback'], 'ARRAY_FLOAT', ['ARRAY_FLOAT'], ''], [['array_popback'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE'], ''], [['array_popback'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''], @@ -507,6 +513,8 @@ visible_functions = [ [['array_with_constant'], 'ARRAY_LARGEINT', ['BIGINT', 'LARGEINT'], 'ALWAYS_NOT_NULLABLE'], [['array_with_constant'], 'ARRAY_DATETIME', ['BIGINT', 'DATETIME'], 'ALWAYS_NOT_NULLABLE'], [['array_with_constant'], 'ARRAY_DATE', ['BIGINT', 'DATE'], 'ALWAYS_NOT_NULLABLE'], + [['array_with_constant'], 'ARRAY_DATETIMEV2', ['BIGINT', 'DATETIMEV2'], 'ALWAYS_NOT_NULLABLE'], + [['array_with_constant'], 'ARRAY_DATEV2', ['BIGINT', 'DATEV2'], 'ALWAYS_NOT_NULLABLE'], [['array_with_constant'], 'ARRAY_FLOAT', ['BIGINT', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'], [['array_with_constant'], 'ARRAY_DOUBLE', ['BIGINT', 'DOUBLE'], 'ALWAYS_NOT_NULLABLE'], [['array_with_constant'], 'ARRAY_DECIMALV2', ['BIGINT', 'DECIMALV2'], 'ALWAYS_NOT_NULLABLE'], @@ -531,6 +539,8 @@ visible_functions = [ [['reverse'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT'], ''], [['reverse'], 'ARRAY_DATETIME', ['ARRAY_DATETIME'], ''], [['reverse'], 'ARRAY_DATE', ['ARRAY_DATE'], ''], + [['reverse'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2'], ''], + [['reverse'], 'ARRAY_DATEV2', ['ARRAY_DATEV2'], ''], [['reverse'], 'ARRAY_FLOAT', ['ARRAY_FLOAT'], ''], [['reverse'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE'], ''], [['reverse'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''], diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out index 6424664700..c0a773048f 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out @@ -1,31 +1,31 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !select -- -1 1 100 1000 2147483648 9223372036854775808 0 1.0 100.0001 2022-08-31 2022-08-31T12:00 -2 1 \N \N \N \N \N 127.0 4.023 \N \N -3 -1 -32768 -2147483647 -9223372036854775808 -117341182548128045443221445 -9.999999 -1.0 -128.0001 \N \N -4 \N \N \N \N \N \N \N \N \N \N +1 1 100 1000 2147483648 9223372036854775808 0E-9 1.0 100.0001 2022-08-31 2022-08-31T12:00 2022-08-31 2022-08-31T12:00:00.999 +2 1 \N \N \N \N \N 127.0 4.023 \N \N \N \N +3 -1 -32768 -2147483647 -9223372036854775808 -117341182548128045443221445 -9.999999000 -1.0 -128.0001 \N \N \N \N +4 \N \N \N \N \N \N \N \N \N \N \N \N -- !select -- -1 3 101 1001 2147483649 9223372036854775808 9.999999 1.5 100.0005 2022-10-15 2022-10-15T10:30 -2 3 \N \N \N \N \N 128.1 4.023 \N \N -3 1 -32767 -50000 0 170141183460469231731687303715884105727 9.999999 1.0 127.0001 \N \N -4 \N \N \N \N \N \N \N \N \N \N +1 3 101 1001 2147483649 9223372036854775808 9.999999000 1.5 100.0005 2022-10-15 2022-10-15T10:30 2022-10-15 2022-10-15T10:30:00.999 +2 3 \N \N \N \N \N 128.1 4.023 \N \N \N \N +3 1 -32767 -50000 0 170141183460469231731687303715884105727 9.999999000 1.0 127.0001 \N \N \N \N +4 \N \N \N \N \N \N \N \N \N \N \N \N -- !select -- -1 2.0 100.5 1000.5 2.1474836485E9 9.223372036854776E18 4.9999995 1.25 100.00030000000001 +1 2.0 100.5 1000.5 2.1474836485E9 9.223372036854776E18 4.999999500 1.25 100.00030000000001 2 2.0 \N \N \N \N \N 127.55000305175781 4.023 -3 0.0 -32767.5 -1.0737668235E9 -4.6116860184273879E18 8.5070591730175945E37 0 0.0 -0.5 +3 0.0 -32767.5 -1.0737668235E9 -4.6116860184273879E18 8.5070591730175945E37 0E-9 0.0 -0.5 4 \N \N \N \N \N \N \N \N -- !select -- -1 6 201 2001 4294967297 9223372036854775808 9.999999 2.5 200.00060000000002 +1 6 201 2001 4294967297 9223372036854775808 9.999999000 2.5 200.00060000000002 2 12 \N \N \N \N \N 255.10000610351562 4.023 -3 0 -65535 -2147533647 -9223372036854775808 170141183460351890549139175670440884282 0 0.0 -1.0 +3 0 -65535 -2147533647 -9223372036854775808 170141183460351890549139175670440884282 0E-9 0.0 -1.0 4 \N \N \N \N \N \N \N \N -- !select -- -1 6.0 10100.0 1001000.0 4.6116860205748716E18 9.223372036854776E18 0 1.5 10000.06000005 +1 6.0 10100.0 1001000.0 4.6116860205748716E18 9.223372036854776E18 0E-9 1.5 10000.06000005 2 36.0 \N \N \N \N \N 16268.700775146484 4.023 -3 -0.0 1.073709056E9 1.0737418235E14 -0.0 -1.9964567667389465E64 -7766259631453241920 -0.0 -16256.02550001 +3 -0.0 1.073709056E9 1.0737418235E14 -0.0 -1.9964567667389465E64 -99.999980000 -0.0 -16256.02550001 4 \N \N \N \N \N \N \N \N diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out index 22a42eb4cf..0aa8122714 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out @@ -32,6 +32,28 @@ 8 \N 9 true +-- !select -- +1 true +2 true +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 true +2 true +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [1, 2, 3] ['a', 'b', ''] 2 [4] \N @@ -43,6 +65,17 @@ 8 [1, 2, 3, 4, NULL] ['a', 'b'] 9 [1, 2, 3] ['a', 'b', ''] +-- !select -- +1 [2023-02-05, 2023-02-06] [2022-10-15 10:30:00.999, 2022-08-31 12:00:00.999] +2 [2023-01-05, 2023-01-06] [2022-11-15 10:30:00.999, 2022-01-31 12:00:00.999] +3 \N \N +4 \N \N +5 \N \N +6 \N \N +7 \N \N +8 \N \N +9 \N \N + -- !select -- [2, 3] 1 [4] 2 @@ -54,6 +87,28 @@ [1, 2, 3, 3, 4, 4, NULL] 8 [1, 2, 3] 9 +-- !select -- +[2023-02-06] +[2023-01-05, 2023-01-06] +\N +\N +\N +\N +\N +\N +\N + +-- !select -- +[2022-08-31 12:00:00.999] +[2022-11-15 10:30:00.999, 2022-01-31 12:00:00.999] +\N +\N +\N +\N +\N +\N +\N + -- !select -- 1 [1, 2, 3] ['', 'a', 'b'] [1, 2] 2 [4] \N [5] @@ -65,6 +120,17 @@ 8 [NULL, 1, 2, 3, 3, 4, 4] ['a', 'b', 'b', 'b'] [1, 2, 2, 3] 9 [1, 2, 3] ['', 'a', 'b'] [1, 2] +-- !select -- +1 [2023-02-05, 2023-02-06] [2022-08-31 12:00:00.999, 2022-10-15 10:30:00.999] +2 [2023-01-05, 2023-01-06] [2022-01-31 12:00:00.999, 2022-11-15 10:30:00.999] +3 \N \N +4 \N \N +5 \N \N +6 \N \N +7 \N \N +8 \N \N +9 \N \N + -- !select -- 1 [1, 2, 3] 2 [4, 5] @@ -76,6 +142,28 @@ 8 [1, 2, 3, 4, NULL] 9 [1, 2, 3] +-- !select -- +1 [2023-02-05, 2023-02-06, 2023-02-07] +2 [2023-01-05, 2023-01-06, 2023-01-07] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [2022-10-15 10:30:00.999, 2022-08-31 12:00:00.999, 2022-10-16 10:30:00.999] +2 [2022-11-15 10:30:00.999, 2022-01-31 12:00:00.999, 2022-11-16 10:30:00.999] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [3] 2 [4] @@ -87,6 +175,28 @@ 8 [4, NULL] 9 [3] +-- !select -- +1 [2023-02-05] +2 [2023-01-05] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [2022-10-15 10:30:00.999] +2 [2022-11-15 10:30:00.999] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [1, 2] 2 [] @@ -98,6 +208,28 @@ 8 [1, 2, 3] 9 [1, 2] +-- !select -- +1 [2023-02-06] +2 [2023-01-06] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [2022-08-31 12:00:00.999] +2 [2022-01-31 12:00:00.999] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [2, 3] 2 [] @@ -120,6 +252,28 @@ 8 [1, 2] 9 [1, 2] +-- !select -- +1 [2023-02-05, 2023-02-06] +2 [2023-01-05, 2023-01-06] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [2022-10-15 10:30:00.999, 2022-08-31 12:00:00.999] +2 [2022-11-15 10:30:00.999, 2022-01-31 12:00:00.999] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [3, 2, 1] ['', 'b', 'a'] [2, 1] 2 [4] \N [5] @@ -131,6 +285,17 @@ 8 [NULL, 4, 4, 3, 3, 2, 1] ['b', 'b', 'b', 'a'] [3, 2, 2, 1] 9 [3, 2, 1] ['', 'b', 'a'] [2, 1] +-- !select -- +1 [2023-02-06, 2023-02-05] [2022-08-31 12:00:00.999, 2022-10-15 10:30:00.999] +2 [2023-01-06, 2023-01-05] [2022-01-31 12:00:00.999, 2022-11-15 10:30:00.999] +3 \N \N +4 \N \N +5 \N \N +6 \N \N +7 \N \N +8 \N \N +9 \N \N + -- !select -- 1 1_2_3 a-b- 2 4 \N @@ -219,6 +384,28 @@ 8 false 9 false +-- !select -- +1 true +2 false +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 true +2 false +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [1, 2, 3] 2 [1] @@ -263,6 +450,28 @@ 8 [1] 9 [1, 2] +-- !select -- +1 [1, 2] +2 [1, 2] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [1, 2] +2 [1, 2] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [1, 2] 2 [] @@ -307,6 +516,28 @@ 8 [] 9 [2015-03-13 12:36:38] +-- !select -- +1 [2023-02-05] +2 [2023-01-05] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 [2022-10-15 10:30:00.999] +2 [2022-11-15 10:30:00.999] +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- 1 [1, 1, 1] 2 [2, 2, 2] @@ -461,6 +692,28 @@ 8 0 9 0 +-- !select -- +1 1 +2 0 +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + +-- !select -- +1 1 +2 0 +3 \N +4 \N +5 \N +6 \N +7 \N +8 \N +9 \N + -- !select -- \N \N -1 \N @@ -593,11 +846,11 @@ 1 [2023-01-19 18:11:11.111, 2023-01-19 18:22:22.222, 2023-01-19 18:33:33.333] [2023-01-19 18:22:22.222, 2023-01-19 18:33:33.333, 2023-01-19 18:44:44.444] [2023-01-19 18:11:11.111111, 2023-01-19 18:22:22.222222, 2023-01-19 18:33:33.333333] -- !select_array_datetimev2_2 -- -[2023-01-19 18:11:11, 2023-01-19 18:22:22, 2023-01-19 18:33:33] +[2023-01-19 18:11:11.111, 2023-01-19 18:22:22.222, 2023-01-19 18:33:33.333] -- !select_array_datetimev2_3 -- -[2023-01-19 18:22:22, 2023-01-19 18:33:33, 2023-01-19 18:44:44] +[2023-01-19 18:22:22.222, 2023-01-19 18:33:33.333, 2023-01-19 18:44:44.444] -- !select_array_datetimev2_4 -- -[2023-01-19 18:11:11, 2023-01-19 18:22:22, 2023-01-19 18:33:33] +[2023-01-19 18:11:11.111, 2023-01-19 18:22:22.222, 2023-01-19 18:33:33.333] diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out index 01ec14bfdf..2384f7bec7 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out @@ -26,6 +26,12 @@ false -- !sql -- false +-- !sql -- +true + +-- !sql -- +true + -- !sql -- 1 @@ -71,6 +77,12 @@ false -- !sql -- 1 +-- !sql -- +2 + +-- !sql -- +1 + -- !sql -- 3 @@ -95,6 +107,12 @@ false -- !sql -- \N +-- !sql -- +2023-02-04T22:07:34.999 + +-- !sql -- +2023-02-05 + -- !sql -- 1 @@ -122,6 +140,12 @@ false -- !sql -- [1, 0] +-- !sql -- +2023-02-04T23:07:34.999 + +-- !sql -- +2023-02-05 + -- !sql -- 2.0 @@ -188,6 +212,18 @@ false -- !sql -- -16.344720000 +-- !sql -- +2023-02-04T22:07:34.999 + +-- !sql -- +2023-02-04T23:07:34.999 + +-- !sql -- +2023-02-04 + +-- !sql -- +2023-02-05 + -- !sql -- [1, 2, 3] @@ -215,6 +251,12 @@ false -- !sql -- [1, 0, NULL] +-- !sql -- +[2023-02-04 22:07:34.999, 2023-02-04 23:07:34.999] + +-- !sql -- +[2023-02-04, 2023-02-05] + -- !sql -- [2, 3] @@ -230,6 +272,12 @@ false -- !sql -- [1] +-- !sql -- +[2023-02-04 23:07:34.999] + +-- !sql -- +[2023-02-04] + -- !sql -- [1, 2, 3] @@ -254,6 +302,12 @@ false -- !sql -- [] +-- !sql -- +[2023-02-04 23:07:34.999, 2023-02-06 22:07:34.999] + +-- !sql -- +[2023-02-05, 2023-02-06] + -- !sql -- false @@ -269,6 +323,18 @@ false -- !sql -- false +-- !sql -- +true + +-- !sql -- +false + +-- !sql -- +true + +-- !sql -- +false + -- !sql -- [1, 2, 3, 4] @@ -332,6 +398,24 @@ false -- !sql -- [] +-- !sql -- +[2023-02-06 22:07:34.999, 2023-02-04 23:07:34.999, 2023-02-07 22:07:34.999] + +-- !sql -- +[2023-02-06 22:07:34.999] + +-- !sql -- +[2023-02-04 23:07:34.999] + +-- !sql -- +[2023-02-06, 2023-02-05, 2023-02-07] + +-- !sql -- +[2023-02-06] + +-- !sql -- +[2023-02-05] + -- !sql -- [1] @@ -359,6 +443,12 @@ false -- !sql -- [0, 0] +-- !sql -- +[2023-02-06 22:07:34.999, 2023-02-04 23:07:34.999] + +-- !sql -- +[2023-02-06, 2023-02-05] + -- !sql -- 1_2_3 @@ -425,6 +515,12 @@ _ -- !sql -- ['2015-03-13'] +-- !sql -- +[2023-02-06 22:07:34.999, 2023-02-04 23:07:34.999, 2023-02-07 22:07:34.999, 2023-02-04 23:07:34.999] + +-- !sql -- +[2023-02-06, 2023-02-05, 2023-02-07, 2023-02-05] + -- !sql -- [8, NULL] diff --git a/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out index 90d372c356..60eb0f837f 100644 --- a/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out +++ b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out @@ -14,6 +14,12 @@ -- !sql -- [2022-09-01] +-- !sql -- +[2022-09-01] + +-- !sql -- +[2022-09-01 00:00:00] + -- !sql -- [1, 2, 3, 0, 0, 0] diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy index b48772a07c..fb7839c110 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy @@ -31,7 +31,9 @@ suite("test_array_aggregation_functions") { `a7` array NULL COMMENT "", `a8` array NULL COMMENT "", `a9` array NULL COMMENT "", - `a10` array NULL COMMENT "" + `a10` array NULL COMMENT "", + `a11` array NULL COMMENT "", + `a12` array NULL COMMENT "" ) ENGINE=OLAP DUPLICATE KEY(`k1`) DISTRIBUTED BY HASH(`k1`) BUCKETS 1 @@ -40,13 +42,13 @@ suite("test_array_aggregation_functions") { "storage_format" = "V2" ) """ - sql """ INSERT INTO ${tableName} VALUES(1, [1, 2, 3], [100, 101], [1000, 1001], [2147483648, 2147483649], [9223372036854775808], [0.0, 9.999999], [1.0, 1.5], [100.0001, 100.0005], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00', '2022-08-31 12:00:00', '2022-09-01 09:00:00']) """ - sql """ INSERT INTO ${tableName} VALUES(2, [1, 2, 3, NULL, 3, 2, 1], NULL, NULL, NULL, NULL, NULL, [127, 128.1], [NULL, 4.023], NULL, NULL) """ - sql """ INSERT INTO ${tableName} VALUES(3, [-1, 0, 1], [-32767, -32768], [-50000, -2147483647], [-9223372036854775808, 0], [-117341182548128045443221445, 170141183460469231731687303715884105727], [-9.999999, 9.999999], [-1.0, 0.0, 1.0], [-128.0001, 127.0001], NULL, NULL) """ - sql """ INSERT INTO ${tableName} VALUES(4, [], [], [], [], [], [], [], [], [], NULL) """ + sql """ INSERT INTO ${tableName} VALUES(1, [1, 2, 3], [100, 101], [1000, 1001], [2147483648, 2147483649], [9223372036854775808], [0.0, 9.999999], [1.0, 1.5], [100.0001, 100.0005], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00', '2022-08-31 12:00:00', '2022-09-01 09:00:00'], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999', '2022-09-01 09:00:00.999']) """ + sql """ INSERT INTO ${tableName} VALUES(2, [1, 2, 3, NULL, 3, 2, 1], NULL, NULL, NULL, NULL, NULL, [127, 128.1], [NULL, 4.023], NULL, NULL, NULL, NULL) """ + sql """ INSERT INTO ${tableName} VALUES(3, [-1, 0, 1], [-32767, -32768], [-50000, -2147483647], [-9223372036854775808, 0], [-117341182548128045443221445, 170141183460469231731687303715884105727], [-9.999999, 9.999999], [-1.0, 0.0, 1.0], [-128.0001, 127.0001], NULL, NULL, NULL, NULL) """ + sql """ INSERT INTO ${tableName} VALUES(4, [], [], [], [], [], [], [], [], [], NULL, NULL, NULL) """ - qt_select "SELECT k1, array_min(a1), array_min(a2), array_min(a3), array_min(a4), array_min(a5), array_min(a6), array_min(a7), array_min(a8), array_min(a9), array_min(a10) from ${tableName} order by k1" - qt_select "SELECT k1, array_max(a1), array_max(a2), array_max(a3), array_max(a4), array_max(a5), array_max(a6), array_max(a7), array_max(a8), array_max(a9), array_max(a10) from ${tableName} order by k1" + qt_select "SELECT k1, array_min(a1), array_min(a2), array_min(a3), array_min(a4), array_min(a5), array_min(a6), array_min(a7), array_min(a8), array_min(a9), array_min(a10), array_min(a11), array_min(a12) from ${tableName} order by k1" + qt_select "SELECT k1, array_max(a1), array_max(a2), array_max(a3), array_max(a4), array_max(a5), array_max(a6), array_max(a7), array_max(a8), array_max(a9), array_max(a10), array_max(a11), array_max(a12) from ${tableName} order by k1" qt_select "SELECT k1, array_avg(a1), array_avg(a2), array_avg(a3), array_avg(a4), array_avg(a5), array_avg(a6), array_avg(a7), array_avg(a8) from ${tableName} order by k1" qt_select "SELECT k1, array_sum(a1), array_sum(a2), array_sum(a3), array_sum(a4), array_sum(a5), array_sum(a6), array_sum(a7), array_sum(a8) from ${tableName} order by k1" qt_select "SELECT k1, array_product(a1), array_product(a2), array_product(a3), array_product(a4), array_product(a5), array_product(a6), array_product(a7), array_product(a8) from ${tableName} order by k1" diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy index 096d3245fc..f4edcba8ea 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy @@ -27,7 +27,11 @@ suite("test_array_functions") { `k4` ARRAY NULL COMMENT "", `k5` ARRAY NULL COMMENT "", `k6` ARRAY NULL COMMENT "", - `k7` ARRAY NULL COMMENT "" + `k7` ARRAY NULL COMMENT "", + `k8` ARRAY NULL COMMENT "", + `k9` ARRAY NULL COMMENT "", + `k10` ARRAY NULL COMMENT "", + `k11` ARRAY NULL COMMENT "" ) ENGINE=OLAP DUPLICATE KEY(`k1`) DISTRIBUTED BY HASH(`k1`) BUCKETS 1 @@ -36,28 +40,43 @@ suite("test_array_functions") { "storage_format" = "V2" ) """ - sql """ INSERT INTO ${tableName} VALUES(1,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13"],["2015-03-13 12:36:38"]) """ - sql """ INSERT INTO ${tableName} VALUES(2,[4],NULL,[5],["hi2"],NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(3,[],[],NULL,["hi3"],NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(4,[1,2,3,4,5,4,3,2,1],[],[],NULL,NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(5,[],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(6,[1,2,3,4,5,4,3,2,1],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(7,[8,9,NULL,10,NULL],["f",NULL,"g",NULL,"h"],NULL,NULL,NULL,NULL) """ - sql """ INSERT INTO ${tableName} VALUES(8,[1,2,3,3,4,4,NULL],["a","b","b","b"],[1,2,2,3],["hi","hi","hello"],["2015-03-13"],["2015-03-13 12:36:38"]) """ - sql """ INSERT INTO ${tableName} VALUES(9,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13","2015-03-13","2015-03-14"],["2015-03-13 12:36:38","2015-03-13 12:36:38"]) """ + sql """ INSERT INTO ${tableName} VALUES(1,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13"],["2015-03-13 12:36:38"],["2023-02-05","2023-02-06"],["2023-02-07","2023-02-06"],['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999'],['2022-10-16 10:30:00.999', '2022-08-31 12:00:00.999']) """ + sql """ INSERT INTO ${tableName} VALUES(2,[4],NULL,[5],["hi2"],NULL,NULL,["2023-01-05","2023-01-06"],["2023-01-07","2023-01-06"],['2022-11-15 10:30:00.999', '2022-01-31 12:00:00.999'],['2022-11-16 10:30:00.999', '2022-01-31 12:00:00.999']) """ + sql """ INSERT INTO ${tableName} VALUES(3,[],[],NULL,["hi3"],NULL,NULL,NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(4,[1,2,3,4,5,4,3,2,1],[],[],NULL,NULL,NULL,NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(5,[],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(6,[1,2,3,4,5,4,3,2,1],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(7,[8,9,NULL,10,NULL],["f",NULL,"g",NULL,"h"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(8,[1,2,3,3,4,4,NULL],["a","b","b","b"],[1,2,2,3],["hi","hi","hello"],["2015-03-13"],["2015-03-13 12:36:38"],NULL,NULL,NULL,NULL) """ + sql """ INSERT INTO ${tableName} VALUES(9,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13","2015-03-13","2015-03-14"],["2015-03-13 12:36:38","2015-03-13 12:36:38"],NULL,NULL,NULL,NULL) """ qt_select "SELECT k1, size(k2), size(k3) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, cardinality(k2), cardinality(k3) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, arrays_overlap(k2, k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, arrays_overlap(k8, k9) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, arrays_overlap(k10, k11) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_distinct(k2), array_distinct(k3) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_distinct(k8), array_distinct(k10) FROM ${tableName} ORDER BY k1" qt_select "SELECT array_remove(k2, k1), k1 FROM ${tableName} ORDER BY k1" + qt_select "SELECT array_remove(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1" + qt_select "SELECT array_remove(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_sort(k2), array_sort(k3), array_sort(k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_sort(k8), array_sort(k10) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_union(k2, k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_union(k8, k9) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_union(k10, k11) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_except(k2, k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_except(k8, k9) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_except(k10, k11) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_intersect(k2, k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_intersect(k8, k9) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_intersect(k10, k11) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_slice(k2, 2) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_slice(k2, 1, 2) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_slice(k8, 1, 2) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_slice(k10, 1, 2) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, reverse(k2), reverse(k3), reverse(k4) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, reverse(k8), reverse(k10) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_join(k2, '_', 'null'), array_join(k3, '-', 'null') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k2, 1) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k3, 'a') FROM ${tableName} ORDER BY k1" @@ -66,14 +85,20 @@ suite("test_array_functions") { qt_select "SELECT k1, array_contains(k5, 'hi') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k5, 'hi222') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k6, null) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_enumerate(k2) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_enumerate(k5) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_enumerate(k6) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_enumerate(k7) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_enumerate(k8) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_enumerate(k10) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_popback(k2) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_popback(k5) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_popback(k6) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_popback(k7) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_popback(k8) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_popback(k10) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_with_constant(3, k1) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_with_constant(10, null) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array_with_constant(2, 'a') from ${tableName} ORDER BY k1" @@ -88,6 +113,8 @@ suite("test_array_functions") { qt_select "SELECT k1, array_position(k5, 'hi') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_position(k5, 'hi222') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_position(k6, null) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1" def tableName2 = "tbl_test_array_range" sql """DROP TABLE IF EXISTS ${tableName2}""" @@ -175,7 +202,6 @@ suite("test_array_functions") { ["2023-01-19 18:11:11.111111","2023-01-19 18:22:22.222222","2023-01-19 18:33:33.333333"]) """ qt_select_array_datetimev2_1 "SELECT * FROM ${tableName4}" - // Todo(Yukang-Lian): will fix if function bugs in the future qt_select_array_datetimev2_2 "SELECT if(1,k2,k3) FROM ${tableName4}" qt_select_array_datetimev2_3 "SELECT if(0,k2,k3) FROM ${tableName4}" qt_select_array_datetimev2_4 "SELECT if(0,k2,k4) FROM ${tableName4}" diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy index f60bbaf81a..c7afc7adb4 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy @@ -26,6 +26,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_contains(NULL, 1)" qt_sql "select array_contains(NULL, NULL)" qt_sql "select array_contains([true], false)" + qt_sql "select array_contains(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))" + qt_sql "select array_contains(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))" // array_position function qt_sql "select array_position([1,2,3], 1)" @@ -42,6 +44,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_position([null, '1'], '')" qt_sql "select array_position([''], null)" qt_sql "select array_position([false, NULL, true], true)" + qt_sql "select array_position(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))" + qt_sql "select array_position(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))" // element_at function qt_sql "select element_at([1,2,3], 1)" @@ -53,6 +57,8 @@ suite("test_array_functions_by_literal") { qt_sql "select element_at([1,2,NULL], 2)" qt_sql "select element_at([], -1)" qt_sql "select element_at([true, NULL, false], 2)" + qt_sql "select element_at(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), 1)" + qt_sql "select element_at(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), 2)" // array subscript function qt_sql "select [1,2,3][1]" @@ -64,6 +70,8 @@ suite("test_array_functions_by_literal") { qt_sql "select [1,2,NULL][2]" qt_sql "select [][-1]" qt_sql "select [true, false]" + qt_sql "select (array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))[2]" + qt_sql "select (array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))[2]" // array_aggregation function qt_sql "select array_avg([1,2,3])" @@ -88,6 +96,10 @@ suite("test_array_functions_by_literal") { qt_sql "select array_product([null])" qt_sql "select array_product([1.12, 3.45, 4.23])" qt_sql "select array_product([1.12, 3.45, -4.23])" + qt_sql "select array_min(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_max(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_min(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))" + qt_sql "select array_max(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))" // array_distinct function qt_sql "select array_distinct([1,1,2,2,3,3])" @@ -99,6 +111,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_distinct([])" qt_sql "select array_distinct([null,null])" qt_sql "select array_distinct([1, 0, 0, null])" + qt_sql "select array_distinct(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_distinct(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2),cast ('2023-02-05' as datev2)))" // array_remove function @@ -107,6 +121,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_remove(['a','b','c'], 'a')" qt_sql "select array_remove(['a','b','c',null], 'a')" qt_sql "select array_remove([true, false, false], false)" + qt_sql "select array_remove(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))" + qt_sql "select array_remove(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))" // array_sort function qt_sql "select array_sort([1,2,3])" @@ -117,6 +133,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_sort(['c','b','a'])" qt_sql "select array_sort([true, false, true])" qt_sql "select array_sort([])" + qt_sql "select array_sort(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_sort(array(cast ('2023-02-06' as datev2),cast ('2023-02-05' as datev2)))" // array_overlap function qt_sql "select arrays_overlap([1,2,3], [4,5,6])" @@ -124,6 +142,10 @@ suite("test_array_functions_by_literal") { qt_sql "select arrays_overlap([1,2,3,null], [3,4,5])" qt_sql "select arrays_overlap([true], [false])" qt_sql "select arrays_overlap([], [])" + qt_sql "select arrays_overlap(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select arrays_overlap(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-08 23:07:34.999' as datetimev2(3))))" + qt_sql "select arrays_overlap(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))" + qt_sql "select arrays_overlap(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-08' as datev2)))" // array_binary function qt_sql "select array_union([1,2,3], [2,3,4])" @@ -147,8 +169,14 @@ suite("test_array_functions_by_literal") { qt_sql "select array_union([1], [100000000])" qt_sql "select array_except([1], [100000000])" qt_sql "select array_intersect([1], [100000000])" + qt_sql "select array_union(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_except(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_intersect(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_union(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))" + qt_sql "select array_except(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))" + qt_sql "select array_intersect(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))" - // arrat_slice function + // array_slice function qt_sql "select [1,2,3][1:1]" qt_sql "select [1,2,3][1:3]" qt_sql "select [1,2,3][1:5]" @@ -158,6 +186,8 @@ suite("test_array_functions_by_literal") { qt_sql "select [1,2,3][0:]" qt_sql "select [1,2,3][-5:]" qt_sql "select [true, false, false][2:]" + qt_sql "select (array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))[1:2]" + qt_sql "select (array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)))[1:2]" // array_join function qt_sql "select array_join([1, 2, 3], '_')" @@ -183,6 +213,8 @@ suite("test_array_functions_by_literal") { qt_sql "select array_compact(['a','b','c','c','d'])" qt_sql "select array_compact(['aaa','aaa','bbb','ccc','ccccc',null, null,'dddd'])" qt_sql "select array_compact(['2015-03-13','2015-03-13'])" + qt_sql "select array_compact(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3)), cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))" + qt_sql "select array_compact(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2), cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))" qt_sql "select array(8, null)" qt_sql "select array('a', 1, 2)" diff --git a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy index 311e310065..59d0a90413 100644 --- a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy +++ b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy @@ -31,6 +31,12 @@ suite("test_cast_string_to_array") { // cast string to array qt_sql """ select cast ("[2022-09-01]" as array) """ + // cast string to array + qt_sql """ select cast ("[2022-09-01]" as array) """ + + // cast string to array + qt_sql """ select cast ("[2022-09-01]" as array) """ + // cast empty value qt_sql """ select cast ("[1,2,3,,,]" as array) """ qt_sql """ select cast ("[a,b,c,,,]" as array) """