Skip to content

Commit

Permalink
Fix crash in join on sparse column
Browse files Browse the repository at this point in the history
  • Loading branch information
vdimir committed Aug 18, 2023
1 parent 1822012 commit ae96d32
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 10 deletions.
19 changes: 9 additions & 10 deletions src/Interpreters/JoinUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,11 @@ ColumnPtr emptyNotNullableClone(const ColumnPtr & column)
return column->cloneEmpty();
}

ColumnPtr materializeColumn(const ColumnPtr & column)
{
return recursiveRemoveLowCardinality(recursiveRemoveSparse(column->convertToFullColumnIfConst()));
}

ColumnRawPtrs materializeColumnsInplace(Block & block, const Names & names)
{
ColumnRawPtrs ptrs;
Expand All @@ -311,7 +316,7 @@ ColumnRawPtrs materializeColumnsInplace(Block & block, const Names & names)
for (const auto & column_name : names)
{
auto & column = block.getByName(column_name).column;
column = recursiveRemoveLowCardinality(recursiveRemoveSparse(column->convertToFullColumnIfConst()));
column = materializeColumn(column);
ptrs.push_back(column.get());
}

Expand All @@ -326,12 +331,7 @@ ColumnPtrMap materializeColumnsInplaceMap(const Block & block, const Names & nam
for (const auto & column_name : names)
{
ColumnPtr column = block.getByName(column_name).column;

column = column->convertToFullColumnIfConst();
column = recursiveRemoveLowCardinality(column);
column = recursiveRemoveSparse(column);

ptrs[column_name] = column;
ptrs[column_name] = materializeColumn(column);
}

return ptrs;
Expand All @@ -340,8 +340,7 @@ ColumnPtrMap materializeColumnsInplaceMap(const Block & block, const Names & nam
ColumnPtr materializeColumn(const Block & block, const String & column_name)
{
const auto & src_column = block.getByName(column_name).column;
return recursiveRemoveLowCardinality(
recursiveRemoveSparse(src_column->convertToFullColumnIfConst()));
return materializeColumn(src_column);
}

Columns materializeColumns(const Block & block, const Names & names)
Expand Down Expand Up @@ -539,7 +538,7 @@ JoinMask getColumnAsMask(const Block & block, const String & column_name)
return JoinMask(const_cond->getBool(0), block.rows());
}

ColumnPtr join_condition_col = recursiveRemoveLowCardinality(src_col.column->convertToFullColumnIfConst());
ColumnPtr join_condition_col = materializeColumn(src_col.column);
if (const auto * nullable_col = typeid_cast<const ColumnNullable *>(join_condition_col.get()))
{
if (isNothing(assert_cast<const DataTypeNullable &>(*col_type).getNestedType()))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0 1 0 0
21 changes: 21 additions & 0 deletions tests/queries/0_stateless/02845_join_on_cond_sparse.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

CREATE TABLE t1 ( id UInt32, attr UInt32 ) ENGINE = MergeTree ORDER BY id
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.1;

INSERT INTO t1 VALUES (0, 0);

CREATE TABLE t2 ( id UInt32, attr UInt32 ) ENGINE = MergeTree ORDER BY id
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.1;

INSERT INTO t2 VALUES (0, 0);

SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND t1.attr != 0;

INSERT INTO t1 VALUES (0, 1);

SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND t1.attr != 0;

DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

0 comments on commit ae96d32

Please sign in to comment.