Skip to content

Commit b7c8d8b

Browse files
Backport ClickHouse#88213 to 25.8: Fix propagation of is_shared flag in ColumnLowCardinality
1 parent c346ce9 commit b7c8d8b

File tree

8 files changed

+26
-22
lines changed

8 files changed

+26
-22
lines changed

src/Columns/ColumnLowCardinality.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ MutableColumnPtr ColumnLowCardinality::cloneResized(size_t size) const
350350
if (size == 0)
351351
unique_ptr = unique_ptr->cloneEmpty();
352352

353-
return ColumnLowCardinality::create(IColumn::mutate(std::move(unique_ptr)), getIndexes().cloneResized(size));
353+
return ColumnLowCardinality::create(IColumn::mutate(std::move(unique_ptr)), getIndexes().cloneResized(size), /*is_shared=*/false);
354354
}
355355

356356
MutableColumnPtr ColumnLowCardinality::cloneNullable() const
@@ -584,7 +584,7 @@ std::vector<MutableColumnPtr> ColumnLowCardinality::scatter(ColumnIndex num_colu
584584
for (auto & column : columns)
585585
{
586586
auto unique_ptr = dictionary.getColumnUniquePtr();
587-
column = ColumnLowCardinality::create(IColumn::mutate(std::move(unique_ptr)), std::move(column));
587+
column = ColumnLowCardinality::create(IColumn::mutate(std::move(unique_ptr)), std::move(column), /*is_shared=*/false);
588588
}
589589

590590
return columns;
@@ -603,7 +603,7 @@ ColumnLowCardinality::MutablePtr ColumnLowCardinality::cutAndCompact(size_t star
603603
{
604604
auto sub_positions = IColumn::mutate(idx.getPositions()->cut(start, length));
605605
auto new_column_unique = Dictionary::compact(getDictionary(), sub_positions);
606-
return ColumnLowCardinality::create(std::move(new_column_unique), std::move(sub_positions));
606+
return ColumnLowCardinality::create(std::move(new_column_unique), std::move(sub_positions), /*is_shared=*/false);
607607
}
608608

609609
void ColumnLowCardinality::compactInplace()

src/Columns/ColumnLowCardinality.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,20 @@ class ColumnLowCardinality final : public COWHelper<IColumnHelper<ColumnLowCardi
2828
{
2929
friend class COWHelper<IColumnHelper<ColumnLowCardinality>, ColumnLowCardinality>;
3030

31-
ColumnLowCardinality(MutableColumnPtr && column_unique, MutableColumnPtr && indexes, bool is_shared = false);
31+
ColumnLowCardinality(MutableColumnPtr && column_unique, MutableColumnPtr && indexes, bool is_shared);
3232
ColumnLowCardinality(const ColumnLowCardinality & other) = default;
3333

3434
public:
3535
/** Create immutable column using immutable arguments. This arguments may be shared with other columns.
3636
* Use IColumn::mutate in order to make mutable column and mutate shared nested columns.
3737
*/
3838
using Base = COWHelper<IColumnHelper<ColumnLowCardinality>, ColumnLowCardinality>;
39-
static Ptr create(const ColumnPtr & column_unique_, const ColumnPtr & indexes_, bool is_shared = false)
39+
static Ptr create(const ColumnPtr & column_unique_, const ColumnPtr & indexes_, bool is_shared)
4040
{
4141
return ColumnLowCardinality::create(column_unique_->assumeMutable(), indexes_->assumeMutable(), is_shared);
4242
}
4343

44-
static MutablePtr create(MutableColumnPtr && column_unique, MutableColumnPtr && indexes, bool is_shared = false)
44+
static MutablePtr create(MutableColumnPtr && column_unique, MutableColumnPtr && indexes, bool is_shared)
4545
{
4646
return Base::create(std::move(column_unique), std::move(indexes), is_shared);
4747
}
@@ -75,7 +75,7 @@ class ColumnLowCardinality final : public COWHelper<IColumnHelper<ColumnLowCardi
7575
bool isNullAt(size_t n) const override { return getDictionary().isNullAt(getIndexes().getUInt(n)); }
7676
ColumnPtr cut(size_t start, size_t length) const override
7777
{
78-
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().cut(start, length));
78+
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().cut(start, length), isSharedDictionary());
7979
}
8080

8181
void insert(const Field & x) override;
@@ -123,7 +123,8 @@ class ColumnLowCardinality final : public COWHelper<IColumnHelper<ColumnLowCardi
123123

124124
ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override
125125
{
126-
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().filter(filt, result_size_hint));
126+
return ColumnLowCardinality::create(
127+
dictionary.getColumnUniquePtr(), getIndexes().filter(filt, result_size_hint), isSharedDictionary());
127128
}
128129

