Skip to content

Commit 889afac

Browse files
Backport ClickHouse#83118 to 25.6: Do not use unrelated parts of a shared dictionary in the lowCardinalityKeys function
1 parent 356ccf0 commit 889afac

File tree

4 files changed

+26
-8
lines changed

4 files changed

+26
-8
lines changed

src/Functions/lowCardinalityKeys.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,12 @@ class FunctionLowCardinalityKeys: public IFunction
4141
return type->getDictionaryType();
4242
}
4343

44-
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
44+
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
4545
{
4646
const auto & arg = arguments[0];
4747
const auto * low_cardinality_column = typeid_cast<const ColumnLowCardinality *>(arg.column.get());
48-
return low_cardinality_column->getDictionary().getNestedColumn()->cloneResized(arg.column->size());
48+
/// In the case of a shared dictionary, we want only dictionary keys that correspond to this block:
49+
return low_cardinality_column->cutAndCompact(0, input_rows_count)->getDictionary().getNestedColumn()->cloneResized(arg.column->size());
4950
}
5051
};
5152

tests/queries/0_stateless/00688_low_cardinality_serialization.reference

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
NativeReader
22
LowCardinality(String) 123_a 2
3-
LowCardinality(String) 123_bb 3 123_
4-
LowCardinality(String) 123_ 1 123_a
5-
LowCardinality(String) 123_a 2 123_bb
3+
LowCardinality(String) 123_bb 3 123_a
4+
LowCardinality(String) 123_ 1 123_bb
5+
LowCardinality(String) 123_a 2 123_
66
LowCardinality(String) 123_ccc 4 123_ccc
77
LowCardinality(String) 123_a 2 123_dddd
88
LowCardinality(String) 123_bb 3
@@ -11,9 +11,9 @@ LowCardinality(String) 123_dddd 5
1111
-
1212
LowCardinality(Nullable(String)) 123_a 3 \N
1313
LowCardinality(Nullable(String)) \N 0
14-
LowCardinality(Nullable(String)) 123_bb 4 123_
15-
LowCardinality(Nullable(String)) 123_ 2 123_a
16-
LowCardinality(Nullable(String)) 123_a 3 123_bb
14+
LowCardinality(Nullable(String)) 123_bb 4 123_a
15+
LowCardinality(Nullable(String)) 123_ 2 123_bb
16+
LowCardinality(Nullable(String)) 123_a 3 123_
1717
LowCardinality(Nullable(String)) \N 0 123_ccc
1818
LowCardinality(Nullable(String)) 123_ccc 5 123_dddd
1919
LowCardinality(Nullable(String)) 123_a 3 \N
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
ok
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
DROP TABLE IF EXISTS test;
2+
3+
CREATE TABLE test
4+
(
5+
s LowCardinality(String),
6+
client_name String,
7+
) ENGINE = MergeTree ORDER BY ();
8+
9+
INSERT INTO test
10+
SELECT number < 8000 ? 'ok' : 'fail' AS s,
11+
number < 8000 ? 'client1' : 'client2' FROM numbers(20000);
12+
13+
SELECT DISTINCT lowCardinalityKeys(s) FROM test PREWHERE client_name = 'client1' ORDER BY ALL;
14+
15+
DROP TABLE test;

0 commit comments

Comments
 (0)