@@ -149,21 +149,42 @@ namespace
149149 offset_values.resize (i);
150150 }
151151
152- MutableColumnPtr getArraySizesPositionIndependent (const ColumnArray & column_array )
152+ ColumnPtr arrayOffsetsToSizes (const IColumn & column )
153153 {
154- const auto & offset_values = column_array. getOffsets ( );
155- MutableColumnPtr new_offsets = column_array. getOffsetsColumn () .cloneEmpty ();
154+ const auto & column_offsets = assert_cast< const ColumnArray::ColumnOffsets &>(column );
155+ MutableColumnPtr column_sizes = column_offsets .cloneEmpty ();
156156
157- if (offset_values .empty ())
158- return new_offsets ;
157+ if (column_offsets .empty ())
158+ return column_sizes ;
159159
160- auto & new_offsets_values = assert_cast<ColumnVector<ColumnArray::Offset> &>(*new_offsets).getData ();
161- new_offsets_values.reserve (offset_values.size ());
162- new_offsets_values.push_back (offset_values[0 ]);
163- for (size_t i = 1 ; i < offset_values.size (); ++i)
164- new_offsets_values.push_back (offset_values[i] - offset_values[i - 1 ]);
160+ const auto & offsets_data = column_offsets.getData ();
161+ auto & sizes_data = assert_cast<ColumnArray::ColumnOffsets &>(*column_sizes).getData ();
165162
166- return new_offsets;
163+ sizes_data.resize (offsets_data.size ());
164+ sizes_data[0 ] = offsets_data[0 ];
165+ for (size_t i = 1 ; i < offsets_data.size (); ++i)
166+ sizes_data[i] = offsets_data[i] - offsets_data[i - 1 ];
167+
168+ return column_sizes;
169+ }
170+
171+ ColumnPtr arraySizesToOffsets (const IColumn & column)
172+ {
173+ const auto & column_sizes = assert_cast<const ColumnArray::ColumnOffsets &>(column);
174+ MutableColumnPtr column_offsets = column_sizes.cloneEmpty ();
175+
176+ if (column_sizes.empty ())
177+ return column_offsets;
178+
179+ const auto & sizes_data = column_sizes.getData ();
180+ auto & offsets_data = assert_cast<ColumnArray::ColumnOffsets &>(*column_offsets).getData ();
181+
182+ offsets_data.resize (sizes_data.size ());
183+ offsets_data[0 ] = sizes_data[0 ];
184+ for (size_t i = 0 ; i < sizes_data.size (); ++i)
185+ offsets_data[i] = offsets_data[i - 1 ] + sizes_data[i];
186+
187+ return column_offsets;
167188 }
168189}
169190
@@ -263,12 +284,11 @@ void DataTypeArray::deserializeBinaryBulkWithMultipleStreamsImpl(
263284 SubstreamsCache * cache) const
264285{
265286 ColumnArray & column_array = typeid_cast<ColumnArray &>(column);
266-
267287 settings.path .push_back (Substream::ArraySizes);
268288
269289 if (auto cached_column = getFromSubstreamsCache (cache, settings.path ))
270290 {
271- column_array.getOffsetsPtr () = cached_column;
291+ column_array.getOffsetsPtr () = arraySizesToOffsets (* cached_column) ;
272292 }
273293 else if (auto * stream = settings.getter (settings.path ))
274294 {
@@ -277,7 +297,7 @@ void DataTypeArray::deserializeBinaryBulkWithMultipleStreamsImpl(
277297 else
278298 DataTypeNumber<ColumnArray::Offset>().deserializeBinaryBulk (column_array.getOffsetsColumn (), *stream, limit, 0 );
279299
280- addToSubstreamsCache (cache, settings.path , column_array.getOffsetsPtr ( ));
300+ addToSubstreamsCache (cache, settings.path , arrayOffsetsToSizes ( column_array.getOffsetsColumn () ));
281301 }
282302
283303 settings.path .back () = Substream::ArrayElements;
@@ -547,24 +567,24 @@ DataTypePtr DataTypeArray::tryGetSubcolumnTypeImpl(const String & subcolumn_name
547567 return (subcolumn ? std::make_shared<DataTypeArray>(std::move (subcolumn)) : subcolumn);
548568}
549569
550- MutableColumnPtr DataTypeArray::getSubcolumn (const String & subcolumn_name, IColumn & column) const
570+ ColumnPtr DataTypeArray::getSubcolumn (const String & subcolumn_name, const IColumn & column) const
551571{
552572 return getSubcolumnImpl (subcolumn_name, column, 0 );
553573}
554574
555- MutableColumnPtr DataTypeArray::getSubcolumnImpl (const String & subcolumn_name, IColumn & column, size_t level) const
575+ ColumnPtr DataTypeArray::getSubcolumnImpl (const String & subcolumn_name, const IColumn & column, size_t level) const
556576{
557- auto & column_array = assert_cast<ColumnArray &>(column);
577+ const auto & column_array = assert_cast<const ColumnArray &>(column);
558578 if (subcolumn_name == " size" + std::to_string (level))
559- return getArraySizesPositionIndependent (column_array);
579+ return arrayOffsetsToSizes (column_array. getOffsetsColumn () );
560580
561- MutableColumnPtr subcolumn;
581+ ColumnPtr subcolumn;
562582 if (const auto * nested_array = typeid_cast<const DataTypeArray *>(nested.get ()))
563583 subcolumn = nested_array->getSubcolumnImpl (subcolumn_name, column_array.getData (), level + 1 );
564584 else
565585 subcolumn = nested->getSubcolumn (subcolumn_name, column_array.getData ());
566586
567- return ColumnArray::create (std::move ( subcolumn) , column_array.getOffsetsPtr ()-> assumeMutable ());
587+ return ColumnArray::create (subcolumn, column_array.getOffsetsPtr ());
568588}
569589
570590size_t DataTypeArray::getNumberOfDimensions () const
0 commit comments