Coverage Report

Created: 2026-03-16 08:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exec/scan/meta_scanner.cpp
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
#include "exec/scan/meta_scanner.h"
19
20
#include <fmt/format.h>
21
#include <gen_cpp/FrontendService.h>
22
#include <gen_cpp/FrontendService_types.h>
23
#include <gen_cpp/HeartbeatService_types.h>
24
#include <gen_cpp/PaloInternalService_types.h>
25
#include <gen_cpp/PlanNodes_types.h>
26
27
#include <ostream>
28
#include <string>
29
#include <unordered_map>
30
31
#include "common/cast_set.h"
32
#include "common/logging.h"
33
#include "core/block/block.h"
34
#include "core/column/column.h"
35
#include "core/column/column_nullable.h"
36
#include "core/column/column_string.h"
37
#include "core/column/column_vector.h"
38
#include "core/data_type/define_primitive_type.h"
39
#include "core/types.h"
40
#include "format/table/iceberg_sys_table_jni_reader.h"
41
#include "format/table/parquet_metadata_reader.h"
42
#include "runtime/descriptors.h"
43
#include "runtime/exec_env.h"
44
#include "runtime/runtime_state.h"
45
#include "util/client_cache.h"
46
#include "util/thrift_rpc_helper.h"
47
48
namespace doris {
49
class RuntimeProfile;
50
class VExprContext;
51
} // namespace doris
52
53
namespace doris {
54
#include "common/compile_check_begin.h"
55
56
MetaScanner::MetaScanner(RuntimeState* state, ScanLocalStateBase* local_state, TupleId tuple_id,
57
                         const TScanRangeParams& scan_range, int64_t limit, RuntimeProfile* profile,
58
                         TUserIdentity user_identity)
59
7.26k
        : Scanner(state, local_state, limit, profile),
60
7.26k
          _meta_eos(false),
61
7.26k
          _tuple_id(tuple_id),
62
7.26k
          _user_identity(user_identity),
63
7.26k
          _scan_range(scan_range.scan_range) {}
64
65
7.26k
Status MetaScanner::_open_impl(RuntimeState* state) {
66
7.26k
    VLOG_CRITICAL << "MetaScanner::open";
67
7.26k
    RETURN_IF_ERROR(Scanner::_open_impl(state));
68
7.26k
    if (_scan_range.meta_scan_range.metadata_type == TMetadataType::ICEBERG) {
69
        // TODO: refactor this code
70
824
        auto reader = IcebergSysTableJniReader::create_unique(_tuple_desc->slots(), state, _profile,
71
824
                                                              _scan_range.meta_scan_range);
72
824
        RETURN_IF_ERROR(reader->init_reader());
73
824
        static_cast<IcebergSysTableJniReader*>(reader.get())
74
824
                ->set_col_name_to_block_idx(&_src_block_name_to_idx);
75
824
        _reader = std::move(reader);
76
6.44k
    } else if (_scan_range.meta_scan_range.metadata_type == TMetadataType::PARQUET) {
77
76
        auto reader = ParquetMetadataReader::create_unique(_tuple_desc->slots(), state, _profile,
78
76
                                                           _scan_range.meta_scan_range);
79
76
        RETURN_IF_ERROR(reader->init_reader());
80
76
        _reader = std::move(reader);
81
6.36k
    } else {
82
6.36k
        RETURN_IF_ERROR(_fetch_metadata(_scan_range.meta_scan_range));
83
6.36k
    }
84
7.26k
    return Status::OK();
85
7.26k
}
86
87
7.26k
Status MetaScanner::init(RuntimeState* state, const VExprContextSPtrs& conjuncts) {
88
7.26k
    VLOG_CRITICAL << "MetaScanner::init";
89
7.26k
    RETURN_IF_ERROR(Scanner::init(_state, conjuncts));
90
7.26k
    _tuple_desc = state->desc_tbl().get_tuple_descriptor(_tuple_id);
91
7.26k
    return Status::OK();
92
7.26k
}
93
94
13.6k
Status MetaScanner::_get_block_impl(RuntimeState* state, Block* block, bool* eof) {
95
13.6k
    VLOG_CRITICAL << "MetaScanner::_get_block_impl";
96
13.6k
    if (nullptr == state || nullptr == block || nullptr == eof) {
97
0
        return Status::InternalError("input is NULL pointer");
98
0
    }
99
100
    // Build name to index map only once on first call
101
13.6k
    if (_src_block_name_to_idx.empty()) {
102
7.26k
        _src_block_name_to_idx = block->get_name_to_pos_map();
103
7.26k
    }
104
105
13.6k
    if (_reader) {
106
        // TODO: This is a temporary workaround; the code is planned to be refactored later.
107
1.76k
        size_t read_rows = 0;
108
1.76k
        return _reader->get_next_block(block, &read_rows, eof);
109
1.76k
    }
110
111
11.8k
    if (_meta_eos == true) {
112
5.47k
        *eof = true;
113
5.47k
        return Status::OK();
114
5.47k
    }
115
116
6.37k
    auto column_size = _tuple_desc->slots().size();
117
6.37k
    std::vector<MutableColumnPtr> columns(column_size);
118
6.37k
    bool mem_reuse = block->mem_reuse();
119
6.37k
    do {
120
6.37k
        RETURN_IF_CANCELLED(state);
121
122
6.37k
        columns.resize(column_size);
123
49.1k
        for (auto i = 0; i < column_size; i++) {
124
42.8k
            if (mem_reuse) {
125
42.8k
                columns[i] = block->get_by_position(i).column->assume_mutable();
126
42.8k
            } else {
127
0
                columns[i] = _tuple_desc->slots()[i]->get_empty_mutable_column();
128
0
            }
129
42.8k
        }
130
        // fill block
131
6.37k
        RETURN_IF_ERROR(_fill_block_with_remote_data(columns));
132
6.37k
        if (_meta_eos == true) {
133
6.36k
            if (block->rows() == 0) {
134
887
                *eof = true;
135
887
            }
136
6.36k
            break;
137
6.36k
        }
138
        // Before really use the Block, must clear other ptr of column in block
139
        // So here need do std::move and clear in `columns`
140
2
        if (!mem_reuse) {
141
0
            int column_index = 0;
142
0
            for (const auto slot_desc : _tuple_desc->slots()) {
143
0
                block->insert(ColumnWithTypeAndName(std::move(columns[column_index++]),
144
0
                                                    slot_desc->get_data_type_ptr(),
145
0
                                                    slot_desc->col_name()));
146
0
            }
147
2
        } else {
148
2
            columns.clear();
149
2
        }
150
2
        VLOG_ROW << "VMetaScanNode output rows: " << block->rows();
151
2
    } while (block->rows() == 0 && !(*eof));
152
6.37k
    return Status::OK();
153
6.37k
}
154
155
6.36k
Status MetaScanner::_fill_block_with_remote_data(const std::vector<MutableColumnPtr>& columns) {
156
6.36k
    VLOG_CRITICAL << "MetaScanner::_fill_block_with_remote_data";
157
48.9k
    for (int col_idx = 0; col_idx < columns.size(); col_idx++) {
158
42.8k
        auto slot_desc = _tuple_desc->slots()[col_idx];
159
160
4.88M
        for (int _row_idx = 0; _row_idx < _batch_data.size(); _row_idx++) {
161
4.83M
            IColumn* col_ptr = columns[col_idx].get();
162
4.83M
            TCell& cell = _batch_data[_row_idx].column_value[col_idx];
163
4.83M
            if (cell.__isset.isNull && cell.isNull) {
164
82
                DCHECK(slot_desc->is_nullable())
165
0
                        << "cell is null but column is not nullable: " << slot_desc->col_name();
166
82
                auto& null_col = reinterpret_cast<ColumnNullable&>(*col_ptr);
167
82
                null_col.get_nested_column().insert_default();
168
82
                null_col.get_null_map_data().push_back(1);
169
4.83M
            } else {
170
4.83M
                if (slot_desc->is_nullable()) {
171
230
                    auto& null_col = reinterpret_cast<ColumnNullable&>(*col_ptr);
172
230
                    null_col.get_null_map_data().push_back(0);
173
230
                    col_ptr = null_col.get_nested_column_ptr().get();
174
230
                }
175
4.83M
                switch (slot_desc->type()->get_primitive_type()) {
176
5.63k
                case TYPE_BOOLEAN: {
177
5.63k
                    bool data = cell.boolVal;
178
5.63k
                    assert_cast<ColumnBool*>(col_ptr)->insert_value((uint8_t)data);
179
5.63k
                    break;
180
0
                }
181
4
                case TYPE_TINYINT: {
182
4
                    int8_t data = (int8_t)cell.intVal;
183
4
                    assert_cast<ColumnInt8*>(col_ptr)->insert_value(data);
184
4
                    break;
185
0
                }
186
4
                case TYPE_SMALLINT: {
187
4
                    int16_t data = (int16_t)cell.intVal;
188
4
                    assert_cast<ColumnInt16*>(col_ptr)->insert_value(data);
189
4
                    break;
190
0
                }
191
142
                case TYPE_INT: {
192
142
                    int32_t data = cell.intVal;
193
142
                    assert_cast<ColumnInt32*>(col_ptr)->insert_value(data);
194
142
                    break;
195
0
                }
196
6.71k
                case TYPE_BIGINT: {
197
6.71k
                    int64_t data = cell.longVal;
198
6.71k
                    assert_cast<ColumnInt64*>(col_ptr)->insert_value(data);
199
6.71k
                    break;
200
0
                }
201
78
                case TYPE_FLOAT: {
202
78
                    auto data = static_cast<float>(cell.doubleVal);
203
78
                    assert_cast<ColumnFloat32*>(col_ptr)->insert_value(data);
204
78
                    break;
205
0
                }
206
20
                case TYPE_DOUBLE: {
207
20
                    double data = cell.doubleVal;
208
20
                    assert_cast<ColumnFloat64*>(col_ptr)->insert_value(data);
209
20
                    break;
210
0
                }
211
4
                case TYPE_DATEV2: {
212
4
                    uint32_t data = (uint32_t)cell.longVal;
213
4
                    assert_cast<ColumnDateV2*>(col_ptr)->insert_value(data);
214
4
                    break;
215
0
                }
216
4
                case TYPE_DATETIMEV2: {
217
4
                    uint64_t data = cell.longVal;
218
4
                    assert_cast<ColumnDateTimeV2*>(col_ptr)->insert_value(data);
219
4
                    break;
220
0
                }
221
4.83M
                case TYPE_STRING:
222
4.83M
                case TYPE_CHAR:
223
4.83M
                case TYPE_VARCHAR: {
224
4.83M
                    std::string data = cell.stringVal;
225
4.83M
                    assert_cast<ColumnString*>(col_ptr)->insert_data(data.c_str(), data.length());
226
4.83M
                    break;
227
4.83M
                }
228
0
                default: {
229
0
                    std::string error_msg =
230
0
                            fmt::format("Invalid column type {} on column: {}.",
231
0
                                        slot_desc->type()->get_name(), slot_desc->col_name());
232
0
                    return Status::InternalError(std::string(error_msg));
233
4.83M
                }
234
4.83M
                }
235
4.83M
            }
236
4.83M
        }
237
42.8k
    }
238
6.11k
    _meta_eos = true;
239
6.11k
    return Status::OK();
240
6.36k
}
241
242
6.36k
Status MetaScanner::_fetch_metadata(const TMetaScanRange& meta_scan_range) {
243
6.36k
    VLOG_CRITICAL << "MetaScanner::_fetch_metadata";
244
6.36k
    TFetchSchemaTableDataRequest request;
245
6.36k
    switch (meta_scan_range.metadata_type) {
246
0
    case TMetadataType::HUDI:
247
0
        RETURN_IF_ERROR(_build_hudi_metadata_request(meta_scan_range, &request));
248
0
        break;
249
24
    case TMetadataType::BACKENDS:
250
24
        RETURN_IF_ERROR(_build_backends_metadata_request(meta_scan_range, &request));
251
24
        break;
252
42
    case TMetadataType::FRONTENDS:
253
42
        RETURN_IF_ERROR(_build_frontends_metadata_request(meta_scan_range, &request));
254
42
        break;
255
42
    case TMetadataType::FRONTENDS_DISKS:
256
13
        RETURN_IF_ERROR(_build_frontends_disks_metadata_request(meta_scan_range, &request));
257
13
        break;
258
13
    case TMetadataType::WORKLOAD_SCHED_POLICY:
259
0
        RETURN_IF_ERROR(_build_workload_sched_policy_metadata_request(meta_scan_range, &request));
260
0
        break;
261
48
    case TMetadataType::CATALOGS:
262
48
        RETURN_IF_ERROR(_build_catalogs_metadata_request(meta_scan_range, &request));
263
48
        break;
264
2.44k
    case TMetadataType::MATERIALIZED_VIEWS:
265
2.44k
        RETURN_IF_ERROR(_build_materialized_views_metadata_request(meta_scan_range, &request));
266
2.44k
        break;
267
2.44k
    case TMetadataType::PARTITIONS:
268
26
        RETURN_IF_ERROR(_build_partitions_metadata_request(meta_scan_range, &request));
269
26
        break;
270
982
    case TMetadataType::JOBS:
271
982
        RETURN_IF_ERROR(_build_jobs_metadata_request(meta_scan_range, &request));
272
982
        break;
273
2.74k
    case TMetadataType::TASKS:
274
2.74k
        RETURN_IF_ERROR(_build_tasks_metadata_request(meta_scan_range, &request));
275
2.74k
        break;
276
2.74k
    case TMetadataType::PARTITION_VALUES:
277
40
        RETURN_IF_ERROR(_build_partition_values_metadata_request(meta_scan_range, &request));
278
40
        break;
279
40
    default:
280
0
        _meta_eos = true;
281
0
        return Status::OK();
282
6.36k
    }
283
284
    // set filter columns
285
6.36k
    std::vector<std::string> filter_columns;
286
42.8k
    for (const auto& slot : _tuple_desc->slots()) {
287
42.8k
        filter_columns.emplace_back(slot->col_name_lower_case());
288
42.8k
    }
289
6.36k
    request.metada_table_params.__set_columns_name(filter_columns);
290
291
    // _state->execution_timeout() is seconds, change to milliseconds
292
6.36k
    int time_out = _state->execution_timeout() * 1000;
293
6.36k
    TNetworkAddress master_addr = ExecEnv::GetInstance()->cluster_info()->master_fe_addr;
294
6.36k
    TFetchSchemaTableDataResult result;
295
6.36k
    RETURN_IF_ERROR(ThriftRpcHelper::rpc<FrontendServiceClient>(
296
6.36k
            master_addr.hostname, master_addr.port,
297
6.36k
            [&request, &result](FrontendServiceConnection& client) {
298
6.36k
                client->fetchSchemaTableData(result, request);
299
6.36k
            },
300
6.36k
            time_out));
301
302
6.36k
    Status status(Status::create(result.status));
303
6.36k
    if (!status.ok()) {
304
0
        LOG(WARNING) << "fetch schema table data from master failed, errmsg=" << status;
305
0
        return status;
306
0
    }
307
6.36k
    _batch_data = std::move(result.data_batch);
308
6.36k
    return Status::OK();
309
6.36k
}
310
311
Status MetaScanner::_build_hudi_metadata_request(const TMetaScanRange& meta_scan_range,
312
0
                                                 TFetchSchemaTableDataRequest* request) {
313
0
    VLOG_CRITICAL << "MetaScanner::_build_hudi_metadata_request";
314
0
    if (!meta_scan_range.__isset.hudi_params) {
315
0
        return Status::InternalError("Can not find THudiMetadataParams from meta_scan_range.");
316
0
    }
317
318
    // create request
319
0
    request->__set_cluster_name("");
320
0
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
321
322
    // create TMetadataTableRequestParams
323
0
    TMetadataTableRequestParams metadata_table_params;
324
0
    metadata_table_params.__set_metadata_type(TMetadataType::HUDI);
325
0
    metadata_table_params.__set_hudi_metadata_params(meta_scan_range.hudi_params);
326
327
0
    request->__set_metada_table_params(metadata_table_params);
328
0
    return Status::OK();
329
0
}
330
331
Status MetaScanner::_build_backends_metadata_request(const TMetaScanRange& meta_scan_range,
332
24
                                                     TFetchSchemaTableDataRequest* request) {
333
24
    VLOG_CRITICAL << "MetaScanner::_build_backends_metadata_request";
334
24
    if (!meta_scan_range.__isset.backends_params) {
335
0
        return Status::InternalError("Can not find TBackendsMetadataParams from meta_scan_range.");
336
0
    }
337
    // create request
338
24
    request->__set_cluster_name("");
339
24
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
340
341
    // create TMetadataTableRequestParams
342
24
    TMetadataTableRequestParams metadata_table_params;
343
24
    metadata_table_params.__set_metadata_type(TMetadataType::BACKENDS);
344
24
    metadata_table_params.__set_backends_metadata_params(meta_scan_range.backends_params);
345
346
24
    request->__set_metada_table_params(metadata_table_params);
347
24
    return Status::OK();
348
24
}
349
350
Status MetaScanner::_build_frontends_metadata_request(const TMetaScanRange& meta_scan_range,
351
42
                                                      TFetchSchemaTableDataRequest* request) {
352
42
    VLOG_CRITICAL << "MetaScanner::_build_frontends_metadata_request";
353
42
    if (!meta_scan_range.__isset.frontends_params) {
354
0
        return Status::InternalError("Can not find TFrontendsMetadataParams from meta_scan_range.");
355
0
    }
356
    // create request
357
42
    request->__set_cluster_name("");
358
42
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
359
360
    // create TMetadataTableRequestParams
361
42
    TMetadataTableRequestParams metadata_table_params;
362
42
    metadata_table_params.__set_metadata_type(TMetadataType::FRONTENDS);
363
42
    metadata_table_params.__set_frontends_metadata_params(meta_scan_range.frontends_params);
364
365
42
    request->__set_metada_table_params(metadata_table_params);
366
42
    return Status::OK();
367
42
}
368
369
Status MetaScanner::_build_frontends_disks_metadata_request(const TMetaScanRange& meta_scan_range,
370
13
                                                            TFetchSchemaTableDataRequest* request) {
371
13
    VLOG_CRITICAL << "MetaScanner::_build_frontends_metadata_request";
372
13
    if (!meta_scan_range.__isset.frontends_params) {
373
0
        return Status::InternalError("Can not find TFrontendsMetadataParams from meta_scan_range.");
374
0
    }
375
    // create request
376
13
    request->__set_cluster_name("");
377
13
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
378
379
    // create TMetadataTableRequestParams
380
13
    TMetadataTableRequestParams metadata_table_params;
381
13
    metadata_table_params.__set_metadata_type(TMetadataType::FRONTENDS_DISKS);
382
13
    metadata_table_params.__set_frontends_metadata_params(meta_scan_range.frontends_params);
383
384
13
    request->__set_metada_table_params(metadata_table_params);
385
13
    return Status::OK();
386
13
}
387
388
Status MetaScanner::_build_workload_sched_policy_metadata_request(
389
0
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
390
0
    VLOG_CRITICAL << "MetaScanner::_build_workload_sched_policy_metadata_request";
391
392
    // create request
393
0
    request->__set_cluster_name("");
394
0
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
395
396
    // create TMetadataTableRequestParams
397
0
    TMetadataTableRequestParams metadata_table_params;
398
0
    metadata_table_params.__set_metadata_type(TMetadataType::WORKLOAD_SCHED_POLICY);
399
0
    metadata_table_params.__set_current_user_ident(_user_identity);
400
401
0
    request->__set_metada_table_params(metadata_table_params);
402
0
    return Status::OK();
403
0
}
404
405
Status MetaScanner::_build_catalogs_metadata_request(const TMetaScanRange& meta_scan_range,
406
48
                                                     TFetchSchemaTableDataRequest* request) {
407
48
    VLOG_CRITICAL << "MetaScanner::_build_catalogs_metadata_request";
408
409
    // create request
410
48
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
411
412
    // create TMetadataTableRequestParams
413
48
    TMetadataTableRequestParams metadata_table_params;
414
48
    metadata_table_params.__set_metadata_type(TMetadataType::CATALOGS);
415
48
    metadata_table_params.__set_current_user_ident(_user_identity);
416
417
48
    request->__set_metada_table_params(metadata_table_params);
418
48
    return Status::OK();
419
48
}
420
421
Status MetaScanner::_build_materialized_views_metadata_request(
422
2.44k
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
423
2.44k
    VLOG_CRITICAL << "MetaScanner::_build_materialized_views_metadata_request";
424
2.44k
    if (!meta_scan_range.__isset.materialized_views_params) {
425
0
        return Status::InternalError(
426
0
                "Can not find TMaterializedViewsMetadataParams from meta_scan_range.");
427
0
    }
428
429
    // create request
430
2.44k
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
431
432
    // create TMetadataTableRequestParams
433
2.44k
    TMetadataTableRequestParams metadata_table_params;
434
2.44k
    metadata_table_params.__set_metadata_type(TMetadataType::MATERIALIZED_VIEWS);
435
2.44k
    metadata_table_params.__set_materialized_views_metadata_params(
436
2.44k
            meta_scan_range.materialized_views_params);
437
438
2.44k
    request->__set_metada_table_params(metadata_table_params);
439
2.44k
    return Status::OK();
440
2.44k
}
441
442
Status MetaScanner::_build_partitions_metadata_request(const TMetaScanRange& meta_scan_range,
443
26
                                                       TFetchSchemaTableDataRequest* request) {
444
26
    VLOG_CRITICAL << "MetaScanner::_build_partitions_metadata_request";
445
26
    if (!meta_scan_range.__isset.partitions_params) {
446
0
        return Status::InternalError(
447
0
                "Can not find TPartitionsMetadataParams from meta_scan_range.");
448
0
    }
449
450
    // create request
451
26
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
452
453
    // create TMetadataTableRequestParams
454
26
    TMetadataTableRequestParams metadata_table_params;
455
26
    metadata_table_params.__set_metadata_type(TMetadataType::PARTITIONS);
456
26
    metadata_table_params.__set_partitions_metadata_params(meta_scan_range.partitions_params);
457
458
26
    request->__set_metada_table_params(metadata_table_params);
459
26
    return Status::OK();
460
26
}
461
462
Status MetaScanner::_build_jobs_metadata_request(const TMetaScanRange& meta_scan_range,
463
982
                                                 TFetchSchemaTableDataRequest* request) {
464
982
    VLOG_CRITICAL << "MetaScanner::_build_jobs_metadata_request";
465
982
    if (!meta_scan_range.__isset.jobs_params) {
466
0
        return Status::InternalError("Can not find TJobsMetadataParams from meta_scan_range.");
467
0
    }
468
469
    // create request
470
982
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
471
472
    // create TMetadataTableRequestParams
473
982
    TMetadataTableRequestParams metadata_table_params;
474
982
    metadata_table_params.__set_metadata_type(TMetadataType::JOBS);
475
982
    metadata_table_params.__set_jobs_metadata_params(meta_scan_range.jobs_params);
476
477
982
    request->__set_metada_table_params(metadata_table_params);
478
982
    return Status::OK();
479
982
}
480
481
Status MetaScanner::_build_tasks_metadata_request(const TMetaScanRange& meta_scan_range,
482
2.74k
                                                  TFetchSchemaTableDataRequest* request) {
483
2.74k
    VLOG_CRITICAL << "MetaScanner::_build_tasks_metadata_request";
484
2.74k
    if (!meta_scan_range.__isset.tasks_params) {
485
0
        return Status::InternalError("Can not find TTasksMetadataParams from meta_scan_range.");
486
0
    }
487
488
    // create request
489
2.74k
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
490
491
    // create TMetadataTableRequestParams
492
2.74k
    TMetadataTableRequestParams metadata_table_params;
493
2.74k
    metadata_table_params.__set_metadata_type(TMetadataType::TASKS);
494
2.74k
    metadata_table_params.__set_tasks_metadata_params(meta_scan_range.tasks_params);
495
496
2.74k
    request->__set_metada_table_params(metadata_table_params);
497
2.74k
    return Status::OK();
498
2.74k
}
499
500
Status MetaScanner::_build_partition_values_metadata_request(
501
40
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
502
40
    VLOG_CRITICAL << "MetaScanner::_build_partition_values_metadata_request";
503
40
    if (!meta_scan_range.__isset.partition_values_params) {
504
0
        return Status::InternalError(
505
0
                "Can not find TPartitionValuesMetadataParams from meta_scan_range.");
506
0
    }
507
508
    // create request
509
40
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
510
511
    // create TMetadataTableRequestParams
512
40
    TMetadataTableRequestParams metadata_table_params;
513
40
    metadata_table_params.__set_metadata_type(TMetadataType::PARTITION_VALUES);
514
40
    metadata_table_params.__set_partition_values_metadata_params(
515
40
            meta_scan_range.partition_values_params);
516
517
40
    request->__set_metada_table_params(metadata_table_params);
518
40
    return Status::OK();
519
40
}
520
521
7.26k
Status MetaScanner::close(RuntimeState* state) {
522
7.26k
    VLOG_CRITICAL << "MetaScanner::close";
523
7.26k
    if (!_try_close()) {
524
0
        return Status::OK();
525
0
    }
526
7.26k
    if (_reader) {
527
900
        RETURN_IF_ERROR(_reader->close());
528
900
    }
529
7.26k
    RETURN_IF_ERROR(Scanner::close(state));
530
7.26k
    return Status::OK();
531
7.26k
}
532
533
#include "common/compile_check_end.h"
534
} // namespace doris