Skip to content

Commit cc1a701

Browse files
authored
Merge pull request ClickHouse#91310 from ClickHouse/backport/25.8/90880
Backport ClickHouse#90880 to 25.8: Add setting for compatibility serialziation of string
2 parents 2467f9e + 2f33c29 commit cc1a701

File tree

71 files changed

+557
-622
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+557
-622
lines changed

src/AggregateFunctions/AggregateFunctionGroupArray.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,8 @@ struct GroupArrayNodeGeneral : public GroupArrayNodeBase<GroupArrayNodeGeneral>
457457
static Node * allocate(const IColumn & column, size_t row_num, Arena * arena)
458458
{
459459
const char * begin = arena->alignedAlloc(sizeof(Node), alignof(Node));
460-
StringRef value = column.serializeAggregationStateValueIntoArena(row_num, *arena, begin);
460+
auto settings = IColumn::SerializationSettings::createForAggregationState();
461+
auto value = column.serializeValueIntoArena(row_num, *arena, begin, &settings);
461462

462463
Node * node = reinterpret_cast<Node *>(const_cast<char *>(begin));
463464
node->size = value.size;

src/AggregateFunctions/AggregateFunctionGroupArrayIntersect.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ class AggregateFunctionGroupArrayIntersectGeneric final
236236
else
237237
{
238238
const char * begin = nullptr;
239-
StringRef serialized = data_column->serializeAggregationStateValueIntoArena(offset + i, *arena, begin);
239+
auto settings = IColumn::SerializationSettings::createForAggregationState();
240+
auto serialized = data_column->serializeValueIntoArena(offset + i, *arena, begin, &settings);
240241
chassert(serialized.data != nullptr);
241242
set.emplace(SerializedKeyHolder{serialized, *arena}, it, inserted);
242243
}
@@ -256,7 +257,8 @@ class AggregateFunctionGroupArrayIntersectGeneric final
256257
else
257258
{
258259
const char * begin = nullptr;
259-
StringRef serialized = data_column->serializeAggregationStateValueIntoArena(offset + i, *arena, begin);
260+
auto settings = IColumn::SerializationSettings::createForAggregationState();
261+
auto serialized = data_column->serializeValueIntoArena(offset + i, *arena, begin, &settings);
260262
chassert(serialized.data != nullptr);
261263
it = set.find(serialized);
262264

src/AggregateFunctions/AggregateFunctionTopK.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ class AggregateFunctionTopKGeneric final
310310
else
311311
{
312312
const char * begin = nullptr;
313-
StringRef str_serialized = columns[0]->serializeAggregationStateValueIntoArena(row_num, *arena, begin);
313+
auto settings = IColumn::SerializationSettings::createForAggregationState();
314+
auto str_serialized = columns[0]->serializeValueIntoArena(row_num, *arena, begin, &settings);
314315
if constexpr (is_weighted)
315316
set.insert(str_serialized, columns[1]->getUInt(row_num));
316317
else

src/AggregateFunctions/Combinators/AggregateFunctionDistinct.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ struct AggregateFunctionDistinctMultipleGenericData : public AggregateFunctionDi
116116
StringRef value(begin, 0);
117117
for (size_t i = 0; i < columns_num; ++i)
118118
{
119-
auto cur_ref = columns[i]->serializeAggregationStateValueIntoArena(row_num, *arena, begin);
119+
auto settings = IColumn::SerializationSettings::createForAggregationState();
120+
auto cur_ref = columns[i]->serializeValueIntoArena(row_num, *arena, begin, &settings);
120121
value.data = cur_ref.data - value.size;
121122
value.size += cur_ref.size;
122123
}
@@ -140,8 +141,9 @@ struct AggregateFunctionDistinctMultipleGenericData : public AggregateFunctionDi
140141
history.emplace(ArenaKeyHolder{value, *arena}, it, inserted);
141142
ReadBufferFromString in({it->getValue().data, it->getValue().size});
142143
/// Multiple columns are serialized one by one
144+
auto settings = IColumn::SerializationSettings::createForAggregationState();
143145
for (auto & column : argument_columns)
144-
column->deserializeAndInsertAggregationStateValueFromArena(in);
146+
column->deserializeAndInsertFromArena(in, &settings);
145147
}
146148
}
147149
}

