From e243969519781def3321583a1376e1de623bbeb0 Mon Sep 17 00:00:00 2001 From: Andrey Zvonov <32552679+zvonand@users.noreply.github.com> Date: Fri, 10 Jul 2026 20:25:14 +0200 Subject: [PATCH] Merge pull request #1994 from Altinity/backport/25.8/93814 Backport of #93814 to 25.8: Fix logical error in `Map` column types when used with empty tuple --- src/Functions/array/array.cpp | 3 +- .../03786_empty_tuple_map_array.reference | 4 ++ .../03786_empty_tuple_map_array.sql | 43 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/03786_empty_tuple_map_array.reference create mode 100644 tests/queries/0_stateless/03786_empty_tuple_map_array.sql diff --git a/src/Functions/array/array.cpp b/src/Functions/array/array.cpp index 715ee70bf9b8..15b75c5f7bbf 100644 --- a/src/Functions/array/array.cpp +++ b/src/Functions/array/array.cpp @@ -253,7 +253,8 @@ class FunctionArray : public IFunction const size_t tuple_size = concrete_out_data->tupleSize(); if (tuple_size == 0) { - out_data.insertManyDefaults(columns.size()); + /// Tuple() has no subcolumns to fill. Create `columns.size()` elements per row to match array offsets + out_data.insertManyDefaults(columns.size() * input_rows_count); } else { diff --git a/tests/queries/0_stateless/03786_empty_tuple_map_array.reference b/tests/queries/0_stateless/03786_empty_tuple_map_array.reference new file mode 100644 index 000000000000..590860f31966 --- /dev/null +++ b/tests/queries/0_stateless/03786_empty_tuple_map_array.reference @@ -0,0 +1,4 @@ +{((),1):1,((),1):1} +{((),1):1,((),1):1} +{} +{((),1):1,((),1):1} diff --git a/tests/queries/0_stateless/03786_empty_tuple_map_array.sql b/tests/queries/0_stateless/03786_empty_tuple_map_array.sql new file mode 100644 index 000000000000..5d6cce952c96 --- /dev/null +++ b/tests/queries/0_stateless/03786_empty_tuple_map_array.sql @@ -0,0 +1,43 @@ +DROP TABLE IF EXISTS t0; + +CREATE TABLE t0 (c0 Map(Tuple(Tuple(), Int), Int)) +ENGINE = MergeTree() +ORDER BY tuple(); + +INSERT INTO TABLE t0 (c0) +VALUES +( + map( + ((), 1), 1, + ((), 1), 1 + ) +), +( + map( + ((), 1), 1, + ((), 1), 1 + ) +); + +SELECT * FROM t0; + + +DROP TABLE IF EXISTS t1; + +CREATE TABLE t1 (c0 Map(Tuple(Tuple(), Int), Int)) +ENGINE = MergeTree() +ORDER BY tuple(); + +INSERT INTO TABLE t1 (c0) +VALUES +( + map() +), +( + map( + ((), 1), 1, + ((), 1), 1 + ) +); + +SELECT * FROM t1;