Skip to content

Commit

Permalink
Merge pull request ClickHouse#57048 from ClickHouse/vdimir/pmj_crash_…
Browse files Browse the repository at this point in the history
…57016

Fix Nullptr dereference in partial merge join with joined_subquery_re…
  • Loading branch information
alexey-milovidov authored Nov 22, 2023
2 parents d0653f2 + ee4d5d7 commit 3463d9a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/Interpreters/MergeJoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -530,16 +530,16 @@ MergeJoin::MergeJoin(std::shared_ptr<TableJoin> 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});
Expand Down
12 changes: 12 additions & 0 deletions tests/queries/0_stateless/02918_join_pm_lc_crash.reference
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
0

0
0

0
0

\N
0

\N
31 changes: 31 additions & 0 deletions tests/queries/0_stateless/02918_join_pm_lc_crash.sql
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 3463d9a

Please sign in to comment.