src/AggregateFunctions/KeyHolderHelpers.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ static auto getKeyHolder(const IColumn & column, size_t row_num, Arena & arena)
2323
else
2424
{
2525
const char * begin = nullptr;
26-
StringRef serialized = column.serializeAggregationStateValueIntoArena(row_num, arena, begin);
26+
auto settings = IColumn::SerializationSettings::createForAggregationState();
27+
auto serialized = column.serializeValueIntoArena(row_num, arena, begin, &settings);
2728
assert(serialized.data != nullptr);
2829
return SerializedKeyHolder{serialized, arena};
2930
}
@@ -37,7 +38,8 @@ static void deserializeAndInsert(StringRef str, IColumn & data_to)
3738
else
3839
{
3940
ReadBufferFromString in({str.data, str.size});
40-
data_to.deserializeAndInsertAggregationStateValueFromArena(in);
41+
auto settings = IColumn::SerializationSettings::createForAggregationState();
42+
data_to.deserializeAndInsertFromArena(in, &settings);
4143
if (!in.eof())
4244
{
4345
throw Exception(ErrorCodes::INCORRECT_DATA, "Extra bytes ({}) found after deserializing aggregation state", in.available());

src/Columns/ColumnAggregateFunction.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -601,15 +601,16 @@ void ColumnAggregateFunction::insertDefault()
601601
pushBackAndCreateState(data, arena, func.get());
602602
}
603603

604-
StringRef ColumnAggregateFunction::serializeValueIntoArena(size_t n, Arena & arena, const char *& begin) const
604+
StringRef ColumnAggregateFunction::serializeValueIntoArena(
605+
size_t n, Arena & arena, const char *& begin, const IColumn::SerializationSettings *) const
605606
{
606607
WriteBufferFromArena out(arena, begin);
607608
func->serialize(data[n], out, version);
608609
out.finalize();
609610
return out.complete();
610611
}
611612

612-
void ColumnAggregateFunction::deserializeAndInsertFromArena(ReadBuffer & in)
613+
void ColumnAggregateFunction::deserializeAndInsertFromArena(ReadBuffer & in, const IColumn::SerializationSettings *)
613614
{
614615
ensureOwnership();
615616

src/Columns/ColumnAggregateFunction.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,9 @@ class ColumnAggregateFunction final : public COWHelper<IColumnHelper<ColumnAggre
171171

172172
void insertDefault() override;
173173

174-
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
174+
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin, const IColumn::SerializationSettings * settings) const override;
175175

176-
void deserializeAndInsertFromArena(ReadBuffer & in) override;
176+
void deserializeAndInsertFromArena(ReadBuffer & in, const IColumn::SerializationSettings * settings) override;
177177

178178
void skipSerializedInArena(ReadBuffer & in) const override;
179179

src/Columns/ColumnArray.cpp

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ void ColumnArray::insertData(const char * pos, size_t length)
223223
}
224224

225225

