From ee4d5d758f19e101e726e19025deac97e8389492 Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 21 Nov 2023 12:15:12 +0000 Subject: [PATCH] Fix Nullptr dereference in partial merge join with joined_subquery_requires_alias = 0 --- src/Interpreters/MergeJoin.cpp | 4 +-- .../02918_join_pm_lc_crash.reference | 12 +++++++ .../0_stateless/02918_join_pm_lc_crash.sql | 31 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 tests/queries/0_stateless/02918_join_pm_lc_crash.reference create mode 100644 tests/queries/0_stateless/02918_join_pm_lc_crash.sql diff --git a/src/Interpreters/MergeJoin.cpp b/src/Interpreters/MergeJoin.cpp index e14cb544b102..30c62386ca36 100644 --- a/src/Interpreters/MergeJoin.cpp +++ b/src/Interpreters/MergeJoin.cpp @@ -530,16 +530,16 @@ MergeJoin::MergeJoin(std::shared_ptr table_join_, const Block & right addConditionJoinColumn(right_sample_block, JoinTableSide::Right); JoinCommon::splitAdditionalColumns(key_names_right, right_sample_block, right_table_keys, right_columns_to_add); + const NameSet required_right_keys = table_join->requiredRightKeys(); for (const auto & right_key : key_names_right) { - if (right_sample_block.getByName(right_key).type->lowCardinality()) + if (required_right_keys.contains(right_key) && right_table_keys.getByName(right_key).type->lowCardinality()) lowcard_right_keys.push_back(right_key); } JoinCommon::convertToFullColumnsInplace(right_table_keys); JoinCommon::convertToFullColumnsInplace(right_sample_block, key_names_right); - const NameSet required_right_keys = table_join->requiredRightKeys(); for (const auto & column : right_table_keys) if (required_right_keys.contains(column.name)) right_columns_to_add.insert(ColumnWithTypeAndName{nullptr, column.type, column.name}); diff --git a/tests/queries/0_stateless/02918_join_pm_lc_crash.reference b/tests/queries/0_stateless/02918_join_pm_lc_crash.reference new file mode 100644 index 000000000000..7523f1c1774c --- /dev/null +++ b/tests/queries/0_stateless/02918_join_pm_lc_crash.reference @@ -0,0 +1,12 @@ +0 + +0 +0 + +0 +0 + +\N +0 + +\N diff --git a/tests/queries/0_stateless/02918_join_pm_lc_crash.sql b/tests/queries/0_stateless/02918_join_pm_lc_crash.sql new file mode 100644 index 000000000000..123208ee981a --- /dev/null +++ b/tests/queries/0_stateless/02918_join_pm_lc_crash.sql @@ -0,0 +1,31 @@ + +SET joined_subquery_requires_alias = 0, join_algorithm = 'partial_merge'; + +SET allow_experimental_analyzer = 0, join_use_nulls = 0; + +SELECT * FROM (SELECT dummy AS val FROM system.one) +JOIN (SELECT toLowCardinality(toNullable(dummy)) AS val +FROM system.one GROUP BY val WITH TOTALS) +USING (val); + +SET allow_experimental_analyzer = 0, join_use_nulls = 1; + +SELECT * FROM (SELECT dummy AS val FROM system.one) +JOIN (SELECT toLowCardinality(toNullable(dummy)) AS val +FROM system.one GROUP BY val WITH TOTALS) +USING (val); + +SET allow_experimental_analyzer = 1, join_use_nulls = 0; + +SELECT * FROM (SELECT dummy AS val FROM system.one) +JOIN (SELECT toLowCardinality(toNullable(dummy)) AS val +FROM system.one GROUP BY val WITH TOTALS) +USING (val); + +SET allow_experimental_analyzer = 1, join_use_nulls = 1; + +SELECT * FROM (SELECT dummy AS val FROM system.one) +JOIN (SELECT toLowCardinality(toNullable(dummy)) AS val +FROM system.one GROUP BY val WITH TOTALS) +USING (val); +