Coverage Report

Created: 2026-08-06 12:11

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