Skip to content

Commit ec28a5d

Browse files
authored
Merge pull request ClickHouse#91345 from ClickHouse/backport/25.8/91142
Backport ClickHouse#91142 to 25.8: Fix lazy materialization of a column added via alter add column in old parts
2 parents e810455 + 778562b commit ec28a5d

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/DataTypes/Serializations/SerializationArray.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void SerializationArray::serializeBinaryBulkWithMultipleStreams(
372372
settings.path.pop_back();
373373
}
374374

375-
void SerializationArray::deserializeOffsetsBinaryBulk(
375+
bool SerializationArray::deserializeOffsetsBinaryBulk(
376376
ColumnPtr & offsets_column,
377377
size_t limit,
378378
ISerialization::DeserializeBinaryBulkSettings & settings,
@@ -390,8 +390,11 @@ void SerializationArray::deserializeOffsetsBinaryBulk(
390390
insertArraySizesToOffsets(offsets_column, cached_column, cached_column->size() - num_read_rows, cached_column->size());
391391
else
392392
offsets_column = arraySizesToOffsets(*cached_column);
393+
394+
return true;
393395
}
394-
else if (auto * stream = settings.getter(settings.path))
396+
397+
if (auto * stream = settings.getter(settings.path))
395398
{
396399
size_t prev_size = offsets_column->size();
397400

@@ -416,7 +419,11 @@ void SerializationArray::deserializeOffsetsBinaryBulk(
416419
/// Add array sizes read from current range into the cache.
417420
if (cache)
418421
addColumnWithNumReadRowsToSubstreamsCache(cache, settings.path, arrayOffsetsToSizes(*offsets_column), offsets_column->size() - prev_size);
422+
423+
return true;
419424
}
425+
426+
return false;
420427
}
421428

422429
std::pair<size_t, size_t> SerializationArray::deserializeOffsetsBinaryBulkAndGetNestedOffsetAndLimit(
@@ -429,7 +436,8 @@ std::pair<size_t, size_t> SerializationArray::deserializeOffsetsBinaryBulkAndGet
429436
const auto & offsets_data = assert_cast<const ColumnArray::ColumnOffsets &>(*offsets_column).getData();
430437
size_t prev_last_offset = offsets_data.back();
431438
size_t prev_offset_size = offsets_data.size();
432-
deserializeOffsetsBinaryBulk(offsets_column, offset + limit, settings, cache);
439+
if (!deserializeOffsetsBinaryBulk(offsets_column, offset + limit, settings, cache))
440+
return {0, 0};
433441

434442
size_t skipped_nested_rows = 0;
435443

src/DataTypes/Serializations/SerializationArray.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class SerializationArray final : public SimpleTextSerialization
7474
SubstreamsCache * cache) const override;
7575

7676
static void serializeOffsetsBinaryBulk(const IColumn & offsets_column, size_t offset, size_t limit, SerializeBinaryBulkSettings & settings);
77-
static void deserializeOffsetsBinaryBulk(ColumnPtr & offsets_column, size_t limit, DeserializeBinaryBulkSettings & settings, SubstreamsCache * cache);
77+
static bool deserializeOffsetsBinaryBulk(ColumnPtr & offsets_column, size_t limit, DeserializeBinaryBulkSettings & settings, SubstreamsCache * cache);
7878
static std::pair<size_t, size_t> deserializeOffsetsBinaryBulkAndGetNestedOffsetAndLimit(ColumnPtr & offsets_column, size_t offset, size_t limit, DeserializeBinaryBulkSettings & settings, SubstreamsCache * cache);
7979

8080
struct SubcolumnCreator : public ISubcolumnCreator

src/DataTypes/Serializations/SerializationObjectSharedData.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1325,7 +1325,9 @@ void SerializationObjectSharedData::deserializeBinaryBulkWithMultipleStreams(
13251325

13261326
/// Read array sizes.
13271327
settings.path.push_back(Substream::ObjectSharedDataCopySizes);
1328-
SerializationArray::deserializeOffsetsBinaryBulk(offsets_column, rows_offset + limit, settings, cache);
1328+
if (!SerializationArray::deserializeOffsetsBinaryBulk(offsets_column, rows_offset + limit, settings, cache))
1329+
throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty stream for object shared data copy sizes");
1330+
13291331
settings.path.pop_back();
13301332

13311333
/// Read paths indexes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42 []
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
drop table if exists test_lazy;
2+
create table test_lazy (id UInt64) engine=MergeTree order by tuple() settings min_bytes_for_wide_part=1, min_rows_for_wide_part=1;
3+
insert into test_lazy select * from numbers(100);
4+
alter table test_lazy add column array Array(UInt64) settings mutations_sync=1;
5+
select id, array from test_lazy where id = 42 order by id limit 10 settings query_plan_optimize_lazy_materialization = 1;
6+
drop table test_lazy;
7+

0 commit comments

Comments
 (0)