From 83aeb573a99acb4bc85047852a5ea35281447cfb Mon Sep 17 00:00:00 2001 From: amory Date: Wed, 16 Aug 2023 20:47:36 +0800 Subject: [PATCH] [Improve](complex-type) update for array/map element_at with nested complex type with local tvf (#22927) --- be/src/vec/columns/column_array.cpp | 1 + be/src/vec/columns/column_map.cpp | 1 + .../functions/array/function_array_element.h | 42 ++ gensrc/script/doris_builtins_functions.py | 19 +- .../table_valued_function/t.orc | Bin 0 -> 34739 bytes .../table_valued_function/t.parquet | Bin 0 -> 37374 bytes ...local_tvf_with_complex_type_element_at.out | 385 ++++++++++++++++++ ...al_tvf_with_complex_type_element_at.groovy | 120 ++++++ 8 files changed, 550 insertions(+), 18 deletions(-) create mode 100644 regression-test/data/correctness_p0/table_valued_function/t.orc create mode 100644 regression-test/data/correctness_p0/table_valued_function/t.parquet create mode 100644 regression-test/data/correctness_p0/table_valued_function/test_local_tvf_with_complex_type_element_at.out create mode 100644 regression-test/suites/external_table_p0/tvf/test_local_tvf_with_complex_type_element_at.groovy diff --git a/be/src/vec/columns/column_array.cpp b/be/src/vec/columns/column_array.cpp index 94ec98c1045f1b..7922b692b9b306 100644 --- a/be/src/vec/columns/column_array.cpp +++ b/be/src/vec/columns/column_array.cpp @@ -381,6 +381,7 @@ void ColumnArray::insert(const Field& x) { } void ColumnArray::insert_from(const IColumn& src_, size_t n) { + DCHECK(n < src_.size()); const ColumnArray& src = assert_cast(src_); size_t size = src.size_at(n); size_t offset = src.offset_at(n); diff --git a/be/src/vec/columns/column_map.cpp b/be/src/vec/columns/column_map.cpp index ac7c5da1a93f3d..7597131ccadffa 100644 --- a/be/src/vec/columns/column_map.cpp +++ b/be/src/vec/columns/column_map.cpp @@ -169,6 +169,7 @@ void ColumnMap::pop_back(size_t n) { } void ColumnMap::insert_from(const IColumn& src_, size_t n) { + DCHECK(n < src_.size()); const ColumnMap& src = assert_cast(src_); size_t size = src.size_at(n); size_t offset = src.offset_at(n); diff --git a/be/src/vec/functions/array/function_array_element.h b/be/src/vec/functions/array/function_array_element.h index 6b4b26fdbb3106..c6cc27fbaf047c 100644 --- a/be/src/vec/functions/array/function_array_element.h +++ b/be/src/vec/functions/array/function_array_element.h @@ -35,6 +35,7 @@ #include "vec/columns/column_map.h" #include "vec/columns/column_nullable.h" #include "vec/columns/column_string.h" +#include "vec/columns/column_struct.h" #include "vec/columns/column_vector.h" #include "vec/columns/columns_number.h" #include "vec/core/block.h" @@ -283,6 +284,44 @@ class FunctionArrayElement : public IFunction { return _execute_nullable(args, input_rows_count, src_null_map, dst_null_map); } + ColumnPtr _execute_common(const ColumnArray::Offsets64& offsets, const IColumn& nested_column, + const UInt8* arr_null_map, const IColumn& indices, + const UInt8* nested_null_map, UInt8* dst_null_map) { + // prepare return data + auto dst_column = nested_column.clone_empty(); + dst_column->reserve(offsets.size()); + + // process + for (size_t row = 0; row < offsets.size(); ++row) { + size_t off = offsets[row - 1]; + size_t len = offsets[row] - off; + auto index = indices.get_int(row); + // array is nullable + bool null_flag = bool(arr_null_map && arr_null_map[row]); + // calc index in nested column + if (!null_flag && index > 0 && index <= len) { + index += off - 1; + } else if (!null_flag && index < 0 && -index <= len) { + index += off + len; + } else { + null_flag = true; + } + // nested column nullable check + if (!null_flag && nested_null_map && nested_null_map[index]) { + null_flag = true; + } + // actual data copy + if (!null_flag) { + dst_null_map[row] = false; + dst_column->insert_from(nested_column, index); + } else { + dst_null_map[row] = true; + dst_column->insert_default(); + } + } + return dst_column; + } + ColumnPtr _execute_nullable(const ColumnsWithTypeAndName& arguments, size_t input_rows_count, const UInt8* src_null_map, UInt8* dst_null_map) { // check array nested column type and get data @@ -356,6 +395,9 @@ class FunctionArrayElement : public IFunction { } else if (check_column(*nested_column)) { res = _execute_string(offsets, *nested_column, src_null_map, *idx_col, nested_null_map, dst_null_map); + } else { + res = _execute_common(offsets, *nested_column, src_null_map, *idx_col, nested_null_map, + dst_null_map); } return res; diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 8b0df0f76c084a..95926678b4715b 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -112,24 +112,7 @@ [['array'], 'ARRAY', ['VARCHAR', '...'], 'ALWAYS_NOT_NULLABLE'], [['array'], 'ARRAY', ['STRING', '...'], 'ALWAYS_NOT_NULLABLE'], - [['element_at', '%element_extract%'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'TINYINT', ['ARRAY_TINYINT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'SMALLINT', ['ARRAY_SMALLINT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'INT', ['ARRAY_INT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'LARGEINT', ['ARRAY_LARGEINT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DATETIME', ['ARRAY_DATETIME', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DATE', ['ARRAY_DATE', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DATEV2', ['ARRAY_DATEV2', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'FLOAT', ['ARRAY_FLOAT', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DOUBLE', ['ARRAY_DOUBLE', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DECIMAL32', ['ARRAY_DECIMAL32', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DECIMAL64', ['ARRAY_DECIMAL64', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'DECIMAL128', ['ARRAY_DECIMAL128', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'VARCHAR', ['ARRAY_VARCHAR', 'BIGINT'], 'ALWAYS_NULLABLE'], - [['element_at', '%element_extract%'], 'STRING', ['ARRAY_STRING', 'BIGINT'], 'ALWAYS_NULLABLE'], + [['element_at', '%element_extract%'], 'T', ['ARRAY', 'BIGINT'], 'ALWAYS_NULLABLE', ['T']], [['arrays_overlap'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'], 'ALWAYS_NULLABLE'], [['arrays_overlap'], 'BOOLEAN', ['ARRAY_TINYINT', 'ARRAY_TINYINT'], 'ALWAYS_NULLABLE'], diff --git a/regression-test/data/correctness_p0/table_valued_function/t.orc b/regression-test/data/correctness_p0/table_valued_function/t.orc new file mode 100644 index 0000000000000000000000000000000000000000..d75b0cd1c68d764478a5a840cdff85574be74dbb GIT binary patch literal 34739 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 literal 0 HcmV?d00001 diff --git a/regression-test/data/correctness_p0/table_valued_function/t.parquet b/regression-test/data/correctness_p0/table_valued_function/t.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d5d19a1358ab45ac7d5ad8d92906075a71260b56 GIT binary patch literal 37374 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

@+$~LpdL-NBK8$;g6PcY~_P;{$<7wM|nf`)0-sC zZjyqSC?xh*A1^icm_p9~_CX=jTF?Uze}8I4R?>|pk~Tk)f`=PQ_fPfW9xdI)iw|{e?a|yH0$Lnkaa^JZm4g}KYuFi-bP8ajg!7_oPwwSX?uS4hob#1{f46a zt_P$0EN_uCZb(w~;FS4a(dGILY5YIZDIYD@xSPngd2DQ^wWh1IVS4>j(XKQ~x{{pq zPWu!@Ktskorb|v9)8yf}dt6ctrTBH|A;G1oN#_|Uh}O_E{wXN!(PG?MiM-J~m|w+@ zEyk~%dpo zZOiimzxmgNd^Dp6BRe+1RXmY`hz)({@ynFIUIaZ-%%s|n znkKRE+Dz`_@mmKNyas%F4v2k)4hZ<11MoTO3z>rh{GP}FmpN!K8G?r7(QSu!50-e% z-3NAW7&zVgcemJ~d>iOK@TKA1-3AvOWH;gVuaDW?L9^BD#|?ML=`6dq)Vn}!nH{`Ff`9W&$aLun)JZYv@cdE7yR-5rp_hz0{j z{>9CIU?v9rKQ*%<3O+g-%ztQL?3?=6o2Y6t5{})<{C{EigSKmEq`$Ak2cZvQ{kg^Q zdGVko9+v69tjY(I)WanH%U<)!|6wE2v-V>f@xN)N2levbJlx&n3DJH3?^^Y*+xx$) zNV+(W9Xfxs@L}~n((N9U=dlCrVF4aHl>V>S{-A^Xp8KB> table = sql """ select * from backends(); """ + assertTrue(table.size() > 0) + def be_id = table[0][0] + def dataFilePath = context.config.dataPath + "/external_table_p0/tvf/" + + /** + * here is file schema + * var schema = StructType( + StructField("id", IntegerType, true) :: + StructField("arr_arr", ArrayType(ArrayType(StringType), true), true):: + StructField("arr_map", ArrayType(MapType(StringType, DateType)), true) :: + StructField("arr_struct", ArrayType(StructType(StructField("vin", StringType, true)::StructField("charge_id", IntegerType, true)::Nil))) :: + StructField("map_map", MapType(StringType, MapType(StringType, DoubleType)), true):: + StructField("map_arr", MapType(IntegerType, ArrayType(DoubleType)), true):: + StructField("map_struct", MapType(TimestampType, StructType(StructField("vin", StringType, true)::StructField("charge_id", IntegerType, true)::StructField("start_time", DoubleType, true)::Nil), true)):: + StructField("struct_arr_map", StructType(StructField("aa", ArrayType(StringType), true)::StructField("mm", MapType(DateType, StringType), true)::Nil)):: + Nil + ) + */ + + qt_sql """ + select * from local( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ + select count(*) from local( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ select arr_arr[1][1] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ select arr_map[1] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + qt_sql """ select arr_map[1]["WdTnFb-LHW8Nel-laB-HCQA"] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ select map_map["W1iF16-DE1gzJx-avC-Mrf6"]["HJVQSC-46l3xm7-J6c-moIH"] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ select map_arr[1] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + qt_sql """ select map_arr[1][7] from local ( + "file_path" = "${dataFilePath}/t.orc", + "backend_id" = "${be_id}", + "format" = "orc");""" + + qt_sql """ + select * from local( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet"); """ + + qt_sql """ + select count(*) from local( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet"); """ + + + qt_sql """ select arr_arr[1][1] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" + + qt_sql """ select arr_map[1] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" + qt_sql """ select arr_map[1]["WdTnFb-LHW8Nel-laB-HCQA"] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" + + qt_sql """ select map_map["W1iF16-DE1gzJx-avC-Mrf6"]["HJVQSC-46l3xm7-J6c-moIH"] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" + + qt_sql """ select map_arr[1] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" + qt_sql """ select map_arr[1][7] from local ( + "file_path" = "${dataFilePath}/t.parquet", + "backend_id" = "${be_id}", + "format" = "parquet");""" +}