Skip to content

Commit 8950b79

Browse files
authored
Merge pull request ClickHouse#86719 from ClickHouse/backport/25.8/86410
Backport ClickHouse#86410 to 25.8: Fix GROUP BY Nullable(JSON)
2 parents cd2b15a + b07f068 commit 8950b79

19 files changed

+118
-5
lines changed

src/Columns/ColumnArray.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,25 @@ char * ColumnArray::serializeValueIntoMemory(size_t n, char * memory) const
255255
return memory;
256256
}
257257

258+
std::optional<size_t> ColumnArray::getSerializedValueSize(size_t n) const
259+
{
260+
const auto & offsets_data = getOffsets();
261+
262+
size_t pos = offsets_data[n - 1];
263+
size_t end = offsets_data[n];
264+
265+
size_t res = sizeof(offsets_data[0]);
266+
for (; pos < end; ++pos)
267+
{
268+
auto element_size = getData().getSerializedValueSize(pos);
269+
if (!element_size)
270+
return std::nullopt;
271+
res += *element_size;
272+
}
273+
274+
return res;
275+
}
276+
258277

259278
const char * ColumnArray::deserializeAndInsertFromArena(const char * pos)
260279
{

src/Columns/ColumnArray.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class ColumnArray final : public COWHelper<IColumnHelper<ColumnArray>, ColumnArr
8080
void insertData(const char * pos, size_t length) override;
8181
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
8282
char * serializeValueIntoMemory(size_t, char * memory) const override;
83+
std::optional<size_t> getSerializedValueSize(size_t n) const override;
8384
const char * deserializeAndInsertFromArena(const char * pos) override;
8485
const char * skipSerializedInArena(const char * pos) const override;
8586
void updateHashWithValue(size_t n, SipHash & hash) const override;

src/Columns/ColumnDynamic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ class ColumnDynamic final : public COWHelper<IColumnHelper<ColumnDynamic>, Colum
196196
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
197197
const char * deserializeAndInsertFromArena(const char * pos) override;
198198
const char * skipSerializedInArena(const char * pos) const override;
199+
std::optional<size_t> getSerializedValueSize(size_t) const override { return std::nullopt; }
199200

200201
void updateHashWithValue(size_t n, SipHash & hash) const override;
201202

src/Columns/ColumnMap.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ char * ColumnMap::serializeValueIntoMemory(size_t n, char * memory) const
160160
return nested->serializeValueIntoMemory(n, memory);
161161
}
162162

163+
std::optional<size_t> ColumnMap::getSerializedValueSize(size_t n) const
164+
{
165+
return nested->getSerializedValueSize(n);
166+
}
167+
163168
const char * ColumnMap::deserializeAndInsertFromArena(const char * pos)
164169
{
165170
return nested->deserializeAndInsertFromArena(pos);

src/Columns/ColumnMap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class ColumnMap final : public COWHelper<IColumnHelper<ColumnMap>, ColumnMap>
5858
void popBack(size_t n) override;
5959
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
6060
char * serializeValueIntoMemory(size_t n, char * memory) const override;
61+
std::optional<size_t> getSerializedValueSize(size_t n) const override;
6162
const char * deserializeAndInsertFromArena(const char * pos) override;
6263
const char * skipSerializedInArena(const char * pos) const override;
6364
void updateHashWithValue(size_t n, SipHash & hash) const override;

src/Columns/ColumnNullable.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ char * ColumnNullable::serializeValueIntoMemory(size_t n, char * memory) const
198198
return getNestedColumn().serializeValueIntoMemory(n, memory);
199199
}
200200

201+
std::optional<size_t> ColumnNullable::getSerializedValueSize(size_t n) const
202+
{
203+
auto nested_size = getNestedColumn().getSerializedValueSize(n);
204+
if (!nested_size)
205+
return std::nullopt;
206+
return 1 + *nested_size; /// +1 for null mask byte.
207+
}
208+
201209
const char * ColumnNullable::deserializeAndInsertFromArena(const char * pos)
202210
{
203211
UInt8 val = unalignedLoad<UInt8>(pos);

src/Columns/ColumnNullable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ColumnNullable final : public COWHelper<IColumnHelper<ColumnNullable>, Col
6868
void insertData(const char * pos, size_t length) override;
6969
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
7070
char * serializeValueIntoMemory(size_t n, char * memory) const override;
71+
std::optional<size_t> getSerializedValueSize(size_t n) const override;
7172
const char * deserializeAndInsertFromArena(const char * pos) override;
7273
const char * skipSerializedInArena(const char * pos) const override;
7374
#if !defined(DEBUG_OR_SANITIZER_BUILD)

src/Columns/ColumnObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ StringRef ColumnObject::serializeValueIntoArena(size_t n, Arena & arena, const c
896896
res.size += data_ref.size;
897897
}
898898

899-
/// Second, serialize paths and values in bunary format from dynamic paths and shared data in sorted by path order.
899+
/// Second, serialize paths and values in binary format from dynamic paths and shared data in sorted by path order.
900900
/// Calculate total number of paths to serialize and write it.
901901
const auto & shared_data_offsets = getSharedDataOffsets();
902902
size_t offset = shared_data_offsets[static_cast<ssize_t>(n) - 1];

src/Columns/ColumnObject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ class ColumnObject final : public COWHelper<IColumnHelper<ColumnObject>, ColumnO
146146
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
147147
const char * deserializeAndInsertFromArena(const char * pos) override;
148148
const char * skipSerializedInArena(const char * pos) const override;
149+
std::optional<size_t> getSerializedValueSize(size_t) const override { return std::nullopt; }
149150

150151
void updateHashWithValue(size_t n, SipHash & hash) const override;
151152
WeakHash32 getWeakHash32() const override;

src/Columns/ColumnSparse.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ char * ColumnSparse::serializeValueIntoMemory(size_t n, char * memory) const
168168
return values->serializeValueIntoMemory(getValueIndex(n), memory);
169169
}
170170

171+
std::optional<size_t> ColumnSparse::getSerializedValueSize(size_t n) const
172+
{
173+
return values->getSerializedValueSize(getValueIndex(n));
174+
}
175+
171176
const char * ColumnSparse::deserializeAndInsertFromArena(const char * pos)
172177
{
173178
const char * res = nullptr;

0 commit comments

Comments
 (0)