226-
StringRef ColumnArray::serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const
226+
StringRef
227+
ColumnArray::serializeValueIntoArena(size_t n, Arena & arena, char const *& begin, const IColumn::SerializationSettings * settings) const
227228
{
228229
size_t array_size = sizeAt(n);
229230
size_t offset = offsetAt(n);
@@ -235,49 +236,27 @@ StringRef ColumnArray::serializeValueIntoArena(size_t n, Arena & arena, char con
235236

236237
for (size_t i = 0; i < array_size; ++i)
237238
{
238-
auto value_ref = getData().serializeValueIntoArena(offset + i, arena, begin);
239+
auto value_ref = getData().serializeValueIntoArena(offset + i, arena, begin, settings);
239240
res.data = value_ref.data - res.size;
240241
res.size += value_ref.size;
241242
}
242243

243244
return res;
244245
}
245246

246-
247-
StringRef ColumnArray::serializeAggregationStateValueIntoArena(size_t n, Arena & arena, char const *& begin) const
248-
{
249-
size_t array_size = sizeAt(n);
250-
size_t offset = offsetAt(n);
251-
252-
char * pos = arena.allocContinue(sizeof(array_size), begin);
253-
memcpy(pos, &array_size, sizeof(array_size));
254-
255-
StringRef res(pos, sizeof(array_size));
256-
257-
for (size_t i = 0; i < array_size; ++i)
258-
{
259-
auto value_ref = getData().serializeAggregationStateValueIntoArena(offset + i, arena, begin);
260-
res.data = value_ref.data - res.size;
261-
res.size += value_ref.size;
262-
}
263-
264-
return res;
265-
}
266-
267-
268-
char * ColumnArray::serializeValueIntoMemory(size_t n, char * memory) const
247+
char * ColumnArray::serializeValueIntoMemory(size_t n, char * memory, const IColumn::SerializationSettings * settings) const
269248
{
270249
size_t array_size = sizeAt(n);
271250
size_t offset = offsetAt(n);
272251

273252
memcpy(memory, &array_size, sizeof(array_size));
274253
memory += sizeof(array_size);
275254
for (size_t i = 0; i < array_size; ++i)
276-
memory = getData().serializeValueIntoMemory(offset + i, memory);
255+
memory = getData().serializeValueIntoMemory(offset + i, memory, settings);
277256
return memory;
278257
}
279258

280-
std::optional<size_t> ColumnArray::getSerializedValueSize(size_t n) const
259+
std::optional<size_t> ColumnArray::getSerializedValueSize(size_t n, const IColumn::SerializationSettings * settings) const
281260
{
282261
const auto & offsets_data = getOffsets();
283262

@@ -287,7 +266,7 @@ std::optional<size_t> ColumnArray::getSerializedValueSize(size_t n) const
287266
size_t res = sizeof(offsets_data[0]);
288267
for (; pos < end; ++pos)
289268
{
290-
auto element_size = getData().getSerializedValueSize(pos);
269+
auto element_size = getData().getSerializedValueSize(pos, settings);
291270
if (!element_size)
292271
return std::nullopt;
293272
res += *element_size;
@@ -297,24 +276,13 @@ std::optional<size_t> ColumnArray::getSerializedValueSize(size_t n) const
297276
}
298277

299278

300-
void ColumnArray::deserializeAndInsertFromArena(ReadBuffer & in)
301-
{
302-
size_t array_size;
303-
readBinaryLittleEndian<size_t>(array_size, in);
304-
305-
for (size_t i = 0; i < array_size; ++i)
306-
getData().deserializeAndInsertFromArena(in);
307-
308-
getOffsets().push_back(getOffsets().back() + array_size);
309-
}
310-
311-
void ColumnArray::deserializeAndInsertAggregationStateValueFromArena(ReadBuffer & in)
279+
void ColumnArray::deserializeAndInsertFromArena(ReadBuffer & in, const IColumn::SerializationSettings * settings)
312280
{
313281
size_t array_size;
314282
readBinaryLittleEndian<size_t>(array_size, in);
315283

316284
for (size_t i = 0; i < array_size; ++i)
317-
getData().deserializeAndInsertAggregationStateValueFromArena(in);
285+
getData().deserializeAndInsertFromArena(in, settings);
318286

319287
getOffsets().push_back(getOffsets().back() + array_size);
320288
}

src/Columns/ColumnArray.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,10 @@ class ColumnArray final : public COWHelper<IColumnHelper<ColumnArray>, ColumnArr
7878
StringRef getDataAt(size_t n) const override;
7979
bool isDefaultAt(size_t n) const override;
8080
void insertData(const char * pos, size_t length) override;
81-
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
82-
StringRef serializeAggregationStateValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
83-
char * serializeValueIntoMemory(size_t, char * memory) const override;
84-
std::optional<size_t> getSerializedValueSize(size_t n) const override;
85-
void deserializeAndInsertFromArena(ReadBuffer & in) override;
86-
void deserializeAndInsertAggregationStateValueFromArena(ReadBuffer & in) override;
81+
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin, const IColumn::SerializationSettings * settings) const override;
82+
char * serializeValueIntoMemory(size_t, char * memory, const IColumn::SerializationSettings * settings) const override;
83+
std::optional<size_t> getSerializedValueSize(size_t n, const IColumn::SerializationSettings * settings) const override;
84+
void deserializeAndInsertFromArena(ReadBuffer & in, const IColumn::SerializationSettings * settings) override;
8785
void skipSerializedInArena(ReadBuffer & in) const override;
8886
void updateHashWithValue(size_t n, SipHash & hash) const override;
8987
WeakHash32 getWeakHash32() const override;

src/Columns/ColumnBLOB.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ class ColumnBLOB : public COWHelper<IColumnHelper<ColumnBLOB>, ColumnBLOB>
161161
void insertData(const char *, size_t) override { throwInapplicable(); }
162162
void insertDefault() override { throwInapplicable(); }
163163
void popBack(size_t) override { throwInapplicable(); }
164-
StringRef serializeValueIntoArena(size_t, Arena &, char const *&) const override { throwInapplicable(); }
165-
char * serializeValueIntoMemory(size_t, char *) const override { throwInapplicable(); }
166-
void deserializeAndInsertFromArena(ReadBuffer &) override { throwInapplicable(); }
164+
StringRef serializeValueIntoArena(size_t, Arena &, char const *&, const IColumn::SerializationSettings *) const override { throwInapplicable(); }
165+
char * serializeValueIntoMemory(size_t, char *, const IColumn::SerializationSettings *) const override { throwInapplicable(); }
166+
void deserializeAndInsertFromArena(ReadBuffer &, const IColumn::SerializationSettings *) override { throwInapplicable(); }
167167
void skipSerializedInArena(ReadBuffer &) const override { throwInapplicable(); }
168168
void updateHashWithValue(size_t, SipHash &) const override { throwInapplicable(); }
169169
WeakHash32 getWeakHash32() const override { throwInapplicable(); }

0 commit comments

Comments
 (0)