Coverage Report

Created: 2025-07-27 03:09

/root/doris/be/src/exec/schema_scanner.cpp
Line
Count
Source (jump to first uncovered line)
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/schema_scanner.h"
19
20
#include <gen_cpp/Descriptors_types.h>
21
#include <gen_cpp/Types_types.h>
22
#include <glog/logging.h>
23
#include <string.h>
24
25
#include <new>
26
#include <ostream>
27
#include <utility>
28
29
#include "exec/schema_scanner/schema_active_queries_scanner.h"
30
#include "exec/schema_scanner/schema_backend_active_tasks.h"
31
#include "exec/schema_scanner/schema_backend_configuration_scanner.h"
32
#include "exec/schema_scanner/schema_backend_kerberos_ticket_cache.h"
33
#include "exec/schema_scanner/schema_catalog_meta_cache_stats_scanner.h"
34
#include "exec/schema_scanner/schema_charsets_scanner.h"
35
#include "exec/schema_scanner/schema_collations_scanner.h"
36
#include "exec/schema_scanner/schema_columns_scanner.h"
37
#include "exec/schema_scanner/schema_dummy_scanner.h"
38
#include "exec/schema_scanner/schema_file_cache_statistics.h"
39
#include "exec/schema_scanner/schema_files_scanner.h"
40
#include "exec/schema_scanner/schema_metadata_name_ids_scanner.h"
41
#include "exec/schema_scanner/schema_partitions_scanner.h"
42
#include "exec/schema_scanner/schema_processlist_scanner.h"
43
#include "exec/schema_scanner/schema_profiling_scanner.h"
44
#include "exec/schema_scanner/schema_routine_load_job_scanner.h"
45
#include "exec/schema_scanner/schema_routine_scanner.h"
46
#include "exec/schema_scanner/schema_rowsets_scanner.h"
47
#include "exec/schema_scanner/schema_schema_privileges_scanner.h"
48
#include "exec/schema_scanner/schema_schemata_scanner.h"
49
#include "exec/schema_scanner/schema_table_options_scanner.h"
50
#include "exec/schema_scanner/schema_table_privileges_scanner.h"
51
#include "exec/schema_scanner/schema_table_properties_scanner.h"
52
#include "exec/schema_scanner/schema_tables_scanner.h"
53
#include "exec/schema_scanner/schema_tablets_scanner.h"
54
#include "exec/schema_scanner/schema_user_privileges_scanner.h"
55
#include "exec/schema_scanner/schema_user_scanner.h"
56
#include "exec/schema_scanner/schema_variables_scanner.h"
57
#include "exec/schema_scanner/schema_views_scanner.h"
58
#include "exec/schema_scanner/schema_workload_group_privileges.h"
59
#include "exec/schema_scanner/schema_workload_group_resource_usage_scanner.h"
60
#include "exec/schema_scanner/schema_workload_groups_scanner.h"
61
#include "exec/schema_scanner/schema_workload_sched_policy_scanner.h"
62
#include "olap/hll.h"
63
#include "pipeline/dependency.h"
64
#include "runtime/define_primitive_type.h"
65
#include "runtime/fragment_mgr.h"
66
#include "runtime/types.h"
67
#include "util/string_util.h"
68
#include "util/types.h"
69
#include "vec/columns/column.h"
70
#include "vec/columns/column_complex.h"
71
#include "vec/columns/column_nullable.h"
72
#include "vec/columns/column_string.h"
73
#include "vec/columns/column_vector.h"
74
#include "vec/columns/columns_number.h"
75
#include "vec/common/string_ref.h"
76
#include "vec/core/block.h"
77
#include "vec/core/column_with_type_and_name.h"
78
#include "vec/core/types.h"
79
#include "vec/data_types/data_type.h"
80
#include "vec/data_types/data_type_factory.hpp"
81
82
namespace doris {
83
class ObjectPool;
84
85
SchemaScanner::SchemaScanner(const std::vector<ColumnDesc>& columns)
86
0
        : _is_init(false), _columns(columns), _schema_table_type(TSchemaTableType::SCH_INVALID) {}
87
88
SchemaScanner::SchemaScanner(const std::vector<ColumnDesc>& columns, TSchemaTableType::type type)
89
0
        : _is_init(false), _columns(columns), _schema_table_type(type) {}
90
91
0
SchemaScanner::~SchemaScanner() = default;
92
93
0
Status SchemaScanner::start(RuntimeState* state) {
94
0
    if (!_is_init) {
  Branch (94:9): [True: 0, False: 0]
95
0
        return Status::InternalError("call Start before Init.");
96
0
    }
97
98
0
    return Status::OK();
99
0
}
100
101
0
Status SchemaScanner::get_next_block(RuntimeState* state, vectorized::Block* block, bool* eos) {
102
0
    if (_data_block == nullptr) {
  Branch (102:9): [True: 0, False: 0]
103
0
        return Status::InternalError("No data left!");
104
0
    }
105
0
    DCHECK(_async_thread_running == false);
106
0
    RETURN_IF_ERROR(_scanner_status.status());
107
0
    for (size_t i = 0; i < block->columns(); i++) {
  Branch (107:24): [True: 0, False: 0]
108
0
        std::move(*block->get_by_position(i).column)
109
0
                .mutate()
110
0
                ->insert_range_from(*_data_block->get_by_position(i).column, 0,
111
0
                                    _data_block->rows());
112
0
    }
113
0
    _data_block->clear_column_data();
114
0
    *eos = _eos;
115
0
    if (!*eos) {
  Branch (115:9): [True: 0, False: 0]
116
0
        RETURN_IF_ERROR(get_next_block_async(state));
117
0
    }
118
0
    return Status::OK();
119
0
}
120
121
0
Status SchemaScanner::get_next_block_async(RuntimeState* state) {
122
0
    _dependency->block();
123
0
    auto task_ctx = state->get_task_execution_context();
124
0
    RETURN_IF_ERROR(ExecEnv::GetInstance()->fragment_mgr()->get_thread_pool()->submit_func(
125
0
            [this, task_ctx, state]() {
126
0
                auto task_lock = task_ctx.lock();
127
0
                if (task_lock == nullptr) {
128
0
                    return;
129
0
                }
130
0
                DCHECK(_async_thread_running == false);
131
0
                SCOPED_ATTACH_TASK(state);
132
0
                _dependency->block();
133
0
                _async_thread_running = true;
134
0
                if (!_opened) {
135
0
                    _data_block = vectorized::Block::create_unique();
136
0
                    _init_block(_data_block.get());
137
0
                    _scanner_status.update(start(state));
138
0
                    _opened = true;
139
0
                }
140
0
                bool eos = false;
141
0
                auto call_next_block_internal = [&]() -> Status {
142
0
                    RETURN_IF_CATCH_EXCEPTION(
143
0
                            { return get_next_block_internal(_data_block.get(), &eos); });
144
0
                };
145
0
                _scanner_status.update(call_next_block_internal());
146
0
                _eos = eos;
147
0
                _async_thread_running = false;
148
0
                _dependency->set_ready();
149
0
            }));
150
0
    return Status::OK();
151
0
}
152
153
0
Status SchemaScanner::get_next_block_internal(vectorized::Block* block, bool* eos) {
154
0
    if (!_is_init) {
  Branch (154:9): [True: 0, False: 0]
155
0
        return Status::InternalError("used before initialized.");
156
0
    }
157
158
0
    if (nullptr == block || nullptr == eos) {
  Branch (158:9): [True: 0, False: 0]
  Branch (158:29): [True: 0, False: 0]
159
0
        return Status::InternalError("input pointer is nullptr.");
160
0
    }
161
162
0
    *eos = true;
163
0
    return Status::OK();
164
0
}
165
166
0
Status SchemaScanner::init(RuntimeState* state, SchemaScannerParam* param, ObjectPool* pool) {
167
0
    if (_is_init) {
  Branch (167:9): [True: 0, False: 0]
168
0
        return Status::OK();
169
0
    }
170
0
    if (nullptr == param || nullptr == pool) {
  Branch (170:9): [True: 0, False: 0]
  Branch (170:29): [True: 0, False: 0]
171
0
        return Status::InternalError("invalid parameter");
172
0
    }
173
174
0
    _param = param;
175
0
    _timezone_obj = state->timezone_obj();
176
0
    _is_init = true;
177
178
0
    if (_param->profile) {
  Branch (178:9): [True: 0, False: 0]
179
0
        _get_db_timer = ADD_TIMER(_param->profile, "GetDbTime");
Line
Count
Source
60
0
#define ADD_TIMER(profile, name) (profile)->add_counter(name, TUnit::TIME_NS)
180
0
        _get_table_timer = ADD_TIMER(_param->profile, "GetTableTime");
Line
Count
Source
60
0
#define ADD_TIMER(profile, name) (profile)->add_counter(name, TUnit::TIME_NS)
181
0
        _get_describe_timer = ADD_TIMER(_param->profile, "GetDescribeTime");
Line
Count
Source
60
0
#define ADD_TIMER(profile, name) (profile)->add_counter(name, TUnit::TIME_NS)
182
0
        _fill_block_timer = ADD_TIMER(_param->profile, "FillBlockTime");
Line
Count
Source
60
0
#define ADD_TIMER(profile, name) (profile)->add_counter(name, TUnit::TIME_NS)
183
0
    }
184
185
0
    return Status::OK();
186
0
}
187
188
0
std::unique_ptr<SchemaScanner> SchemaScanner::create(TSchemaTableType::type type) {
189
0
    switch (type) {
190
0
    case TSchemaTableType::SCH_TABLES:
  Branch (190:5): [True: 0, False: 0]
191
0
        return SchemaTablesScanner::create_unique();
192
0
    case TSchemaTableType::SCH_SCHEMATA:
  Branch (192:5): [True: 0, False: 0]
193
0
        return SchemaSchemataScanner::create_unique();
194
0
    case TSchemaTableType::SCH_COLUMNS:
  Branch (194:5): [True: 0, False: 0]
195
0
        return SchemaColumnsScanner::create_unique();
196
0
    case TSchemaTableType::SCH_CHARSETS:
  Branch (196:5): [True: 0, False: 0]
197
0
        return SchemaCharsetsScanner::create_unique();
198
0
    case TSchemaTableType::SCH_COLLATIONS:
  Branch (198:5): [True: 0, False: 0]
199
0
        return SchemaCollationsScanner::create_unique();
200
0
    case TSchemaTableType::SCH_GLOBAL_VARIABLES:
  Branch (200:5): [True: 0, False: 0]
201
0
        return SchemaVariablesScanner::create_unique(TVarType::GLOBAL);
202
0
    case TSchemaTableType::SCH_SESSION_VARIABLES:
  Branch (202:5): [True: 0, False: 0]
203
0
    case TSchemaTableType::SCH_VARIABLES:
  Branch (203:5): [True: 0, False: 0]
204
0
        return SchemaVariablesScanner::create_unique(TVarType::SESSION);
205
0
    case TSchemaTableType::SCH_VIEWS:
  Branch (205:5): [True: 0, False: 0]
206
0
        return SchemaViewsScanner::create_unique();
207
0
    case TSchemaTableType::SCH_TABLE_PRIVILEGES:
  Branch (207:5): [True: 0, False: 0]
208
0
        return SchemaTablePrivilegesScanner::create_unique();
209
0
    case TSchemaTableType::SCH_SCHEMA_PRIVILEGES:
  Branch (209:5): [True: 0, False: 0]
210
0
        return SchemaSchemaPrivilegesScanner::create_unique();
211
0
    case TSchemaTableType::SCH_USER_PRIVILEGES:
  Branch (211:5): [True: 0, False: 0]
212
0
        return SchemaUserPrivilegesScanner::create_unique();
213
0
    case TSchemaTableType::SCH_FILES:
  Branch (213:5): [True: 0, False: 0]
214
0
        return SchemaFilesScanner::create_unique();
215
0
    case TSchemaTableType::SCH_PARTITIONS:
  Branch (215:5): [True: 0, False: 0]
216
0
        return SchemaPartitionsScanner::create_unique();
217
0
    case TSchemaTableType::SCH_BACKEND_CONFIGURATION:
  Branch (217:5): [True: 0, False: 0]
218
0
        return SchemaBackendConfigurationScanner::create_unique();
219
0
    case TSchemaTableType::SCH_ROWSETS:
  Branch (219:5): [True: 0, False: 0]
220
0
        return SchemaRowsetsScanner::create_unique();
221
0
    case TSchemaTableType::SCH_METADATA_NAME_IDS:
  Branch (221:5): [True: 0, False: 0]
222
0
        return SchemaMetadataNameIdsScanner::create_unique();
223
0
    case TSchemaTableType::SCH_PROFILING:
  Branch (223:5): [True: 0, False: 0]
224
0
        return SchemaProfilingScanner::create_unique();
225
0
    case TSchemaTableType::SCH_BACKEND_ACTIVE_TASKS:
  Branch (225:5): [True: 0, False: 0]
226
0
        return SchemaBackendActiveTasksScanner::create_unique();
227
0
    case TSchemaTableType::SCH_ACTIVE_QUERIES:
  Branch (227:5): [True: 0, False: 0]
228
0
        return SchemaActiveQueriesScanner::create_unique();
229
0
    case TSchemaTableType::SCH_WORKLOAD_GROUPS:
  Branch (229:5): [True: 0, False: 0]
230
0
        return SchemaWorkloadGroupsScanner::create_unique();
231
0
    case TSchemaTableType::SCH_PROCESSLIST:
  Branch (231:5): [True: 0, False: 0]
232
0
        return SchemaProcessListScanner::create_unique();
233
0
    case TSchemaTableType::SCH_PROCEDURES:
  Branch (233:5): [True: 0, False: 0]
234
0
        return SchemaRoutinesScanner::create_unique();
235
0
    case TSchemaTableType::SCH_USER:
  Branch (235:5): [True: 0, False: 0]
236
0
        return SchemaUserScanner::create_unique();
237
0
    case TSchemaTableType::SCH_WORKLOAD_POLICY:
  Branch (237:5): [True: 0, False: 0]
238
0
        return SchemaWorkloadSchedulePolicyScanner::create_unique();
239
0
    case TSchemaTableType::SCH_TABLE_OPTIONS:
  Branch (239:5): [True: 0, False: 0]
240
0
        return SchemaTableOptionsScanner::create_unique();
241
0
    case TSchemaTableType::SCH_WORKLOAD_GROUP_PRIVILEGES:
  Branch (241:5): [True: 0, False: 0]
242
0
        return SchemaWorkloadGroupPrivilegesScanner::create_unique();
243
0
    case TSchemaTableType::SCH_WORKLOAD_GROUP_RESOURCE_USAGE:
  Branch (243:5): [True: 0, False: 0]
244
0
        return SchemaBackendWorkloadGroupResourceUsage::create_unique();
245
0
    case TSchemaTableType::SCH_TABLE_PROPERTIES:
  Branch (245:5): [True: 0, False: 0]
246
0
        return SchemaTablePropertiesScanner::create_unique();
247
0
    case TSchemaTableType::SCH_FILE_CACHE_STATISTICS:
  Branch (247:5): [True: 0, False: 0]
248
0
        return SchemaFileCacheStatisticsScanner::create_unique();
249
0
    case TSchemaTableType::SCH_CATALOG_META_CACHE_STATISTICS:
  Branch (249:5): [True: 0, False: 0]
250
0
        return SchemaCatalogMetaCacheStatsScanner::create_unique();
251
0
    case TSchemaTableType::SCH_ROUTINE_LOAD_JOBS:
  Branch (251:5): [True: 0, False: 0]
252
0
        return SchemaRoutineLoadJobScanner::create_unique();
253
0
    case TSchemaTableType::SCH_BACKEND_KERBEROS_TICKET_CACHE:
  Branch (253:5): [True: 0, False: 0]
254
0
        return SchemaBackendKerberosTicketCacheScanner::create_unique();
255
0
    case TSchemaTableType::SCH_BACKEND_TABLETS:
  Branch (255:5): [True: 0, False: 0]
256
0
        return SchemaTabletsScanner::create_unique();
257
0
    default:
  Branch (257:5): [True: 0, False: 0]
258
0
        return SchemaDummyScanner::create_unique();
259
0
        break;
260
0
    }
261
0
}
262
263
0
void SchemaScanner::_init_block(vectorized::Block* src_block) {
264
0
    const std::vector<SchemaScanner::ColumnDesc>& columns_desc(get_column_desc());
265
0
    for (int i = 0; i < columns_desc.size(); ++i) {
  Branch (265:21): [True: 0, False: 0]
266
0
        TypeDescriptor descriptor(columns_desc[i].type);
267
0
        auto data_type = vectorized::DataTypeFactory::instance().create_data_type(descriptor, true);
268
0
        src_block->insert(vectorized::ColumnWithTypeAndName(data_type->create_column(), data_type,
269
0
                                                            columns_desc[i].name));
270
0
    }
271
0
}
272
273
Status SchemaScanner::fill_dest_column_for_range(vectorized::Block* block, size_t pos,
274
0
                                                 const std::vector<void*>& datas) {
275
0
    const ColumnDesc& col_desc = _columns[pos];
276
0
    vectorized::MutableColumnPtr column_ptr;
277
0
    column_ptr = std::move(*block->get_by_position(pos).column).assume_mutable();
278
0
    vectorized::IColumn* col_ptr = column_ptr.get();
279
280
0
    auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(col_ptr);
281
282
    // Resize in advance to improve insertion efficiency.
283
0
    size_t fill_num = datas.size();
284
0
    col_ptr = &nullable_column->get_nested_column();
285
0
    for (int i = 0; i < fill_num; ++i) {
  Branch (285:21): [True: 0, False: 0]
286
0
        auto* data = datas[i];
287
0
        if (data == nullptr) {
  Branch (287:13): [True: 0, False: 0]
288
            // For nested column need not insert default.
289
0
            nullable_column->insert_data(nullptr, 0);
290
0
            continue;
291
0
        } else {
292
0
            nullable_column->get_null_map_data().emplace_back(0);
293
0
        }
294
0
        switch (col_desc.type) {
295
0
        case TYPE_HLL: {
  Branch (295:9): [True: 0, False: 0]
296
0
            auto* hll_slot = reinterpret_cast<HyperLogLog*>(data);
297
0
            assert_cast<vectorized::ColumnHLL*>(col_ptr)->get_data().emplace_back(*hll_slot);
298
0
            break;
299
0
        }
300
0
        case TYPE_VARCHAR:
  Branch (300:9): [True: 0, False: 0]
301
0
        case TYPE_CHAR:
  Branch (301:9): [True: 0, False: 0]
302
0
        case TYPE_STRING: {
  Branch (302:9): [True: 0, False: 0]
303
0
            auto* str_slot = reinterpret_cast<StringRef*>(data);
304
0
            assert_cast<vectorized::ColumnString*>(col_ptr)->insert_data(str_slot->data,
305
0
                                                                         str_slot->size);
306
0
            break;
307
0
        }
308
309
0
        case TYPE_BOOLEAN: {
  Branch (309:9): [True: 0, False: 0]
310
0
            uint8_t num = *reinterpret_cast<bool*>(data);
311
0
            assert_cast<vectorized::ColumnVector<vectorized::UInt8>*>(col_ptr)->insert_value(num);
312
0
            break;
313
0
        }
314
315
0
        case TYPE_TINYINT: {
  Branch (315:9): [True: 0, False: 0]
316
0
            int8_t num = *reinterpret_cast<int8_t*>(data);
317
0
            assert_cast<vectorized::ColumnVector<vectorized::Int8>*>(col_ptr)->insert_value(num);
318
0
            break;
319
0
        }
320
321
0
        case TYPE_SMALLINT: {
  Branch (321:9): [True: 0, False: 0]
322
0
            int16_t num = *reinterpret_cast<int16_t*>(data);
323
0
            assert_cast<vectorized::ColumnVector<vectorized::Int16>*>(col_ptr)->insert_value(num);
324
0
            break;
325
0
        }
326
327
0
        case TYPE_INT: {
  Branch (327:9): [True: 0, False: 0]
328
0
            int32_t num = *reinterpret_cast<int32_t*>(data);
329
0
            assert_cast<vectorized::ColumnVector<vectorized::Int32>*>(col_ptr)->insert_value(num);
330
0
            break;
331
0
        }
332
333
0
        case TYPE_BIGINT: {
  Branch (333:9): [True: 0, False: 0]
334
0
            int64_t num = *reinterpret_cast<int64_t*>(data);
335
0
            assert_cast<vectorized::ColumnVector<vectorized::Int64>*>(col_ptr)->insert_value(num);
336
0
            break;
337
0
        }
338
339
0
        case TYPE_LARGEINT: {
  Branch (339:9): [True: 0, False: 0]
340
0
            __int128 num;
341
0
            memcpy(&num, data, sizeof(__int128));
342
0
            assert_cast<vectorized::ColumnVector<vectorized::Int128>*>(col_ptr)->insert_value(num);
343
0
            break;
344
0
        }
345
346
0
        case TYPE_FLOAT: {
  Branch (346:9): [True: 0, False: 0]
347
0
            float num = *reinterpret_cast<float*>(data);
348
0
            assert_cast<vectorized::ColumnVector<vectorized::Float32>*>(col_ptr)->insert_value(num);
349
0
            break;
350
0
        }
351
352
0
        case TYPE_DOUBLE: {
  Branch (352:9): [True: 0, False: 0]
353
0
            double num = *reinterpret_cast<double*>(data);
354
0
            assert_cast<vectorized::ColumnVector<vectorized::Float64>*>(col_ptr)->insert_value(num);
355
0
            break;
356
0
        }
357
358
0
        case TYPE_DATE: {
  Branch (358:9): [True: 0, False: 0]
359
0
            assert_cast<vectorized::ColumnVector<vectorized::Int64>*>(col_ptr)->insert_data(
360
0
                    reinterpret_cast<char*>(data), 0);
361
0
            break;
362
0
        }
363
364
0
        case TYPE_DATEV2: {
  Branch (364:9): [True: 0, False: 0]
365
0
            uint32_t num = *reinterpret_cast<uint32_t*>(data);
366
0
            assert_cast<vectorized::ColumnDateV2*>(col_ptr)->insert_value(num);
367
0
            break;
368
0
        }
369
370
0
        case TYPE_DATETIME: {
  Branch (370:9): [True: 0, False: 0]
371
0
            assert_cast<vectorized::ColumnVector<vectorized::Int64>*>(col_ptr)->insert_data(
372
0
                    reinterpret_cast<char*>(data), 0);
373
0
            break;
374
0
        }
375
376
0
        case TYPE_DATETIMEV2: {
  Branch (376:9): [True: 0, False: 0]
377
0
            uint64_t num = *reinterpret_cast<uint64_t*>(data);
378
0
            assert_cast<vectorized::ColumnDateTimeV2*>(col_ptr)->insert_value(num);
379
0
            break;
380
0
        }
381
382
0
        case TYPE_DECIMALV2: {
  Branch (382:9): [True: 0, False: 0]
383
0
            const vectorized::Int128 num = (reinterpret_cast<PackedInt128*>(data))->value;
384
0
            assert_cast<vectorized::ColumnDecimal128V2*>(col_ptr)->insert_data(
385
0
                    reinterpret_cast<const char*>(&num), 0);
386
0
            break;
387
0
        }
388
0
        case TYPE_DECIMAL128I: {
  Branch (388:9): [True: 0, False: 0]
389
0
            const vectorized::Int128 num = (reinterpret_cast<PackedInt128*>(data))->value;
390
0
            assert_cast<vectorized::ColumnDecimal128V3*>(col_ptr)->insert_data(
391
0
                    reinterpret_cast<const char*>(&num), 0);
392
0
            break;
393
0
        }
394
395
0
        case TYPE_DECIMAL32: {
  Branch (395:9): [True: 0, False: 0]
396
0
            const int32_t num = *reinterpret_cast<int32_t*>(data);
397
0
            assert_cast<vectorized::ColumnDecimal32*>(col_ptr)->insert_data(
398
0
                    reinterpret_cast<const char*>(&num), 0);
399
0
            break;
400
0
        }
401
402
0
        case TYPE_DECIMAL64: {
  Branch (402:9): [True: 0, False: 0]
403
0
            const int64_t num = *reinterpret_cast<int64_t*>(data);
404
0
            assert_cast<vectorized::ColumnDecimal64*>(col_ptr)->insert_data(
405
0
                    reinterpret_cast<const char*>(&num), 0);
406
0
            break;
407
0
        }
408
409
0
        default: {
  Branch (409:9): [True: 0, False: 0]
410
0
            DCHECK(false) << "bad slot type: " << col_desc.type;
411
0
            std::stringstream ss;
412
0
            ss << "Fail to convert schema type:'" << col_desc.type << " on column:`"
413
0
               << std::string(col_desc.name) + "`";
414
0
            return Status::InternalError(ss.str());
415
0
        }
416
0
        }
417
0
    }
418
0
    return Status::OK();
419
0
}
420
421
0
std::string SchemaScanner::get_db_from_full_name(const std::string& full_name) {
422
0
    std::vector<std::string> part = split(full_name, ".");
423
0
    if (part.size() == 2) {
  Branch (423:9): [True: 0, False: 0]
424
0
        return part[1];
425
0
    }
426
0
    return full_name;
427
0
}
428
429
Status SchemaScanner::insert_block_column(TCell cell, int col_index, vectorized::Block* block,
430
0
                                          PrimitiveType type) {
431
0
    vectorized::MutableColumnPtr mutable_col_ptr;
432
0
    mutable_col_ptr = std::move(*block->get_by_position(col_index).column).assume_mutable();
433
0
    auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(mutable_col_ptr.get());
434
0
    vectorized::IColumn* col_ptr = &nullable_column->get_nested_column();
435
436
0
    switch (type) {
437
0
    case TYPE_BIGINT: {
  Branch (437:5): [True: 0, False: 0]
438
0
        reinterpret_cast<vectorized::ColumnVector<vectorized::Int64>*>(col_ptr)->insert_value(
439
0
                cell.longVal);
440
0
        nullable_column->get_null_map_data().emplace_back(0);
441
0
        break;
442
0
    }
443
444
0
    case TYPE_INT: {
  Branch (444:5): [True: 0, False: 0]
445
0
        reinterpret_cast<vectorized::ColumnVector<vectorized::Int32>*>(col_ptr)->insert_value(
446
0
                cell.intVal);
447
0
        nullable_column->get_null_map_data().emplace_back(0);
448
0
        break;
449
0
    }
450
451
0
    case TYPE_BOOLEAN: {
  Branch (451:5): [True: 0, False: 0]
452
0
        reinterpret_cast<vectorized::ColumnVector<vectorized::UInt8>*>(col_ptr)->insert_value(
453
0
                cell.boolVal);
454
0
        nullable_column->get_null_map_data().emplace_back(0);
455
0
        break;
456
0
    }
457
458
0
    case TYPE_STRING:
  Branch (458:5): [True: 0, False: 0]
459
0
    case TYPE_VARCHAR:
  Branch (459:5): [True: 0, False: 0]
460
0
    case TYPE_CHAR: {
  Branch (460:5): [True: 0, False: 0]
461
0
        reinterpret_cast<vectorized::ColumnString*>(col_ptr)->insert_data(cell.stringVal.data(),
462
0
                                                                          cell.stringVal.size());
463
0
        nullable_column->get_null_map_data().emplace_back(0);
464
0
        break;
465
0
    }
466
467
0
    case TYPE_DATETIME: {
  Branch (467:5): [True: 0, False: 0]
468
0
        std::vector<void*> datas(1);
469
0
        VecDateTimeValue src[1];
470
0
        src[0].from_date_str(cell.stringVal.data(), cell.stringVal.size());
471
0
        datas[0] = src;
472
0
        auto data = datas[0];
473
0
        reinterpret_cast<vectorized::ColumnVector<vectorized::Int64>*>(col_ptr)->insert_data(
474
0
                reinterpret_cast<char*>(data), 0);
475
0
        nullable_column->get_null_map_data().emplace_back(0);
476
0
        break;
477
0
    }
478
0
    default: {
  Branch (478:5): [True: 0, False: 0]
479
0
        std::stringstream ss;
480
0
        ss << "unsupported column type:" << type;
481
0
        return Status::InternalError(ss.str());
482
0
    }
483
0
    }
484
0
    return Status::OK();
485
0
}
486
487
} // namespace doris