From e7303c12c7494fc585f8ece3abe8ead3033dd759 Mon Sep 17 00:00:00 2001 From: xy720 <22125576+xy720@users.noreply.github.com> Date: Sat, 3 Sep 2022 09:55:56 +0800 Subject: [PATCH] [Enhancement](array-type) Support Floating/Decimal type for array aggregation functions (#12271) --- .../array/function_array_aggregation.cpp | 2 +- gensrc/script/doris_builtins_functions.py | 15 +++++ .../test_array_aggregation_functions.out | 30 ++++++++++ .../test_array_aggregation_functions.groovy | 57 +++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out create mode 100644 regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy diff --git a/be/src/vec/functions/array/function_array_aggregation.cpp b/be/src/vec/functions/array/function_array_aggregation.cpp index 171e9098a4..42351fd7eb 100644 --- a/be/src/vec/functions/array/function_array_aggregation.cpp +++ b/be/src/vec/functions/array/function_array_aggregation.cpp @@ -106,7 +106,7 @@ struct AggregateFunctionImpl { template struct TypeTraits { using ResultType = ArrayAggregateResult; - using AggregateDataType = AggregateFunctionProductData; + using AggregateDataType = AggregateFunctionProductData; using Function = AggregateFunctionProduct; }; }; diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 0ecde878c1..a0660f87f0 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -253,26 +253,41 @@ visible_functions = [ [['array_min'], 'INT', ['ARRAY_INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_min'], 'BIGINT', ['ARRAY_BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_min'], 'LARGEINT', ['ARRAY_LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_min'], 'FLOAT', ['ARRAY_FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_min'], 'DOUBLE', ['ARRAY_DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_min'], 'DECIMALV2',['ARRAY_DECIMALV2'],'', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_max'], 'TINYINT', ['ARRAY_TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_max'], 'SMALLINT', ['ARRAY_SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_max'], 'INT', ['ARRAY_INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_max'], 'BIGINT', ['ARRAY_BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_max'], 'LARGEINT', ['ARRAY_LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_max'], 'FLOAT', ['ARRAY_FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_max'], 'DOUBLE', ['ARRAY_DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_max'], 'DECIMALV2',['ARRAY_DECIMALV2'],'', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_sum'], 'BIGINT', ['ARRAY_TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_sum'], 'BIGINT', ['ARRAY_SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_sum'], 'BIGINT', ['ARRAY_INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_sum'], 'BIGINT', ['ARRAY_BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_sum'], 'LARGEINT', ['ARRAY_LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_sum'], 'DOUBLE', ['ARRAY_FLOAT'], '', '', '','vec', 'ALWAYS_NULLABLE'], + [['array_sum'], 'DOUBLE', ['ARRAY_DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_sum'], 'DECIMALV2',['ARRAY_DECIMALV2'],'', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_avg'], 'DOUBLE', ['ARRAY_TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_avg'], 'DOUBLE', ['ARRAY_SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_avg'], 'DOUBLE', ['ARRAY_INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_avg'], 'DOUBLE', ['ARRAY_BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_avg'], 'DOUBLE', ['ARRAY_LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_avg'], 'DOUBLE', ['ARRAY_FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_avg'], 'DOUBLE', ['ARRAY_DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_avg'], 'DECIMALV2',['ARRAY_DECIMALV2'],'', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_product'], 'DOUBLE', ['ARRAY_TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_product'], 'DOUBLE', ['ARRAY_SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_product'], 'DOUBLE', ['ARRAY_INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_product'], 'DOUBLE', ['ARRAY_BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_product'], 'DOUBLE', ['ARRAY_LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_product'], 'DOUBLE', ['ARRAY_FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_product'], 'DOUBLE', ['ARRAY_DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_product'], 'DECIMALV2',['ARRAY_DECIMALV2'],'', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_remove'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', ''], [['array_remove'], 'ARRAY_TINYINT', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', ''], 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 new file mode 100644 index 0000000000..3564d7eb6e --- /dev/null +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out @@ -0,0 +1,30 @@ +-- 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 100.0001 +2 1 \N \N \N \N \N 127 4.023 +3 -1 -32768 -2147483647 -9223372036854775808 -117341182548128045443221445 -9.999999 -1 -128.0001 +4 \N \N \N \N \N \N \N \N + +-- !select -- +1 3 101 1001 2147483649 9223372036854775808 9.999999 1.5 100.0005 +2 3 \N \N \N \N \N 128.1 4.023 +3 1 -32767 -50000 0 170141183460469231731687303715884105727 9.999999 1 127.0001 +4 \N \N \N \N \N \N \N \N + +-- !select -- +1 2 100.5 1000.5 2147483648.5 9.2233720368547758e+18 4.9999995 1.25 100.00030000000001 +2 2 \N \N \N \N \N 127.55000305175781 4.023 +3 0 -32767.5 -1073766823.5 -4.6116860184273879e+18 8.5070591730175945e+37 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 +2 12 \N \N \N \N \N 255.10000610351562 4.023 +3 0 -65535 -2147533647 -9223372036854775808 170141183460351890549139175670440884282 0 0 -1 +4 \N \N \N \N \N \N \N \N + +-- !select -- +1 6 10100 1001000 4.6116860205748716e+18 9.2233720368547758e+18 0 1.5 10000.06000005 +2 36 \N \N \N \N \N 16268.700775146484 4.023 +3 -0 1073709056 107374182350000 -0 -1.9964567667389465e+64 -7766259631453241920 -0 -16256.02550001 +4 \N \N \N \N \N \N \N \N 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 new file mode 100644 index 0000000000..2a58e1be49 --- /dev/null +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy @@ -0,0 +1,57 @@ +// 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_array_aggregation_functions") { + def tableName = "tbl_test_array_aggregation_functions" + // open enable_array_type + sql "ADMIN SET FRONTEND CONFIG ('enable_array_type' = 'true')" + // array functions only supported in vectorized engine + sql """ set enable_vectorized_engine = true """ + + sql """DROP TABLE IF EXISTS ${tableName}""" + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int(11) NULL COMMENT "", + `a1` array NULL COMMENT "", + `a2` array NULL COMMENT "", + `a3` array NULL COMMENT "", + `a4` array NULL COMMENT "", + `a5` array NULL COMMENT "", + `a6` array NULL COMMENT "", + `a7` array NULL COMMENT "", + `a8` array NULL COMMENT "", + `a9` array NULL COMMENT "", + `a10` array NULL COMMENT "" + ) ENGINE=OLAP + DUPLICATE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "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-08-31', '2022-09-01'], ['2022-08-31', '2022-09-01']) """ + 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) """ + + 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) 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) 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" +}