129130
void expand(const Filter & mask, bool inverted) override
@@ -133,12 +134,12 @@ class ColumnLowCardinality final : public COWHelper<IColumnHelper<ColumnLowCardi
133134

134135
ColumnPtr permute(const Permutation & perm, size_t limit) const override
135136
{
136-
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().permute(perm, limit));
137+
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().permute(perm, limit), isSharedDictionary());
137138
}
138139

139140
ColumnPtr index(const IColumn & indexes_, size_t limit) const override
140141
{
141-
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().index(indexes_, limit));
142+
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().index(indexes_, limit), isSharedDictionary());
142143
}
143144

144145
#if !defined(DEBUG_OR_SANITIZER_BUILD)
@@ -167,7 +168,7 @@ class ColumnLowCardinality final : public COWHelper<IColumnHelper<ColumnLowCardi
167168

168169
ColumnPtr replicate(const Offsets & offsets) const override
169170
{
170-
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().replicate(offsets));
171+
return ColumnLowCardinality::create(dictionary.getColumnUniquePtr(), getIndexes().replicate(offsets), isSharedDictionary());
171172
}
172173

173174
std::vector<MutableColumnPtr> scatter(ColumnIndex num_columns, const Selector & selector) const override;

src/DataTypes/DataTypeLowCardinality.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ MutableColumnPtr DataTypeLowCardinality::createColumn() const
133133
{
134134
MutableColumnPtr indexes = DataTypeUInt8().createColumn();
135135
MutableColumnPtr dictionary = createColumnUnique(*dictionary_type);
136-
return ColumnLowCardinality::create(std::move(dictionary), std::move(indexes));
136+
return ColumnLowCardinality::create(std::move(dictionary), std::move(indexes), /*is_shared=*/false);
137137
}
138138

139139
Field DataTypeLowCardinality::getDefault() const

src/DataTypes/Serializations/SerializationLowCardinality.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ void SerializationLowCardinality::deserializeBinaryBulkWithMultipleStreams(
622622
if (column_is_empty)
623623
low_cardinality_column.setSharedDictionary(global_dictionary);
624624

625-
auto local_column = ColumnLowCardinality::create(global_dictionary, std::move(indexes_column));
625+
auto local_column = ColumnLowCardinality::create(global_dictionary, std::move(indexes_column), /*is_shared=*/true);
626626
low_cardinality_column.insertRangeFrom(*local_column, 0, num_rows);
627627
}
628628
else

