From 009359d0ae941af2506dd6109509f26f725bca55 Mon Sep 17 00:00:00 2001 From: Vladimir Cherkasov Date: Mon, 25 Nov 2024 09:18:46 +0000 Subject: [PATCH 1/3] Merge pull request #72226 from ClickHouse/vdimir/fix72174 Fix assert failure in SimpleSquashingChunksTransform --- src/Interpreters/Squashing.cpp | 10 ++++++++++ ...74_squashing_transform_sparse_bug.reference | 0 .../03274_squashing_transform_sparse_bug.sql | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference create mode 100644 tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql diff --git a/src/Interpreters/Squashing.cpp b/src/Interpreters/Squashing.cpp index c656a1a797b0..63d44459fae8 100644 --- a/src/Interpreters/Squashing.cpp +++ b/src/Interpreters/Squashing.cpp @@ -139,6 +139,16 @@ Chunk Squashing::squash(std::vector && input_chunks, Chunk::ChunkInfoColl { auto columns = input_chunks[i].detachColumns(); for (size_t j = 0; j != num_columns; ++j) + { + /// IColumn::structureEquals is not implemented for deprecated object type, ignore it and always convert to non-sparse. + bool has_object_deprecated = columns[j]->getDataType() == TypeIndex::ObjectDeprecated || + mutable_columns[j]->getDataType() == TypeIndex::ObjectDeprecated; + auto has_object_deprecated_lambda = [&has_object_deprecated](const auto & subcolumn) + { + has_object_deprecated = has_object_deprecated || subcolumn.getDataType() == TypeIndex::ObjectDeprecated; + }; + columns[j]->forEachSubcolumnRecursively(has_object_deprecated_lambda); + mutable_columns[j]->forEachSubcolumnRecursively(has_object_deprecated_lambda); source_columns_list[j].emplace_back(std::move(columns[j])); } diff --git a/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference b/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql b/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql new file mode 100644 index 000000000000..4ea6dcc80e25 --- /dev/null +++ b/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql @@ -0,0 +1,18 @@ + +DROP TABLE IF EXISTS t0; +DROP TABLE IF EXISTS t1; + +SET max_insert_block_size = 1; +SET min_insert_block_size_rows = 1; +SET min_insert_block_size_bytes = 1; + +CREATE TABLE t0 (x UInt64, y Tuple(UInt64, UInt64) ) ENGINE = MergeTree ORDER BY x SETTINGS ratio_of_defaults_for_sparse_serialization = 0.5; +SYSTEM STOP MERGES t0; +INSERT INTO t0 SELECT if(number % 2 = 0, 0, number) as x, (x, 0) from numbers(200) SETTINGS max_block_size = 1; + +CREATE TABLE t1 (x UInt64, y Tuple(UInt64, UInt64) ) ENGINE = MergeTree ORDER BY x; + +SET min_joined_block_size_bytes = 100; + +SET join_algorithm = 'parallel_hash'; +SELECT sum(ignore(*)) FROM t0 a FULL JOIN t1 b ON a.x = b.x FORMAT Null; From b97c11ff7a44126c31512fdeaeadb4bc5ef6c1a9 Mon Sep 17 00:00:00 2001 From: Andrey Zvonov Date: Fri, 13 Feb 2026 12:35:56 +0100 Subject: [PATCH 2/3] fix typo --- src/Interpreters/Squashing.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Interpreters/Squashing.cpp b/src/Interpreters/Squashing.cpp index 63d44459fae8..f705fa2c455b 100644 --- a/src/Interpreters/Squashing.cpp +++ b/src/Interpreters/Squashing.cpp @@ -150,6 +150,7 @@ Chunk Squashing::squash(std::vector && input_chunks, Chunk::ChunkInfoColl columns[j]->forEachSubcolumnRecursively(has_object_deprecated_lambda); mutable_columns[j]->forEachSubcolumnRecursively(has_object_deprecated_lambda); source_columns_list[j].emplace_back(std::move(columns[j])); + } } for (size_t i = 0; i != num_columns; ++i) From 3b179cb761a827c59fc50d314ee08f15bfc7871a Mon Sep 17 00:00:00 2001 From: Andrey Zvonov Date: Sat, 14 Feb 2026 16:37:51 +0100 Subject: [PATCH 3/3] remove test --- ...74_squashing_transform_sparse_bug.reference | 0 .../03274_squashing_transform_sparse_bug.sql | 18 ------------------ 2 files changed, 18 deletions(-) delete mode 100644 tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference delete mode 100644 tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql diff --git a/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference b/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.reference deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql b/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql deleted file mode 100644 index 4ea6dcc80e25..000000000000 --- a/tests/queries/0_stateless/03274_squashing_transform_sparse_bug.sql +++ /dev/null @@ -1,18 +0,0 @@ - -DROP TABLE IF EXISTS t0; -DROP TABLE IF EXISTS t1; - -SET max_insert_block_size = 1; -SET min_insert_block_size_rows = 1; -SET min_insert_block_size_bytes = 1; - -CREATE TABLE t0 (x UInt64, y Tuple(UInt64, UInt64) ) ENGINE = MergeTree ORDER BY x SETTINGS ratio_of_defaults_for_sparse_serialization = 0.5; -SYSTEM STOP MERGES t0; -INSERT INTO t0 SELECT if(number % 2 = 0, 0, number) as x, (x, 0) from numbers(200) SETTINGS max_block_size = 1; - -CREATE TABLE t1 (x UInt64, y Tuple(UInt64, UInt64) ) ENGINE = MergeTree ORDER BY x; - -SET min_joined_block_size_bytes = 100; - -SET join_algorithm = 'parallel_hash'; -SELECT sum(ignore(*)) FROM t0 a FULL JOIN t1 b ON a.x = b.x FORMAT Null;