From f43779f7f96129af73d8fcc41dbf07afad4f2cb5 Mon Sep 17 00:00:00 2001 From: kakachen Date: Mon, 18 Nov 2024 01:58:00 +0800 Subject: [PATCH 1/5] [opt](parquet-reader)Implement late materialization of parquet complex types. --- .../exec/format/parquet/parquet_common.cpp | 152 ++++++------------ .../vec/exec/format/parquet/parquet_common.h | 144 +++++++++++++---- .../format/parquet/vparquet_column_reader.cpp | 148 ++++++++++++----- .../format/parquet/vparquet_column_reader.h | 59 ++++--- .../format/parquet/vparquet_group_reader.cpp | 58 +++---- .../format/parquet/vparquet_group_reader.h | 6 +- .../exec/format/parquet/vparquet_reader.cpp | 3 +- 7 files changed, 351 insertions(+), 219 deletions(-) diff --git a/be/src/vec/exec/format/parquet/parquet_common.cpp b/be/src/vec/exec/format/parquet/parquet_common.cpp index 59e12fcc71a463..09613b9dc86794 100644 --- a/be/src/vec/exec/format/parquet/parquet_common.cpp +++ b/be/src/vec/exec/format/parquet/parquet_common.cpp @@ -28,24 +28,19 @@ const int32_t ParquetInt96::JULIAN_EPOCH_OFFSET_DAYS = 2440588; const int64_t ParquetInt96::MICROS_IN_DAY = 86400000000; const int64_t ParquetInt96::NANOS_PER_MICROSECOND = 1000; -ColumnSelectVector::ColumnSelectVector(const uint8_t* filter_map, size_t filter_map_size, - bool filter_all) { - build(filter_map, filter_map_size, filter_all); -} - -void ColumnSelectVector::build(const uint8_t* filter_map, size_t filter_map_size, bool filter_all) { +Status FilterMap::init(const uint8_t* filter_map_data, size_t filter_map_size, bool filter_all) { _filter_all = filter_all; - _filter_map = filter_map; + _filter_map_data = filter_map_data; _filter_map_size = filter_map_size; if (filter_all) { _has_filter = true; _filter_ratio = 1; - } else if (filter_map == nullptr) { + } else if (filter_map_data == nullptr) { _has_filter = false; _filter_ratio = 0; } else { - size_t filter_count = - simd::count_zero_num(reinterpret_cast(filter_map), filter_map_size); + size_t filter_count = simd::count_zero_num(reinterpret_cast(filter_map_data), + filter_map_size); if (filter_count == filter_map_size) { _has_filter = true; _filter_all = true; @@ -58,109 +53,68 @@ void ColumnSelectVector::build(const uint8_t* filter_map, size_t filter_map_size _filter_ratio = 0; } } + return Status::OK(); } -void ColumnSelectVector::set_run_length_null_map(const std::vector& run_length_null_map, - size_t num_values, NullMap* null_map) { - _num_values = num_values; - _num_nulls = 0; - _read_index = 0; - size_t map_index = 0; - bool is_null = false; - if (_has_filter) { - // No run length null map is generated when _filter_all = true - DCHECK(!_filter_all); - _data_map.resize(num_values); - for (auto& run_length : run_length_null_map) { - if (is_null) { - _num_nulls += run_length; - for (int i = 0; i < run_length; ++i) { - _data_map[map_index++] = FILTERED_NULL; - } - } else { - for (int i = 0; i < run_length; ++i) { - _data_map[map_index++] = FILTERED_CONTENT; - } - } - is_null = !is_null; - } - size_t num_read = 0; - DCHECK_LE(_filter_map_index + num_values, _filter_map_size); - for (size_t i = 0; i < num_values; ++i) { - if (_filter_map[_filter_map_index++]) { - _data_map[i] = _data_map[i] == FILTERED_NULL ? NULL_DATA : CONTENT; - num_read++; - } - } - _num_filtered = num_values - num_read; - if (null_map != nullptr && num_read > 0) { - NullMap& map_data_column = *null_map; - auto null_map_index = map_data_column.size(); - map_data_column.resize(null_map_index + num_read); - if (_num_nulls == 0) { - memset(map_data_column.data() + null_map_index, 0, num_read); - } else if (_num_nulls == num_values) { - memset(map_data_column.data() + null_map_index, 1, num_read); - } else { - for (size_t i = 0; i < num_values; ++i) { - if (_data_map[i] == CONTENT) { - map_data_column[null_map_index++] = (UInt8) false; - } else if (_data_map[i] == NULL_DATA) { - map_data_column[null_map_index++] = (UInt8) true; - } - } - } - } - } else { - _num_filtered = 0; - _run_length_null_map = &run_length_null_map; - if (null_map != nullptr) { - NullMap& map_data_column = *null_map; - auto null_map_index = map_data_column.size(); - map_data_column.resize(null_map_index + num_values); - - for (auto& run_length : run_length_null_map) { - if (is_null) { - memset(map_data_column.data() + null_map_index, 1, run_length); - null_map_index += run_length; - _num_nulls += run_length; - } else { - memset(map_data_column.data() + null_map_index, 0, run_length); - null_map_index += run_length; - } - is_null = !is_null; - } - } else { - for (auto& run_length : run_length_null_map) { - if (is_null) { - _num_nulls += run_length; - } - is_null = !is_null; - } - } - } -} - -bool ColumnSelectVector::can_filter_all(size_t remaining_num_values) { +bool FilterMap::can_filter_all(size_t remaining_num_values, size_t filter_map_index) { if (!_has_filter) { return false; } if (_filter_all) { // all data in normal columns can be skipped when _filter_all = true, // so the remaining_num_values should be less than the remaining filter map size. - DCHECK_LE(remaining_num_values + _filter_map_index, _filter_map_size); + DCHECK_LE(remaining_num_values + filter_map_index, _filter_map_size); // return true always, to make sure that the data in normal columns can be skipped. return true; } - if (remaining_num_values + _filter_map_index > _filter_map_size) { + if (remaining_num_values + filter_map_index > _filter_map_size) { return false; } - return simd::count_zero_num(reinterpret_cast(_filter_map + _filter_map_index), - remaining_num_values) == remaining_num_values; -} + return simd::count_zero_num( + reinterpret_cast(_filter_map_data + filter_map_index), + remaining_num_values) == remaining_num_values; +} + +Status FilterMap::generate_nested_filter_map(const std::vector& rep_levels, + std::vector& nested_filter_map_data, + std::unique_ptr* nested_filter_map, + size_t* current_row_ptr, bool is_cross_page, + size_t start_index) const { + if (!has_filter() || filter_all()) { + *nested_filter_map = std::make_unique(); + return Status::OK(); + } + + if (rep_levels.empty()) { + return Status::OK(); + } + + nested_filter_map_data.resize(rep_levels.size()); -void ColumnSelectVector::skip(size_t num_values) { - _filter_map_index += num_values; + size_t current_row = current_row_ptr ? *current_row_ptr : 0; + + for (size_t i = start_index; i < rep_levels.size(); i++) { + if (!is_cross_page && i > start_index && rep_levels[i] == 0) { + current_row++; + if (current_row >= _filter_map_size) { + return Status::InvalidArgument( + fmt::format("Filter map size {} is not enough for {} rows", + _filter_map_size, current_row + 1)); + } + } + nested_filter_map_data[i] = _filter_map_data[current_row]; + } + + if (current_row_ptr) { + *current_row_ptr = current_row; + } + + auto new_filter = std::make_unique(); + RETURN_IF_ERROR( + new_filter->init(nested_filter_map_data.data(), nested_filter_map_data.size(), false)); + *nested_filter_map = std::move(new_filter); + + return Status::OK(); } ParsedVersion::ParsedVersion(std::string application, std::optional version, diff --git a/be/src/vec/exec/format/parquet/parquet_common.h b/be/src/vec/exec/format/parquet/parquet_common.h index da374d5fe793f8..deb0a867229f66 100644 --- a/be/src/vec/exec/format/parquet/parquet_common.h +++ b/be/src/vec/exec/format/parquet/parquet_common.h @@ -69,17 +69,122 @@ struct ParquetInt96 { #pragma pack() static_assert(sizeof(ParquetInt96) == 12, "The size of ParquetInt96 is not 12."); +class FilterMap { +public: + FilterMap() = default; + Status init(const uint8_t* filter_map_data, size_t filter_map_size, bool filter_all); + + Status generate_nested_filter_map(const std::vector& rep_levels, + std::vector& nested_filter_map_data, + std::unique_ptr* nested_filter_map, + size_t* current_row_ptr, // 当前处理到哪一行 + bool is_cross_page, // 是否是跨页的情况 + size_t start_index = 0) const; // rep_levels的起始处理位置 + + const uint8_t* filter_map_data() const { return _filter_map_data; } + size_t filter_map_size() const { return _filter_map_size; } + bool has_filter() const { return _has_filter; } + bool filter_all() const { return _filter_all; } + double filter_ratio() const { return _has_filter ? _filter_ratio : 0; } + + bool can_filter_all(size_t remaining_num_values, size_t filter_map_index); + +private: + bool _has_filter = false; + bool _filter_all = false; + const uint8_t* _filter_map_data = nullptr; + size_t _filter_map_size = 0; + double _filter_ratio = 0; +}; + class ColumnSelectVector { public: enum DataReadType : uint8_t { CONTENT = 0, NULL_DATA, FILTERED_CONTENT, FILTERED_NULL }; - ColumnSelectVector(const uint8_t* filter_map, size_t filter_map_size, bool filter_all); - ColumnSelectVector() = default; - void build(const uint8_t* filter_map, size_t filter_map_size, bool filter_all); - - const uint8_t* filter_map() { return _filter_map; } + Status init(const std::vector& run_length_null_map, size_t num_values, + NullMap* null_map, FilterMap* filter_map, size_t filter_map_index) { + _num_values = num_values; + _num_nulls = 0; + _read_index = 0; + size_t map_index = 0; + bool is_null = false; + _has_filter = filter_map->has_filter(); + if (filter_map->has_filter()) { + // No run length null map is generated when _filter_all = true + DCHECK(!filter_map->filter_all()); + _data_map.resize(num_values); + for (auto& run_length : run_length_null_map) { + if (is_null) { + _num_nulls += run_length; + for (int i = 0; i < run_length; ++i) { + _data_map[map_index++] = FILTERED_NULL; + } + } else { + for (int i = 0; i < run_length; ++i) { + _data_map[map_index++] = FILTERED_CONTENT; + } + } + is_null = !is_null; + } + size_t num_read = 0; + DCHECK_LE(filter_map_index + num_values, filter_map->filter_map_size()); + for (size_t i = 0; i < num_values; ++i) { + if (filter_map->filter_map_data()[filter_map_index++]) { + _data_map[i] = _data_map[i] == FILTERED_NULL ? NULL_DATA : CONTENT; + num_read++; + } + } + _num_filtered = num_values - num_read; + if (null_map != nullptr && num_read > 0) { + NullMap& map_data_column = *null_map; + auto null_map_index = map_data_column.size(); + map_data_column.resize(null_map_index + num_read); + if (_num_nulls == 0) { + memset(map_data_column.data() + null_map_index, 0, num_read); + } else if (_num_nulls == num_values) { + memset(map_data_column.data() + null_map_index, 1, num_read); + } else { + for (size_t i = 0; i < num_values; ++i) { + if (_data_map[i] == CONTENT) { + map_data_column[null_map_index++] = (UInt8) false; + } else if (_data_map[i] == NULL_DATA) { + map_data_column[null_map_index++] = (UInt8) true; + } + } + } + } + } else { + _num_filtered = 0; + _run_length_null_map = &run_length_null_map; + if (null_map != nullptr) { + NullMap& map_data_column = *null_map; + auto null_map_index = map_data_column.size(); + map_data_column.resize(null_map_index + num_values); + + for (auto& run_length : run_length_null_map) { + if (is_null) { + memset(map_data_column.data() + null_map_index, 1, run_length); + null_map_index += run_length; + _num_nulls += run_length; + } else { + memset(map_data_column.data() + null_map_index, 0, run_length); + null_map_index += run_length; + } + is_null = !is_null; + } + } else { + for (auto& run_length : run_length_null_map) { + if (is_null) { + _num_nulls += run_length; + } + is_null = !is_null; + } + } + } + return Status::OK(); + } size_t num_values() const { return _num_values; } @@ -87,24 +192,8 @@ class ColumnSelectVector { size_t num_filtered() const { return _num_filtered; } - double filter_ratio() const { return _has_filter ? _filter_ratio : 0; } - - void fallback_filter() { _has_filter = false; } - bool has_filter() const { return _has_filter; } - bool can_filter_all(size_t remaining_num_values); - - bool filter_all() const { return _filter_all; } - - void skip(size_t num_values); - - void reset() { - if (_has_filter) { - _filter_map_index = 0; - } - } - template size_t get_next_run(DataReadType* data_read_type) { DCHECK_EQ(_has_filter, has_filter); @@ -137,22 +226,11 @@ class ColumnSelectVector { } } - void set_run_length_null_map(const std::vector& run_length_null_map, - size_t num_values, NullMap* null_map = nullptr); - private: std::vector _data_map; // the length of non-null values and null values are arranged in turn. const std::vector* _run_length_null_map; - bool _has_filter = false; - // only used when the whole batch is skipped - bool _filter_all = false; - const uint8_t* _filter_map = nullptr; - size_t _filter_map_size = 0; - double _filter_ratio = 0; - size_t _filter_map_index = 0; - - // generated in set_run_length_null_map + bool _has_filter; size_t _num_values; size_t _num_nulls; size_t _num_filtered; diff --git a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp index 11fec1d5a79042..0291625eb79a6f 100644 --- a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp @@ -240,7 +240,7 @@ Status ScalarColumnReader::_skip_values(size_t num_values) { } Status ScalarColumnReader::_read_values(size_t num_values, ColumnPtr& doris_column, - DataTypePtr& type, ColumnSelectVector& select_vector, + DataTypePtr& type, FilterMap& filter_map, bool is_dict_filter) { if (num_values == 0) { return Status::OK(); @@ -303,9 +303,12 @@ Status ScalarColumnReader::_read_values(size_t num_values, ColumnPtr& doris_colu } null_map.emplace_back((u_short)remaining); } + ColumnSelectVector select_vector; { SCOPED_RAW_TIMER(&_decode_null_map_time); - select_vector.set_run_length_null_map(null_map, num_values, map_data_column); + RETURN_IF_ERROR(select_vector.init(null_map, num_values, map_data_column, &filter_map, + _filter_map_index)); + _filter_map_index += num_values; } return _chunk_reader->decode_values(data_column, type, select_vector, is_dict_filter); } @@ -316,9 +319,15 @@ Status ScalarColumnReader::_read_values(size_t num_values, ColumnPtr& doris_colu * whether the reader should read the remaining value of the last row in previous page. */ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, + FilterMap& filter_map, size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter, - bool align_rows = false) { + bool align_rows) { + std::unique_ptr nested_filter_map; + std::unique_ptr> nested_filter_map_data; + + size_t current_row; + + FilterMap* current_filter_map = &filter_map; size_t origin_size = 0; if (align_rows) { origin_size = _rep_levels.size(); @@ -348,13 +357,25 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType _rep_levels.emplace_back(rep_level); remaining_values--; } + + if (filter_map.has_filter()) { + nested_filter_map_data = std::make_unique>(); + nested_filter_map_data->resize(_rep_levels.size()); + current_row = _orig_filter_map_index; + RETURN_IF_ERROR(filter_map.generate_nested_filter_map( + _rep_levels, *nested_filter_map_data, &nested_filter_map, ¤t_row, false, + 0)); + current_filter_map = nested_filter_map.get(); + } } else if (!align_rows) { // case : required child columns in struct type parsed_rows = std::min(remaining_values, batch_size); remaining_values -= parsed_rows; _rep_levels.resize(parsed_rows, 0); } + size_t parsed_values = _chunk_reader->remaining_num_values() - remaining_values; + _def_levels.resize(origin_size + parsed_values); if (has_def_level) { _chunk_reader->def_level_decoder().get_levels(&_def_levels[origin_size], parsed_values); @@ -377,10 +398,14 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } data_column = doris_column->assume_mutable(); } + size_t has_read = origin_size; size_t ancestor_nulls = 0; + size_t null_size = 0; + size_t nonnull_size = 0; null_map.emplace_back(0); bool prev_is_null = false; + while (has_read < origin_size + parsed_values) { level_t def_level = _def_levels[has_read++]; size_t loop_read = 1; @@ -388,16 +413,20 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType has_read++; loop_read++; } + if (def_level < _field_schema->repeated_parent_def_level) { - // when def_level is less than repeated_parent_def_level, it means that level - // will affect its ancestor. ancestor_nulls += loop_read; continue; } + bool is_null = def_level < _field_schema->definition_level; + if (is_null) { + null_size += loop_read; + } else { + nonnull_size += loop_read; + } + if (prev_is_null == is_null && (USHRT_MAX - null_map.back() >= loop_read)) { - // If whether the values are nullable in current loop is the same the previous values, - // we can save the memory usage in null map null_map.back() += loop_read; } else { if (!(prev_is_null ^ is_null)) { @@ -415,29 +444,74 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } size_t num_values = parsed_values - ancestor_nulls; - { - SCOPED_RAW_TIMER(&_decode_null_map_time); - select_vector.set_run_length_null_map(null_map, num_values, map_data_column); - } - RETURN_IF_ERROR(_chunk_reader->decode_values(data_column, type, select_vector, is_dict_filter)); - if (ancestor_nulls != 0) { - RETURN_IF_ERROR(_chunk_reader->skip_values(ancestor_nulls, false)); + + if (current_filter_map->filter_all()) { + if (null_size > 0) { + RETURN_IF_ERROR(_chunk_reader->skip_values(null_size, false)); + } + if (nonnull_size > 0) { + RETURN_IF_ERROR(_chunk_reader->skip_values(nonnull_size, true)); + } + if (ancestor_nulls != 0) { + RETURN_IF_ERROR(_chunk_reader->skip_values(ancestor_nulls, false)); + } + } else { + ColumnSelectVector select_vector; + { + SCOPED_RAW_TIMER(&_decode_null_map_time); + RETURN_IF_ERROR( + select_vector.init(null_map, num_values, map_data_column, current_filter_map, + nested_filter_map_data ? origin_size : _filter_map_index)); + } + + RETURN_IF_ERROR( + _chunk_reader->decode_values(data_column, type, select_vector, is_dict_filter)); + if (ancestor_nulls != 0) { + RETURN_IF_ERROR(_chunk_reader->skip_values(ancestor_nulls, false)); + } } if (!align_rows) { *read_rows = parsed_rows; } + _filter_map_index += parsed_values; if (_chunk_reader->remaining_num_values() == 0) { if (_chunk_reader->has_next_page()) { RETURN_IF_ERROR(_chunk_reader->next_page()); RETURN_IF_ERROR(_chunk_reader->load_page_data()); - select_vector.reset(); - return _read_nested_column(doris_column, type, select_vector, 0, read_rows, eof, + return _read_nested_column(doris_column, type, filter_map, 0, read_rows, eof, is_dict_filter, true); } else { *eof = true; } } + + if (current_filter_map->has_filter()) { + if (current_filter_map->filter_all()) { + _rep_levels.resize(0); + _def_levels.resize(0); + } else { + std::vector filtered_rep_levels; + std::vector filtered_def_levels; + filtered_rep_levels.reserve(_rep_levels.size()); + filtered_def_levels.reserve(_def_levels.size()); + + const uint8_t* filter_map_data = current_filter_map->filter_map_data(); + + for (size_t i = 0; i < _rep_levels.size(); i++) { + if (filter_map_data[i]) { + filtered_rep_levels.push_back(_rep_levels[i]); + filtered_def_levels.push_back(_def_levels[i]); + } + } + + _rep_levels = std::move(filtered_rep_levels); + _def_levels = std::move(filtered_def_levels); + } + } + + _orig_filter_map_index = current_row + 1; + if (_rep_levels.size() > 0) { // make sure the rows of complex type are aligned correctly, // so the repetition level of first element should be 0, meaning a new row is started. @@ -445,6 +519,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } return Status::OK(); } + Status ScalarColumnReader::read_dict_values_to_column(MutableColumnPtr& doris_column, bool* has_dict) { bool loaded; @@ -476,7 +551,7 @@ Status ScalarColumnReader::_try_load_dict_page(bool* loaded, bool* has_dict) { } Status ScalarColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, + FilterMap& filter_map, size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter) { if (_converter == nullptr) { _converter = parquet::PhysicalToLogicalConverter::get_converter( @@ -501,8 +576,8 @@ Status ScalarColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr } if (_nested_column) { RETURN_IF_ERROR(_chunk_reader->load_page_data_idempotent()); - RETURN_IF_ERROR(_read_nested_column(resolved_column, resolved_type, select_vector, - batch_size, read_rows, eof, is_dict_filter)); + RETURN_IF_ERROR(_read_nested_column(resolved_column, resolved_type, filter_map, + batch_size, read_rows, eof, is_dict_filter, false)); break; } @@ -520,16 +595,16 @@ Status ScalarColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr bool skip_whole_batch = false; // Determining whether to skip page or batch will increase the calculation time. // When the filtering effect is greater than 60%, it is possible to skip the page or batch. - if (select_vector.has_filter() && select_vector.filter_ratio() > 0.6) { + if (filter_map.has_filter() && filter_map.filter_ratio() > 0.6) { // lazy read size_t remaining_num_values = 0; for (auto& range : read_ranges) { remaining_num_values += range.last_row - range.first_row; } if (batch_size >= remaining_num_values && - select_vector.can_filter_all(remaining_num_values)) { + filter_map.can_filter_all(remaining_num_values, _filter_map_index)) { // We can skip the whole page if the remaining values is filtered by predicate columns - select_vector.skip(remaining_num_values); + _filter_map_index += remaining_num_values; _current_row_index += _chunk_reader->remaining_num_values(); RETURN_IF_ERROR(_chunk_reader->skip_page()); *read_rows = remaining_num_values; @@ -539,9 +614,9 @@ Status ScalarColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr break; } skip_whole_batch = batch_size <= remaining_num_values && - select_vector.can_filter_all(batch_size); + filter_map.can_filter_all(batch_size, _filter_map_index); if (skip_whole_batch) { - select_vector.skip(batch_size); + _filter_map_index += batch_size; } } // load page data to decode or skip values @@ -559,7 +634,7 @@ Status ScalarColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr RETURN_IF_ERROR(_skip_values(read_values)); } else { RETURN_IF_ERROR(_read_values(read_values, resolved_column, resolved_type, - select_vector, is_dict_filter)); + filter_map, is_dict_filter)); } has_read += read_values; _current_row_index += read_values; @@ -587,7 +662,7 @@ Status ArrayColumnReader::init(std::unique_ptr element_read } Status ArrayColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, + FilterMap& filter_map, size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter) { MutableColumnPtr data_column; NullMap* null_map_ptr = nullptr; @@ -613,7 +688,7 @@ Status ArrayColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& (reinterpret_cast(remove_nullable(type).get())) ->get_nested_type()); // read nested column - RETURN_IF_ERROR(_element_reader->read_column_data(element_column, element_type, select_vector, + RETURN_IF_ERROR(_element_reader->read_column_data(element_column, element_type, filter_map, batch_size, read_rows, eof, is_dict_filter)); if (*read_rows == 0) { return Status::OK(); @@ -638,7 +713,7 @@ Status MapColumnReader::init(std::unique_ptr key_reader, } Status MapColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, + FilterMap& filter_map, size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter) { MutableColumnPtr data_column; NullMap* null_map_ptr = nullptr; @@ -671,12 +746,12 @@ Status MapColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& t size_t value_rows = 0; bool key_eof = false; bool value_eof = false; - RETURN_IF_ERROR(_key_reader->read_column_data(key_column, key_type, select_vector, batch_size, + RETURN_IF_ERROR(_key_reader->read_column_data(key_column, key_type, filter_map, batch_size, &key_rows, &key_eof, is_dict_filter)); + while (value_rows < key_rows && !value_eof) { size_t loop_rows = 0; - select_vector.reset(); - RETURN_IF_ERROR(_value_reader->read_column_data(value_column, value_type, select_vector, + RETURN_IF_ERROR(_value_reader->read_column_data(value_column, value_type, filter_map, key_rows - value_rows, &loop_rows, &value_eof, is_dict_filter)); value_rows += loop_rows; @@ -707,7 +782,7 @@ Status StructColumnReader::init( return Status::OK(); } Status StructColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, + FilterMap& filter_map, size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter) { MutableColumnPtr data_column; NullMap* null_map_ptr = nullptr; @@ -750,22 +825,21 @@ Status StructColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr _read_column_names.insert(doris_name); - select_vector.reset(); + // select_vector.reset(); size_t field_rows = 0; bool field_eof = false; if (not_missing_column_id == -1) { not_missing_column_id = i; RETURN_IF_ERROR(_child_readers[doris_name]->read_column_data( - doris_field, doris_type, select_vector, batch_size, &field_rows, &field_eof, + doris_field, doris_type, filter_map, batch_size, &field_rows, &field_eof, is_dict_filter)); *read_rows = field_rows; *eof = field_eof; } else { while (field_rows < *read_rows && !field_eof) { size_t loop_rows = 0; - select_vector.reset(); RETURN_IF_ERROR(_child_readers[doris_name]->read_column_data( - doris_field, doris_type, select_vector, *read_rows - field_rows, &loop_rows, + doris_field, doris_type, filter_map, *read_rows - field_rows, &loop_rows, &field_eof, is_dict_filter)); field_rows += loop_rows; } diff --git a/be/src/vec/exec/format/parquet/vparquet_column_reader.h b/be/src/vec/exec/format/parquet/vparquet_column_reader.h index a8062d2d9f9b7c..c6bc9f9157b431 100644 --- a/be/src/vec/exec/format/parquet/vparquet_column_reader.h +++ b/be/src/vec/exec/format/parquet/vparquet_column_reader.h @@ -121,8 +121,8 @@ class ParquetColumnReader { : _row_ranges(row_ranges), _ctz(ctz), _io_ctx(io_ctx) {} virtual ~ParquetColumnReader() = default; virtual Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, - size_t* read_rows, bool* eof, bool is_dict_filter) = 0; + FilterMap& filter_map, size_t batch_size, size_t* read_rows, + bool* eof, bool is_dict_filter) = 0; virtual Status read_dict_values_to_column(MutableColumnPtr& doris_column, bool* has_dict) { return Status::NotSupported("read_dict_values_to_column is not supported"); @@ -144,6 +144,8 @@ class ParquetColumnReader { virtual Statistics statistics() = 0; virtual void close() = 0; + virtual void reset_filter_map_index() = 0; + protected: void _generate_read_ranges(int64_t start_index, int64_t end_index, std::list& read_ranges); @@ -157,6 +159,8 @@ class ParquetColumnReader { int64_t _current_row_index = 0; int _row_range_index = 0; int64_t _decode_null_map_time = 0; + + size_t _filter_map_index = 0; }; class ScalarColumnReader : public ParquetColumnReader { @@ -171,9 +175,9 @@ class ScalarColumnReader : public ParquetColumnReader { _offset_index(offset_index) {} ~ScalarColumnReader() override { close(); } Status init(io::FileReaderSPtr file, FieldSchema* field, size_t max_buf_size); - Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, size_t* read_rows, - bool* eof, bool is_dict_filter) override; + Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, FilterMap& filter_map, + size_t batch_size, size_t* read_rows, bool* eof, + bool is_dict_filter) override; Status read_dict_values_to_column(MutableColumnPtr& doris_column, bool* has_dict) override; MutableColumnPtr convert_dict_column_to_string_column(const ColumnInt32* dict_column) override; const std::vector& get_rep_level() const override { return _rep_levels; } @@ -184,6 +188,11 @@ class ScalarColumnReader : public ParquetColumnReader { } void close() override {} + void reset_filter_map_index() override { + _filter_map_index = 0; // nested + _orig_filter_map_index = 0; + } + private: tparquet::ColumnChunk _chunk_meta; const tparquet::OffsetIndex* _offset_index; @@ -192,13 +201,14 @@ class ScalarColumnReader : public ParquetColumnReader { std::vector _rep_levels; std::vector _def_levels; std::unique_ptr _converter = nullptr; + size_t _orig_filter_map_index = 0; Status _skip_values(size_t num_values); Status _read_values(size_t num_values, ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, bool is_dict_filter); - Status _read_nested_column(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, - size_t* read_rows, bool* eof, bool is_dict_filter, bool align_rows); + FilterMap& filter_map, bool is_dict_filter); + Status _read_nested_column(ColumnPtr& doris_column, DataTypePtr& type, FilterMap& filter_map, + size_t batch_size, size_t* read_rows, bool* eof, bool is_dict_filter, + bool align_rows); Status _try_load_dict_page(bool* loaded, bool* has_dict); }; @@ -210,9 +220,9 @@ class ArrayColumnReader : public ParquetColumnReader { : ParquetColumnReader(row_ranges, ctz, io_ctx) {} ~ArrayColumnReader() override { close(); } Status init(std::unique_ptr element_reader, FieldSchema* field); - Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, size_t* read_rows, - bool* eof, bool is_dict_filter) override; + Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, FilterMap& filter_map, + size_t batch_size, size_t* read_rows, bool* eof, + bool is_dict_filter) override; const std::vector& get_rep_level() const override { return _element_reader->get_rep_level(); } @@ -222,6 +232,8 @@ class ArrayColumnReader : public ParquetColumnReader { Statistics statistics() override { return _element_reader->statistics(); } void close() override {} + void reset_filter_map_index() override { _element_reader->reset_filter_map_index(); } + private: std::unique_ptr _element_reader; }; @@ -236,9 +248,9 @@ class MapColumnReader : public ParquetColumnReader { Status init(std::unique_ptr key_reader, std::unique_ptr value_reader, FieldSchema* field); - Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, size_t* read_rows, - bool* eof, bool is_dict_filter) override; + Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, FilterMap& filter_map, + size_t batch_size, size_t* read_rows, bool* eof, + bool is_dict_filter) override; const std::vector& get_rep_level() const override { return _key_reader->get_rep_level(); @@ -256,6 +268,11 @@ class MapColumnReader : public ParquetColumnReader { void close() override {} + void reset_filter_map_index() override { + _key_reader->reset_filter_map_index(); + _value_reader->reset_filter_map_index(); + } + private: std::unique_ptr _key_reader; std::unique_ptr _value_reader; @@ -272,9 +289,9 @@ class StructColumnReader : public ParquetColumnReader { Status init( std::unordered_map>&& child_readers, FieldSchema* field); - Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, - ColumnSelectVector& select_vector, size_t batch_size, size_t* read_rows, - bool* eof, bool is_dict_filter) override; + Status read_column_data(ColumnPtr& doris_column, DataTypePtr& type, FilterMap& filter_map, + size_t batch_size, size_t* read_rows, bool* eof, + bool is_dict_filter) override; const std::vector& get_rep_level() const override { if (!_read_column_names.empty()) { @@ -306,6 +323,12 @@ class StructColumnReader : public ParquetColumnReader { void close() override {} + void reset_filter_map_index() override { + for (const auto& reader : _child_readers) { + reader.second->reset_filter_map_index(); + } + } + private: std::unordered_map> _child_readers; std::set _read_column_names; diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp index b9259be936bb31..a9854b53f3beec 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp @@ -317,9 +317,9 @@ Status RowGroupReader::next_batch(Block* block, size_t batch_size, size_t* read_ // call _do_lazy_read recursively when current batch is skipped return _do_lazy_read(block, batch_size, read_rows, batch_eof); } else { - ColumnSelectVector run_length_vector; + FilterMap filter_map; RETURN_IF_ERROR(_read_column_data(block, _lazy_read_ctx.all_read_columns, batch_size, - read_rows, batch_eof, run_length_vector)); + read_rows, batch_eof, filter_map)); RETURN_IF_ERROR( _fill_partition_columns(block, *read_rows, _lazy_read_ctx.partition_columns)); RETURN_IF_ERROR(_fill_missing_columns(block, *read_rows, _lazy_read_ctx.missing_columns)); @@ -389,7 +389,7 @@ void RowGroupReader::_merge_read_ranges(std::vector& row_ranges) { Status RowGroupReader::_read_column_data(Block* block, const std::vector& columns, size_t batch_size, size_t* read_rows, bool* batch_eof, - ColumnSelectVector& select_vector) { + FilterMap& filter_map) { size_t batch_read_rows = 0; bool has_eof = false; for (auto& read_col_name : columns) { @@ -420,11 +420,12 @@ Status RowGroupReader::_read_column_data(Block* block, const std::vectorreset_filter_map_index(); while (!col_eof && col_read_rows < batch_size) { size_t loop_rows = 0; RETURN_IF_ERROR(_column_readers[read_col_name]->read_column_data( - column_ptr, column_type, select_vector, batch_size - col_read_rows, &loop_rows, + column_ptr, column_type, filter_map, batch_size - col_read_rows, &loop_rows, &col_eof, is_dict_filter)); col_read_rows += loop_rows; } @@ -445,7 +446,7 @@ Status RowGroupReader::_read_column_data(Block* block, const std::vector select_vector_ptr = nullptr; + std::unique_ptr filter_map_ptr = nullptr; size_t pre_read_rows; bool pre_eof; std::vector columns_to_filter; @@ -460,9 +461,9 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re // read predicate columns pre_read_rows = 0; pre_eof = false; - ColumnSelectVector run_length_vector; + FilterMap filter_map; RETURN_IF_ERROR(_read_column_data(block, _lazy_read_ctx.predicate_columns.first, batch_size, - &pre_read_rows, &pre_eof, run_length_vector)); + &pre_read_rows, &pre_eof, filter_map)); if (pre_read_rows == 0) { DCHECK_EQ(pre_eof, true); break; @@ -504,9 +505,10 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re block->get_by_position(0).column->assume_mutable()->clear(); } - const uint8_t* __restrict filter_map = result_filter.data(); - select_vector_ptr.reset(new ColumnSelectVector(filter_map, pre_read_rows, can_filter_all)); - if (select_vector_ptr->filter_all()) { + const uint8_t* __restrict filter_map_data = result_filter.data(); + filter_map_ptr.reset(new FilterMap()); + RETURN_IF_ERROR(filter_map_ptr->init(filter_map_data, pre_read_rows, can_filter_all)); + if (filter_map_ptr->filter_all()) { for (auto& col : _lazy_read_ctx.predicate_columns.first) { // clean block to read predicate columns block->get_by_name(col).column->assume_mutable()->clear(); @@ -526,7 +528,7 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re // If continuous batches are skipped, we can cache them to skip a whole page _cached_filtered_rows += pre_read_rows; } else { // pre_eof - // If select_vector_ptr->filter_all() and pre_eof, we can skip whole row group. + // If filter_map_ptr->filter_all() and pre_eof, we can skip whole row group. *read_rows = 0; *batch_eof = true; _lazy_read_filtered_rows += pre_read_rows; @@ -541,17 +543,17 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re return Status::Cancelled("cancelled"); } - if (select_vector_ptr == nullptr) { + if (filter_map_ptr == nullptr) { DCHECK_EQ(pre_read_rows + _cached_filtered_rows, 0); *read_rows = 0; *batch_eof = true; return Status::OK(); } - ColumnSelectVector& select_vector = *select_vector_ptr; + FilterMap& filter_map = *filter_map_ptr; std::unique_ptr rebuild_filter_map = nullptr; if (_cached_filtered_rows != 0) { - _rebuild_select_vector(select_vector, rebuild_filter_map, pre_read_rows); + RETURN_IF_ERROR(_rebuild_filter_map(filter_map, rebuild_filter_map, pre_read_rows)); pre_read_rows += _cached_filtered_rows; _cached_filtered_rows = 0; } @@ -560,7 +562,8 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re size_t lazy_read_rows; bool lazy_eof; RETURN_IF_ERROR(_read_column_data(block, _lazy_read_ctx.lazy_read_columns, pre_read_rows, - &lazy_read_rows, &lazy_eof, select_vector)); + &lazy_read_rows, &lazy_eof, filter_map)); + if (pre_read_rows != lazy_read_rows) { return Status::Corruption("Can't read the same number of rows when doing lazy read"); } @@ -568,7 +571,7 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re // we set pre_read_rows as batch_size for lazy read columns, so pre_eof != lazy_eof // filter data in predicate columns, and remove filter column - if (select_vector.has_filter()) { + if (filter_map.has_filter()) { if (block->columns() == origin_column_num) { // the whole row group has been filtered by _lazy_read_ctx.vconjunct_ctx, and batch_eof is // generated from next batch, so the filter column is removed ahead. @@ -613,24 +616,24 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re return Status::OK(); } -void RowGroupReader::_rebuild_select_vector(ColumnSelectVector& select_vector, - std::unique_ptr& filter_map, - size_t pre_read_rows) const { +Status RowGroupReader::_rebuild_filter_map(FilterMap& filter_map, + std::unique_ptr& filter_map_data, + size_t pre_read_rows) const { if (_cached_filtered_rows == 0) { - return; + return Status::OK(); } size_t total_rows = _cached_filtered_rows + pre_read_rows; - if (select_vector.filter_all()) { - select_vector.build(nullptr, total_rows, true); - return; + if (filter_map.filter_all()) { + RETURN_IF_ERROR(filter_map.init(nullptr, total_rows, true)); + return Status::OK(); } uint8_t* map = new uint8_t[total_rows]; - filter_map.reset(map); + filter_map_data.reset(map); for (size_t i = 0; i < _cached_filtered_rows; ++i) { map[i] = 0; } - const uint8_t* old_map = select_vector.filter_map(); + const uint8_t* old_map = filter_map.filter_map_data(); if (old_map == nullptr) { // select_vector.filter_all() == true is already built. for (size_t i = _cached_filtered_rows; i < total_rows; ++i) { @@ -639,7 +642,8 @@ void RowGroupReader::_rebuild_select_vector(ColumnSelectVector& select_vector, } else { memcpy(map + _cached_filtered_rows, old_map, pre_read_rows); } - select_vector.build(map, total_rows, false); + RETURN_IF_ERROR(filter_map.init(map, total_rows, false)); + return Status::OK(); } Status RowGroupReader::_fill_partition_columns( diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.h b/be/src/vec/exec/format/parquet/vparquet_group_reader.h index a889c1774ea126..f73e9ebe09eee6 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.h +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.h @@ -175,10 +175,10 @@ class RowGroupReader : public ProfileCollector { Status _read_empty_batch(size_t batch_size, size_t* read_rows, bool* batch_eof); Status _read_column_data(Block* block, const std::vector& columns, size_t batch_size, size_t* read_rows, bool* batch_eof, - ColumnSelectVector& select_vector); + FilterMap& filter_map); Status _do_lazy_read(Block* block, size_t batch_size, size_t* read_rows, bool* batch_eof); - void _rebuild_select_vector(ColumnSelectVector& select_vector, - std::unique_ptr& filter_map, size_t pre_read_rows) const; + Status _rebuild_filter_map(FilterMap& filter_map, std::unique_ptr& filter_map_data, + size_t pre_read_rows) const; Status _fill_partition_columns( Block* block, size_t rows, const std::unordered_map>& diff --git a/be/src/vec/exec/format/parquet/vparquet_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_reader.cpp index 47209dbb332cb8..99db918afb6d0b 100644 --- a/be/src/vec/exec/format/parquet/vparquet_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_reader.cpp @@ -477,8 +477,7 @@ Status ParquetReader::set_fill_columns( } } - if (!_lazy_read_ctx.has_complex_type && _enable_lazy_mat && - _lazy_read_ctx.predicate_columns.first.size() > 0 && + if (_enable_lazy_mat && _lazy_read_ctx.predicate_columns.first.size() > 0 && _lazy_read_ctx.lazy_read_columns.size() > 0) { _lazy_read_ctx.can_lazy_read = true; } From 4672c2689c66460bf81893a7e4fd0539f8aa66bc Mon Sep 17 00:00:00 2001 From: kakachen Date: Tue, 19 Nov 2024 00:38:41 +0800 Subject: [PATCH 2/5] Disable dict filter when have non-single slot filter conjuncts. --- .../format/parquet/vparquet_group_reader.cpp | 32 ++++--------------- .../format/parquet/vparquet_group_reader.h | 1 - 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp index a9854b53f3beec..c93b5c6fbad2e1 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp @@ -109,11 +109,6 @@ Status RowGroupReader::init( _tuple_descriptor = tuple_descriptor; _row_descriptor = row_descriptor; _col_name_to_slot_id = colname_to_slot_id; - if (not_single_slot_filter_conjuncts != nullptr && !not_single_slot_filter_conjuncts->empty()) { - _not_single_slot_filter_conjuncts.insert(_not_single_slot_filter_conjuncts.end(), - not_single_slot_filter_conjuncts->begin(), - not_single_slot_filter_conjuncts->end()); - } _slot_id_to_filter_conjuncts = slot_id_to_filter_conjuncts; _merge_read_ranges(row_ranges); if (_read_columns.empty()) { @@ -141,6 +136,11 @@ Status RowGroupReader::init( _column_readers[read_col] = std::move(reader); } // Check if single slot can be filtered by dict. + if (not_single_slot_filter_conjuncts != nullptr && !not_single_slot_filter_conjuncts->empty()) { + _filter_conjuncts.insert(_filter_conjuncts.end(), not_single_slot_filter_conjuncts->begin(), + not_single_slot_filter_conjuncts->end()); + return Status::OK(); + } if (!_slot_id_to_filter_conjuncts) { return Status::OK(); } @@ -363,17 +363,8 @@ Status RowGroupReader::next_batch(Block* block, size_t batch_size, size_t* read_ RETURN_IF_CATCH_EXCEPTION( Block::filter_block_internal(block, columns_to_filter, result_filter)); - if (!_not_single_slot_filter_conjuncts.empty()) { - _convert_dict_cols_to_string_cols(block); - SCOPED_RAW_TIMER(&_predicate_filter_time); - RETURN_IF_CATCH_EXCEPTION( - RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block( - _not_single_slot_filter_conjuncts, block, columns_to_filter, - column_to_keep))); - } else { - Block::erase_useless_column(block, column_to_keep); - _convert_dict_cols_to_string_cols(block); - } + Block::erase_useless_column(block, column_to_keep); + _convert_dict_cols_to_string_cols(block); } else { RETURN_IF_CATCH_EXCEPTION( RETURN_IF_ERROR(_filter_block(block, column_to_keep, columns_to_filter))); @@ -604,15 +595,6 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re *batch_eof = pre_eof; RETURN_IF_ERROR(_fill_partition_columns(block, column_size, _lazy_read_ctx.partition_columns)); RETURN_IF_ERROR(_fill_missing_columns(block, column_size, _lazy_read_ctx.missing_columns)); - if (!_not_single_slot_filter_conjuncts.empty()) { - { - SCOPED_RAW_TIMER(&_predicate_filter_time); - RETURN_IF_CATCH_EXCEPTION( - RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block( - _not_single_slot_filter_conjuncts, block, columns_to_filter, - origin_column_num))); - } - } return Status::OK(); } diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.h b/be/src/vec/exec/format/parquet/vparquet_group_reader.h index f73e9ebe09eee6..8106241014ba63 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.h +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.h @@ -220,7 +220,6 @@ class RowGroupReader : public ProfileCollector { const TupleDescriptor* _tuple_descriptor = nullptr; const RowDescriptor* _row_descriptor = nullptr; const std::unordered_map* _col_name_to_slot_id = nullptr; - VExprContextSPtrs _not_single_slot_filter_conjuncts; const std::unordered_map* _slot_id_to_filter_conjuncts = nullptr; VExprContextSPtrs _dict_filter_conjuncts; VExprContextSPtrs _filter_conjuncts; From 7d1f80413e89ed2aaff44d0b462bd9735f4f4ee2 Mon Sep 17 00:00:00 2001 From: kakachen Date: Thu, 21 Nov 2024 21:36:52 +0800 Subject: [PATCH 3/5] opt source code and add tests. --- .../exec/format/parquet/parquet_common.cpp | 16 +- .../vec/exec/format/parquet/parquet_common.h | 4 +- .../format/parquet/vparquet_column_reader.cpp | 43 +- .../format/parquet/vparquet_column_reader.h | 1 + .../vec/exec/parquet/parquet_common_test.cpp | 457 +++++++++ .../parquet_nested_type_cross_page_test.cpp | 179 ++++ .../vec/exec/parquet/parquet_thrift_test.cpp | 8 +- .../parquet_nested_types/create_table.hql | 42 + .../parquet_nested_types/data.tar.gz | Bin 0 -> 35305 bytes .../nested_cross_page_test1.py | 192 ++++ .../nested_cross_page_test2.py | 287 ++++++ .../multi_catalog/parquet_nested_types/run.sh | 12 + .../hive/test_parquet_nested_types.out | 913 ++++++++++++++++++ .../hive/test_parquet_nested_types.groovy | 154 +++ 14 files changed, 2277 insertions(+), 31 deletions(-) create mode 100644 be/test/vec/exec/parquet/parquet_common_test.cpp create mode 100644 be/test/vec/exec/parquet/parquet_nested_type_cross_page_test.cpp create mode 100644 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql create mode 100644 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data.tar.gz create mode 100644 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test1.py create mode 100644 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test2.py create mode 100755 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/run.sh create mode 100644 regression-test/data/external_table_p0/hive/test_parquet_nested_types.out create mode 100644 regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy diff --git a/be/src/vec/exec/format/parquet/parquet_common.cpp b/be/src/vec/exec/format/parquet/parquet_common.cpp index 09613b9dc86794..f71f511edd30ce 100644 --- a/be/src/vec/exec/format/parquet/parquet_common.cpp +++ b/be/src/vec/exec/format/parquet/parquet_common.cpp @@ -78,11 +78,11 @@ bool FilterMap::can_filter_all(size_t remaining_num_values, size_t filter_map_in Status FilterMap::generate_nested_filter_map(const std::vector& rep_levels, std::vector& nested_filter_map_data, std::unique_ptr* nested_filter_map, - size_t* current_row_ptr, bool is_cross_page, - size_t start_index) const { + size_t* current_row_ptr, size_t start_index) const { if (!has_filter() || filter_all()) { - *nested_filter_map = std::make_unique(); - return Status::OK(); + return Status::InternalError(fmt::format( + "FilterMap::generate_nested_filter_map failed: has_filter={}, filter_all={}", + has_filter(), filter_all())); } if (rep_levels.empty()) { @@ -94,12 +94,12 @@ Status FilterMap::generate_nested_filter_map(const std::vector& rep_lev size_t current_row = current_row_ptr ? *current_row_ptr : 0; for (size_t i = start_index; i < rep_levels.size(); i++) { - if (!is_cross_page && i > start_index && rep_levels[i] == 0) { + if (i != start_index && rep_levels[i] == 0) { current_row++; if (current_row >= _filter_map_size) { - return Status::InvalidArgument( - fmt::format("Filter map size {} is not enough for {} rows", - _filter_map_size, current_row + 1)); + return Status::InvalidArgument(fmt::format( + "current_row >= _filter_map_size. current_row: {}, _filter_map_size: {}", + current_row, _filter_map_size)); } } nested_filter_map_data[i] = _filter_map_data[current_row]; diff --git a/be/src/vec/exec/format/parquet/parquet_common.h b/be/src/vec/exec/format/parquet/parquet_common.h index deb0a867229f66..cb156e380569ea 100644 --- a/be/src/vec/exec/format/parquet/parquet_common.h +++ b/be/src/vec/exec/format/parquet/parquet_common.h @@ -77,9 +77,7 @@ class FilterMap { Status generate_nested_filter_map(const std::vector& rep_levels, std::vector& nested_filter_map_data, std::unique_ptr* nested_filter_map, - size_t* current_row_ptr, // 当前处理到哪一行 - bool is_cross_page, // 是否是跨页的情况 - size_t start_index = 0) const; // rep_levels的起始处理位置 + size_t* current_row_ptr, size_t start_index = 0) const; const uint8_t* filter_map_data() const { return _filter_map_data; } size_t filter_map_size() const { return _filter_map_size; } diff --git a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp index 0291625eb79a6f..d0afba3a0a3864 100644 --- a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp @@ -323,9 +323,6 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType size_t* read_rows, bool* eof, bool is_dict_filter, bool align_rows) { std::unique_ptr nested_filter_map; - std::unique_ptr> nested_filter_map_data; - - size_t current_row; FilterMap* current_filter_map = &filter_map; size_t origin_size = 0; @@ -337,17 +334,22 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } else { _rep_levels.resize(0); _def_levels.resize(0); + if (_nested_filter_map_data) { + _nested_filter_map_data->resize(0); + } } size_t parsed_rows = 0; size_t remaining_values = _chunk_reader->remaining_num_values(); bool has_rep_level = _chunk_reader->max_rep_level() > 0; bool has_def_level = _chunk_reader->max_def_level() > 0; + // Handle repetition levels (indicates nesting structure) if (has_rep_level) { LevelDecoder& rep_decoder = _chunk_reader->rep_level_decoder(); + // Read repetition levels until batch is full or no more values while (parsed_rows <= batch_size && remaining_values > 0) { level_t rep_level = rep_decoder.get_next(); - if (rep_level == 0) { + if (rep_level == 0) { // rep_level 0 indicates start of new row if (parsed_rows == batch_size) { rep_decoder.rewind_one(); break; @@ -358,13 +360,15 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType remaining_values--; } - if (filter_map.has_filter()) { - nested_filter_map_data = std::make_unique>(); - nested_filter_map_data->resize(_rep_levels.size()); - current_row = _orig_filter_map_index; + // Generate nested filter map + if (filter_map.has_filter() && (!filter_map.filter_all())) { + if (_nested_filter_map_data == nullptr) { + _nested_filter_map_data.reset(new std::vector()); + } RETURN_IF_ERROR(filter_map.generate_nested_filter_map( - _rep_levels, *nested_filter_map_data, &nested_filter_map, ¤t_row, false, - 0)); + _rep_levels, *_nested_filter_map_data, &nested_filter_map, + &_orig_filter_map_index, origin_size)); + // Update current_filter_map to nested_filter_map current_filter_map = nested_filter_map.get(); } } else if (!align_rows) { @@ -374,8 +378,8 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType _rep_levels.resize(parsed_rows, 0); } + // Process definition levels (indicates null values) size_t parsed_values = _chunk_reader->remaining_num_values() - remaining_values; - _def_levels.resize(origin_size + parsed_values); if (has_def_level) { _chunk_reader->def_level_decoder().get_levels(&_def_levels[origin_size], parsed_values); @@ -383,6 +387,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType std::fill(_def_levels.begin() + origin_size, _def_levels.end(), 0); } + // Handle nullable columns MutableColumnPtr data_column; std::vector null_map; NullMap* map_data_column = nullptr; @@ -399,6 +404,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType data_column = doris_column->assume_mutable(); } + // Process definition levels to build null map size_t has_read = origin_size; size_t ancestor_nulls = 0; size_t null_size = 0; @@ -445,7 +451,9 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType size_t num_values = parsed_values - ancestor_nulls; + // Handle filtered values if (current_filter_map->filter_all()) { + // Skip all values if everything is filtered if (null_size > 0) { RETURN_IF_ERROR(_chunk_reader->skip_values(null_size, false)); } @@ -461,7 +469,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType SCOPED_RAW_TIMER(&_decode_null_map_time); RETURN_IF_ERROR( select_vector.init(null_map, num_values, map_data_column, current_filter_map, - nested_filter_map_data ? origin_size : _filter_map_index)); + _nested_filter_map_data ? origin_size : _filter_map_index)); } RETURN_IF_ERROR( @@ -470,11 +478,10 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType RETURN_IF_ERROR(_chunk_reader->skip_values(ancestor_nulls, false)); } } - - if (!align_rows) { - *read_rows = parsed_rows; - } + *read_rows += parsed_rows; _filter_map_index += parsed_values; + + // Handle cross-page reading if (_chunk_reader->remaining_num_values() == 0) { if (_chunk_reader->has_next_page()) { RETURN_IF_ERROR(_chunk_reader->next_page()); @@ -486,6 +493,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } } + // Apply filtering to repetition and definition levels if (current_filter_map->has_filter()) { if (current_filter_map->filter_all()) { _rep_levels.resize(0); @@ -510,7 +518,8 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } } - _orig_filter_map_index = current_row + 1; + // Prepare for next row + ++_orig_filter_map_index; if (_rep_levels.size() > 0) { // make sure the rows of complex type are aligned correctly, diff --git a/be/src/vec/exec/format/parquet/vparquet_column_reader.h b/be/src/vec/exec/format/parquet/vparquet_column_reader.h index c6bc9f9157b431..5ced83a498e258 100644 --- a/be/src/vec/exec/format/parquet/vparquet_column_reader.h +++ b/be/src/vec/exec/format/parquet/vparquet_column_reader.h @@ -201,6 +201,7 @@ class ScalarColumnReader : public ParquetColumnReader { std::vector _rep_levels; std::vector _def_levels; std::unique_ptr _converter = nullptr; + std::unique_ptr> _nested_filter_map_data = nullptr; size_t _orig_filter_map_index = 0; Status _skip_values(size_t num_values); diff --git a/be/test/vec/exec/parquet/parquet_common_test.cpp b/be/test/vec/exec/parquet/parquet_common_test.cpp new file mode 100644 index 00000000000000..067153629379b0 --- /dev/null +++ b/be/test/vec/exec/parquet/parquet_common_test.cpp @@ -0,0 +1,457 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include "vec/exec/format/parquet/parquet_common.h" + +#include + +namespace doris::vectorized { + +// ============= FilterMap Tests ============= +class FilterMapTest : public testing::Test { +protected: + void SetUp() override {} + void TearDown() override {} +}; + +// Basic initialization test +TEST_F(FilterMapTest, test_basic_init) { + std::vector filter_data = {1, 0, 1, 0}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + EXPECT_TRUE(filter_map.has_filter()); + EXPECT_FALSE(filter_map.filter_all()); + EXPECT_EQ(filter_map.filter_map_size(), 4); + EXPECT_DOUBLE_EQ(filter_map.filter_ratio(), 0.5); +} + +// Empty filter test +TEST_F(FilterMapTest, test_empty_filter) { + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(nullptr, 0, false).ok()); + + EXPECT_FALSE(filter_map.has_filter()); + EXPECT_FALSE(filter_map.filter_all()); + EXPECT_DOUBLE_EQ(filter_map.filter_ratio(), 0.0); +} + +// Test filter all +TEST_F(FilterMapTest, test_filter_all) { + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(nullptr, 0, true).ok()); + + EXPECT_TRUE(filter_map.has_filter()); + EXPECT_TRUE(filter_map.filter_all()); + EXPECT_DOUBLE_EQ(filter_map.filter_ratio(), 1.0); +} + +// Test all zero filter +TEST_F(FilterMapTest, test_all_zero_filter) { + std::vector filter_data(100, 0); // Large data test + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + EXPECT_TRUE(filter_map.has_filter()); + EXPECT_TRUE(filter_map.filter_all()); + EXPECT_DOUBLE_EQ(filter_map.filter_ratio(), 1.0); +} + +// Test all one filter +TEST_F(FilterMapTest, test_all_one_filter) { + std::vector filter_data(100, 1); + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + EXPECT_FALSE(filter_map.has_filter()); + EXPECT_FALSE(filter_map.filter_all()); + EXPECT_DOUBLE_EQ(filter_map.filter_ratio(), 0.0); +} + +// Basic nested filter map generation test +TEST_F(FilterMapTest, test_generate_nested_filter_map_basic) { + std::vector filter_data = {1, 0, 1}; + std::vector rep_levels = {0, 1, 1, 0, 1, 0}; + + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + size_t current_row = 0; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 0) + .ok()); + + std::vector expected = {1, 1, 1, 0, 0, 1}; + EXPECT_EQ(nested_filter_map_data, expected); + EXPECT_EQ(current_row, 2); +} + +// Empty rep_levels test +TEST_F(FilterMapTest, test_generate_nested_filter_map_empty_rep_levels) { + std::vector filter_data = {1, 0, 1}; + std::vector rep_levels; + + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + size_t current_row = 0; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 0) + .ok()); + + EXPECT_TRUE(nested_filter_map_data.empty()); + EXPECT_EQ(current_row, 0); +} + +// Test nested filter map generation with start index +TEST_F(FilterMapTest, test_generate_nested_filter_map_with_start_index) { + std::vector filter_data = {1, 0, 1}; + std::vector rep_levels = {0, 1, 1, 0, 1, 0}; + // 011, 01, 0 + // 111, 00, 1 + + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + size_t current_row = 1; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 3) + .ok()); + + std::vector expected(6); // Initialize with zeros + expected[5] = 1; // Last value should be 1 + EXPECT_EQ(nested_filter_map_data, expected); + EXPECT_EQ(current_row, 2); +} + +// Test filter map boundary check +TEST_F(FilterMapTest, test_generate_nested_filter_map_boundary) { + std::vector filter_data = {1}; + std::vector rep_levels = {0, 1, 1, 0}; // Needs 2 rows but filter_data only has 1 + + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + size_t current_row = 0; + + // Should return error + auto status = filter_map.generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 0); + EXPECT_FALSE(status.ok()); +} + +// Test can_filter_all functionality +TEST_F(FilterMapTest, test_can_filter_all) { + std::vector filter_data = {0, 0, 1, 0, 0, 1, 0}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + EXPECT_TRUE(filter_map.can_filter_all(2, 0)); // First two are 0 + EXPECT_FALSE(filter_map.can_filter_all(3, 0)); // First three include 1 + EXPECT_TRUE(filter_map.can_filter_all(2, 3)); // Two values starting at index 3 are 0 + EXPECT_FALSE(filter_map.can_filter_all(2, 5)); // Index 5 contains 1 + EXPECT_TRUE(filter_map.can_filter_all(1, 6)); // Last value is 0 +} + +// Test can_filter_all when filter_all is true +TEST_F(FilterMapTest, test_can_filter_all_when_filter_all) { + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(nullptr, 100, true).ok()); + + EXPECT_TRUE(filter_map.can_filter_all(50, 0)); + EXPECT_TRUE(filter_map.can_filter_all(100, 0)); +} + +class CrossPageTest : public testing::Test { +protected: + void SetUp() override { + filter_data = {1, 0, 1, 0, 1}; + + // 1111 00 + page1_rep_levels = {0, 1, 1, 1, 0, 1}; + // 00 11 000 1 + page2_rep_levels = {1, 1, 0, 1, 0, 1, 1, 0}; + } + + std::vector filter_data; + std::vector page1_rep_levels; + std::vector page2_rep_levels; +}; + +TEST_F(CrossPageTest, test_basic1) { + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + size_t current_row = 0; + std::vector rep_levels; + rep_levels.insert(rep_levels.end(), page1_rep_levels.begin(), page1_rep_levels.end()); + rep_levels.insert(rep_levels.end(), page2_rep_levels.begin(), page2_rep_levels.end()); + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 0) + .ok()); + + std::vector expected = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1}; + + EXPECT_EQ(nested_filter_map_data, expected); + + EXPECT_EQ(current_row, 4); +} + +TEST_F(CrossPageTest, test_basic2) { + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_filter_map_data; + std::unique_ptr nested_filter_map; + + size_t current_row = 0; + std::vector rep_levels; + rep_levels.insert(rep_levels.end(), page1_rep_levels.begin(), page1_rep_levels.end()); + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, 0) + .ok()); + std::vector expected1 = {1, 1, 1, 1, 0, 0}; + + EXPECT_EQ(nested_filter_map_data, expected1); + EXPECT_EQ(current_row, 1); + + rep_levels.insert(rep_levels.end(), page2_rep_levels.begin(), page2_rep_levels.end()); + + size_t start_index = page1_rep_levels.size(); + ASSERT_TRUE(filter_map + .generate_nested_filter_map(rep_levels, nested_filter_map_data, + &nested_filter_map, ¤t_row, start_index) + .ok()); + + std::vector expected2 = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1}; + + EXPECT_EQ(nested_filter_map_data, expected2); + EXPECT_EQ(current_row, 4); +} + +// ============= ColumnSelectVector Tests ============= +class ColumnSelectVectorTest : public testing::Test { +protected: + void SetUp() override {} + void TearDown() override {} +}; + +// Basic initialization test +TEST_F(ColumnSelectVectorTest, test_basic_init) { + std::vector run_length_null_map = {2, 1, 3}; // 2 non-null, 1 null, 3 non-null + std::vector filter_data = {1, 0, 1, 0, 1, 0}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + EXPECT_TRUE(select_vector.has_filter()); + EXPECT_EQ(select_vector.num_values(), 6); + EXPECT_EQ(select_vector.num_nulls(), 1); + EXPECT_EQ(select_vector.num_filtered(), 3); +} + +// Test initialization without null map +TEST_F(ColumnSelectVectorTest, test_init_without_null_map) { + std::vector run_length_null_map = {2, 1, 3}; + std::vector filter_data = {1, 1, 1, 1, 1, 1}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, nullptr, &filter_map, 0).ok()); + + EXPECT_EQ(select_vector.num_nulls(), 1); + EXPECT_EQ(select_vector.num_filtered(), 0); +} + +// Test all null values +TEST_F(ColumnSelectVectorTest, test_all_null) { + std::vector run_length_null_map = {0, 6}; // All null + std::vector filter_data = {1, 1, 1, 1, 1, 1}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + EXPECT_EQ(select_vector.num_nulls(), 6); + EXPECT_EQ(select_vector.num_filtered(), 0); + + // Verify null_map + EXPECT_EQ(null_map.size(), 6); + for (size_t i = 0; i < 6; i++) { + EXPECT_EQ(null_map[i], 1); + } +} + +// Test no null values +TEST_F(ColumnSelectVectorTest, test_no_null) { + std::vector run_length_null_map = {6}; // All non-null + std::vector filter_data = {1, 1, 1, 1, 1, 1}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + EXPECT_EQ(select_vector.num_nulls(), 0); + EXPECT_EQ(select_vector.num_filtered(), 0); + + // Verify null_map + EXPECT_EQ(null_map.size(), 6); + for (size_t i = 0; i < 6; i++) { + EXPECT_EQ(null_map[i], 0); + } +} + +// Test get_next_run with filter +TEST_F(ColumnSelectVectorTest, test_get_next_run_with_filter) { + std::vector run_length_null_map = {2, 1, 3}; // 1, 1, 0, 1, 1, 1 + std::vector filter_data = {1, 1, 0, 1, 1, 0}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + ColumnSelectVector::DataReadType type; + + // Verify read sequence + EXPECT_EQ(select_vector.get_next_run(&type), 2); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::FILTERED_NULL); + + EXPECT_EQ(select_vector.get_next_run(&type), 2); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::FILTERED_CONTENT); +} + +// Test get_next_run without filter +TEST_F(ColumnSelectVectorTest, test_get_next_run_without_filter) { + std::vector run_length_null_map = {2, 1, 3}; + std::vector filter_data = {1, 1, 1, 1, 1, 1}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(nullptr, 0, false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + ColumnSelectVector::DataReadType type; + + // Verify read sequence + EXPECT_EQ(select_vector.get_next_run(&type), 2); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::NULL_DATA); + + EXPECT_EQ(select_vector.get_next_run(&type), 3); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 0); +} + +// Test complex null pattern +TEST_F(ColumnSelectVectorTest, test_complex_null_pattern) { + // Alternating null and non-null values + std::vector run_length_null_map = {1, 1, 1, 1, 1, 1}; // 1, 0, 1, 0, 1, 0 + std::vector filter_data = {1, 0, 1, 0, 1, 0}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 6, &null_map, &filter_map, 0).ok()); + + EXPECT_EQ(select_vector.num_nulls(), 3); + EXPECT_EQ(select_vector.num_filtered(), 3); + + ColumnSelectVector::DataReadType type; + + // Verify alternating read pattern + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::FILTERED_NULL); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::FILTERED_NULL); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); + + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::FILTERED_NULL); +} + +// Test filter_map_index +TEST_F(ColumnSelectVectorTest, test_filter_map_index) { + std::vector run_length_null_map = {0, 1, 3}; // 0, 1, 1, 1 + std::vector filter_data = {0, 0, 1, 1, 1, 1}; + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + ColumnSelectVector select_vector; + NullMap null_map; + ASSERT_TRUE(select_vector.init(run_length_null_map, 4, &null_map, &filter_map, 2).ok()); + + EXPECT_EQ(select_vector.num_filtered(), 0); + + ColumnSelectVector::DataReadType type; + EXPECT_EQ(select_vector.get_next_run(&type), 1); + EXPECT_EQ(type, ColumnSelectVector::NULL_DATA); + + EXPECT_EQ(select_vector.get_next_run(&type), 3); + EXPECT_EQ(type, ColumnSelectVector::CONTENT); +} + +} // namespace doris::vectorized diff --git a/be/test/vec/exec/parquet/parquet_nested_type_cross_page_test.cpp b/be/test/vec/exec/parquet/parquet_nested_type_cross_page_test.cpp new file mode 100644 index 00000000000000..cff0937910e9a8 --- /dev/null +++ b/be/test/vec/exec/parquet/parquet_nested_type_cross_page_test.cpp @@ -0,0 +1,179 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include + +#include "vec/exec/format/parquet/parquet_common.h" + +namespace doris::vectorized { +class ParquetCrossPageTest : public testing::Test { +protected: + void SetUp() override { + // filter_data is row-level, corresponding to 8 rows + filter_data = {1, 0, 0, 1, 0, 0, 1, 1}; // filter conditions for 8 rows + + // Page 1: 2 complete rows + 1 incomplete row + page1_rep_levels = { + 0, 1, 1, // Row 1: [1,1,1] + 0, 1, // Row 2: [1,1] + 0, 1, 1 // Row 3: [1,1,to be continued...] + }; + + // Page 2: continue Row 3 + 2 complete rows + 1 incomplete row + page2_rep_levels = { + 1, 1, // Continue Row 3: [...1,1] + 0, 1, // Row 4: [1] + 0, 1, 1, // Row 5: [1,1,1] + 0, 1 // Row 6: [1,to be continued...] + }; + + // Page 3: continue Row 6 + 2 complete rows + page3_rep_levels = { + 1, 1, // Continue Row 6: [...1,1] + 0, 1, 1, // Row 7: [1,1] + 0, 1 // Row 8: [1] + }; + } + + std::vector filter_data; // Row-level filter conditions for all data + std::vector page1_rep_levels; + std::vector page2_rep_levels; + std::vector page3_rep_levels; +}; + +// Test complete processing of three pages +TEST_F(ParquetCrossPageTest, test_three_pages_complete) { + size_t current_row = 0; + + // Process first page + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(filter_data.data(), filter_data.size(), false).ok()); + + std::vector nested_data1; + std::unique_ptr nested_map1; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(page1_rep_levels, nested_data1, &nested_map1, + ¤t_row, 0) + .ok()); + + // Verify first page results - using corresponding rows from overall filter_data + std::vector expected1 = {1, 1, 1, 0, 0, 0, 0, 0}; + EXPECT_EQ(nested_data1, expected1); + EXPECT_EQ(current_row, 2); // Processed up to Row 3 + + // Process second page - continue with same filter_map + std::vector nested_data2; + std::unique_ptr nested_map2; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(page2_rep_levels, nested_data2, &nested_map2, + ¤t_row, 0) + .ok()); + + // Verify second page results + std::vector expected2 = {0, 0, 1, 1, 0, 0, 0, 0, 0}; + EXPECT_EQ(nested_data2, expected2); + EXPECT_EQ(current_row, 5); // Processed up to Row 6 + + // Process third page - continue with same filter_map + std::vector nested_data3; + std::unique_ptr nested_map3; + + ASSERT_TRUE(filter_map + .generate_nested_filter_map(page3_rep_levels, nested_data3, &nested_map3, + ¤t_row, 0) + .ok()); + + // Verify third page results + std::vector expected3 = {0, 0, 1, 1, 1, 1, 1}; + EXPECT_EQ(nested_data3, expected3); + EXPECT_EQ(current_row, 7); // Processed all 8 rows +} + +// Test case where a single row spans three pages +TEST_F(ParquetCrossPageTest, test_single_row_across_three_pages) { + // Filter for one long array row + std::vector row_filter = {1, 0}; // Only 2 rows of data + + // First page + std::vector rep1 = { + 0, // Start of first row + 1, 1, 1, // 3 array elements + 1, 1 // To be continued... + }; + + // Second page + std::vector rep2 = { + 1, 1, 1, // Continue with 3 array elements + 1, 1, 1 // To be continued... + }; + + // Third page + std::vector rep3 = { + 1, 1, 1, // Last 3 array elements + 0 // Start of second row + }; + + size_t current_row = 0; + + // Use same filter_map for all pages + FilterMap filter_map; + ASSERT_TRUE(filter_map.init(row_filter.data(), row_filter.size(), false).ok()); + + // Process first page + std::vector nested_data1; + std::unique_ptr nested_map1; + + ASSERT_TRUE( + filter_map.generate_nested_filter_map(rep1, nested_data1, &nested_map1, ¤t_row, 0) + .ok()); + + // Verify first page results + std::vector expected1(rep1.size(), 1); // All use first row's filter value + EXPECT_EQ(nested_data1, expected1); + EXPECT_EQ(current_row, 0); // Still in first row + + // Process second page + std::vector nested_data2; + std::unique_ptr nested_map2; + + ASSERT_TRUE( + filter_map.generate_nested_filter_map(rep2, nested_data2, &nested_map2, ¤t_row, 0) + .ok()); + + // Verify second page results + std::vector expected2(rep2.size(), 1); // Still using first row's filter value + EXPECT_EQ(nested_data2, expected2); + EXPECT_EQ(current_row, 0); // Still in first row + + // Process third page + std::vector nested_data3; + std::unique_ptr nested_map3; + + ASSERT_TRUE( + filter_map.generate_nested_filter_map(rep3, nested_data3, &nested_map3, ¤t_row, 0) + .ok()); + + // Verify third page results + std::vector expected3(rep3.size(), 1); + expected3.back() = 0; // Last element uses second row's filter value + EXPECT_EQ(nested_data3, expected3); + EXPECT_EQ(current_row, 1); // Moved to second row +} + +} // namespace doris::vectorized diff --git a/be/test/vec/exec/parquet/parquet_thrift_test.cpp b/be/test/vec/exec/parquet/parquet_thrift_test.cpp index fe2221bf8d3725..dc69c214f531f7 100644 --- a/be/test/vec/exec/parquet/parquet_thrift_test.cpp +++ b/be/test/vec/exec/parquet/parquet_thrift_test.cpp @@ -230,12 +230,14 @@ static Status get_column_values(io::FileReaderSPtr file_reader, tparquet::Column } else { data_column = src_column->assume_mutable(); } + FilterMap filter_map; + RETURN_IF_ERROR(filter_map.init(nullptr, 0, false)); ColumnSelectVector run_length_map; // decode page data if (field_schema->definition_level == 0) { // required column std::vector null_map = {(u_short)rows}; - run_length_map.set_run_length_null_map(null_map, rows, nullptr); + RETURN_IF_ERROR(run_length_map.init(null_map, rows, nullptr, &filter_map, 0)); RETURN_IF_ERROR( chunk_reader.decode_values(data_column, resolved_type, run_length_map, false)); } else { @@ -249,7 +251,7 @@ static Status get_column_values(io::FileReaderSPtr file_reader, tparquet::Column chunk_reader.insert_null_values(data_column, num_values); } else { std::vector null_map = {(u_short)num_values}; - run_length_map.set_run_length_null_map(null_map, rows, nullptr); + RETURN_IF_ERROR(run_length_map.init(null_map, rows, nullptr, &filter_map, 0)); RETURN_IF_ERROR(chunk_reader.decode_values(data_column, resolved_type, run_length_map, false)); } @@ -264,7 +266,7 @@ static Status get_column_values(io::FileReaderSPtr file_reader, tparquet::Column chunk_reader.insert_null_values(data_column, num_values); } else { std::vector null_map = {(u_short)num_values}; - run_length_map.set_run_length_null_map(null_map, rows, nullptr); + RETURN_IF_ERROR(run_length_map.init(null_map, rows, nullptr, &filter_map, 0)); RETURN_IF_ERROR( chunk_reader.decode_values(data_column, resolved_type, run_length_map, false)); } diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql new file mode 100644 index 00000000000000..9aa256b210aca4 --- /dev/null +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql @@ -0,0 +1,42 @@ +CREATE DATABASE IF NOT EXISTS multi_catalog; +USE multi_catalog; + +CREATE TABLE `nested_cross_page1_parquet`( + `id` int, + `array_col` array, + `description` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' +LOCATION + '/user/doris/suites/multi_catalog/nested_cross_page1_parquet'; + +msck repair table nested_cross_page1_parquet; + +CREATE TABLE `nested_cross_page2_parquet`( + id INT, + nested_array_col ARRAY>, + array_struct_col ARRAY>, + map_array_col MAP>, + complex_struct_col STRUCT< + a: ARRAY, + b: MAP>, + c: STRUCT< + x: ARRAY, + y: STRING + > + >, + description STRING) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' +LOCATION + '/user/doris/suites/multi_catalog/nested_cross_page2_parquet'; + +msck repair table nested_cross_page2_parquet; diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data.tar.gz b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..51af8457225552b7de3b1d79a45fe89114c3f8ee GIT binary patch literal 35305 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 XEz)Nv@$|BgdGfdSZ3;`?$u0ReCYVDt literal 0 HcmV?d00001 diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test1.py b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test1.py new file mode 100644 index 00000000000000..9fff6d362cde49 --- /dev/null +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test1.py @@ -0,0 +1,192 @@ +import pyarrow as pa +import pyarrow.parquet as pq +import subprocess +import argparse +import json + +# Define the output file path as a constant +OUTPUT_PARQUET_FILE = 'nested_cross_page_test1.parquet' + +def generate_cross_page_test_data(output_file): + # Create test data + data = { + # id column (INT32) + 'id': [1, 2, 3], + + # array column (ARRAY) + 'array_col': [ + # Row 1 - Large array to force cross-page + [1, 2, 3, 4, 5] * 200, # 1000 elements + + # Row 2 - Normal sized array + [1, 2, 3], + + # Row 3 - Another large array + [6, 7, 8, 9, 10] * 200 # 1000 elements + ], + + # description column (STRING) + 'description': [ + 'This is a large array with repeated sequence [1,2,3,4,5]', + 'This is a small array with just three elements', + 'This is another large array with repeated sequence [6,7,8,9,10]' + ] + } + + # Create table structure + table = pa.Table.from_pydict({ + 'id': pa.array(data['id'], type=pa.int32()), + 'array_col': pa.array(data['array_col'], type=pa.list_(pa.int32())), + 'description': pa.array(data['description'], type=pa.string()) + }) + + # Write to parquet file + pq.write_table( + table, + output_file, + compression=None, # No compression for predictable size + version='2.6', + write_statistics=True, + row_group_size=3, # All data in one row group + data_page_size=100, # Very small page size + write_batch_size=10 # Small batch size + ) + +def inspect_parquet_file(file_path): + """Inspect the structure of generated parquet file""" + pf = pq.ParquetFile(file_path) + print(f"\nFile: {file_path}") + print(f"Number of row groups: {pf.num_row_groups}") + + metadata = pf.metadata + schema = pf.schema + print(f"\nSchema: {schema}") + print(f"\nDetailed schema:") + for i in range(len(schema)): + print(f"Column {i}: {schema[i]}") + + for i in range(metadata.num_row_groups): + rg = metadata.row_group(i) + print(f"\nRow Group {i}:") + print(f"Num rows: {rg.num_rows}") + + for j in range(rg.num_columns): + col = rg.column(j) + print(f"\nColumn {j}:") + print(f"Path: {schema[j].name}") + print(f"Type: {col.physical_type}") + print(f"Encodings: {col.encodings}") + print(f"Total compressed size: {col.total_compressed_size}") + print(f"Total uncompressed size: {col.total_uncompressed_size}") + print(f"Number of values: {col.num_values}") + print(f"Data page offset: {col.data_page_offset}") + if col.dictionary_page_offset is not None: + print(f"Dictionary page offset: {col.dictionary_page_offset}") + +def read_and_print_file(file_path): + """Read and print file content""" + table = pq.read_table(file_path) + df = table.to_pandas() + print("\nFile content:") + for i in range(len(df)): + print(f"\nRow {i}:") + print(f"ID: {df.iloc[i]['id']}") + arr = df.iloc[i]['array_col'] + print(f"Array length: {len(arr)}") + print(f"First few elements: {arr[:5]}...") + print(f"Last few elements: ...{arr[-5:]}") + print(f"Description: {df.iloc[i]['description']}") + +def inspect_pages_with_cli(file_path, parquet_cli_path=None): + """ + Inspect page information using parquet-cli + + Args: + file_path: Path to the parquet file + parquet_cli_path: Optional path to parquet-cli jar file + """ + if not parquet_cli_path: + print("\nSkipping parquet-cli inspection: No parquet-cli path provided") + return + + print("\nParquet CLI Output:") + try: + cmd = f"java -jar {parquet_cli_path} pages {file_path}" + result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True) + print(result.stdout) + except subprocess.CalledProcessError as e: + print(f"Error running parquet-cli: {e}") + if e.output: + print(f"Error output: {e.output}") + except Exception as e: + print(f"Unexpected error running parquet-cli: {e}") + +def save_test_data_info(output_file): + """Save detailed test data information to text file""" + info = { + "file_format": "Parquet", + "version": "2.6", + "compression": "None", + "row_group_size": 3, + "data_page_size": 100, + "write_batch_size": 10, + "output_file": output_file, + "schema": { + "id": "INT32", + "array_col": "ARRAY", + "description": "STRING" + }, + "test_cases": [ + { + "row": 1, + "description": "Large array", + "characteristics": [ + "1000 elements", + "Repeated sequence [1,2,3,4,5]", + "Forces cross-page scenario" + ] + }, + { + "row": 2, + "description": "Small array", + "characteristics": [ + "3 elements", + "Simple sequence [1,2,3]", + "Fits in single page" + ] + }, + { + "row": 3, + "description": "Another large array", + "characteristics": [ + "1000 elements", + "Repeated sequence [6,7,8,9,10]", + "Forces cross-page scenario" + ] + } + ] + } + + info_file = output_file.replace('.parquet', '_info.json') + with open(info_file, 'w') as f: + json.dump(info, f, indent=2) + +if __name__ == '__main__': + # Add command line argument parsing + parser = argparse.ArgumentParser(description='Generate and inspect parquet test data') + parser.add_argument('--parquet-cli', + help='Path to parquet-cli jar file', + default=None) + parser.add_argument('--output', + help='Output parquet file path', + default=OUTPUT_PARQUET_FILE) + args = parser.parse_args() + + # Use the output file path from command line or default + output_file = args.output + + generate_cross_page_test_data(output_file) + inspect_parquet_file(output_file) + read_and_print_file(output_file) + inspect_pages_with_cli(output_file, args.parquet_cli) + save_test_data_info(output_file) diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test2.py b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test2.py new file mode 100644 index 00000000000000..2e67e96213190e --- /dev/null +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test2.py @@ -0,0 +1,287 @@ +import pyarrow as pa +import pyarrow.parquet as pq +import subprocess +import json +import argparse + +# Define the output file path as a constant +OUTPUT_PARQUET_FILE = 'nested_cross_page_test2.parquet' + +def generate_cross_page_test_data(output_file): + # Create test data + data = { + # id column (INT32) + 'id': [1, 2, 3], + + # Multi-level array column (ARRAY>) + 'nested_array_col': [ + # Row 1 - Large array + [[i for i in range(10)] for _ in range(100)], # 100 sub-arrays, each with 10 elements + + # Row 2 - Small array + [[1, 2], [3, 4], [5, 6]], + + # Row 3 - Another large array + [[i for i in range(10, 20)] for _ in range(100)] + ], + + # Struct array column (ARRAY>) + 'array_struct_col': [ + # Row 1 + [{'x': i, 'y': f'value_{i}'} for i in range(500)], + + # Row 2 + [{'x': 1, 'y': 'small'}, {'x': 2, 'y': 'array'}], + + # Row 3 + [{'x': i, 'y': f'big_{i}'} for i in range(500)] + ], + + # Map column (MAP>) + 'map_array_col': [ + # Row 1 + {f'key_{i}': list(range(i, i+10)) for i in range(50)}, + + # Row 2 + {'small_key': [1, 2, 3]}, + + # Row 3 + {f'big_key_{i}': list(range(i*10, (i+1)*10)) for i in range(50)} + ], + + # Complex nested structure (STRUCT< + # a: ARRAY, + # b: MAP>, + # c: STRUCT, y: STRING> + # >) + 'complex_struct_col': [ + # Row 1 + { + 'a': list(range(100)), + 'b': {f'key_{i}': list(range(i, i+5)) for i in range(20)}, + 'c': {'x': list(range(50)), 'y': 'nested_struct_1'} + }, + + # Row 2 + { + 'a': [1, 2, 3], + 'b': {'small': [1, 2]}, + 'c': {'x': [1], 'y': 'small_struct'} + }, + + # Row 3 + { + 'a': list(range(100, 200)), + 'b': {f'big_{i}': list(range(i*5, (i+1)*5)) for i in range(20)}, + 'c': {'x': list(range(50)), 'y': 'nested_struct_2'} + } + ], + + # Description column (STRING) + 'description': [ + 'Row with large nested arrays and structures', + 'Row with small nested data', + 'Row with another set of large nested arrays and structures' + ] + } + + # Create complex table structure + table = pa.Table.from_pydict({ + 'id': pa.array(data['id'], type=pa.int32()), + + # Multi-level array type + 'nested_array_col': pa.array(data['nested_array_col'], + type=pa.list_(pa.list_(pa.int32()))), + + # Struct array type + 'array_struct_col': pa.array(data['array_struct_col'], + type=pa.list_(pa.struct([ + ('x', pa.int32()), + ('y', pa.string()) + ]))), + + # Map type + 'map_array_col': pa.array(data['map_array_col'], + type=pa.map_(pa.string(), pa.list_(pa.int32()))), + + # Complex nested structure type + 'complex_struct_col': pa.array(data['complex_struct_col'], + type=pa.struct([ + ('a', pa.list_(pa.int32())), + ('b', pa.map_(pa.string(), pa.list_(pa.int32()))), + ('c', pa.struct([ + ('x', pa.list_(pa.int32())), + ('y', pa.string()) + ])) + ])), + + 'description': pa.array(data['description'], type=pa.string()) + }) + + # Write to parquet file + pq.write_table( + table, + output_file, + compression=None, # No compression + version='2.6', + write_statistics=True, + row_group_size=3, # All data in one row group + data_page_size=100, # Very small page size + write_batch_size=1 # Minimum batch size + ) + +def inspect_parquet_file(file_path): + """Inspect the structure of generated parquet file""" + pf = pq.ParquetFile(file_path) + print(f"\nFile: {file_path}") + print(f"Number of row groups: {pf.num_row_groups}") + + metadata = pf.metadata + schema = pf.schema + print(f"\nSchema: {schema}") + print(f"\nDetailed schema:") + for i in range(len(schema)): + print(f"Column {i}: {schema[i]}") + + for i in range(metadata.num_row_groups): + rg = metadata.row_group(i) + print(f"\nRow Group {i}:") + print(f"Num rows: {rg.num_rows}") + + for j in range(rg.num_columns): + col = rg.column(j) + print(f"\nColumn {j}:") + print(f"Path: {schema[j].name}") + print(f"Type: {col.physical_type}") + print(f"Encodings: {col.encodings}") + print(f"Total compressed size: {col.total_compressed_size}") + print(f"Total uncompressed size: {col.total_uncompressed_size}") + print(f"Number of values: {col.num_values}") + print(f"Data page offset: {col.data_page_offset}") + if col.dictionary_page_offset is not None: + print(f"Dictionary page offset: {col.dictionary_page_offset}") + +def format_value(value): + """Format value for printing""" + if isinstance(value, (list, dict)): + return f"{str(value)[:100]}... (length: {len(str(value))})" + return str(value) + +def read_and_print_file(file_path): + """Read and print file content""" + table = pq.read_table(file_path) + df = table.to_pandas() + print("\nFile content:") + + for i in range(len(df)): + print(f"\nRow {i}:") + for column in df.columns: + value = df.iloc[i][column] + print(f"{column}: {format_value(value)}") + +def inspect_pages_with_cli(file_path, parquet_cli_path=None): + """ + Inspect page information using parquet-cli + + Args: + file_path: Path to the parquet file + parquet_cli_path: Optional path to parquet-cli jar file + """ + if not parquet_cli_path: + print("\nSkipping parquet-cli inspection: No parquet-cli path provided") + return + + print("\nParquet CLI Output:") + try: + cmd = f"java -jar {parquet_cli_path} pages {file_path}" + result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True) + print(result.stdout) + except subprocess.CalledProcessError as e: + print(f"Error running parquet-cli: {e}") + if e.output: + print(f"Error output: {e.output}") + except Exception as e: + print(f"Unexpected error running parquet-cli: {e}") + +def save_test_data_info(output_file): + """Save detailed test data information to text file""" + info = { + "file_format": "Parquet", + "version": "2.6", + "compression": "None", + "row_group_size": 3, + "data_page_size": 100, + "write_batch_size": 1, + "output_file": output_file, + "schema": { + "id": "INT32", + "nested_array_col": "ARRAY>", + "array_struct_col": "ARRAY>", + "map_array_col": "MAP>", + "complex_struct_col": """STRUCT< + a: ARRAY, + b: MAP>, + c: STRUCT< + x: ARRAY, + y: STRING + > + >""", + "description": "STRING" + }, + "test_cases": [ + { + "row": 1, + "description": "Large nested data", + "characteristics": [ + "Large nested arrays (100 arrays of 10 elements each)", + "Large struct array (500 elements)", + "Large map (50 key-value pairs)", + "Complex nested structure with large arrays" + ] + }, + { + "row": 2, + "description": "Small nested data", + "characteristics": [ + "Small nested arrays (3 arrays of 2 elements each)", + "Small struct array (2 elements)", + "Small map (1 key-value pair)", + "Complex nested structure with small arrays" + ] + }, + { + "row": 3, + "description": "Another large nested data", + "characteristics": [ + "Large nested arrays (100 arrays of 10 elements each)", + "Large struct array (500 elements)", + "Large map (50 key-value pairs)", + "Complex nested structure with large arrays" + ] + } + ] + } + + info_file = output_file.replace('.parquet', '_info.json') + with open(info_file, 'w') as f: + json.dump(info, f, indent=2) + +if __name__ == '__main__': + # Add command line argument parsing + parser = argparse.ArgumentParser(description='Generate and inspect parquet test data') + parser.add_argument('--parquet-cli', + help='Path to parquet-cli jar file', + default=None) + parser.add_argument('--output', + help='Output parquet file path', + default=OUTPUT_PARQUET_FILE) + args = parser.parse_args() + + # Use the output file path from command line or default + output_file = args.output + + generate_cross_page_test_data(output_file) + inspect_parquet_file(output_file) + read_and_print_file(output_file) + inspect_pages_with_cli(output_file, args.parquet_cli) + save_test_data_info(output_file) diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/run.sh b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/run.sh new file mode 100755 index 00000000000000..f3136eaa20094a --- /dev/null +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/run.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x + +CUR_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" + +## mkdir and put data to hdfs +cd "${CUR_DIR}" && rm -rf data/ && tar xzf data.tar.gz +hadoop fs -mkdir -p /user/doris/suites/multi_catalog/ +hadoop fs -put "${CUR_DIR}"/data/* /user/doris/suites/multi_catalog/ + +# create table +hive -f "${CUR_DIR}/create_table.hql" diff --git a/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out b/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out new file mode 100644 index 00000000000000..cc793ef96e4c2a --- /dev/null +++ b/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out @@ -0,0 +1,913 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !nested_cross_page1_parquet_q1 -- +[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] + +-- !nested_cross_page1_parquet_q2 -- +[1, 2, 3] + +-- !nested_cross_page1_parquet_q3 -- +[6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page1_parquet_q4 -- +1 1000 +2 3 +3 1000 + +-- !nested_cross_page1_parquet_q5 -- +1 1 3 +2 1 3 +3 6 8 + +-- !nested_cross_page1_parquet_q6 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +3 [6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page1_parquet_q7 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +2 [1, 2, 3] + +-- !nested_cross_page1_parquet_q8 -- +2 [1, 2, 3] This is a small array with just three elements + +-- !nested_cross_page1_parquet_q9 -- +1 1 5 +2 1 3 +3 6 10 + +-- !nested_cross_page1_parquet_q10 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +3 [6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page2_parquet_q1 -- +1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 100 + +-- !nested_cross_page2_parquet_q2 -- +2 [[1, 2], [3, 4], [5, 6]] 3 + +-- !nested_cross_page2_parquet_q3 -- +3 [[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]] 100 + +-- !nested_cross_page2_parquet_q4 -- +1 [{"x":0, "y":"value_0"}, {"x":1, "y":"value_1"}, {"x":2, "y":"value_2"}, {"x":3, "y":"value_3"}, {"x":4, "y":"value_4"}, {"x":5, "y":"value_5"}, {"x":6, "y":"value_6"}, {"x":7, "y":"value_7"}, {"x":8, "y":"value_8"}, {"x":9, "y":"value_9"}, {"x":10, "y":"value_10"}, {"x":11, "y":"value_11"}, {"x":12, "y":"value_12"}, {"x":13, "y":"value_13"}, {"x":14, "y":"value_14"}, {"x":15, "y":"value_15"}, {"x":16, "y":"value_16"}, {"x":17, "y":"value_17"}, {"x":18, "y":"value_18"}, {"x":19, "y":"value_19"}, {"x":20, "y":"value_20"}, {"x":21, "y":"value_21"}, {"x":22, "y":"value_22"}, {"x":23, "y":"value_23"}, {"x":24, "y":"value_24"}, {"x":25, "y":"value_25"}, {"x":26, "y":"value_26"}, {"x":27, "y":"value_27"}, {"x":28, "y":"value_28"}, {"x":29, "y":"value_29"}, {"x":30, "y":"value_30"}, {"x":31, "y":"value_31"}, {"x":32, "y":"value_32"}, {"x":33, "y":"value_33"}, {"x":34, "y":"value_34"}, {"x":35, "y":"value_35"}, {"x":36, "y":"value_36"}, {"x":37, "y":"value_37"}, {"x":38, "y":"value_38"}, {"x":39, "y":"value_39"}, {"x":40, "y":"value_40"}, {"x":41, "y":"value_41"}, {"x":42, "y":"value_42"}, {"x":43, "y":"value_43"}, {"x":44, "y":"value_44"}, {"x":45, "y":"value_45"}, {"x":46, "y":"value_46"}, {"x":47, "y":"value_47"}, {"x":48, "y":"value_48"}, {"x":49, "y":"value_49"}, {"x":50, "y":"value_50"}, {"x":51, "y":"value_51"}, {"x":52, "y":"value_52"}, {"x":53, "y":"value_53"}, {"x":54, "y":"value_54"}, {"x":55, "y":"value_55"}, {"x":56, "y":"value_56"}, {"x":57, "y":"value_57"}, {"x":58, "y":"value_58"}, {"x":59, "y":"value_59"}, {"x":60, "y":"value_60"}, {"x":61, "y":"value_61"}, {"x":62, "y":"value_62"}, {"x":63, "y":"value_63"}, {"x":64, "y":"value_64"}, {"x":65, "y":"value_65"}, {"x":66, "y":"value_66"}, {"x":67, "y":"value_67"}, {"x":68, "y":"value_68"}, {"x":69, "y":"value_69"}, {"x":70, "y":"value_70"}, {"x":71, "y":"value_71"}, {"x":72, "y":"value_72"}, {"x":73, "y":"value_73"}, {"x":74, "y":"value_74"}, {"x":75, "y":"value_75"}, {"x":76, "y":"value_76"}, {"x":77, "y":"value_77"}, {"x":78, "y":"value_78"}, {"x":79, "y":"value_79"}, {"x":80, "y":"value_80"}, {"x":81, "y":"value_81"}, {"x":82, "y":"value_82"}, {"x":83, "y":"value_83"}, {"x":84, "y":"value_84"}, {"x":85, "y":"value_85"}, {"x":86, "y":"value_86"}, {"x":87, "y":"value_87"}, {"x":88, "y":"value_88"}, {"x":89, "y":"value_89"}, {"x":90, "y":"value_90"}, {"x":91, "y":"value_91"}, {"x":92, "y":"value_92"}, {"x":93, "y":"value_93"}, {"x":94, "y":"value_94"}, {"x":95, "y":"value_95"}, {"x":96, "y":"value_96"}, {"x":97, "y":"value_97"}, {"x":98, "y":"value_98"}, {"x":99, "y":"value_99"}, {"x":100, "y":"value_100"}, {"x":101, "y":"value_101"}, {"x":102, "y":"value_102"}, {"x":103, "y":"value_103"}, {"x":104, "y":"value_104"}, {"x":105, "y":"value_105"}, {"x":106, "y":"value_106"}, {"x":107, "y":"value_107"}, {"x":108, "y":"value_108"}, {"x":109, "y":"value_109"}, {"x":110, "y":"value_110"}, {"x":111, "y":"value_111"}, {"x":112, "y":"value_112"}, {"x":113, "y":"value_113"}, {"x":114, "y":"value_114"}, {"x":115, "y":"value_115"}, {"x":116, "y":"value_116"}, {"x":117, "y":"value_117"}, {"x":118, "y":"value_118"}, {"x":119, "y":"value_119"}, {"x":120, "y":"value_120"}, {"x":121, "y":"value_121"}, {"x":122, "y":"value_122"}, {"x":123, "y":"value_123"}, {"x":124, "y":"value_124"}, {"x":125, "y":"value_125"}, {"x":126, "y":"value_126"}, {"x":127, "y":"value_127"}, {"x":128, "y":"value_128"}, {"x":129, "y":"value_129"}, {"x":130, "y":"value_130"}, {"x":131, "y":"value_131"}, {"x":132, "y":"value_132"}, {"x":133, "y":"value_133"}, {"x":134, "y":"value_134"}, {"x":135, "y":"value_135"}, {"x":136, "y":"value_136"}, {"x":137, "y":"value_137"}, {"x":138, "y":"value_138"}, {"x":139, "y":"value_139"}, {"x":140, "y":"value_140"}, {"x":141, "y":"value_141"}, {"x":142, "y":"value_142"}, {"x":143, "y":"value_143"}, {"x":144, "y":"value_144"}, {"x":145, "y":"value_145"}, {"x":146, "y":"value_146"}, {"x":147, "y":"value_147"}, {"x":148, "y":"value_148"}, {"x":149, "y":"value_149"}, {"x":150, "y":"value_150"}, {"x":151, "y":"value_151"}, {"x":152, "y":"value_152"}, {"x":153, "y":"value_153"}, {"x":154, "y":"value_154"}, {"x":155, "y":"value_155"}, {"x":156, "y":"value_156"}, {"x":157, "y":"value_157"}, {"x":158, "y":"value_158"}, {"x":159, "y":"value_159"}, {"x":160, "y":"value_160"}, {"x":161, "y":"value_161"}, {"x":162, "y":"value_162"}, {"x":163, "y":"value_163"}, {"x":164, "y":"value_164"}, {"x":165, "y":"value_165"}, {"x":166, "y":"value_166"}, {"x":167, "y":"value_167"}, {"x":168, "y":"value_168"}, {"x":169, "y":"value_169"}, {"x":170, "y":"value_170"}, {"x":171, "y":"value_171"}, {"x":172, "y":"value_172"}, {"x":173, "y":"value_173"}, {"x":174, "y":"value_174"}, {"x":175, "y":"value_175"}, {"x":176, "y":"value_176"}, {"x":177, "y":"value_177"}, {"x":178, "y":"value_178"}, {"x":179, "y":"value_179"}, {"x":180, "y":"value_180"}, {"x":181, "y":"value_181"}, {"x":182, "y":"value_182"}, {"x":183, "y":"value_183"}, {"x":184, "y":"value_184"}, {"x":185, "y":"value_185"}, {"x":186, "y":"value_186"}, {"x":187, "y":"value_187"}, {"x":188, "y":"value_188"}, {"x":189, "y":"value_189"}, {"x":190, "y":"value_190"}, {"x":191, "y":"value_191"}, {"x":192, "y":"value_192"}, {"x":193, "y":"value_193"}, {"x":194, "y":"value_194"}, {"x":195, "y":"value_195"}, {"x":196, "y":"value_196"}, {"x":197, "y":"value_197"}, {"x":198, "y":"value_198"}, {"x":199, "y":"value_199"}, {"x":200, "y":"value_200"}, {"x":201, "y":"value_201"}, {"x":202, "y":"value_202"}, {"x":203, "y":"value_203"}, {"x":204, "y":"value_204"}, {"x":205, "y":"value_205"}, {"x":206, "y":"value_206"}, {"x":207, "y":"value_207"}, {"x":208, "y":"value_208"}, {"x":209, "y":"value_209"}, {"x":210, "y":"value_210"}, {"x":211, "y":"value_211"}, {"x":212, "y":"value_212"}, {"x":213, "y":"value_213"}, {"x":214, "y":"value_214"}, {"x":215, "y":"value_215"}, {"x":216, "y":"value_216"}, {"x":217, "y":"value_217"}, {"x":218, "y":"value_218"}, {"x":219, "y":"value_219"}, {"x":220, "y":"value_220"}, {"x":221, "y":"value_221"}, {"x":222, "y":"value_222"}, {"x":223, "y":"value_223"}, {"x":224, "y":"value_224"}, {"x":225, "y":"value_225"}, {"x":226, "y":"value_226"}, {"x":227, "y":"value_227"}, {"x":228, "y":"value_228"}, {"x":229, "y":"value_229"}, {"x":230, "y":"value_230"}, {"x":231, "y":"value_231"}, {"x":232, "y":"value_232"}, {"x":233, "y":"value_233"}, {"x":234, "y":"value_234"}, {"x":235, "y":"value_235"}, {"x":236, "y":"value_236"}, {"x":237, "y":"value_237"}, {"x":238, "y":"value_238"}, {"x":239, "y":"value_239"}, {"x":240, "y":"value_240"}, {"x":241, "y":"value_241"}, {"x":242, "y":"value_242"}, {"x":243, "y":"value_243"}, {"x":244, "y":"value_244"}, {"x":245, "y":"value_245"}, {"x":246, "y":"value_246"}, {"x":247, "y":"value_247"}, {"x":248, "y":"value_248"}, {"x":249, "y":"value_249"}, {"x":250, "y":"value_250"}, {"x":251, "y":"value_251"}, {"x":252, "y":"value_252"}, {"x":253, "y":"value_253"}, {"x":254, "y":"value_254"}, {"x":255, "y":"value_255"}, {"x":256, "y":"value_256"}, {"x":257, "y":"value_257"}, {"x":258, "y":"value_258"}, {"x":259, "y":"value_259"}, {"x":260, "y":"value_260"}, {"x":261, "y":"value_261"}, {"x":262, "y":"value_262"}, {"x":263, "y":"value_263"}, {"x":264, "y":"value_264"}, {"x":265, "y":"value_265"}, {"x":266, "y":"value_266"}, {"x":267, "y":"value_267"}, {"x":268, "y":"value_268"}, {"x":269, "y":"value_269"}, {"x":270, "y":"value_270"}, {"x":271, "y":"value_271"}, {"x":272, "y":"value_272"}, {"x":273, "y":"value_273"}, {"x":274, "y":"value_274"}, {"x":275, "y":"value_275"}, {"x":276, "y":"value_276"}, {"x":277, "y":"value_277"}, {"x":278, "y":"value_278"}, {"x":279, "y":"value_279"}, {"x":280, "y":"value_280"}, {"x":281, "y":"value_281"}, {"x":282, "y":"value_282"}, {"x":283, "y":"value_283"}, {"x":284, "y":"value_284"}, {"x":285, "y":"value_285"}, {"x":286, "y":"value_286"}, {"x":287, "y":"value_287"}, {"x":288, "y":"value_288"}, {"x":289, "y":"value_289"}, {"x":290, "y":"value_290"}, {"x":291, "y":"value_291"}, {"x":292, "y":"value_292"}, {"x":293, "y":"value_293"}, {"x":294, "y":"value_294"}, {"x":295, "y":"value_295"}, {"x":296, "y":"value_296"}, {"x":297, "y":"value_297"}, {"x":298, "y":"value_298"}, {"x":299, "y":"value_299"}, {"x":300, "y":"value_300"}, {"x":301, "y":"value_301"}, {"x":302, "y":"value_302"}, {"x":303, "y":"value_303"}, {"x":304, "y":"value_304"}, {"x":305, "y":"value_305"}, {"x":306, "y":"value_306"}, {"x":307, "y":"value_307"}, {"x":308, "y":"value_308"}, {"x":309, "y":"value_309"}, {"x":310, "y":"value_310"}, {"x":311, "y":"value_311"}, {"x":312, "y":"value_312"}, {"x":313, "y":"value_313"}, {"x":314, "y":"value_314"}, {"x":315, "y":"value_315"}, {"x":316, "y":"value_316"}, {"x":317, "y":"value_317"}, {"x":318, "y":"value_318"}, {"x":319, "y":"value_319"}, {"x":320, "y":"value_320"}, {"x":321, "y":"value_321"}, {"x":322, "y":"value_322"}, {"x":323, "y":"value_323"}, {"x":324, "y":"value_324"}, {"x":325, "y":"value_325"}, {"x":326, "y":"value_326"}, {"x":327, "y":"value_327"}, {"x":328, "y":"value_328"}, {"x":329, "y":"value_329"}, {"x":330, "y":"value_330"}, {"x":331, "y":"value_331"}, {"x":332, "y":"value_332"}, {"x":333, "y":"value_333"}, {"x":334, "y":"value_334"}, {"x":335, "y":"value_335"}, {"x":336, "y":"value_336"}, {"x":337, "y":"value_337"}, {"x":338, "y":"value_338"}, {"x":339, "y":"value_339"}, {"x":340, "y":"value_340"}, {"x":341, "y":"value_341"}, {"x":342, "y":"value_342"}, {"x":343, "y":"value_343"}, {"x":344, "y":"value_344"}, {"x":345, "y":"value_345"}, {"x":346, "y":"value_346"}, {"x":347, "y":"value_347"}, {"x":348, "y":"value_348"}, {"x":349, "y":"value_349"}, {"x":350, "y":"value_350"}, {"x":351, "y":"value_351"}, {"x":352, "y":"value_352"}, {"x":353, "y":"value_353"}, {"x":354, "y":"value_354"}, {"x":355, "y":"value_355"}, {"x":356, "y":"value_356"}, {"x":357, "y":"value_357"}, {"x":358, "y":"value_358"}, {"x":359, "y":"value_359"}, {"x":360, "y":"value_360"}, {"x":361, "y":"value_361"}, {"x":362, "y":"value_362"}, {"x":363, "y":"value_363"}, {"x":364, "y":"value_364"}, {"x":365, "y":"value_365"}, {"x":366, "y":"value_366"}, {"x":367, "y":"value_367"}, {"x":368, "y":"value_368"}, {"x":369, "y":"value_369"}, {"x":370, "y":"value_370"}, {"x":371, "y":"value_371"}, {"x":372, "y":"value_372"}, {"x":373, "y":"value_373"}, {"x":374, "y":"value_374"}, {"x":375, "y":"value_375"}, {"x":376, "y":"value_376"}, {"x":377, "y":"value_377"}, {"x":378, "y":"value_378"}, {"x":379, "y":"value_379"}, {"x":380, "y":"value_380"}, {"x":381, "y":"value_381"}, {"x":382, "y":"value_382"}, {"x":383, "y":"value_383"}, {"x":384, "y":"value_384"}, {"x":385, "y":"value_385"}, {"x":386, "y":"value_386"}, {"x":387, "y":"value_387"}, {"x":388, "y":"value_388"}, {"x":389, "y":"value_389"}, {"x":390, "y":"value_390"}, {"x":391, "y":"value_391"}, {"x":392, "y":"value_392"}, {"x":393, "y":"value_393"}, {"x":394, "y":"value_394"}, {"x":395, "y":"value_395"}, {"x":396, "y":"value_396"}, {"x":397, "y":"value_397"}, {"x":398, "y":"value_398"}, {"x":399, "y":"value_399"}, {"x":400, "y":"value_400"}, {"x":401, "y":"value_401"}, {"x":402, "y":"value_402"}, {"x":403, "y":"value_403"}, {"x":404, "y":"value_404"}, {"x":405, "y":"value_405"}, {"x":406, "y":"value_406"}, {"x":407, "y":"value_407"}, {"x":408, "y":"value_408"}, {"x":409, "y":"value_409"}, {"x":410, "y":"value_410"}, {"x":411, "y":"value_411"}, {"x":412, "y":"value_412"}, {"x":413, "y":"value_413"}, {"x":414, "y":"value_414"}, {"x":415, "y":"value_415"}, {"x":416, "y":"value_416"}, {"x":417, "y":"value_417"}, {"x":418, "y":"value_418"}, {"x":419, "y":"value_419"}, {"x":420, "y":"value_420"}, {"x":421, "y":"value_421"}, {"x":422, "y":"value_422"}, {"x":423, "y":"value_423"}, {"x":424, "y":"value_424"}, {"x":425, "y":"value_425"}, {"x":426, "y":"value_426"}, {"x":427, "y":"value_427"}, {"x":428, "y":"value_428"}, {"x":429, "y":"value_429"}, {"x":430, "y":"value_430"}, {"x":431, "y":"value_431"}, {"x":432, "y":"value_432"}, {"x":433, "y":"value_433"}, {"x":434, "y":"value_434"}, {"x":435, "y":"value_435"}, {"x":436, "y":"value_436"}, {"x":437, "y":"value_437"}, {"x":438, "y":"value_438"}, {"x":439, "y":"value_439"}, {"x":440, "y":"value_440"}, {"x":441, "y":"value_441"}, {"x":442, "y":"value_442"}, {"x":443, "y":"value_443"}, {"x":444, "y":"value_444"}, {"x":445, "y":"value_445"}, {"x":446, "y":"value_446"}, {"x":447, "y":"value_447"}, {"x":448, "y":"value_448"}, {"x":449, "y":"value_449"}, {"x":450, "y":"value_450"}, {"x":451, "y":"value_451"}, {"x":452, "y":"value_452"}, {"x":453, "y":"value_453"}, {"x":454, "y":"value_454"}, {"x":455, "y":"value_455"}, {"x":456, "y":"value_456"}, {"x":457, "y":"value_457"}, {"x":458, "y":"value_458"}, {"x":459, "y":"value_459"}, {"x":460, "y":"value_460"}, {"x":461, "y":"value_461"}, {"x":462, "y":"value_462"}, {"x":463, "y":"value_463"}, {"x":464, "y":"value_464"}, {"x":465, "y":"value_465"}, {"x":466, "y":"value_466"}, {"x":467, "y":"value_467"}, {"x":468, "y":"value_468"}, {"x":469, "y":"value_469"}, {"x":470, "y":"value_470"}, {"x":471, "y":"value_471"}, {"x":472, "y":"value_472"}, {"x":473, "y":"value_473"}, {"x":474, "y":"value_474"}, {"x":475, "y":"value_475"}, {"x":476, "y":"value_476"}, {"x":477, "y":"value_477"}, {"x":478, "y":"value_478"}, {"x":479, "y":"value_479"}, {"x":480, "y":"value_480"}, {"x":481, "y":"value_481"}, {"x":482, "y":"value_482"}, {"x":483, "y":"value_483"}, {"x":484, "y":"value_484"}, {"x":485, "y":"value_485"}, {"x":486, "y":"value_486"}, {"x":487, "y":"value_487"}, {"x":488, "y":"value_488"}, {"x":489, "y":"value_489"}, {"x":490, "y":"value_490"}, {"x":491, "y":"value_491"}, {"x":492, "y":"value_492"}, {"x":493, "y":"value_493"}, {"x":494, "y":"value_494"}, {"x":495, "y":"value_495"}, {"x":496, "y":"value_496"}, {"x":497, "y":"value_497"}, {"x":498, "y":"value_498"}, {"x":499, "y":"value_499"}] 500 +3 [{"x":0, "y":"big_0"}, {"x":1, "y":"big_1"}, {"x":2, "y":"big_2"}, {"x":3, "y":"big_3"}, {"x":4, "y":"big_4"}, {"x":5, "y":"big_5"}, {"x":6, "y":"big_6"}, {"x":7, "y":"big_7"}, {"x":8, "y":"big_8"}, {"x":9, "y":"big_9"}, {"x":10, "y":"big_10"}, {"x":11, "y":"big_11"}, {"x":12, "y":"big_12"}, {"x":13, "y":"big_13"}, {"x":14, "y":"big_14"}, {"x":15, "y":"big_15"}, {"x":16, "y":"big_16"}, {"x":17, "y":"big_17"}, {"x":18, "y":"big_18"}, {"x":19, "y":"big_19"}, {"x":20, "y":"big_20"}, {"x":21, "y":"big_21"}, {"x":22, "y":"big_22"}, {"x":23, "y":"big_23"}, {"x":24, "y":"big_24"}, {"x":25, "y":"big_25"}, {"x":26, "y":"big_26"}, {"x":27, "y":"big_27"}, {"x":28, "y":"big_28"}, {"x":29, "y":"big_29"}, {"x":30, "y":"big_30"}, {"x":31, "y":"big_31"}, {"x":32, "y":"big_32"}, {"x":33, "y":"big_33"}, {"x":34, "y":"big_34"}, {"x":35, "y":"big_35"}, {"x":36, "y":"big_36"}, {"x":37, "y":"big_37"}, {"x":38, "y":"big_38"}, {"x":39, "y":"big_39"}, {"x":40, "y":"big_40"}, {"x":41, "y":"big_41"}, {"x":42, "y":"big_42"}, {"x":43, "y":"big_43"}, {"x":44, "y":"big_44"}, {"x":45, "y":"big_45"}, {"x":46, "y":"big_46"}, {"x":47, "y":"big_47"}, {"x":48, "y":"big_48"}, {"x":49, "y":"big_49"}, {"x":50, "y":"big_50"}, {"x":51, "y":"big_51"}, {"x":52, "y":"big_52"}, {"x":53, "y":"big_53"}, {"x":54, "y":"big_54"}, {"x":55, "y":"big_55"}, {"x":56, "y":"big_56"}, {"x":57, "y":"big_57"}, {"x":58, "y":"big_58"}, {"x":59, "y":"big_59"}, {"x":60, "y":"big_60"}, {"x":61, "y":"big_61"}, {"x":62, "y":"big_62"}, {"x":63, "y":"big_63"}, {"x":64, "y":"big_64"}, {"x":65, "y":"big_65"}, {"x":66, "y":"big_66"}, {"x":67, "y":"big_67"}, {"x":68, "y":"big_68"}, {"x":69, "y":"big_69"}, {"x":70, "y":"big_70"}, {"x":71, "y":"big_71"}, {"x":72, "y":"big_72"}, {"x":73, "y":"big_73"}, {"x":74, "y":"big_74"}, {"x":75, "y":"big_75"}, {"x":76, "y":"big_76"}, {"x":77, "y":"big_77"}, {"x":78, "y":"big_78"}, {"x":79, "y":"big_79"}, {"x":80, "y":"big_80"}, {"x":81, "y":"big_81"}, {"x":82, "y":"big_82"}, {"x":83, "y":"big_83"}, {"x":84, "y":"big_84"}, {"x":85, "y":"big_85"}, {"x":86, "y":"big_86"}, {"x":87, "y":"big_87"}, {"x":88, "y":"big_88"}, {"x":89, "y":"big_89"}, {"x":90, "y":"big_90"}, {"x":91, "y":"big_91"}, {"x":92, "y":"big_92"}, {"x":93, "y":"big_93"}, {"x":94, "y":"big_94"}, {"x":95, "y":"big_95"}, {"x":96, "y":"big_96"}, {"x":97, "y":"big_97"}, {"x":98, "y":"big_98"}, {"x":99, "y":"big_99"}, {"x":100, "y":"big_100"}, {"x":101, "y":"big_101"}, {"x":102, "y":"big_102"}, {"x":103, "y":"big_103"}, {"x":104, "y":"big_104"}, {"x":105, "y":"big_105"}, {"x":106, "y":"big_106"}, {"x":107, "y":"big_107"}, {"x":108, "y":"big_108"}, {"x":109, "y":"big_109"}, {"x":110, "y":"big_110"}, {"x":111, "y":"big_111"}, {"x":112, "y":"big_112"}, {"x":113, "y":"big_113"}, {"x":114, "y":"big_114"}, {"x":115, "y":"big_115"}, {"x":116, "y":"big_116"}, {"x":117, "y":"big_117"}, {"x":118, "y":"big_118"}, {"x":119, "y":"big_119"}, {"x":120, "y":"big_120"}, {"x":121, "y":"big_121"}, {"x":122, "y":"big_122"}, {"x":123, "y":"big_123"}, {"x":124, "y":"big_124"}, {"x":125, "y":"big_125"}, {"x":126, "y":"big_126"}, {"x":127, "y":"big_127"}, {"x":128, "y":"big_128"}, {"x":129, "y":"big_129"}, {"x":130, "y":"big_130"}, {"x":131, "y":"big_131"}, {"x":132, "y":"big_132"}, {"x":133, "y":"big_133"}, {"x":134, "y":"big_134"}, {"x":135, "y":"big_135"}, {"x":136, "y":"big_136"}, {"x":137, "y":"big_137"}, {"x":138, "y":"big_138"}, {"x":139, "y":"big_139"}, {"x":140, "y":"big_140"}, {"x":141, "y":"big_141"}, {"x":142, "y":"big_142"}, {"x":143, "y":"big_143"}, {"x":144, "y":"big_144"}, {"x":145, "y":"big_145"}, {"x":146, "y":"big_146"}, {"x":147, "y":"big_147"}, {"x":148, "y":"big_148"}, {"x":149, "y":"big_149"}, {"x":150, "y":"big_150"}, {"x":151, "y":"big_151"}, {"x":152, "y":"big_152"}, {"x":153, "y":"big_153"}, {"x":154, "y":"big_154"}, {"x":155, "y":"big_155"}, {"x":156, "y":"big_156"}, {"x":157, "y":"big_157"}, {"x":158, "y":"big_158"}, {"x":159, "y":"big_159"}, {"x":160, "y":"big_160"}, {"x":161, "y":"big_161"}, {"x":162, "y":"big_162"}, {"x":163, "y":"big_163"}, {"x":164, "y":"big_164"}, {"x":165, "y":"big_165"}, {"x":166, "y":"big_166"}, {"x":167, "y":"big_167"}, {"x":168, "y":"big_168"}, {"x":169, "y":"big_169"}, {"x":170, "y":"big_170"}, {"x":171, "y":"big_171"}, {"x":172, "y":"big_172"}, {"x":173, "y":"big_173"}, {"x":174, "y":"big_174"}, {"x":175, "y":"big_175"}, {"x":176, "y":"big_176"}, {"x":177, "y":"big_177"}, {"x":178, "y":"big_178"}, {"x":179, "y":"big_179"}, {"x":180, "y":"big_180"}, {"x":181, "y":"big_181"}, {"x":182, "y":"big_182"}, {"x":183, "y":"big_183"}, {"x":184, "y":"big_184"}, {"x":185, "y":"big_185"}, {"x":186, "y":"big_186"}, {"x":187, "y":"big_187"}, {"x":188, "y":"big_188"}, {"x":189, "y":"big_189"}, {"x":190, "y":"big_190"}, {"x":191, "y":"big_191"}, {"x":192, "y":"big_192"}, {"x":193, "y":"big_193"}, {"x":194, "y":"big_194"}, {"x":195, "y":"big_195"}, {"x":196, "y":"big_196"}, {"x":197, "y":"big_197"}, {"x":198, "y":"big_198"}, {"x":199, "y":"big_199"}, {"x":200, "y":"big_200"}, {"x":201, "y":"big_201"}, {"x":202, "y":"big_202"}, {"x":203, "y":"big_203"}, {"x":204, "y":"big_204"}, {"x":205, "y":"big_205"}, {"x":206, "y":"big_206"}, {"x":207, "y":"big_207"}, {"x":208, "y":"big_208"}, {"x":209, "y":"big_209"}, {"x":210, "y":"big_210"}, {"x":211, "y":"big_211"}, {"x":212, "y":"big_212"}, {"x":213, "y":"big_213"}, {"x":214, "y":"big_214"}, {"x":215, "y":"big_215"}, {"x":216, "y":"big_216"}, {"x":217, "y":"big_217"}, {"x":218, "y":"big_218"}, {"x":219, "y":"big_219"}, {"x":220, "y":"big_220"}, {"x":221, "y":"big_221"}, {"x":222, "y":"big_222"}, {"x":223, "y":"big_223"}, {"x":224, "y":"big_224"}, {"x":225, "y":"big_225"}, {"x":226, "y":"big_226"}, {"x":227, "y":"big_227"}, {"x":228, "y":"big_228"}, {"x":229, "y":"big_229"}, {"x":230, "y":"big_230"}, {"x":231, "y":"big_231"}, {"x":232, "y":"big_232"}, {"x":233, "y":"big_233"}, {"x":234, "y":"big_234"}, {"x":235, "y":"big_235"}, {"x":236, "y":"big_236"}, {"x":237, "y":"big_237"}, {"x":238, "y":"big_238"}, {"x":239, "y":"big_239"}, {"x":240, "y":"big_240"}, {"x":241, "y":"big_241"}, {"x":242, "y":"big_242"}, {"x":243, "y":"big_243"}, {"x":244, "y":"big_244"}, {"x":245, "y":"big_245"}, {"x":246, "y":"big_246"}, {"x":247, "y":"big_247"}, {"x":248, "y":"big_248"}, {"x":249, "y":"big_249"}, {"x":250, "y":"big_250"}, {"x":251, "y":"big_251"}, {"x":252, "y":"big_252"}, {"x":253, "y":"big_253"}, {"x":254, "y":"big_254"}, {"x":255, "y":"big_255"}, {"x":256, "y":"big_256"}, {"x":257, "y":"big_257"}, {"x":258, "y":"big_258"}, {"x":259, "y":"big_259"}, {"x":260, "y":"big_260"}, {"x":261, "y":"big_261"}, {"x":262, "y":"big_262"}, {"x":263, "y":"big_263"}, {"x":264, "y":"big_264"}, {"x":265, "y":"big_265"}, {"x":266, "y":"big_266"}, {"x":267, "y":"big_267"}, {"x":268, "y":"big_268"}, {"x":269, "y":"big_269"}, {"x":270, "y":"big_270"}, {"x":271, "y":"big_271"}, {"x":272, "y":"big_272"}, {"x":273, "y":"big_273"}, {"x":274, "y":"big_274"}, {"x":275, "y":"big_275"}, {"x":276, "y":"big_276"}, {"x":277, "y":"big_277"}, {"x":278, "y":"big_278"}, {"x":279, "y":"big_279"}, {"x":280, "y":"big_280"}, {"x":281, "y":"big_281"}, {"x":282, "y":"big_282"}, {"x":283, "y":"big_283"}, {"x":284, "y":"big_284"}, {"x":285, "y":"big_285"}, {"x":286, "y":"big_286"}, {"x":287, "y":"big_287"}, {"x":288, "y":"big_288"}, {"x":289, "y":"big_289"}, {"x":290, "y":"big_290"}, {"x":291, "y":"big_291"}, {"x":292, "y":"big_292"}, {"x":293, "y":"big_293"}, {"x":294, "y":"big_294"}, {"x":295, "y":"big_295"}, {"x":296, "y":"big_296"}, {"x":297, "y":"big_297"}, {"x":298, "y":"big_298"}, {"x":299, "y":"big_299"}, {"x":300, "y":"big_300"}, {"x":301, "y":"big_301"}, {"x":302, "y":"big_302"}, {"x":303, "y":"big_303"}, {"x":304, "y":"big_304"}, {"x":305, "y":"big_305"}, {"x":306, "y":"big_306"}, {"x":307, "y":"big_307"}, {"x":308, "y":"big_308"}, {"x":309, "y":"big_309"}, {"x":310, "y":"big_310"}, {"x":311, "y":"big_311"}, {"x":312, "y":"big_312"}, {"x":313, "y":"big_313"}, {"x":314, "y":"big_314"}, {"x":315, "y":"big_315"}, {"x":316, "y":"big_316"}, {"x":317, "y":"big_317"}, {"x":318, "y":"big_318"}, {"x":319, "y":"big_319"}, {"x":320, "y":"big_320"}, {"x":321, "y":"big_321"}, {"x":322, "y":"big_322"}, {"x":323, "y":"big_323"}, {"x":324, "y":"big_324"}, {"x":325, "y":"big_325"}, {"x":326, "y":"big_326"}, {"x":327, "y":"big_327"}, {"x":328, "y":"big_328"}, {"x":329, "y":"big_329"}, {"x":330, "y":"big_330"}, {"x":331, "y":"big_331"}, {"x":332, "y":"big_332"}, {"x":333, "y":"big_333"}, {"x":334, "y":"big_334"}, {"x":335, "y":"big_335"}, {"x":336, "y":"big_336"}, {"x":337, "y":"big_337"}, {"x":338, "y":"big_338"}, {"x":339, "y":"big_339"}, {"x":340, "y":"big_340"}, {"x":341, "y":"big_341"}, {"x":342, "y":"big_342"}, {"x":343, "y":"big_343"}, {"x":344, "y":"big_344"}, {"x":345, "y":"big_345"}, {"x":346, "y":"big_346"}, {"x":347, "y":"big_347"}, {"x":348, "y":"big_348"}, {"x":349, "y":"big_349"}, {"x":350, "y":"big_350"}, {"x":351, "y":"big_351"}, {"x":352, "y":"big_352"}, {"x":353, "y":"big_353"}, {"x":354, "y":"big_354"}, {"x":355, "y":"big_355"}, {"x":356, "y":"big_356"}, {"x":357, "y":"big_357"}, {"x":358, "y":"big_358"}, {"x":359, "y":"big_359"}, {"x":360, "y":"big_360"}, {"x":361, "y":"big_361"}, {"x":362, "y":"big_362"}, {"x":363, "y":"big_363"}, {"x":364, "y":"big_364"}, {"x":365, "y":"big_365"}, {"x":366, "y":"big_366"}, {"x":367, "y":"big_367"}, {"x":368, "y":"big_368"}, {"x":369, "y":"big_369"}, {"x":370, "y":"big_370"}, {"x":371, "y":"big_371"}, {"x":372, "y":"big_372"}, {"x":373, "y":"big_373"}, {"x":374, "y":"big_374"}, {"x":375, "y":"big_375"}, {"x":376, "y":"big_376"}, {"x":377, "y":"big_377"}, {"x":378, "y":"big_378"}, {"x":379, "y":"big_379"}, {"x":380, "y":"big_380"}, {"x":381, "y":"big_381"}, {"x":382, "y":"big_382"}, {"x":383, "y":"big_383"}, {"x":384, "y":"big_384"}, {"x":385, "y":"big_385"}, {"x":386, "y":"big_386"}, {"x":387, "y":"big_387"}, {"x":388, "y":"big_388"}, {"x":389, "y":"big_389"}, {"x":390, "y":"big_390"}, {"x":391, "y":"big_391"}, {"x":392, "y":"big_392"}, {"x":393, "y":"big_393"}, {"x":394, "y":"big_394"}, {"x":395, "y":"big_395"}, {"x":396, "y":"big_396"}, {"x":397, "y":"big_397"}, {"x":398, "y":"big_398"}, {"x":399, "y":"big_399"}, {"x":400, "y":"big_400"}, {"x":401, "y":"big_401"}, {"x":402, "y":"big_402"}, {"x":403, "y":"big_403"}, {"x":404, "y":"big_404"}, {"x":405, "y":"big_405"}, {"x":406, "y":"big_406"}, {"x":407, "y":"big_407"}, {"x":408, "y":"big_408"}, {"x":409, "y":"big_409"}, {"x":410, "y":"big_410"}, {"x":411, "y":"big_411"}, {"x":412, "y":"big_412"}, {"x":413, "y":"big_413"}, {"x":414, "y":"big_414"}, {"x":415, "y":"big_415"}, {"x":416, "y":"big_416"}, {"x":417, "y":"big_417"}, {"x":418, "y":"big_418"}, {"x":419, "y":"big_419"}, {"x":420, "y":"big_420"}, {"x":421, "y":"big_421"}, {"x":422, "y":"big_422"}, {"x":423, "y":"big_423"}, {"x":424, "y":"big_424"}, {"x":425, "y":"big_425"}, {"x":426, "y":"big_426"}, {"x":427, "y":"big_427"}, {"x":428, "y":"big_428"}, {"x":429, "y":"big_429"}, {"x":430, "y":"big_430"}, {"x":431, "y":"big_431"}, {"x":432, "y":"big_432"}, {"x":433, "y":"big_433"}, {"x":434, "y":"big_434"}, {"x":435, "y":"big_435"}, {"x":436, "y":"big_436"}, {"x":437, "y":"big_437"}, {"x":438, "y":"big_438"}, {"x":439, "y":"big_439"}, {"x":440, "y":"big_440"}, {"x":441, "y":"big_441"}, {"x":442, "y":"big_442"}, {"x":443, "y":"big_443"}, {"x":444, "y":"big_444"}, {"x":445, "y":"big_445"}, {"x":446, "y":"big_446"}, {"x":447, "y":"big_447"}, {"x":448, "y":"big_448"}, {"x":449, "y":"big_449"}, {"x":450, "y":"big_450"}, {"x":451, "y":"big_451"}, {"x":452, "y":"big_452"}, {"x":453, "y":"big_453"}, {"x":454, "y":"big_454"}, {"x":455, "y":"big_455"}, {"x":456, "y":"big_456"}, {"x":457, "y":"big_457"}, {"x":458, "y":"big_458"}, {"x":459, "y":"big_459"}, {"x":460, "y":"big_460"}, {"x":461, "y":"big_461"}, {"x":462, "y":"big_462"}, {"x":463, "y":"big_463"}, {"x":464, "y":"big_464"}, {"x":465, "y":"big_465"}, {"x":466, "y":"big_466"}, {"x":467, "y":"big_467"}, {"x":468, "y":"big_468"}, {"x":469, "y":"big_469"}, {"x":470, "y":"big_470"}, {"x":471, "y":"big_471"}, {"x":472, "y":"big_472"}, {"x":473, "y":"big_473"}, {"x":474, "y":"big_474"}, {"x":475, "y":"big_475"}, {"x":476, "y":"big_476"}, {"x":477, "y":"big_477"}, {"x":478, "y":"big_478"}, {"x":479, "y":"big_479"}, {"x":480, "y":"big_480"}, {"x":481, "y":"big_481"}, {"x":482, "y":"big_482"}, {"x":483, "y":"big_483"}, {"x":484, "y":"big_484"}, {"x":485, "y":"big_485"}, {"x":486, "y":"big_486"}, {"x":487, "y":"big_487"}, {"x":488, "y":"big_488"}, {"x":489, "y":"big_489"}, {"x":490, "y":"big_490"}, {"x":491, "y":"big_491"}, {"x":492, "y":"big_492"}, {"x":493, "y":"big_493"}, {"x":494, "y":"big_494"}, {"x":495, "y":"big_495"}, {"x":496, "y":"big_496"}, {"x":497, "y":"big_497"}, {"x":498, "y":"big_498"}, {"x":499, "y":"big_499"}] 500 + +-- !nested_cross_page2_parquet_q5 -- +1 101 value_101 +1 102 value_102 +1 103 value_103 +1 104 value_104 +1 105 value_105 +1 106 value_106 +1 107 value_107 +1 108 value_108 +1 109 value_109 +1 110 value_110 +1 111 value_111 +1 112 value_112 +1 113 value_113 +1 114 value_114 +1 115 value_115 +1 116 value_116 +1 117 value_117 +1 118 value_118 +1 119 value_119 +1 120 value_120 +1 121 value_121 +1 122 value_122 +1 123 value_123 +1 124 value_124 +1 125 value_125 +1 126 value_126 +1 127 value_127 +1 128 value_128 +1 129 value_129 +1 130 value_130 +1 131 value_131 +1 132 value_132 +1 133 value_133 +1 134 value_134 +1 135 value_135 +1 136 value_136 +1 137 value_137 +1 138 value_138 +1 139 value_139 +1 140 value_140 +1 141 value_141 +1 142 value_142 +1 143 value_143 +1 144 value_144 +1 145 value_145 +1 146 value_146 +1 147 value_147 +1 148 value_148 +1 149 value_149 +1 150 value_150 +1 151 value_151 +1 152 value_152 +1 153 value_153 +1 154 value_154 +1 155 value_155 +1 156 value_156 +1 157 value_157 +1 158 value_158 +1 159 value_159 +1 160 value_160 +1 161 value_161 +1 162 value_162 +1 163 value_163 +1 164 value_164 +1 165 value_165 +1 166 value_166 +1 167 value_167 +1 168 value_168 +1 169 value_169 +1 170 value_170 +1 171 value_171 +1 172 value_172 +1 173 value_173 +1 174 value_174 +1 175 value_175 +1 176 value_176 +1 177 value_177 +1 178 value_178 +1 179 value_179 +1 180 value_180 +1 181 value_181 +1 182 value_182 +1 183 value_183 +1 184 value_184 +1 185 value_185 +1 186 value_186 +1 187 value_187 +1 188 value_188 +1 189 value_189 +1 190 value_190 +1 191 value_191 +1 192 value_192 +1 193 value_193 +1 194 value_194 +1 195 value_195 +1 196 value_196 +1 197 value_197 +1 198 value_198 +1 199 value_199 +1 200 value_200 +1 201 value_201 +1 202 value_202 +1 203 value_203 +1 204 value_204 +1 205 value_205 +1 206 value_206 +1 207 value_207 +1 208 value_208 +1 209 value_209 +1 210 value_210 +1 211 value_211 +1 212 value_212 +1 213 value_213 +1 214 value_214 +1 215 value_215 +1 216 value_216 +1 217 value_217 +1 218 value_218 +1 219 value_219 +1 220 value_220 +1 221 value_221 +1 222 value_222 +1 223 value_223 +1 224 value_224 +1 225 value_225 +1 226 value_226 +1 227 value_227 +1 228 value_228 +1 229 value_229 +1 230 value_230 +1 231 value_231 +1 232 value_232 +1 233 value_233 +1 234 value_234 +1 235 value_235 +1 236 value_236 +1 237 value_237 +1 238 value_238 +1 239 value_239 +1 240 value_240 +1 241 value_241 +1 242 value_242 +1 243 value_243 +1 244 value_244 +1 245 value_245 +1 246 value_246 +1 247 value_247 +1 248 value_248 +1 249 value_249 +1 250 value_250 +1 251 value_251 +1 252 value_252 +1 253 value_253 +1 254 value_254 +1 255 value_255 +1 256 value_256 +1 257 value_257 +1 258 value_258 +1 259 value_259 +1 260 value_260 +1 261 value_261 +1 262 value_262 +1 263 value_263 +1 264 value_264 +1 265 value_265 +1 266 value_266 +1 267 value_267 +1 268 value_268 +1 269 value_269 +1 270 value_270 +1 271 value_271 +1 272 value_272 +1 273 value_273 +1 274 value_274 +1 275 value_275 +1 276 value_276 +1 277 value_277 +1 278 value_278 +1 279 value_279 +1 280 value_280 +1 281 value_281 +1 282 value_282 +1 283 value_283 +1 284 value_284 +1 285 value_285 +1 286 value_286 +1 287 value_287 +1 288 value_288 +1 289 value_289 +1 290 value_290 +1 291 value_291 +1 292 value_292 +1 293 value_293 +1 294 value_294 +1 295 value_295 +1 296 value_296 +1 297 value_297 +1 298 value_298 +1 299 value_299 +1 300 value_300 +1 301 value_301 +1 302 value_302 +1 303 value_303 +1 304 value_304 +1 305 value_305 +1 306 value_306 +1 307 value_307 +1 308 value_308 +1 309 value_309 +1 310 value_310 +1 311 value_311 +1 312 value_312 +1 313 value_313 +1 314 value_314 +1 315 value_315 +1 316 value_316 +1 317 value_317 +1 318 value_318 +1 319 value_319 +1 320 value_320 +1 321 value_321 +1 322 value_322 +1 323 value_323 +1 324 value_324 +1 325 value_325 +1 326 value_326 +1 327 value_327 +1 328 value_328 +1 329 value_329 +1 330 value_330 +1 331 value_331 +1 332 value_332 +1 333 value_333 +1 334 value_334 +1 335 value_335 +1 336 value_336 +1 337 value_337 +1 338 value_338 +1 339 value_339 +1 340 value_340 +1 341 value_341 +1 342 value_342 +1 343 value_343 +1 344 value_344 +1 345 value_345 +1 346 value_346 +1 347 value_347 +1 348 value_348 +1 349 value_349 +1 350 value_350 +1 351 value_351 +1 352 value_352 +1 353 value_353 +1 354 value_354 +1 355 value_355 +1 356 value_356 +1 357 value_357 +1 358 value_358 +1 359 value_359 +1 360 value_360 +1 361 value_361 +1 362 value_362 +1 363 value_363 +1 364 value_364 +1 365 value_365 +1 366 value_366 +1 367 value_367 +1 368 value_368 +1 369 value_369 +1 370 value_370 +1 371 value_371 +1 372 value_372 +1 373 value_373 +1 374 value_374 +1 375 value_375 +1 376 value_376 +1 377 value_377 +1 378 value_378 +1 379 value_379 +1 380 value_380 +1 381 value_381 +1 382 value_382 +1 383 value_383 +1 384 value_384 +1 385 value_385 +1 386 value_386 +1 387 value_387 +1 388 value_388 +1 389 value_389 +1 390 value_390 +1 391 value_391 +1 392 value_392 +1 393 value_393 +1 394 value_394 +1 395 value_395 +1 396 value_396 +1 397 value_397 +1 398 value_398 +1 399 value_399 +1 400 value_400 +1 401 value_401 +1 402 value_402 +1 403 value_403 +1 404 value_404 +1 405 value_405 +1 406 value_406 +1 407 value_407 +1 408 value_408 +1 409 value_409 +1 410 value_410 +1 411 value_411 +1 412 value_412 +1 413 value_413 +1 414 value_414 +1 415 value_415 +1 416 value_416 +1 417 value_417 +1 418 value_418 +1 419 value_419 +1 420 value_420 +1 421 value_421 +1 422 value_422 +1 423 value_423 +1 424 value_424 +1 425 value_425 +1 426 value_426 +1 427 value_427 +1 428 value_428 +1 429 value_429 +1 430 value_430 +1 431 value_431 +1 432 value_432 +1 433 value_433 +1 434 value_434 +1 435 value_435 +1 436 value_436 +1 437 value_437 +1 438 value_438 +1 439 value_439 +1 440 value_440 +1 441 value_441 +1 442 value_442 +1 443 value_443 +1 444 value_444 +1 445 value_445 +1 446 value_446 +1 447 value_447 +1 448 value_448 +1 449 value_449 +1 450 value_450 +1 451 value_451 +1 452 value_452 +1 453 value_453 +1 454 value_454 +1 455 value_455 +1 456 value_456 +1 457 value_457 +1 458 value_458 +1 459 value_459 +1 460 value_460 +1 461 value_461 +1 462 value_462 +1 463 value_463 +1 464 value_464 +1 465 value_465 +1 466 value_466 +1 467 value_467 +1 468 value_468 +1 469 value_469 +1 470 value_470 +1 471 value_471 +1 472 value_472 +1 473 value_473 +1 474 value_474 +1 475 value_475 +1 476 value_476 +1 477 value_477 +1 478 value_478 +1 479 value_479 +1 480 value_480 +1 481 value_481 +1 482 value_482 +1 483 value_483 +1 484 value_484 +1 485 value_485 +1 486 value_486 +1 487 value_487 +1 488 value_488 +1 489 value_489 +1 490 value_490 +1 491 value_491 +1 492 value_492 +1 493 value_493 +1 494 value_494 +1 495 value_495 +1 496 value_496 +1 497 value_497 +1 498 value_498 +1 499 value_499 + +-- !nested_cross_page2_parquet_q6 -- +2 {"small_key":[1, 2, 3]} 1 + +-- !nested_cross_page1_parquet_q1 -- +[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] + +-- !nested_cross_page1_parquet_q2 -- +[1, 2, 3] + +-- !nested_cross_page1_parquet_q3 -- +[6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page1_parquet_q4 -- +1 1000 +2 3 +3 1000 + +-- !nested_cross_page1_parquet_q5 -- +1 1 3 +2 1 3 +3 6 8 + +-- !nested_cross_page1_parquet_q6 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +3 [6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page1_parquet_q7 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +2 [1, 2, 3] + +-- !nested_cross_page1_parquet_q8 -- +2 [1, 2, 3] This is a small array with just three elements + +-- !nested_cross_page1_parquet_q9 -- +1 1 5 +2 1 3 +3 6 10 + +-- !nested_cross_page1_parquet_q10 -- +1 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] +3 [6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10] + +-- !nested_cross_page2_parquet_q1 -- +1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 100 + +-- !nested_cross_page2_parquet_q2 -- +2 [[1, 2], [3, 4], [5, 6]] 3 + +-- !nested_cross_page2_parquet_q3 -- +3 [[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]] 100 + +-- !nested_cross_page2_parquet_q4 -- +1 [{"x":0, "y":"value_0"}, {"x":1, "y":"value_1"}, {"x":2, "y":"value_2"}, {"x":3, "y":"value_3"}, {"x":4, "y":"value_4"}, {"x":5, "y":"value_5"}, {"x":6, "y":"value_6"}, {"x":7, "y":"value_7"}, {"x":8, "y":"value_8"}, {"x":9, "y":"value_9"}, {"x":10, "y":"value_10"}, {"x":11, "y":"value_11"}, {"x":12, "y":"value_12"}, {"x":13, "y":"value_13"}, {"x":14, "y":"value_14"}, {"x":15, "y":"value_15"}, {"x":16, "y":"value_16"}, {"x":17, "y":"value_17"}, {"x":18, "y":"value_18"}, {"x":19, "y":"value_19"}, {"x":20, "y":"value_20"}, {"x":21, "y":"value_21"}, {"x":22, "y":"value_22"}, {"x":23, "y":"value_23"}, {"x":24, "y":"value_24"}, {"x":25, "y":"value_25"}, {"x":26, "y":"value_26"}, {"x":27, "y":"value_27"}, {"x":28, "y":"value_28"}, {"x":29, "y":"value_29"}, {"x":30, "y":"value_30"}, {"x":31, "y":"value_31"}, {"x":32, "y":"value_32"}, {"x":33, "y":"value_33"}, {"x":34, "y":"value_34"}, {"x":35, "y":"value_35"}, {"x":36, "y":"value_36"}, {"x":37, "y":"value_37"}, {"x":38, "y":"value_38"}, {"x":39, "y":"value_39"}, {"x":40, "y":"value_40"}, {"x":41, "y":"value_41"}, {"x":42, "y":"value_42"}, {"x":43, "y":"value_43"}, {"x":44, "y":"value_44"}, {"x":45, "y":"value_45"}, {"x":46, "y":"value_46"}, {"x":47, "y":"value_47"}, {"x":48, "y":"value_48"}, {"x":49, "y":"value_49"}, {"x":50, "y":"value_50"}, {"x":51, "y":"value_51"}, {"x":52, "y":"value_52"}, {"x":53, "y":"value_53"}, {"x":54, "y":"value_54"}, {"x":55, "y":"value_55"}, {"x":56, "y":"value_56"}, {"x":57, "y":"value_57"}, {"x":58, "y":"value_58"}, {"x":59, "y":"value_59"}, {"x":60, "y":"value_60"}, {"x":61, "y":"value_61"}, {"x":62, "y":"value_62"}, {"x":63, "y":"value_63"}, {"x":64, "y":"value_64"}, {"x":65, "y":"value_65"}, {"x":66, "y":"value_66"}, {"x":67, "y":"value_67"}, {"x":68, "y":"value_68"}, {"x":69, "y":"value_69"}, {"x":70, "y":"value_70"}, {"x":71, "y":"value_71"}, {"x":72, "y":"value_72"}, {"x":73, "y":"value_73"}, {"x":74, "y":"value_74"}, {"x":75, "y":"value_75"}, {"x":76, "y":"value_76"}, {"x":77, "y":"value_77"}, {"x":78, "y":"value_78"}, {"x":79, "y":"value_79"}, {"x":80, "y":"value_80"}, {"x":81, "y":"value_81"}, {"x":82, "y":"value_82"}, {"x":83, "y":"value_83"}, {"x":84, "y":"value_84"}, {"x":85, "y":"value_85"}, {"x":86, "y":"value_86"}, {"x":87, "y":"value_87"}, {"x":88, "y":"value_88"}, {"x":89, "y":"value_89"}, {"x":90, "y":"value_90"}, {"x":91, "y":"value_91"}, {"x":92, "y":"value_92"}, {"x":93, "y":"value_93"}, {"x":94, "y":"value_94"}, {"x":95, "y":"value_95"}, {"x":96, "y":"value_96"}, {"x":97, "y":"value_97"}, {"x":98, "y":"value_98"}, {"x":99, "y":"value_99"}, {"x":100, "y":"value_100"}, {"x":101, "y":"value_101"}, {"x":102, "y":"value_102"}, {"x":103, "y":"value_103"}, {"x":104, "y":"value_104"}, {"x":105, "y":"value_105"}, {"x":106, "y":"value_106"}, {"x":107, "y":"value_107"}, {"x":108, "y":"value_108"}, {"x":109, "y":"value_109"}, {"x":110, "y":"value_110"}, {"x":111, "y":"value_111"}, {"x":112, "y":"value_112"}, {"x":113, "y":"value_113"}, {"x":114, "y":"value_114"}, {"x":115, "y":"value_115"}, {"x":116, "y":"value_116"}, {"x":117, "y":"value_117"}, {"x":118, "y":"value_118"}, {"x":119, "y":"value_119"}, {"x":120, "y":"value_120"}, {"x":121, "y":"value_121"}, {"x":122, "y":"value_122"}, {"x":123, "y":"value_123"}, {"x":124, "y":"value_124"}, {"x":125, "y":"value_125"}, {"x":126, "y":"value_126"}, {"x":127, "y":"value_127"}, {"x":128, "y":"value_128"}, {"x":129, "y":"value_129"}, {"x":130, "y":"value_130"}, {"x":131, "y":"value_131"}, {"x":132, "y":"value_132"}, {"x":133, "y":"value_133"}, {"x":134, "y":"value_134"}, {"x":135, "y":"value_135"}, {"x":136, "y":"value_136"}, {"x":137, "y":"value_137"}, {"x":138, "y":"value_138"}, {"x":139, "y":"value_139"}, {"x":140, "y":"value_140"}, {"x":141, "y":"value_141"}, {"x":142, "y":"value_142"}, {"x":143, "y":"value_143"}, {"x":144, "y":"value_144"}, {"x":145, "y":"value_145"}, {"x":146, "y":"value_146"}, {"x":147, "y":"value_147"}, {"x":148, "y":"value_148"}, {"x":149, "y":"value_149"}, {"x":150, "y":"value_150"}, {"x":151, "y":"value_151"}, {"x":152, "y":"value_152"}, {"x":153, "y":"value_153"}, {"x":154, "y":"value_154"}, {"x":155, "y":"value_155"}, {"x":156, "y":"value_156"}, {"x":157, "y":"value_157"}, {"x":158, "y":"value_158"}, {"x":159, "y":"value_159"}, {"x":160, "y":"value_160"}, {"x":161, "y":"value_161"}, {"x":162, "y":"value_162"}, {"x":163, "y":"value_163"}, {"x":164, "y":"value_164"}, {"x":165, "y":"value_165"}, {"x":166, "y":"value_166"}, {"x":167, "y":"value_167"}, {"x":168, "y":"value_168"}, {"x":169, "y":"value_169"}, {"x":170, "y":"value_170"}, {"x":171, "y":"value_171"}, {"x":172, "y":"value_172"}, {"x":173, "y":"value_173"}, {"x":174, "y":"value_174"}, {"x":175, "y":"value_175"}, {"x":176, "y":"value_176"}, {"x":177, "y":"value_177"}, {"x":178, "y":"value_178"}, {"x":179, "y":"value_179"}, {"x":180, "y":"value_180"}, {"x":181, "y":"value_181"}, {"x":182, "y":"value_182"}, {"x":183, "y":"value_183"}, {"x":184, "y":"value_184"}, {"x":185, "y":"value_185"}, {"x":186, "y":"value_186"}, {"x":187, "y":"value_187"}, {"x":188, "y":"value_188"}, {"x":189, "y":"value_189"}, {"x":190, "y":"value_190"}, {"x":191, "y":"value_191"}, {"x":192, "y":"value_192"}, {"x":193, "y":"value_193"}, {"x":194, "y":"value_194"}, {"x":195, "y":"value_195"}, {"x":196, "y":"value_196"}, {"x":197, "y":"value_197"}, {"x":198, "y":"value_198"}, {"x":199, "y":"value_199"}, {"x":200, "y":"value_200"}, {"x":201, "y":"value_201"}, {"x":202, "y":"value_202"}, {"x":203, "y":"value_203"}, {"x":204, "y":"value_204"}, {"x":205, "y":"value_205"}, {"x":206, "y":"value_206"}, {"x":207, "y":"value_207"}, {"x":208, "y":"value_208"}, {"x":209, "y":"value_209"}, {"x":210, "y":"value_210"}, {"x":211, "y":"value_211"}, {"x":212, "y":"value_212"}, {"x":213, "y":"value_213"}, {"x":214, "y":"value_214"}, {"x":215, "y":"value_215"}, {"x":216, "y":"value_216"}, {"x":217, "y":"value_217"}, {"x":218, "y":"value_218"}, {"x":219, "y":"value_219"}, {"x":220, "y":"value_220"}, {"x":221, "y":"value_221"}, {"x":222, "y":"value_222"}, {"x":223, "y":"value_223"}, {"x":224, "y":"value_224"}, {"x":225, "y":"value_225"}, {"x":226, "y":"value_226"}, {"x":227, "y":"value_227"}, {"x":228, "y":"value_228"}, {"x":229, "y":"value_229"}, {"x":230, "y":"value_230"}, {"x":231, "y":"value_231"}, {"x":232, "y":"value_232"}, {"x":233, "y":"value_233"}, {"x":234, "y":"value_234"}, {"x":235, "y":"value_235"}, {"x":236, "y":"value_236"}, {"x":237, "y":"value_237"}, {"x":238, "y":"value_238"}, {"x":239, "y":"value_239"}, {"x":240, "y":"value_240"}, {"x":241, "y":"value_241"}, {"x":242, "y":"value_242"}, {"x":243, "y":"value_243"}, {"x":244, "y":"value_244"}, {"x":245, "y":"value_245"}, {"x":246, "y":"value_246"}, {"x":247, "y":"value_247"}, {"x":248, "y":"value_248"}, {"x":249, "y":"value_249"}, {"x":250, "y":"value_250"}, {"x":251, "y":"value_251"}, {"x":252, "y":"value_252"}, {"x":253, "y":"value_253"}, {"x":254, "y":"value_254"}, {"x":255, "y":"value_255"}, {"x":256, "y":"value_256"}, {"x":257, "y":"value_257"}, {"x":258, "y":"value_258"}, {"x":259, "y":"value_259"}, {"x":260, "y":"value_260"}, {"x":261, "y":"value_261"}, {"x":262, "y":"value_262"}, {"x":263, "y":"value_263"}, {"x":264, "y":"value_264"}, {"x":265, "y":"value_265"}, {"x":266, "y":"value_266"}, {"x":267, "y":"value_267"}, {"x":268, "y":"value_268"}, {"x":269, "y":"value_269"}, {"x":270, "y":"value_270"}, {"x":271, "y":"value_271"}, {"x":272, "y":"value_272"}, {"x":273, "y":"value_273"}, {"x":274, "y":"value_274"}, {"x":275, "y":"value_275"}, {"x":276, "y":"value_276"}, {"x":277, "y":"value_277"}, {"x":278, "y":"value_278"}, {"x":279, "y":"value_279"}, {"x":280, "y":"value_280"}, {"x":281, "y":"value_281"}, {"x":282, "y":"value_282"}, {"x":283, "y":"value_283"}, {"x":284, "y":"value_284"}, {"x":285, "y":"value_285"}, {"x":286, "y":"value_286"}, {"x":287, "y":"value_287"}, {"x":288, "y":"value_288"}, {"x":289, "y":"value_289"}, {"x":290, "y":"value_290"}, {"x":291, "y":"value_291"}, {"x":292, "y":"value_292"}, {"x":293, "y":"value_293"}, {"x":294, "y":"value_294"}, {"x":295, "y":"value_295"}, {"x":296, "y":"value_296"}, {"x":297, "y":"value_297"}, {"x":298, "y":"value_298"}, {"x":299, "y":"value_299"}, {"x":300, "y":"value_300"}, {"x":301, "y":"value_301"}, {"x":302, "y":"value_302"}, {"x":303, "y":"value_303"}, {"x":304, "y":"value_304"}, {"x":305, "y":"value_305"}, {"x":306, "y":"value_306"}, {"x":307, "y":"value_307"}, {"x":308, "y":"value_308"}, {"x":309, "y":"value_309"}, {"x":310, "y":"value_310"}, {"x":311, "y":"value_311"}, {"x":312, "y":"value_312"}, {"x":313, "y":"value_313"}, {"x":314, "y":"value_314"}, {"x":315, "y":"value_315"}, {"x":316, "y":"value_316"}, {"x":317, "y":"value_317"}, {"x":318, "y":"value_318"}, {"x":319, "y":"value_319"}, {"x":320, "y":"value_320"}, {"x":321, "y":"value_321"}, {"x":322, "y":"value_322"}, {"x":323, "y":"value_323"}, {"x":324, "y":"value_324"}, {"x":325, "y":"value_325"}, {"x":326, "y":"value_326"}, {"x":327, "y":"value_327"}, {"x":328, "y":"value_328"}, {"x":329, "y":"value_329"}, {"x":330, "y":"value_330"}, {"x":331, "y":"value_331"}, {"x":332, "y":"value_332"}, {"x":333, "y":"value_333"}, {"x":334, "y":"value_334"}, {"x":335, "y":"value_335"}, {"x":336, "y":"value_336"}, {"x":337, "y":"value_337"}, {"x":338, "y":"value_338"}, {"x":339, "y":"value_339"}, {"x":340, "y":"value_340"}, {"x":341, "y":"value_341"}, {"x":342, "y":"value_342"}, {"x":343, "y":"value_343"}, {"x":344, "y":"value_344"}, {"x":345, "y":"value_345"}, {"x":346, "y":"value_346"}, {"x":347, "y":"value_347"}, {"x":348, "y":"value_348"}, {"x":349, "y":"value_349"}, {"x":350, "y":"value_350"}, {"x":351, "y":"value_351"}, {"x":352, "y":"value_352"}, {"x":353, "y":"value_353"}, {"x":354, "y":"value_354"}, {"x":355, "y":"value_355"}, {"x":356, "y":"value_356"}, {"x":357, "y":"value_357"}, {"x":358, "y":"value_358"}, {"x":359, "y":"value_359"}, {"x":360, "y":"value_360"}, {"x":361, "y":"value_361"}, {"x":362, "y":"value_362"}, {"x":363, "y":"value_363"}, {"x":364, "y":"value_364"}, {"x":365, "y":"value_365"}, {"x":366, "y":"value_366"}, {"x":367, "y":"value_367"}, {"x":368, "y":"value_368"}, {"x":369, "y":"value_369"}, {"x":370, "y":"value_370"}, {"x":371, "y":"value_371"}, {"x":372, "y":"value_372"}, {"x":373, "y":"value_373"}, {"x":374, "y":"value_374"}, {"x":375, "y":"value_375"}, {"x":376, "y":"value_376"}, {"x":377, "y":"value_377"}, {"x":378, "y":"value_378"}, {"x":379, "y":"value_379"}, {"x":380, "y":"value_380"}, {"x":381, "y":"value_381"}, {"x":382, "y":"value_382"}, {"x":383, "y":"value_383"}, {"x":384, "y":"value_384"}, {"x":385, "y":"value_385"}, {"x":386, "y":"value_386"}, {"x":387, "y":"value_387"}, {"x":388, "y":"value_388"}, {"x":389, "y":"value_389"}, {"x":390, "y":"value_390"}, {"x":391, "y":"value_391"}, {"x":392, "y":"value_392"}, {"x":393, "y":"value_393"}, {"x":394, "y":"value_394"}, {"x":395, "y":"value_395"}, {"x":396, "y":"value_396"}, {"x":397, "y":"value_397"}, {"x":398, "y":"value_398"}, {"x":399, "y":"value_399"}, {"x":400, "y":"value_400"}, {"x":401, "y":"value_401"}, {"x":402, "y":"value_402"}, {"x":403, "y":"value_403"}, {"x":404, "y":"value_404"}, {"x":405, "y":"value_405"}, {"x":406, "y":"value_406"}, {"x":407, "y":"value_407"}, {"x":408, "y":"value_408"}, {"x":409, "y":"value_409"}, {"x":410, "y":"value_410"}, {"x":411, "y":"value_411"}, {"x":412, "y":"value_412"}, {"x":413, "y":"value_413"}, {"x":414, "y":"value_414"}, {"x":415, "y":"value_415"}, {"x":416, "y":"value_416"}, {"x":417, "y":"value_417"}, {"x":418, "y":"value_418"}, {"x":419, "y":"value_419"}, {"x":420, "y":"value_420"}, {"x":421, "y":"value_421"}, {"x":422, "y":"value_422"}, {"x":423, "y":"value_423"}, {"x":424, "y":"value_424"}, {"x":425, "y":"value_425"}, {"x":426, "y":"value_426"}, {"x":427, "y":"value_427"}, {"x":428, "y":"value_428"}, {"x":429, "y":"value_429"}, {"x":430, "y":"value_430"}, {"x":431, "y":"value_431"}, {"x":432, "y":"value_432"}, {"x":433, "y":"value_433"}, {"x":434, "y":"value_434"}, {"x":435, "y":"value_435"}, {"x":436, "y":"value_436"}, {"x":437, "y":"value_437"}, {"x":438, "y":"value_438"}, {"x":439, "y":"value_439"}, {"x":440, "y":"value_440"}, {"x":441, "y":"value_441"}, {"x":442, "y":"value_442"}, {"x":443, "y":"value_443"}, {"x":444, "y":"value_444"}, {"x":445, "y":"value_445"}, {"x":446, "y":"value_446"}, {"x":447, "y":"value_447"}, {"x":448, "y":"value_448"}, {"x":449, "y":"value_449"}, {"x":450, "y":"value_450"}, {"x":451, "y":"value_451"}, {"x":452, "y":"value_452"}, {"x":453, "y":"value_453"}, {"x":454, "y":"value_454"}, {"x":455, "y":"value_455"}, {"x":456, "y":"value_456"}, {"x":457, "y":"value_457"}, {"x":458, "y":"value_458"}, {"x":459, "y":"value_459"}, {"x":460, "y":"value_460"}, {"x":461, "y":"value_461"}, {"x":462, "y":"value_462"}, {"x":463, "y":"value_463"}, {"x":464, "y":"value_464"}, {"x":465, "y":"value_465"}, {"x":466, "y":"value_466"}, {"x":467, "y":"value_467"}, {"x":468, "y":"value_468"}, {"x":469, "y":"value_469"}, {"x":470, "y":"value_470"}, {"x":471, "y":"value_471"}, {"x":472, "y":"value_472"}, {"x":473, "y":"value_473"}, {"x":474, "y":"value_474"}, {"x":475, "y":"value_475"}, {"x":476, "y":"value_476"}, {"x":477, "y":"value_477"}, {"x":478, "y":"value_478"}, {"x":479, "y":"value_479"}, {"x":480, "y":"value_480"}, {"x":481, "y":"value_481"}, {"x":482, "y":"value_482"}, {"x":483, "y":"value_483"}, {"x":484, "y":"value_484"}, {"x":485, "y":"value_485"}, {"x":486, "y":"value_486"}, {"x":487, "y":"value_487"}, {"x":488, "y":"value_488"}, {"x":489, "y":"value_489"}, {"x":490, "y":"value_490"}, {"x":491, "y":"value_491"}, {"x":492, "y":"value_492"}, {"x":493, "y":"value_493"}, {"x":494, "y":"value_494"}, {"x":495, "y":"value_495"}, {"x":496, "y":"value_496"}, {"x":497, "y":"value_497"}, {"x":498, "y":"value_498"}, {"x":499, "y":"value_499"}] 500 +3 [{"x":0, "y":"big_0"}, {"x":1, "y":"big_1"}, {"x":2, "y":"big_2"}, {"x":3, "y":"big_3"}, {"x":4, "y":"big_4"}, {"x":5, "y":"big_5"}, {"x":6, "y":"big_6"}, {"x":7, "y":"big_7"}, {"x":8, "y":"big_8"}, {"x":9, "y":"big_9"}, {"x":10, "y":"big_10"}, {"x":11, "y":"big_11"}, {"x":12, "y":"big_12"}, {"x":13, "y":"big_13"}, {"x":14, "y":"big_14"}, {"x":15, "y":"big_15"}, {"x":16, "y":"big_16"}, {"x":17, "y":"big_17"}, {"x":18, "y":"big_18"}, {"x":19, "y":"big_19"}, {"x":20, "y":"big_20"}, {"x":21, "y":"big_21"}, {"x":22, "y":"big_22"}, {"x":23, "y":"big_23"}, {"x":24, "y":"big_24"}, {"x":25, "y":"big_25"}, {"x":26, "y":"big_26"}, {"x":27, "y":"big_27"}, {"x":28, "y":"big_28"}, {"x":29, "y":"big_29"}, {"x":30, "y":"big_30"}, {"x":31, "y":"big_31"}, {"x":32, "y":"big_32"}, {"x":33, "y":"big_33"}, {"x":34, "y":"big_34"}, {"x":35, "y":"big_35"}, {"x":36, "y":"big_36"}, {"x":37, "y":"big_37"}, {"x":38, "y":"big_38"}, {"x":39, "y":"big_39"}, {"x":40, "y":"big_40"}, {"x":41, "y":"big_41"}, {"x":42, "y":"big_42"}, {"x":43, "y":"big_43"}, {"x":44, "y":"big_44"}, {"x":45, "y":"big_45"}, {"x":46, "y":"big_46"}, {"x":47, "y":"big_47"}, {"x":48, "y":"big_48"}, {"x":49, "y":"big_49"}, {"x":50, "y":"big_50"}, {"x":51, "y":"big_51"}, {"x":52, "y":"big_52"}, {"x":53, "y":"big_53"}, {"x":54, "y":"big_54"}, {"x":55, "y":"big_55"}, {"x":56, "y":"big_56"}, {"x":57, "y":"big_57"}, {"x":58, "y":"big_58"}, {"x":59, "y":"big_59"}, {"x":60, "y":"big_60"}, {"x":61, "y":"big_61"}, {"x":62, "y":"big_62"}, {"x":63, "y":"big_63"}, {"x":64, "y":"big_64"}, {"x":65, "y":"big_65"}, {"x":66, "y":"big_66"}, {"x":67, "y":"big_67"}, {"x":68, "y":"big_68"}, {"x":69, "y":"big_69"}, {"x":70, "y":"big_70"}, {"x":71, "y":"big_71"}, {"x":72, "y":"big_72"}, {"x":73, "y":"big_73"}, {"x":74, "y":"big_74"}, {"x":75, "y":"big_75"}, {"x":76, "y":"big_76"}, {"x":77, "y":"big_77"}, {"x":78, "y":"big_78"}, {"x":79, "y":"big_79"}, {"x":80, "y":"big_80"}, {"x":81, "y":"big_81"}, {"x":82, "y":"big_82"}, {"x":83, "y":"big_83"}, {"x":84, "y":"big_84"}, {"x":85, "y":"big_85"}, {"x":86, "y":"big_86"}, {"x":87, "y":"big_87"}, {"x":88, "y":"big_88"}, {"x":89, "y":"big_89"}, {"x":90, "y":"big_90"}, {"x":91, "y":"big_91"}, {"x":92, "y":"big_92"}, {"x":93, "y":"big_93"}, {"x":94, "y":"big_94"}, {"x":95, "y":"big_95"}, {"x":96, "y":"big_96"}, {"x":97, "y":"big_97"}, {"x":98, "y":"big_98"}, {"x":99, "y":"big_99"}, {"x":100, "y":"big_100"}, {"x":101, "y":"big_101"}, {"x":102, "y":"big_102"}, {"x":103, "y":"big_103"}, {"x":104, "y":"big_104"}, {"x":105, "y":"big_105"}, {"x":106, "y":"big_106"}, {"x":107, "y":"big_107"}, {"x":108, "y":"big_108"}, {"x":109, "y":"big_109"}, {"x":110, "y":"big_110"}, {"x":111, "y":"big_111"}, {"x":112, "y":"big_112"}, {"x":113, "y":"big_113"}, {"x":114, "y":"big_114"}, {"x":115, "y":"big_115"}, {"x":116, "y":"big_116"}, {"x":117, "y":"big_117"}, {"x":118, "y":"big_118"}, {"x":119, "y":"big_119"}, {"x":120, "y":"big_120"}, {"x":121, "y":"big_121"}, {"x":122, "y":"big_122"}, {"x":123, "y":"big_123"}, {"x":124, "y":"big_124"}, {"x":125, "y":"big_125"}, {"x":126, "y":"big_126"}, {"x":127, "y":"big_127"}, {"x":128, "y":"big_128"}, {"x":129, "y":"big_129"}, {"x":130, "y":"big_130"}, {"x":131, "y":"big_131"}, {"x":132, "y":"big_132"}, {"x":133, "y":"big_133"}, {"x":134, "y":"big_134"}, {"x":135, "y":"big_135"}, {"x":136, "y":"big_136"}, {"x":137, "y":"big_137"}, {"x":138, "y":"big_138"}, {"x":139, "y":"big_139"}, {"x":140, "y":"big_140"}, {"x":141, "y":"big_141"}, {"x":142, "y":"big_142"}, {"x":143, "y":"big_143"}, {"x":144, "y":"big_144"}, {"x":145, "y":"big_145"}, {"x":146, "y":"big_146"}, {"x":147, "y":"big_147"}, {"x":148, "y":"big_148"}, {"x":149, "y":"big_149"}, {"x":150, "y":"big_150"}, {"x":151, "y":"big_151"}, {"x":152, "y":"big_152"}, {"x":153, "y":"big_153"}, {"x":154, "y":"big_154"}, {"x":155, "y":"big_155"}, {"x":156, "y":"big_156"}, {"x":157, "y":"big_157"}, {"x":158, "y":"big_158"}, {"x":159, "y":"big_159"}, {"x":160, "y":"big_160"}, {"x":161, "y":"big_161"}, {"x":162, "y":"big_162"}, {"x":163, "y":"big_163"}, {"x":164, "y":"big_164"}, {"x":165, "y":"big_165"}, {"x":166, "y":"big_166"}, {"x":167, "y":"big_167"}, {"x":168, "y":"big_168"}, {"x":169, "y":"big_169"}, {"x":170, "y":"big_170"}, {"x":171, "y":"big_171"}, {"x":172, "y":"big_172"}, {"x":173, "y":"big_173"}, {"x":174, "y":"big_174"}, {"x":175, "y":"big_175"}, {"x":176, "y":"big_176"}, {"x":177, "y":"big_177"}, {"x":178, "y":"big_178"}, {"x":179, "y":"big_179"}, {"x":180, "y":"big_180"}, {"x":181, "y":"big_181"}, {"x":182, "y":"big_182"}, {"x":183, "y":"big_183"}, {"x":184, "y":"big_184"}, {"x":185, "y":"big_185"}, {"x":186, "y":"big_186"}, {"x":187, "y":"big_187"}, {"x":188, "y":"big_188"}, {"x":189, "y":"big_189"}, {"x":190, "y":"big_190"}, {"x":191, "y":"big_191"}, {"x":192, "y":"big_192"}, {"x":193, "y":"big_193"}, {"x":194, "y":"big_194"}, {"x":195, "y":"big_195"}, {"x":196, "y":"big_196"}, {"x":197, "y":"big_197"}, {"x":198, "y":"big_198"}, {"x":199, "y":"big_199"}, {"x":200, "y":"big_200"}, {"x":201, "y":"big_201"}, {"x":202, "y":"big_202"}, {"x":203, "y":"big_203"}, {"x":204, "y":"big_204"}, {"x":205, "y":"big_205"}, {"x":206, "y":"big_206"}, {"x":207, "y":"big_207"}, {"x":208, "y":"big_208"}, {"x":209, "y":"big_209"}, {"x":210, "y":"big_210"}, {"x":211, "y":"big_211"}, {"x":212, "y":"big_212"}, {"x":213, "y":"big_213"}, {"x":214, "y":"big_214"}, {"x":215, "y":"big_215"}, {"x":216, "y":"big_216"}, {"x":217, "y":"big_217"}, {"x":218, "y":"big_218"}, {"x":219, "y":"big_219"}, {"x":220, "y":"big_220"}, {"x":221, "y":"big_221"}, {"x":222, "y":"big_222"}, {"x":223, "y":"big_223"}, {"x":224, "y":"big_224"}, {"x":225, "y":"big_225"}, {"x":226, "y":"big_226"}, {"x":227, "y":"big_227"}, {"x":228, "y":"big_228"}, {"x":229, "y":"big_229"}, {"x":230, "y":"big_230"}, {"x":231, "y":"big_231"}, {"x":232, "y":"big_232"}, {"x":233, "y":"big_233"}, {"x":234, "y":"big_234"}, {"x":235, "y":"big_235"}, {"x":236, "y":"big_236"}, {"x":237, "y":"big_237"}, {"x":238, "y":"big_238"}, {"x":239, "y":"big_239"}, {"x":240, "y":"big_240"}, {"x":241, "y":"big_241"}, {"x":242, "y":"big_242"}, {"x":243, "y":"big_243"}, {"x":244, "y":"big_244"}, {"x":245, "y":"big_245"}, {"x":246, "y":"big_246"}, {"x":247, "y":"big_247"}, {"x":248, "y":"big_248"}, {"x":249, "y":"big_249"}, {"x":250, "y":"big_250"}, {"x":251, "y":"big_251"}, {"x":252, "y":"big_252"}, {"x":253, "y":"big_253"}, {"x":254, "y":"big_254"}, {"x":255, "y":"big_255"}, {"x":256, "y":"big_256"}, {"x":257, "y":"big_257"}, {"x":258, "y":"big_258"}, {"x":259, "y":"big_259"}, {"x":260, "y":"big_260"}, {"x":261, "y":"big_261"}, {"x":262, "y":"big_262"}, {"x":263, "y":"big_263"}, {"x":264, "y":"big_264"}, {"x":265, "y":"big_265"}, {"x":266, "y":"big_266"}, {"x":267, "y":"big_267"}, {"x":268, "y":"big_268"}, {"x":269, "y":"big_269"}, {"x":270, "y":"big_270"}, {"x":271, "y":"big_271"}, {"x":272, "y":"big_272"}, {"x":273, "y":"big_273"}, {"x":274, "y":"big_274"}, {"x":275, "y":"big_275"}, {"x":276, "y":"big_276"}, {"x":277, "y":"big_277"}, {"x":278, "y":"big_278"}, {"x":279, "y":"big_279"}, {"x":280, "y":"big_280"}, {"x":281, "y":"big_281"}, {"x":282, "y":"big_282"}, {"x":283, "y":"big_283"}, {"x":284, "y":"big_284"}, {"x":285, "y":"big_285"}, {"x":286, "y":"big_286"}, {"x":287, "y":"big_287"}, {"x":288, "y":"big_288"}, {"x":289, "y":"big_289"}, {"x":290, "y":"big_290"}, {"x":291, "y":"big_291"}, {"x":292, "y":"big_292"}, {"x":293, "y":"big_293"}, {"x":294, "y":"big_294"}, {"x":295, "y":"big_295"}, {"x":296, "y":"big_296"}, {"x":297, "y":"big_297"}, {"x":298, "y":"big_298"}, {"x":299, "y":"big_299"}, {"x":300, "y":"big_300"}, {"x":301, "y":"big_301"}, {"x":302, "y":"big_302"}, {"x":303, "y":"big_303"}, {"x":304, "y":"big_304"}, {"x":305, "y":"big_305"}, {"x":306, "y":"big_306"}, {"x":307, "y":"big_307"}, {"x":308, "y":"big_308"}, {"x":309, "y":"big_309"}, {"x":310, "y":"big_310"}, {"x":311, "y":"big_311"}, {"x":312, "y":"big_312"}, {"x":313, "y":"big_313"}, {"x":314, "y":"big_314"}, {"x":315, "y":"big_315"}, {"x":316, "y":"big_316"}, {"x":317, "y":"big_317"}, {"x":318, "y":"big_318"}, {"x":319, "y":"big_319"}, {"x":320, "y":"big_320"}, {"x":321, "y":"big_321"}, {"x":322, "y":"big_322"}, {"x":323, "y":"big_323"}, {"x":324, "y":"big_324"}, {"x":325, "y":"big_325"}, {"x":326, "y":"big_326"}, {"x":327, "y":"big_327"}, {"x":328, "y":"big_328"}, {"x":329, "y":"big_329"}, {"x":330, "y":"big_330"}, {"x":331, "y":"big_331"}, {"x":332, "y":"big_332"}, {"x":333, "y":"big_333"}, {"x":334, "y":"big_334"}, {"x":335, "y":"big_335"}, {"x":336, "y":"big_336"}, {"x":337, "y":"big_337"}, {"x":338, "y":"big_338"}, {"x":339, "y":"big_339"}, {"x":340, "y":"big_340"}, {"x":341, "y":"big_341"}, {"x":342, "y":"big_342"}, {"x":343, "y":"big_343"}, {"x":344, "y":"big_344"}, {"x":345, "y":"big_345"}, {"x":346, "y":"big_346"}, {"x":347, "y":"big_347"}, {"x":348, "y":"big_348"}, {"x":349, "y":"big_349"}, {"x":350, "y":"big_350"}, {"x":351, "y":"big_351"}, {"x":352, "y":"big_352"}, {"x":353, "y":"big_353"}, {"x":354, "y":"big_354"}, {"x":355, "y":"big_355"}, {"x":356, "y":"big_356"}, {"x":357, "y":"big_357"}, {"x":358, "y":"big_358"}, {"x":359, "y":"big_359"}, {"x":360, "y":"big_360"}, {"x":361, "y":"big_361"}, {"x":362, "y":"big_362"}, {"x":363, "y":"big_363"}, {"x":364, "y":"big_364"}, {"x":365, "y":"big_365"}, {"x":366, "y":"big_366"}, {"x":367, "y":"big_367"}, {"x":368, "y":"big_368"}, {"x":369, "y":"big_369"}, {"x":370, "y":"big_370"}, {"x":371, "y":"big_371"}, {"x":372, "y":"big_372"}, {"x":373, "y":"big_373"}, {"x":374, "y":"big_374"}, {"x":375, "y":"big_375"}, {"x":376, "y":"big_376"}, {"x":377, "y":"big_377"}, {"x":378, "y":"big_378"}, {"x":379, "y":"big_379"}, {"x":380, "y":"big_380"}, {"x":381, "y":"big_381"}, {"x":382, "y":"big_382"}, {"x":383, "y":"big_383"}, {"x":384, "y":"big_384"}, {"x":385, "y":"big_385"}, {"x":386, "y":"big_386"}, {"x":387, "y":"big_387"}, {"x":388, "y":"big_388"}, {"x":389, "y":"big_389"}, {"x":390, "y":"big_390"}, {"x":391, "y":"big_391"}, {"x":392, "y":"big_392"}, {"x":393, "y":"big_393"}, {"x":394, "y":"big_394"}, {"x":395, "y":"big_395"}, {"x":396, "y":"big_396"}, {"x":397, "y":"big_397"}, {"x":398, "y":"big_398"}, {"x":399, "y":"big_399"}, {"x":400, "y":"big_400"}, {"x":401, "y":"big_401"}, {"x":402, "y":"big_402"}, {"x":403, "y":"big_403"}, {"x":404, "y":"big_404"}, {"x":405, "y":"big_405"}, {"x":406, "y":"big_406"}, {"x":407, "y":"big_407"}, {"x":408, "y":"big_408"}, {"x":409, "y":"big_409"}, {"x":410, "y":"big_410"}, {"x":411, "y":"big_411"}, {"x":412, "y":"big_412"}, {"x":413, "y":"big_413"}, {"x":414, "y":"big_414"}, {"x":415, "y":"big_415"}, {"x":416, "y":"big_416"}, {"x":417, "y":"big_417"}, {"x":418, "y":"big_418"}, {"x":419, "y":"big_419"}, {"x":420, "y":"big_420"}, {"x":421, "y":"big_421"}, {"x":422, "y":"big_422"}, {"x":423, "y":"big_423"}, {"x":424, "y":"big_424"}, {"x":425, "y":"big_425"}, {"x":426, "y":"big_426"}, {"x":427, "y":"big_427"}, {"x":428, "y":"big_428"}, {"x":429, "y":"big_429"}, {"x":430, "y":"big_430"}, {"x":431, "y":"big_431"}, {"x":432, "y":"big_432"}, {"x":433, "y":"big_433"}, {"x":434, "y":"big_434"}, {"x":435, "y":"big_435"}, {"x":436, "y":"big_436"}, {"x":437, "y":"big_437"}, {"x":438, "y":"big_438"}, {"x":439, "y":"big_439"}, {"x":440, "y":"big_440"}, {"x":441, "y":"big_441"}, {"x":442, "y":"big_442"}, {"x":443, "y":"big_443"}, {"x":444, "y":"big_444"}, {"x":445, "y":"big_445"}, {"x":446, "y":"big_446"}, {"x":447, "y":"big_447"}, {"x":448, "y":"big_448"}, {"x":449, "y":"big_449"}, {"x":450, "y":"big_450"}, {"x":451, "y":"big_451"}, {"x":452, "y":"big_452"}, {"x":453, "y":"big_453"}, {"x":454, "y":"big_454"}, {"x":455, "y":"big_455"}, {"x":456, "y":"big_456"}, {"x":457, "y":"big_457"}, {"x":458, "y":"big_458"}, {"x":459, "y":"big_459"}, {"x":460, "y":"big_460"}, {"x":461, "y":"big_461"}, {"x":462, "y":"big_462"}, {"x":463, "y":"big_463"}, {"x":464, "y":"big_464"}, {"x":465, "y":"big_465"}, {"x":466, "y":"big_466"}, {"x":467, "y":"big_467"}, {"x":468, "y":"big_468"}, {"x":469, "y":"big_469"}, {"x":470, "y":"big_470"}, {"x":471, "y":"big_471"}, {"x":472, "y":"big_472"}, {"x":473, "y":"big_473"}, {"x":474, "y":"big_474"}, {"x":475, "y":"big_475"}, {"x":476, "y":"big_476"}, {"x":477, "y":"big_477"}, {"x":478, "y":"big_478"}, {"x":479, "y":"big_479"}, {"x":480, "y":"big_480"}, {"x":481, "y":"big_481"}, {"x":482, "y":"big_482"}, {"x":483, "y":"big_483"}, {"x":484, "y":"big_484"}, {"x":485, "y":"big_485"}, {"x":486, "y":"big_486"}, {"x":487, "y":"big_487"}, {"x":488, "y":"big_488"}, {"x":489, "y":"big_489"}, {"x":490, "y":"big_490"}, {"x":491, "y":"big_491"}, {"x":492, "y":"big_492"}, {"x":493, "y":"big_493"}, {"x":494, "y":"big_494"}, {"x":495, "y":"big_495"}, {"x":496, "y":"big_496"}, {"x":497, "y":"big_497"}, {"x":498, "y":"big_498"}, {"x":499, "y":"big_499"}] 500 + +-- !nested_cross_page2_parquet_q5 -- +1 101 value_101 +1 102 value_102 +1 103 value_103 +1 104 value_104 +1 105 value_105 +1 106 value_106 +1 107 value_107 +1 108 value_108 +1 109 value_109 +1 110 value_110 +1 111 value_111 +1 112 value_112 +1 113 value_113 +1 114 value_114 +1 115 value_115 +1 116 value_116 +1 117 value_117 +1 118 value_118 +1 119 value_119 +1 120 value_120 +1 121 value_121 +1 122 value_122 +1 123 value_123 +1 124 value_124 +1 125 value_125 +1 126 value_126 +1 127 value_127 +1 128 value_128 +1 129 value_129 +1 130 value_130 +1 131 value_131 +1 132 value_132 +1 133 value_133 +1 134 value_134 +1 135 value_135 +1 136 value_136 +1 137 value_137 +1 138 value_138 +1 139 value_139 +1 140 value_140 +1 141 value_141 +1 142 value_142 +1 143 value_143 +1 144 value_144 +1 145 value_145 +1 146 value_146 +1 147 value_147 +1 148 value_148 +1 149 value_149 +1 150 value_150 +1 151 value_151 +1 152 value_152 +1 153 value_153 +1 154 value_154 +1 155 value_155 +1 156 value_156 +1 157 value_157 +1 158 value_158 +1 159 value_159 +1 160 value_160 +1 161 value_161 +1 162 value_162 +1 163 value_163 +1 164 value_164 +1 165 value_165 +1 166 value_166 +1 167 value_167 +1 168 value_168 +1 169 value_169 +1 170 value_170 +1 171 value_171 +1 172 value_172 +1 173 value_173 +1 174 value_174 +1 175 value_175 +1 176 value_176 +1 177 value_177 +1 178 value_178 +1 179 value_179 +1 180 value_180 +1 181 value_181 +1 182 value_182 +1 183 value_183 +1 184 value_184 +1 185 value_185 +1 186 value_186 +1 187 value_187 +1 188 value_188 +1 189 value_189 +1 190 value_190 +1 191 value_191 +1 192 value_192 +1 193 value_193 +1 194 value_194 +1 195 value_195 +1 196 value_196 +1 197 value_197 +1 198 value_198 +1 199 value_199 +1 200 value_200 +1 201 value_201 +1 202 value_202 +1 203 value_203 +1 204 value_204 +1 205 value_205 +1 206 value_206 +1 207 value_207 +1 208 value_208 +1 209 value_209 +1 210 value_210 +1 211 value_211 +1 212 value_212 +1 213 value_213 +1 214 value_214 +1 215 value_215 +1 216 value_216 +1 217 value_217 +1 218 value_218 +1 219 value_219 +1 220 value_220 +1 221 value_221 +1 222 value_222 +1 223 value_223 +1 224 value_224 +1 225 value_225 +1 226 value_226 +1 227 value_227 +1 228 value_228 +1 229 value_229 +1 230 value_230 +1 231 value_231 +1 232 value_232 +1 233 value_233 +1 234 value_234 +1 235 value_235 +1 236 value_236 +1 237 value_237 +1 238 value_238 +1 239 value_239 +1 240 value_240 +1 241 value_241 +1 242 value_242 +1 243 value_243 +1 244 value_244 +1 245 value_245 +1 246 value_246 +1 247 value_247 +1 248 value_248 +1 249 value_249 +1 250 value_250 +1 251 value_251 +1 252 value_252 +1 253 value_253 +1 254 value_254 +1 255 value_255 +1 256 value_256 +1 257 value_257 +1 258 value_258 +1 259 value_259 +1 260 value_260 +1 261 value_261 +1 262 value_262 +1 263 value_263 +1 264 value_264 +1 265 value_265 +1 266 value_266 +1 267 value_267 +1 268 value_268 +1 269 value_269 +1 270 value_270 +1 271 value_271 +1 272 value_272 +1 273 value_273 +1 274 value_274 +1 275 value_275 +1 276 value_276 +1 277 value_277 +1 278 value_278 +1 279 value_279 +1 280 value_280 +1 281 value_281 +1 282 value_282 +1 283 value_283 +1 284 value_284 +1 285 value_285 +1 286 value_286 +1 287 value_287 +1 288 value_288 +1 289 value_289 +1 290 value_290 +1 291 value_291 +1 292 value_292 +1 293 value_293 +1 294 value_294 +1 295 value_295 +1 296 value_296 +1 297 value_297 +1 298 value_298 +1 299 value_299 +1 300 value_300 +1 301 value_301 +1 302 value_302 +1 303 value_303 +1 304 value_304 +1 305 value_305 +1 306 value_306 +1 307 value_307 +1 308 value_308 +1 309 value_309 +1 310 value_310 +1 311 value_311 +1 312 value_312 +1 313 value_313 +1 314 value_314 +1 315 value_315 +1 316 value_316 +1 317 value_317 +1 318 value_318 +1 319 value_319 +1 320 value_320 +1 321 value_321 +1 322 value_322 +1 323 value_323 +1 324 value_324 +1 325 value_325 +1 326 value_326 +1 327 value_327 +1 328 value_328 +1 329 value_329 +1 330 value_330 +1 331 value_331 +1 332 value_332 +1 333 value_333 +1 334 value_334 +1 335 value_335 +1 336 value_336 +1 337 value_337 +1 338 value_338 +1 339 value_339 +1 340 value_340 +1 341 value_341 +1 342 value_342 +1 343 value_343 +1 344 value_344 +1 345 value_345 +1 346 value_346 +1 347 value_347 +1 348 value_348 +1 349 value_349 +1 350 value_350 +1 351 value_351 +1 352 value_352 +1 353 value_353 +1 354 value_354 +1 355 value_355 +1 356 value_356 +1 357 value_357 +1 358 value_358 +1 359 value_359 +1 360 value_360 +1 361 value_361 +1 362 value_362 +1 363 value_363 +1 364 value_364 +1 365 value_365 +1 366 value_366 +1 367 value_367 +1 368 value_368 +1 369 value_369 +1 370 value_370 +1 371 value_371 +1 372 value_372 +1 373 value_373 +1 374 value_374 +1 375 value_375 +1 376 value_376 +1 377 value_377 +1 378 value_378 +1 379 value_379 +1 380 value_380 +1 381 value_381 +1 382 value_382 +1 383 value_383 +1 384 value_384 +1 385 value_385 +1 386 value_386 +1 387 value_387 +1 388 value_388 +1 389 value_389 +1 390 value_390 +1 391 value_391 +1 392 value_392 +1 393 value_393 +1 394 value_394 +1 395 value_395 +1 396 value_396 +1 397 value_397 +1 398 value_398 +1 399 value_399 +1 400 value_400 +1 401 value_401 +1 402 value_402 +1 403 value_403 +1 404 value_404 +1 405 value_405 +1 406 value_406 +1 407 value_407 +1 408 value_408 +1 409 value_409 +1 410 value_410 +1 411 value_411 +1 412 value_412 +1 413 value_413 +1 414 value_414 +1 415 value_415 +1 416 value_416 +1 417 value_417 +1 418 value_418 +1 419 value_419 +1 420 value_420 +1 421 value_421 +1 422 value_422 +1 423 value_423 +1 424 value_424 +1 425 value_425 +1 426 value_426 +1 427 value_427 +1 428 value_428 +1 429 value_429 +1 430 value_430 +1 431 value_431 +1 432 value_432 +1 433 value_433 +1 434 value_434 +1 435 value_435 +1 436 value_436 +1 437 value_437 +1 438 value_438 +1 439 value_439 +1 440 value_440 +1 441 value_441 +1 442 value_442 +1 443 value_443 +1 444 value_444 +1 445 value_445 +1 446 value_446 +1 447 value_447 +1 448 value_448 +1 449 value_449 +1 450 value_450 +1 451 value_451 +1 452 value_452 +1 453 value_453 +1 454 value_454 +1 455 value_455 +1 456 value_456 +1 457 value_457 +1 458 value_458 +1 459 value_459 +1 460 value_460 +1 461 value_461 +1 462 value_462 +1 463 value_463 +1 464 value_464 +1 465 value_465 +1 466 value_466 +1 467 value_467 +1 468 value_468 +1 469 value_469 +1 470 value_470 +1 471 value_471 +1 472 value_472 +1 473 value_473 +1 474 value_474 +1 475 value_475 +1 476 value_476 +1 477 value_477 +1 478 value_478 +1 479 value_479 +1 480 value_480 +1 481 value_481 +1 482 value_482 +1 483 value_483 +1 484 value_484 +1 485 value_485 +1 486 value_486 +1 487 value_487 +1 488 value_488 +1 489 value_489 +1 490 value_490 +1 491 value_491 +1 492 value_492 +1 493 value_493 +1 494 value_494 +1 495 value_495 +1 496 value_496 +1 497 value_497 +1 498 value_498 +1 499 value_499 + +-- !nested_cross_page2_parquet_q6 -- +2 {"small_key":[1, 2, 3]} 1 + diff --git a/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy b/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy new file mode 100644 index 00000000000000..2e8073e260b39b --- /dev/null +++ b/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy @@ -0,0 +1,154 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_docker_hive") { + String enabled = context.config.otherConfigs.get("enableHiveTest") + if (enabled == null || !enabled.equalsIgnoreCase("true")) { + logger.info("disable Hive test.") + return; + } + + for (String hivePrefix : ["hive2", "hive3"]) { + String hms_port = context.config.otherConfigs.get(hivePrefix + "HmsPort") + String catalog_name = "${hivePrefix}_test_parquet_nested_types" + String externalEnvIp = context.config.otherConfigs.get("externalEnvIp") + + sql """drop catalog if exists ${catalog_name}""" + sql """create catalog if not exists ${catalog_name} properties ( + "type"="hms", + 'hive.metastore.uris' = 'thrift://${externalEnvIp}:${hms_port}' + );""" + logger.info("catalog " + catalog_name + " created") + sql """switch ${catalog_name};""" + logger.info("switched to catalog " + catalog_name) + + sql """ use multi_catalog """ + + qt_nested_cross_page1_parquet_q1 """select array_col from nested_cross_page1_parquet where id = 1""" + + qt_nested_cross_page1_parquet_q2 """select array_col from nested_cross_page1_parquet where id = 2""" + + qt_nested_cross_page1_parquet_q3 """select array_col from nested_cross_page1_parquet where id = 3""" + + qt_nested_cross_page1_parquet_q4 """ + SELECT id, array_size(array_col) as arr_size + FROM nested_cross_page1_parquet + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q5 """ + SELECT id, array_col[1] as first_elem, array_col[3] as third_elem + FROM nested_cross_page1_parquet + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q6 """ + SELECT id, array_col + FROM nested_cross_page1_parquet + WHERE array_size(array_col) > 100 + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q7 """ + SELECT id, array_col + FROM nested_cross_page1_parquet + WHERE array_contains(array_col, 1) + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q8 """ + SELECT id, array_col, description + FROM nested_cross_page1_parquet + WHERE id > 1 AND array_size(array_col) < 100 + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q9 """ + SELECT + id, + array_min(array_col) as min_val, + array_max(array_col) as max_val + FROM nested_cross_page1_parquet + ORDER BY id + """ + + qt_nested_cross_page1_parquet_q10 """ + SELECT id, array_col + FROM nested_cross_page1_parquet + WHERE description LIKE '%large array%' + ORDER BY id + """ + + qt_nested_cross_page2_parquet_q1 """ + SELECT + id, + nested_array_col, + array_size(nested_array_col) as outer_size + FROM nested_cross_page2_parquet + WHERE id = 1 + """ + + qt_nested_cross_page2_parquet_q2 """ + SELECT + id, + nested_array_col, + array_size(nested_array_col) as outer_size + FROM nested_cross_page2_parquet + WHERE id = 2 + """ + + qt_nested_cross_page2_parquet_q3 """ + SELECT + id, + nested_array_col, + array_size(nested_array_col) as outer_size + FROM nested_cross_page2_parquet + WHERE id = 3 + """ + + qt_nested_cross_page2_parquet_q4 """ + SELECT + id, + array_struct_col, + array_size(array_struct_col) as struct_arr_size + FROM nested_cross_page2_parquet + WHERE description LIKE '%large%' + """ + + qt_nested_cross_page2_parquet_q5 """ + SELECT + id, + item_x as x_value, + item_y as y_value + FROM nested_cross_page2_parquet + LATERAL VIEW EXPLODE(array_struct_col) tmp AS item_x, item_y + WHERE id = 1 AND item_x > 100 + """ + + qt_nested_cross_page2_parquet_q6 """ + SELECT + id, + map_array_col, + array_size(map_array_col) as map_size + FROM nested_cross_page2_parquet + WHERE id = 2 + """ + + sql """drop catalog ${catalog_name};""" + } +} + From d972ae9ab138217504be84f5e19e87be97522776 Mon Sep 17 00:00:00 2001 From: kakachen Date: Mon, 25 Nov 2024 15:24:03 +0800 Subject: [PATCH 4/5] Revert modified dictionary filter processing logic to optimize late materialization. --- .../format/parquet/vparquet_group_reader.cpp | 32 +++++++++++++++---- .../format/parquet/vparquet_group_reader.h | 1 + 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp index c93b5c6fbad2e1..a9854b53f3beec 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp @@ -109,6 +109,11 @@ Status RowGroupReader::init( _tuple_descriptor = tuple_descriptor; _row_descriptor = row_descriptor; _col_name_to_slot_id = colname_to_slot_id; + if (not_single_slot_filter_conjuncts != nullptr && !not_single_slot_filter_conjuncts->empty()) { + _not_single_slot_filter_conjuncts.insert(_not_single_slot_filter_conjuncts.end(), + not_single_slot_filter_conjuncts->begin(), + not_single_slot_filter_conjuncts->end()); + } _slot_id_to_filter_conjuncts = slot_id_to_filter_conjuncts; _merge_read_ranges(row_ranges); if (_read_columns.empty()) { @@ -136,11 +141,6 @@ Status RowGroupReader::init( _column_readers[read_col] = std::move(reader); } // Check if single slot can be filtered by dict. - if (not_single_slot_filter_conjuncts != nullptr && !not_single_slot_filter_conjuncts->empty()) { - _filter_conjuncts.insert(_filter_conjuncts.end(), not_single_slot_filter_conjuncts->begin(), - not_single_slot_filter_conjuncts->end()); - return Status::OK(); - } if (!_slot_id_to_filter_conjuncts) { return Status::OK(); } @@ -363,8 +363,17 @@ Status RowGroupReader::next_batch(Block* block, size_t batch_size, size_t* read_ RETURN_IF_CATCH_EXCEPTION( Block::filter_block_internal(block, columns_to_filter, result_filter)); - Block::erase_useless_column(block, column_to_keep); - _convert_dict_cols_to_string_cols(block); + if (!_not_single_slot_filter_conjuncts.empty()) { + _convert_dict_cols_to_string_cols(block); + SCOPED_RAW_TIMER(&_predicate_filter_time); + RETURN_IF_CATCH_EXCEPTION( + RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block( + _not_single_slot_filter_conjuncts, block, columns_to_filter, + column_to_keep))); + } else { + Block::erase_useless_column(block, column_to_keep); + _convert_dict_cols_to_string_cols(block); + } } else { RETURN_IF_CATCH_EXCEPTION( RETURN_IF_ERROR(_filter_block(block, column_to_keep, columns_to_filter))); @@ -595,6 +604,15 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t batch_size, size_t* re *batch_eof = pre_eof; RETURN_IF_ERROR(_fill_partition_columns(block, column_size, _lazy_read_ctx.partition_columns)); RETURN_IF_ERROR(_fill_missing_columns(block, column_size, _lazy_read_ctx.missing_columns)); + if (!_not_single_slot_filter_conjuncts.empty()) { + { + SCOPED_RAW_TIMER(&_predicate_filter_time); + RETURN_IF_CATCH_EXCEPTION( + RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block( + _not_single_slot_filter_conjuncts, block, columns_to_filter, + origin_column_num))); + } + } return Status::OK(); } diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.h b/be/src/vec/exec/format/parquet/vparquet_group_reader.h index 8106241014ba63..f73e9ebe09eee6 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.h +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.h @@ -220,6 +220,7 @@ class RowGroupReader : public ProfileCollector { const TupleDescriptor* _tuple_descriptor = nullptr; const RowDescriptor* _row_descriptor = nullptr; const std::unordered_map* _col_name_to_slot_id = nullptr; + VExprContextSPtrs _not_single_slot_filter_conjuncts; const std::unordered_map* _slot_id_to_filter_conjuncts = nullptr; VExprContextSPtrs _dict_filter_conjuncts; VExprContextSPtrs _filter_conjuncts; From 20b44a6193e87534f75bc30bd97b3f30b9ef6677 Mon Sep 17 00:00:00 2001 From: kakachen Date: Sat, 7 Dec 2024 15:16:42 +0800 Subject: [PATCH 5/5] Fix ancestor_nulls. --- .../vec/exec/format/parquet/parquet_common.h | 30 ++- .../format/parquet/vparquet_column_reader.cpp | 7 +- .../parquet_nested_types/create_table.hql | 16 ++ .../parquet_nested_types/data.tar.gz | Bin 35305 -> 36976 bytes .../nested_cross_page_test3.py | 196 ++++++++++++++++++ .../hive/test_parquet_nested_types.out | 72 +++++++ .../hive/test_parquet_nested_types.groovy | 87 ++++++-- 7 files changed, 386 insertions(+), 22 deletions(-) create mode 100644 docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test3.py diff --git a/be/src/vec/exec/format/parquet/parquet_common.h b/be/src/vec/exec/format/parquet/parquet_common.h index cb156e380569ea..e4c394c05d2489 100644 --- a/be/src/vec/exec/format/parquet/parquet_common.h +++ b/be/src/vec/exec/format/parquet/parquet_common.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "vec/columns/column_nullable.h" @@ -102,13 +103,15 @@ class ColumnSelectVector { ColumnSelectVector() = default; Status init(const std::vector& run_length_null_map, size_t num_values, - NullMap* null_map, FilterMap* filter_map, size_t filter_map_index) { + NullMap* null_map, FilterMap* filter_map, size_t filter_map_index, + const std::unordered_set* skipped_indices = nullptr) { _num_values = num_values; _num_nulls = 0; _read_index = 0; size_t map_index = 0; bool is_null = false; _has_filter = filter_map->has_filter(); + if (filter_map->has_filter()) { // No run length null map is generated when _filter_all = true DCHECK(!filter_map->filter_all()); @@ -126,19 +129,36 @@ class ColumnSelectVector { } is_null = !is_null; } + size_t num_read = 0; - DCHECK_LE(filter_map_index + num_values, filter_map->filter_map_size()); - for (size_t i = 0; i < num_values; ++i) { - if (filter_map->filter_map_data()[filter_map_index++]) { - _data_map[i] = _data_map[i] == FILTERED_NULL ? NULL_DATA : CONTENT; + size_t i = 0; + size_t valid_count = 0; + + while (valid_count < num_values) { + DCHECK_LT(filter_map_index + i, filter_map->filter_map_size()); + + if (skipped_indices != nullptr && + skipped_indices->count(filter_map_index + i) > 0) { + ++i; + continue; + } + + if (filter_map->filter_map_data()[filter_map_index + i]) { + _data_map[valid_count] = + _data_map[valid_count] == FILTERED_NULL ? NULL_DATA : CONTENT; num_read++; } + ++valid_count; + ++i; } + _num_filtered = num_values - num_read; + if (null_map != nullptr && num_read > 0) { NullMap& map_data_column = *null_map; auto null_map_index = map_data_column.size(); map_data_column.resize(null_map_index + num_read); + if (_num_nulls == 0) { memset(map_data_column.data() + null_map_index, 0, num_read); } else if (_num_nulls == num_values) { diff --git a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp index d0afba3a0a3864..7c75bb200c7058 100644 --- a/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_column_reader.cpp @@ -411,6 +411,7 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType size_t nonnull_size = 0; null_map.emplace_back(0); bool prev_is_null = false; + std::unordered_set ancestor_null_indices; while (has_read < origin_size + parsed_values) { level_t def_level = _def_levels[has_read++]; @@ -421,6 +422,9 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType } if (def_level < _field_schema->repeated_parent_def_level) { + for (size_t i = 0; i < loop_read; i++) { + ancestor_null_indices.insert(has_read - loop_read + i); + } ancestor_nulls += loop_read; continue; } @@ -469,7 +473,8 @@ Status ScalarColumnReader::_read_nested_column(ColumnPtr& doris_column, DataType SCOPED_RAW_TIMER(&_decode_null_map_time); RETURN_IF_ERROR( select_vector.init(null_map, num_values, map_data_column, current_filter_map, - _nested_filter_map_data ? origin_size : _filter_map_index)); + _nested_filter_map_data ? origin_size : _filter_map_index, + &ancestor_null_indices)); } RETURN_IF_ERROR( diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql index 9aa256b210aca4..863595278f343d 100644 --- a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/create_table.hql @@ -40,3 +40,19 @@ LOCATION '/user/doris/suites/multi_catalog/nested_cross_page2_parquet'; msck repair table nested_cross_page2_parquet; + +CREATE TABLE `nested_cross_page3_parquet`( + `id` int, + `array_col` array, + `description` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' +LOCATION + '/user/doris/suites/multi_catalog/nested_cross_page3_parquet'; + +msck repair table nested_cross_page3_parquet; + diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data.tar.gz b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data.tar.gz index 51af8457225552b7de3b1d79a45fe89114c3f8ee..ce0d98f7bfc14ad84473dcb8869d6a8055b6801f 100644 GIT binary patch literal 36976 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 literal 35305 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 XEz)Nv@$|BgdGfdSZ3;`?$u0ReCYVDt diff --git a/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test3.py b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test3.py new file mode 100644 index 00000000000000..75ef7c7e755d2b --- /dev/null +++ b/docker/thirdparties/docker-compose/hive/scripts/data/multi_catalog/parquet_nested_types/data_gen_scripts/nested_cross_page_test3.py @@ -0,0 +1,196 @@ +import pyarrow as pa +import pyarrow.parquet as pq +import subprocess +import argparse +import json + +# Define the output file path as a constant +OUTPUT_PARQUET_FILE = 'nested_cross_page_test3.parquet' + +def generate_cross_page_test_data(output_file): + # Create test data + data = { + # id column (INT32) + 'id': [1, None, 3], + + # array column (ARRAY) + 'array_col': [ + # Row 1 - Large array to force cross-page + [1, None, 3, 4, 5] * 200, # 1000 elements + + # Row 2 - Null array + None, + + # Row 3 - Another large array with nulls + [6, None, 8, None, 10] * 200 # 1000 elements + ], + + # description column (STRING) + 'description': [ + 'This is a large array with repeated sequence [1,null,3,4,5]', + None, + 'This is another large array with repeated sequence [6,null,8,null,10]' + ] + } + + # Create table structure + table = pa.Table.from_pydict({ + 'id': pa.array(data['id'], type=pa.int32()), + 'array_col': pa.array(data['array_col'], type=pa.list_(pa.int32())), + 'description': pa.array(data['description'], type=pa.string()) + }) + + # Write to parquet file + pq.write_table( + table, + output_file, + compression=None, # No compression for predictable size + version='2.6', + write_statistics=True, + row_group_size=3, # All data in one row group + data_page_size=100, # Very small page size + write_batch_size=10 # Small batch size + ) + +def inspect_parquet_file(file_path): + """Inspect the structure of generated parquet file""" + pf = pq.ParquetFile(file_path) + print(f"\nFile: {file_path}") + print(f"Number of row groups: {pf.num_row_groups}") + + metadata = pf.metadata + schema = pf.schema + print(f"\nSchema: {schema}") + print(f"\nDetailed schema:") + for i in range(len(schema)): + print(f"Column {i}: {schema[i]}") + + for i in range(metadata.num_row_groups): + rg = metadata.row_group(i) + print(f"\nRow Group {i}:") + print(f"Num rows: {rg.num_rows}") + + for j in range(rg.num_columns): + col = rg.column(j) + print(f"\nColumn {j}:") + print(f"Path: {schema[j].name}") + print(f"Type: {col.physical_type}") + print(f"Encodings: {col.encodings}") + print(f"Total compressed size: {col.total_compressed_size}") + print(f"Total uncompressed size: {col.total_uncompressed_size}") + print(f"Number of values: {col.num_values}") + print(f"Data page offset: {col.data_page_offset}") + if col.dictionary_page_offset is not None: + print(f"Dictionary page offset: {col.dictionary_page_offset}") + +def read_and_print_file(file_path): + """Read and print file content""" + table = pq.read_table(file_path) + df = table.to_pandas() + print("\nFile content:") + for i in range(len(df)): + print(f"\nRow {i}:") + print(f"ID: {df.iloc[i]['id']}") + arr = df.iloc[i]['array_col'] + if arr is not None: + print(f"Array length: {len(arr)}") + print(f"First few elements: {arr[:5]}...") + print(f"Last few elements: ...{arr[-5:]}") + else: + print("Array: None") + print(f"Description: {df.iloc[i]['description']}") + +def inspect_pages_with_cli(file_path, parquet_cli_path=None): + """ + Inspect page information using parquet-cli + + Args: + file_path: Path to the parquet file + parquet_cli_path: Optional path to parquet-cli jar file + """ + if not parquet_cli_path: + print("\nSkipping parquet-cli inspection: No parquet-cli path provided") + return + + print("\nParquet CLI Output:") + try: + cmd = f"java -jar {parquet_cli_path} pages {file_path}" + result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True) + print(result.stdout) + except subprocess.CalledProcessError as e: + print(f"Error running parquet-cli: {e}") + if e.output: + print(f"Error output: {e.output}") + except Exception as e: + print(f"Unexpected error running parquet-cli: {e}") + +def save_test_data_info(output_file): + """Save detailed test data information to text file""" + info = { + "file_format": "Parquet", + "version": "2.6", + "compression": "None", + "row_group_size": 3, + "data_page_size": 100, + "write_batch_size": 10, + "output_file": output_file, + "schema": { + "id": "INT32", + "array_col": "ARRAY", + "description": "STRING" + }, + "test_cases": [ + { + "row": 1, + "description": "Large array with nulls", + "characteristics": [ + "1000 elements", + "Repeated sequence [1,null,3,4,5]", + "Forces cross-page scenario" + ] + }, + { + "row": 2, + "description": "Null array and values", + "characteristics": [ + "Entire array is null", + "ID is null", + "Description is null" + ] + }, + { + "row": 3, + "description": "Another large array with nulls", + "characteristics": [ + "1000 elements", + "Repeated sequence [6,null,8,null,10]", + "Forces cross-page scenario" + ] + } + ] + } + + info_file = output_file.replace('.parquet', '_info.json') + with open(info_file, 'w') as f: + json.dump(info, f, indent=2) + +if __name__ == '__main__': + # Add command line argument parsing + parser = argparse.ArgumentParser(description='Generate and inspect parquet test data') + parser.add_argument('--parquet-cli', + help='Path to parquet-cli jar file', + default=None) + parser.add_argument('--output', + help='Output parquet file path', + default=OUTPUT_PARQUET_FILE) + args = parser.parse_args() + + # Use the output file path from command line or default + output_file = args.output + + generate_cross_page_test_data(output_file) + inspect_parquet_file(output_file) + read_and_print_file(output_file) + inspect_pages_with_cli(output_file, args.parquet_cli) + save_test_data_info(output_file) + diff --git a/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out b/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out index cc793ef96e4c2a..73049b7866ff53 100644 --- a/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out +++ b/regression-test/data/external_table_p0/hive/test_parquet_nested_types.out @@ -455,6 +455,42 @@ -- !nested_cross_page2_parquet_q6 -- 2 {"small_key":[1, 2, 3]} 1 +-- !nested_cross_page3_parquet_q1 -- +[1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] + +-- !nested_cross_page3_parquet_q2 -- + +-- !nested_cross_page3_parquet_q3 -- +[6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + +-- !nested_cross_page3_parquet_q4 -- +\N \N +1 1000 +3 1000 + +-- !nested_cross_page3_parquet_q5 -- +\N \N \N +1 1 3 +3 6 8 + +-- !nested_cross_page3_parquet_q6 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] +3 [6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + +-- !nested_cross_page3_parquet_q7 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] + +-- !nested_cross_page3_parquet_q8 -- + +-- !nested_cross_page3_parquet_q9 -- +\N \N \N +1 1 5 +3 6 10 + +-- !nested_cross_page3_parquet_q10 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] +3 [6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + -- !nested_cross_page1_parquet_q1 -- [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] @@ -911,3 +947,39 @@ -- !nested_cross_page2_parquet_q6 -- 2 {"small_key":[1, 2, 3]} 1 +-- !nested_cross_page3_parquet_q1 -- +[1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] + +-- !nested_cross_page3_parquet_q2 -- + +-- !nested_cross_page3_parquet_q3 -- +[6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + +-- !nested_cross_page3_parquet_q4 -- +\N \N +1 1000 +3 1000 + +-- !nested_cross_page3_parquet_q5 -- +\N \N \N +1 1 3 +3 6 8 + +-- !nested_cross_page3_parquet_q6 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] +3 [6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + +-- !nested_cross_page3_parquet_q7 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] + +-- !nested_cross_page3_parquet_q8 -- + +-- !nested_cross_page3_parquet_q9 -- +\N \N \N +1 1 5 +3 6 10 + +-- !nested_cross_page3_parquet_q10 -- +1 [1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5, 1, null, 3, 4, 5] +3 [6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10, 6, null, 8, null, 10] + diff --git a/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy b/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy index 2e8073e260b39b..d94f909142e94d 100644 --- a/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy +++ b/regression-test/suites/external_table_p0/hive/test_parquet_nested_types.groovy @@ -38,46 +38,46 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do sql """ use multi_catalog """ - qt_nested_cross_page1_parquet_q1 """select array_col from nested_cross_page1_parquet where id = 1""" + order_qt_nested_cross_page1_parquet_q1 """select array_col from nested_cross_page1_parquet where id = 1""" - qt_nested_cross_page1_parquet_q2 """select array_col from nested_cross_page1_parquet where id = 2""" + order_qt_nested_cross_page1_parquet_q2 """select array_col from nested_cross_page1_parquet where id = 2""" - qt_nested_cross_page1_parquet_q3 """select array_col from nested_cross_page1_parquet where id = 3""" + order_qt_nested_cross_page1_parquet_q3 """select array_col from nested_cross_page1_parquet where id = 3""" - qt_nested_cross_page1_parquet_q4 """ + order_qt_nested_cross_page1_parquet_q4 """ SELECT id, array_size(array_col) as arr_size FROM nested_cross_page1_parquet ORDER BY id """ - qt_nested_cross_page1_parquet_q5 """ + order_qt_nested_cross_page1_parquet_q5 """ SELECT id, array_col[1] as first_elem, array_col[3] as third_elem FROM nested_cross_page1_parquet ORDER BY id """ - qt_nested_cross_page1_parquet_q6 """ + order_qt_nested_cross_page1_parquet_q6 """ SELECT id, array_col FROM nested_cross_page1_parquet WHERE array_size(array_col) > 100 ORDER BY id """ - qt_nested_cross_page1_parquet_q7 """ + order_qt_nested_cross_page1_parquet_q7 """ SELECT id, array_col FROM nested_cross_page1_parquet WHERE array_contains(array_col, 1) ORDER BY id """ - qt_nested_cross_page1_parquet_q8 """ + order_qt_nested_cross_page1_parquet_q8 """ SELECT id, array_col, description FROM nested_cross_page1_parquet WHERE id > 1 AND array_size(array_col) < 100 ORDER BY id """ - qt_nested_cross_page1_parquet_q9 """ + order_qt_nested_cross_page1_parquet_q9 """ SELECT id, array_min(array_col) as min_val, @@ -86,14 +86,14 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do ORDER BY id """ - qt_nested_cross_page1_parquet_q10 """ + order_qt_nested_cross_page1_parquet_q10 """ SELECT id, array_col FROM nested_cross_page1_parquet WHERE description LIKE '%large array%' ORDER BY id """ - qt_nested_cross_page2_parquet_q1 """ + order_qt_nested_cross_page2_parquet_q1 """ SELECT id, nested_array_col, @@ -102,7 +102,7 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do WHERE id = 1 """ - qt_nested_cross_page2_parquet_q2 """ + order_qt_nested_cross_page2_parquet_q2 """ SELECT id, nested_array_col, @@ -111,7 +111,7 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do WHERE id = 2 """ - qt_nested_cross_page2_parquet_q3 """ + order_qt_nested_cross_page2_parquet_q3 """ SELECT id, nested_array_col, @@ -120,7 +120,7 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do WHERE id = 3 """ - qt_nested_cross_page2_parquet_q4 """ + order_qt_nested_cross_page2_parquet_q4 """ SELECT id, array_struct_col, @@ -129,7 +129,7 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do WHERE description LIKE '%large%' """ - qt_nested_cross_page2_parquet_q5 """ + order_qt_nested_cross_page2_parquet_q5 """ SELECT id, item_x as x_value, @@ -139,7 +139,7 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do WHERE id = 1 AND item_x > 100 """ - qt_nested_cross_page2_parquet_q6 """ + order_qt_nested_cross_page2_parquet_q6 """ SELECT id, map_array_col, @@ -147,6 +147,61 @@ suite("test_parquet_nested_types", "p0,external,hive,external_docker,external_do FROM nested_cross_page2_parquet WHERE id = 2 """ + + order_qt_nested_cross_page3_parquet_q1 """select array_col from nested_cross_page3_parquet where id = 1""" + + order_qt_nested_cross_page3_parquet_q2 """select array_col from nested_cross_page3_parquet where id = 2""" + + order_qt_nested_cross_page3_parquet_q3 """select array_col from nested_cross_page3_parquet where id = 3""" + + order_qt_nested_cross_page3_parquet_q4 """ + SELECT id, array_size(array_col) as arr_size + FROM nested_cross_page3_parquet + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q5 """ + SELECT id, array_col[1] as first_elem, array_col[3] as third_elem + FROM nested_cross_page3_parquet + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q6 """ + SELECT id, array_col + FROM nested_cross_page3_parquet + WHERE array_size(array_col) > 100 + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q7 """ + SELECT id, array_col + FROM nested_cross_page3_parquet + WHERE array_contains(array_col, 1) + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q8 """ + SELECT id, array_col, description + FROM nested_cross_page3_parquet + WHERE id > 1 AND array_size(array_col) < 100 + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q9 """ + SELECT + id, + array_min(array_col) as min_val, + array_max(array_col) as max_val + FROM nested_cross_page3_parquet + ORDER BY id + """ + + order_qt_nested_cross_page3_parquet_q10 """ + SELECT id, array_col + FROM nested_cross_page3_parquet + WHERE description LIKE '%large array%' + ORDER BY id + """ sql """drop catalog ${catalog_name};""" }