src/Functions/IFunction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,9 @@ ColumnPtr IExecutableFunction::executeWithoutSparseColumns(
406406
ColumnUniquePtr res_dictionary = std::move(res_mut_dictionary);
407407

408408
if (indexes && !res_is_constant)
409-
result = ColumnLowCardinality::create(res_dictionary, res_indexes->index(*indexes, 0));
409+
result = ColumnLowCardinality::create(res_dictionary, res_indexes->index(*indexes, 0), /*is_shared=*/false);
410410
else
411-
result = ColumnLowCardinality::create(res_dictionary, res_indexes);
411+
result = ColumnLowCardinality::create(res_dictionary, res_indexes, /*is_shared=*/false);
412412

413413
if (res_is_constant)
414414
result = ColumnConst::create(std::move(result), input_rows_count);

src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn(
13141314

13151315
auto arrow_indexes_column = std::make_shared<arrow::ChunkedArray>(indexes_array);
13161316
auto indexes_column = readColumnWithIndexesData(arrow_indexes_column, dict_info.default_value_index, dict_info.dictionary_size, is_lc_nullable);
1317-
auto lc_column = ColumnLowCardinality::create(dict_info.values->column, indexes_column);
1317+
auto lc_column = ColumnLowCardinality::create(dict_info.values->column, indexes_column, /*is_shared=*/true);
13181318
auto lc_type = std::make_shared<DataTypeLowCardinality>(is_lc_nullable ? makeNullable(dict_info.values->type) : dict_info.values->type);
13191319
return {std::move(lc_column), std::move(lc_type), column_name};
13201320
}

src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,10 @@ Chunk DWARFBlockInputFormat::parseEntries(UnitState & unit)
396396
auto col_attr_name = ColumnVector<UInt16>::create();
397397
auto col_attr_form = ColumnVector<UInt16>::create();
398398
auto col_attr_int = ColumnVector<UInt64>::create();
399-
auto col_attr_str = ColumnLowCardinality::create(MutableColumnPtr(ColumnUnique<ColumnString>::create(ColumnString::create()->cloneResized(1), /*is_nullable*/ false)), MutableColumnPtr(ColumnVector<UInt16>::create()));
399+
auto col_attr_str = ColumnLowCardinality::create(
400+
MutableColumnPtr(ColumnUnique<ColumnString>::create(ColumnString::create()->cloneResized(1), /*is_nullable*/ false)),
401+
MutableColumnPtr(ColumnVector<UInt16>::create()),
402+
/*is_shared=*/false);
400403
auto col_attr_offsets = ColumnVector<UInt64>::create();
401404
size_t num_rows = 0;
402405
auto err = llvm::Error::success();
@@ -749,8 +752,8 @@ Chunk DWARFBlockInputFormat::parseEntries(UnitState & unit)
749752
auto index = ColumnVector<UInt8>::create();
750753
index->insert(1);
751754
auto indices = index->replicate({num_rows});
752-
cols.push_back(ColumnLowCardinality::create(ColumnUnique<ColumnString>::create(
753-
std::move(dict), /*is_nullable*/ false), indices));
755+
cols.push_back(ColumnLowCardinality::create(
756+
ColumnUnique<ColumnString>::create(std::move(dict), /*is_nullable*/ false), indices, /*is_shared*/ false));
754757
break;
755758
}
756759
case COL_UNIT_OFFSET:
@@ -761,8 +764,8 @@ Chunk DWARFBlockInputFormat::parseEntries(UnitState & unit)
761764
auto index = ColumnVector<UInt8>::create();
762765
index->insert(1);
763766
auto indices = index->replicate({num_rows});
764-
cols.push_back(ColumnLowCardinality::create(ColumnUnique<ColumnVector<UInt64>>::create(
765-
std::move(dict), /*is_nullable*/ false), indices));
767+
cols.push_back(ColumnLowCardinality::create(
768+
ColumnUnique<ColumnVector<UInt64>>::create(std::move(dict), /*is_nullable*/ false), indices, /*is_shared*/ false));
766769
break;
767770
}
768771
case COL_ANCESTOR_TAGS:

src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1422,7 +1422,7 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData(
14221422
}
14231423
}
14241424

1425-
return ColumnLowCardinality::create(std::move(dictionary_column), std::move(new_index_column));
1425+
return ColumnLowCardinality::create(std::move(dictionary_column), std::move(new_index_column), /*is_shared=*/false);
14261426
};
14271427

14281428
MutableColumnPtr internal_column;

0 commit comments

Comments
 (0)