Coverage Report

Created: 2026-03-16 16:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/format/parquet/vparquet_page_reader.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <gen_cpp/parquet_types.h>
21
#include <stdint.h>
22
23
#include <memory>
24
#include <string>
25
26
#include "common/cast_set.h"
27
#include "common/config.h"
28
#include "common/status.h"
29
#include "format/parquet/parquet_common.h"
30
#include "storage/cache/page_cache.h"
31
#include "util/block_compression.h"
32
namespace doris {
33
class BlockCompressionCodec;
34
35
namespace io {
36
class BufferedStreamReader;
37
struct IOContext;
38
} // namespace io
39
40
} // namespace doris
41
42
namespace doris {
43
namespace io {
44
class BufferedStreamReader;
45
struct IOContext;
46
} // namespace io
47
struct Slice;
48
} // namespace doris
49
50
namespace doris {
51
#include "common/compile_check_begin.h"
52
/**
53
 * Use to deserialize parquet page header, and get the page data in iterator interface.
54
 */
55
56
// Session-level options for parquet page reading/caching.
57
struct ParquetPageReadContext {
58
    bool enable_parquet_file_page_cache = true;
59
42
    ParquetPageReadContext() = default;
60
    ParquetPageReadContext(bool enable_parquet_file_page_cache)
61
110
            : enable_parquet_file_page_cache(enable_parquet_file_page_cache) {}
62
};
63
64
inline bool should_cache_decompressed(const tparquet::PageHeader* header,
65
186
                                      const tparquet::ColumnMetaData& metadata) {
66
186
    if (header->compressed_page_size <= 0) return true;
67
182
    if (metadata.codec == tparquet::CompressionCodec::UNCOMPRESSED) return true;
68
175
    if (header->uncompressed_page_size == 0) return true;
69
70
167
    double ratio = static_cast<double>(header->uncompressed_page_size) /
71
167
                   static_cast<double>(header->compressed_page_size);
72
167
    return ratio <= config::parquet_page_cache_decompress_threshold;
73
175
}
74
75
class ParquetPageCacheKeyBuilder {
76
public:
77
    void init(const std::string& path, int64_t mtime);
78
245
    StoragePageCache::CacheKey make_key(uint64_t end_offset, int64_t offset) const {
79
245
        return StoragePageCache::CacheKey(_file_key_prefix, end_offset, offset);
80
245
    }
81
82
private:
83
    std::string _file_key_prefix;
84
};
85
86
template <bool IN_COLLECTION, bool OFFSET_INDEX>
87
class PageReader {
88
public:
89
    struct PageStatistics {
90
        int64_t decode_header_time = 0;
91
        int64_t skip_page_header_num = 0;
92
        int64_t parse_page_header_num = 0;
93
        int64_t read_page_header_time = 0;
94
        int64_t page_cache_hit_counter = 0;
95
        int64_t page_cache_missing_counter = 0;
96
        int64_t page_cache_compressed_hit_counter = 0;
97
        int64_t page_cache_decompressed_hit_counter = 0;
98
        int64_t page_cache_write_counter = 0;
99
        int64_t page_cache_compressed_write_counter = 0;
100
        int64_t page_cache_decompressed_write_counter = 0;
101
        int64_t page_read_counter = 0;
102
    };
103
104
    PageReader(io::BufferedStreamReader* reader, io::IOContext* io_ctx, uint64_t offset,
105
               uint64_t length, size_t total_rows, const tparquet::ColumnMetaData& metadata,
106
               const ParquetPageReadContext& page_read_ctx,
107
               const tparquet::OffsetIndex* offset_index = nullptr);
108
163
    ~PageReader() = default;
_ZN5doris10PageReaderILb0ELb0EED2Ev
Line
Count
Source
108
161
    ~PageReader() = default;
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EED2Ev
_ZN5doris10PageReaderILb1ELb0EED2Ev
Line
Count
Source
108
2
    ~PageReader() = default;
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EED2Ev
109
110
0
    bool has_next_page() const {
111
0
        if constexpr (OFFSET_INDEX) {
112
0
            return _page_index + 1 != _offset_index->page_locations.size();
113
0
        } else {
114
            // Deprecated
115
            // Parquet file may not be standardized,
116
            // _end_offset may exceed the actual data area.
117
            // ColumnChunkReader::has_next_page() use the number of parsed values for judgment
118
            // ref:https://github.com/duckdb/duckdb/issues/10829
119
            // [[deprecated]]
120
0
            LOG(FATAL) << "has_next_page should not be called when no offset index";
121
0
            return _offset < _end_offset;
122
0
        }
123
0
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE13has_next_pageEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE13has_next_pageEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE13has_next_pageEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE13has_next_pageEv
124
125
    Status parse_page_header();
126
127
31
    Status next_page() {
128
31
        _page_statistics.skip_page_header_num += _state == INITIALIZED;
129
31
        if constexpr (OFFSET_INDEX) {
130
0
            _page_index++;
131
0
            _start_row = _offset_index->page_locations[_page_index].first_row_index;
132
0
            if (_page_index + 1 < _offset_index->page_locations.size()) {
133
0
                _end_row = _offset_index->page_locations[_page_index + 1].first_row_index;
134
0
            } else {
135
0
                _end_row = _total_rows;
136
0
            }
137
0
            int64_t next_page_offset = _offset_index->page_locations[_page_index].offset;
138
0
            _offset = next_page_offset;
139
0
            _next_header_offset = next_page_offset;
140
0
            _state = INITIALIZED;
141
31
        } else {
142
31
            if (UNLIKELY(_offset == _start_offset)) {
143
0
                return Status::Corruption("should parse first page.");
144
0
            }
145
146
31
            if (is_header_v2()) {
147
0
                _start_row += _cur_page_header.data_page_header_v2.num_rows;
148
31
            } else if constexpr (!IN_COLLECTION) {
149
31
                _start_row += _cur_page_header.data_page_header.num_values;
150
31
            }
151
152
31
            _offset = _next_header_offset;
153
31
            _state = INITIALIZED;
154
31
        }
155
156
0
        return Status::OK();
157
31
    }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE9next_pageEv
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE9next_pageEv
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE9next_pageEv
_ZN5doris10PageReaderILb0ELb0EE9next_pageEv
Line
Count
Source
127
31
    Status next_page() {
128
31
        _page_statistics.skip_page_header_num += _state == INITIALIZED;
129
        if constexpr (OFFSET_INDEX) {
130
            _page_index++;
131
            _start_row = _offset_index->page_locations[_page_index].first_row_index;
132
            if (_page_index + 1 < _offset_index->page_locations.size()) {
133
                _end_row = _offset_index->page_locations[_page_index + 1].first_row_index;
134
            } else {
135
                _end_row = _total_rows;
136
            }
137
            int64_t next_page_offset = _offset_index->page_locations[_page_index].offset;
138
            _offset = next_page_offset;
139
            _next_header_offset = next_page_offset;
140
            _state = INITIALIZED;
141
31
        } else {
142
31
            if (UNLIKELY(_offset == _start_offset)) {
143
0
                return Status::Corruption("should parse first page.");
144
0
            }
145
146
31
            if (is_header_v2()) {
147
0
                _start_row += _cur_page_header.data_page_header_v2.num_rows;
148
31
            } else if constexpr (!IN_COLLECTION) {
149
31
                _start_row += _cur_page_header.data_page_header.num_values;
150
31
            }
151
152
31
            _offset = _next_header_offset;
153
31
            _state = INITIALIZED;
154
31
        }
155
156
0
        return Status::OK();
157
31
    }
158
159
31
    Status dict_next_page() {
160
31
        if constexpr (OFFSET_INDEX) {
161
0
            _state = INITIALIZED;
162
0
            return Status::OK();
163
31
        } else {
164
31
            return next_page();
165
31
        }
166
31
    }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE14dict_next_pageEv
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE14dict_next_pageEv
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE14dict_next_pageEv
_ZN5doris10PageReaderILb0ELb0EE14dict_next_pageEv
Line
Count
Source
159
31
    Status dict_next_page() {
160
        if constexpr (OFFSET_INDEX) {
161
            _state = INITIALIZED;
162
            return Status::OK();
163
31
        } else {
164
31
            return next_page();
165
31
        }
166
31
    }
167
168
541
    Status get_page_header(const tparquet::PageHeader** page_header) {
169
541
        if (UNLIKELY(_state != HEADER_PARSED)) {
170
0
            return Status::InternalError("Page header not parsed");
171
0
        }
172
541
        *page_header = &_cur_page_header;
173
541
        return Status::OK();
174
541
    }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE15get_page_headerEPPKN8tparquet10PageHeaderE
_ZN5doris10PageReaderILb1ELb0EE15get_page_headerEPPKN8tparquet10PageHeaderE
Line
Count
Source
168
6
    Status get_page_header(const tparquet::PageHeader** page_header) {
169
6
        if (UNLIKELY(_state != HEADER_PARSED)) {
170
0
            return Status::InternalError("Page header not parsed");
171
0
        }
172
6
        *page_header = &_cur_page_header;
173
6
        return Status::OK();
174
6
    }
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE15get_page_headerEPPKN8tparquet10PageHeaderE
_ZN5doris10PageReaderILb0ELb0EE15get_page_headerEPPKN8tparquet10PageHeaderE
Line
Count
Source
168
535
    Status get_page_header(const tparquet::PageHeader** page_header) {
169
535
        if (UNLIKELY(_state != HEADER_PARSED)) {
170
0
            return Status::InternalError("Page header not parsed");
171
0
        }
172
535
        *page_header = &_cur_page_header;
173
535
        return Status::OK();
174
535
    }
175
176
    Status get_page_data(Slice& slice);
177
178
    // Skip page data and update offset (used when data is loaded from cache)
179
17
    void skip_page_data() {
180
17
        if (_state == HEADER_PARSED) {
181
17
            _offset += _cur_page_header.compressed_page_size;
182
17
            _state = DATA_LOADED;
183
17
        }
184
17
    }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE14skip_page_dataEv
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE14skip_page_dataEv
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE14skip_page_dataEv
_ZN5doris10PageReaderILb0ELb0EE14skip_page_dataEv
Line
Count
Source
179
17
    void skip_page_data() {
180
17
        if (_state == HEADER_PARSED) {
181
17
            _offset += _cur_page_header.compressed_page_size;
182
17
            _state = DATA_LOADED;
183
17
        }
184
17
    }
185
186
242
    const std::vector<uint8_t>& header_bytes() const { return _header_buf; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE12header_bytesEv
_ZNK5doris10PageReaderILb1ELb0EE12header_bytesEv
Line
Count
Source
186
3
    const std::vector<uint8_t>& header_bytes() const { return _header_buf; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE12header_bytesEv
_ZNK5doris10PageReaderILb0ELb0EE12header_bytesEv
Line
Count
Source
186
239
    const std::vector<uint8_t>& header_bytes() const { return _header_buf; }
187
    // header start offset for current page
188
56
    int64_t header_start_offset() const {
189
56
        return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) -
190
56
               static_cast<int64_t>(_cur_page_header.compressed_page_size);
191
56
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19header_start_offsetEv
_ZNK5doris10PageReaderILb1ELb0EE19header_start_offsetEv
Line
Count
Source
188
1
    int64_t header_start_offset() const {
189
1
        return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) -
190
1
               static_cast<int64_t>(_cur_page_header.compressed_page_size);
191
1
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19header_start_offsetEv
_ZNK5doris10PageReaderILb0ELb0EE19header_start_offsetEv
Line
Count
Source
188
55
    int64_t header_start_offset() const {
189
55
        return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) -
190
55
               static_cast<int64_t>(_cur_page_header.compressed_page_size);
191
55
    }
192
0
    uint64_t file_end_offset() const { return _end_offset; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE15file_end_offsetEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE15file_end_offsetEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE15file_end_offsetEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE15file_end_offsetEv
193
0
    bool cached_decompressed() const {
194
0
        return should_cache_decompressed(&_cur_page_header, _metadata);
195
0
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19cached_decompressedEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE19cached_decompressedEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19cached_decompressedEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE19cached_decompressedEv
196
197
1.46k
    PageStatistics& page_statistics() { return _page_statistics; }
_ZN5doris10PageReaderILb0ELb0EE15page_statisticsEv
Line
Count
Source
197
1.44k
    PageStatistics& page_statistics() { return _page_statistics; }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE15page_statisticsEv
_ZN5doris10PageReaderILb1ELb0EE15page_statisticsEv
Line
Count
Source
197
24
    PageStatistics& page_statistics() { return _page_statistics; }
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE15page_statisticsEv
198
199
419
    bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; }
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE12is_header_v2Ev
_ZN5doris10PageReaderILb1ELb0EE12is_header_v2Ev
Line
Count
Source
199
8
    bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; }
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE12is_header_v2Ev
_ZN5doris10PageReaderILb0ELb0EE12is_header_v2Ev
Line
Count
Source
199
411
    bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; }
200
201
    // Returns whether the current page's cache payload is decompressed
202
121
    bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE29is_cache_payload_decompressedEv
_ZNK5doris10PageReaderILb1ELb0EE29is_cache_payload_decompressedEv
Line
Count
Source
202
1
    bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE29is_cache_payload_decompressedEv
_ZNK5doris10PageReaderILb0ELb0EE29is_cache_payload_decompressedEv
Line
Count
Source
202
120
    bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; }
203
204
6
    size_t start_row() const { return _start_row; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE9start_rowEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE9start_rowEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE9start_rowEv
_ZNK5doris10PageReaderILb0ELb0EE9start_rowEv
Line
Count
Source
204
6
    size_t start_row() const { return _start_row; }
205
206
188
    size_t end_row() const { return _end_row; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE7end_rowEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE7end_rowEv
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE7end_rowEv
_ZNK5doris10PageReaderILb0ELb0EE7end_rowEv
Line
Count
Source
206
188
    size_t end_row() const { return _end_row; }
207
208
    // Accessors for cache handle
209
189
    bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE21has_page_cache_handleEv
_ZNK5doris10PageReaderILb1ELb0EE21has_page_cache_handleEv
Line
Count
Source
209
2
    bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE21has_page_cache_handleEv
_ZNK5doris10PageReaderILb0ELb0EE21has_page_cache_handleEv
Line
Count
Source
209
187
    bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; }
210
121
    const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE17page_cache_handleEv
_ZNK5doris10PageReaderILb1ELb0EE17page_cache_handleEv
Line
Count
Source
210
1
    const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE17page_cache_handleEv
_ZNK5doris10PageReaderILb0ELb0EE17page_cache_handleEv
Line
Count
Source
210
120
    const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; }
211
245
    StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const {
212
245
        return _page_cache_key_builder.make_key(_end_offset, offset);
213
245
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19make_page_cache_keyEl
_ZNK5doris10PageReaderILb1ELb0EE19make_page_cache_keyEl
Line
Count
Source
211
3
    StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const {
212
3
        return _page_cache_key_builder.make_key(_end_offset, offset);
213
3
    }
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19make_page_cache_keyEl
_ZNK5doris10PageReaderILb0ELb0EE19make_page_cache_keyEl
Line
Count
Source
211
242
    StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const {
212
242
        return _page_cache_key_builder.make_key(_end_offset, offset);
213
242
    }
214
215
private:
216
    enum PageReaderState { INITIALIZED, HEADER_PARSED, DATA_LOADED };
217
    PageReaderState _state = INITIALIZED;
218
    PageStatistics _page_statistics;
219
220
    io::BufferedStreamReader* _reader = nullptr;
221
    io::IOContext* _io_ctx = nullptr;
222
    // current reader offset in file location.
223
    uint64_t _offset = 0;
224
    // this page offset in file location.
225
    uint64_t _start_offset = 0;
226
    uint64_t _end_offset = 0;
227
    uint64_t _next_header_offset = 0;
228
    // current page row range
229
    size_t _start_row = 0;
230
    size_t _end_row = 0;
231
    // total rows in this column chunk
232
    size_t _total_rows = 0;
233
    // Column metadata for this column chunk
234
    const tparquet::ColumnMetaData& _metadata;
235
    // Session-level parquet page cache options
236
    ParquetPageReadContext _page_read_ctx;
237
    // for page index
238
    size_t _page_index = 0;
239
    const tparquet::OffsetIndex* _offset_index;
240
241
    tparquet::PageHeader _cur_page_header;
242
    bool _is_cache_payload_decompressed = true;
243
244
    // Page cache members
245
    ParquetPageCacheKeyBuilder _page_cache_key_builder;
246
    doris::PageCacheHandle _page_cache_handle;
247
    // stored header bytes when cache miss so we can insert header+payload into cache
248
    std::vector<uint8_t> _header_buf;
249
    // last parsed header size in bytes
250
    uint32_t _last_header_size = 0;
251
};
252
253
template <bool IN_COLLECTION, bool OFFSET_INDEX>
254
std::unique_ptr<PageReader<IN_COLLECTION, OFFSET_INDEX>> create_page_reader(
255
        io::BufferedStreamReader* reader, io::IOContext* io_ctx, uint64_t offset, uint64_t length,
256
        size_t total_rows, const tparquet::ColumnMetaData& metadata,
257
163
        const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) {
258
163
    return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>(
259
163
            reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index);
260
163
}
Unexecuted instantiation: _ZN5doris18create_page_readerILb1ELb1EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE
_ZN5doris18create_page_readerILb1ELb0EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE
Line
Count
Source
257
2
        const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) {
258
2
    return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>(
259
2
            reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index);
260
2
}
Unexecuted instantiation: _ZN5doris18create_page_readerILb0ELb1EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE
_ZN5doris18create_page_readerILb0ELb0EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE
Line
Count
Source
257
161
        const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) {
258
161
    return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>(
259
161
            reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index);
260
161
}
261
#include "common/compile_check_end.h"
262
263
} // namespace doris