Skip to content

Commit 8ace61b

Browse files
Merge pull request ClickHouse#86949 from ClickHouse/backport/25.8/86365
Backport ClickHouse#86365 to 25.8: Fix cast from LowCardinality(Nullable(T)) to Dynamic
2 parents 4fff84d + 75c513c commit 8ace61b

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

src/Functions/FunctionsConversion.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5559,16 +5559,16 @@ class FunctionCast final : public IFunctionBase
55595559
}
55605560
}
55615561

5562-
MutableColumnPtr variant_column;
5562+
ColumnPtr variant_column;
55635563
/// If there were no NULLs, we can just clone the column.
5564+
/// We use cloneWithDefaultOnNull to make the dictionary not-nullable in the result column.
55645565
if (variant_size_hint == col_lc.size())
5565-
variant_column = IColumn::mutate(column);
5566+
variant_column = col_lc.cloneWithDefaultOnNull();
55665567
/// Otherwise we should filter column.
55675568
else
5568-
variant_column = IColumn::mutate(column->filter(filter, variant_size_hint));
5569+
variant_column = assert_cast<const ColumnLowCardinality &>(*column->filter(filter, variant_size_hint)).cloneWithDefaultOnNull();
55695570

5570-
assert_cast<ColumnLowCardinality &>(*variant_column).nestedRemoveNullable();
5571-
return createVariantFromDescriptorsAndOneNonEmptyVariant(variant_types, std::move(discriminators), std::move(variant_column), variant_discr);
5571+
return createVariantFromDescriptorsAndOneNonEmptyVariant(variant_types, std::move(discriminators), variant_column, variant_discr);
55725572
}
55735573
else
55745574
{
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
SET allow_suspicious_low_cardinality_types = 1, allow_experimental_dynamic_type = 1;
2+
3+
DROP TABLE IF EXISTS t0;
4+
DROP TABLE IF EXISTS t1;
5+
CREATE TABLE t0 (c0 Dynamic) ENGINE = MergeTree() ORDER BY tuple();
6+
CREATE TABLE t1 (c0 LowCardinality(Nullable(Int))) ENGINE = MergeTree() ORDER BY tuple() SETTINGS min_bytes_for_wide_part = 0;
7+
8+
INSERT INTO TABLE t0 (c0) VALUES (1::LowCardinality(Int));
9+
INSERT INTO TABLE t1 (c0) VALUES (1);
10+
11+
SELECT 1 FROM t0 JOIN t1 ON t0.c0 = t1.c0;
12+
13+
DROP TABLE t0;
14+
DROP TABLE t1;
15+

0 commit comments

Comments
 (0)