```
SELECT categoricalInformationValue(x.1, x.2) FROM (SELECT arrayJoin([(0, 0), (NULL, 2), (1, 0), (1, 1)]) AS x)
```
{
        const auto & column_offsets = assert_cast<const ColumnArray::ColumnOffsets &>(column);
        MutableColumnPtr column_sizes = column_offsets.cloneEmpty();
        if (column_offsets.empty())
            return column_sizes;
        const auto & offsets_data = column_offsets.getData();
        auto & sizes_data = assert_cast<ColumnArray::ColumnOffsets &>(*column_sizes).getData();
        sizes_data.resize(offsets_data.size());
        IColumn::Offset prev_offset = 0;
        for (size_t i = 0, size = offsets_data.size(); i < size; ++i)
        {
            auto current_offset = offsets_data[i];
            sizes_data[i] = current_offset - prev_offset;
            prev_offset =  current_offset;
        }
        return column_sizes;
    }
}
DataTypePtr SerializationArray::SubcolumnCreator::create(const DataTypePtr & prev) const