Coverage Report

Created: 2026-08-14 12:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/information_schema/schema_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 "information_schema/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 "core/block/block.h"
30
#include "core/block/column_with_type_and_name.h"
31
#include "core/column/column.h"
32
#include "core/column/column_complex.h"
33
#include "core/column/column_nullable.h"
34
#include "core/column/column_string.h"
35
#include "core/column/column_vector.h"
36
#include "core/data_type/data_type.h"
37
#include "core/data_type/data_type_factory.hpp"
38
#include "core/data_type/define_primitive_type.h"
39
#include "core/data_type/primitive_type.h"
40
#include "core/packed_int128.h"
41
#include "core/string_ref.h"
42
#include "core/types.h"
43
#include "core/value/hll.h"
44
#include "exec/pipeline/dependency.h"
45
#include "exprs/function/cast/cast_to_date_or_datetime_impl.hpp"
46
#include "information_schema/schema_active_queries_scanner.h"
47
#include "information_schema/schema_authentication_integrations_scanner.h"
48
#include "information_schema/schema_backend_active_tasks.h"
49
#include "information_schema/schema_backend_configuration_scanner.h"
50
#include "information_schema/schema_backend_kerberos_ticket_cache.h"
51
#include "information_schema/schema_backend_ms_rpc_table_throttlers_scanner.h"
52
#include "information_schema/schema_catalog_meta_cache_stats_scanner.h"
53
#include "information_schema/schema_charsets_scanner.h"
54
#include "information_schema/schema_cluster_snapshot_properties_scanner.h"
55
#include "information_schema/schema_cluster_snapshots_scanner.h"
56
#include "information_schema/schema_collations_scanner.h"
57
#include "information_schema/schema_column_data_sizes_scanner.h"
58
#include "information_schema/schema_columns_scanner.h"
59
#include "information_schema/schema_compaction_tasks_scanner.h"
60
#include "information_schema/schema_database_properties_scanner.h"
61
#include "information_schema/schema_dummy_scanner.h"
62
#include "information_schema/schema_encryption_keys_scanner.h"
63
#include "information_schema/schema_extensions_scanner.h"
64
#include "information_schema/schema_file_cache_info_scanner.h"
65
#include "information_schema/schema_file_cache_statistics.h"
66
#include "information_schema/schema_files_scanner.h"
67
#include "information_schema/schema_load_job_scanner.h"
68
#include "information_schema/schema_metadata_name_ids_scanner.h"
69
#include "information_schema/schema_partitions_scanner.h"
70
#include "information_schema/schema_processlist_scanner.h"
71
#include "information_schema/schema_profiling_scanner.h"
72
#include "information_schema/schema_role_mappings_scanner.h"
73
#include "information_schema/schema_routine_load_job_scanner.h"
74
#include "information_schema/schema_routine_scanner.h"
75
#include "information_schema/schema_rowsets_scanner.h"
76
#include "information_schema/schema_schema_privileges_scanner.h"
77
#include "information_schema/schema_schemata_scanner.h"
78
#include "information_schema/schema_sql_block_rule_status_scanner.h"
79
#include "information_schema/schema_table_options_scanner.h"
80
#include "information_schema/schema_table_privileges_scanner.h"
81
#include "information_schema/schema_table_properties_scanner.h"
82
#include "information_schema/schema_table_stream_consumption_scanner.h"
83
#include "information_schema/schema_table_streams_scanner.h"
84
#include "information_schema/schema_tables_scanner.h"
85
#include "information_schema/schema_tablets_scanner.h"
86
#include "information_schema/schema_tso_status_scanner.h"
87
#include "information_schema/schema_user_privileges_scanner.h"
88
#include "information_schema/schema_user_scanner.h"
89
#include "information_schema/schema_variables_scanner.h"
90
#include "information_schema/schema_view_dependency_scanner.h"
91
#include "information_schema/schema_views_scanner.h"
92
#include "information_schema/schema_workload_group_privileges.h"
93
#include "information_schema/schema_workload_group_resource_usage_scanner.h"
94
#include "information_schema/schema_workload_groups_scanner.h"
95
#include "information_schema/schema_workload_sched_policy_scanner.h"
96
#include "runtime/fragment_mgr.h"
97
#include "util/string_util.h"
98
99
namespace doris {
100
class ObjectPool;
101
102
namespace {
103
104
void insert_column_range(ColumnWithTypeAndName* dst, const ColumnWithTypeAndName& src, size_t start,
105
0
                         size_t length) {
106
0
    DORIS_CHECK(dst->column.get() != nullptr);
107
0
    DORIS_CHECK(src.column.get() != nullptr);
108
0
    MutableColumnPtr dst_column = IColumn::mutate(std::move(dst->column));
109
0
    ColumnPtr src_column = src.column->convert_to_full_column_if_const();
110
0
    if (dst_column->is_nullable() && !src_column->is_nullable()) {
111
0
        src_column = make_nullable(src_column);
112
0
    }
113
0
    DORIS_CHECK(dst_column->is_nullable() == src_column->is_nullable());
114
0
    dst_column->insert_range_from(*src_column, start, length);
115
0
    dst->column = std::move(dst_column);
116
0
}
117
118
} // namespace
119
120
SchemaScanner::SchemaScanner(const std::vector<ColumnDesc>& columns, TSchemaTableType::type type)
121
18
        : _is_init(false), _columns(columns), _schema_table_type(type) {}
122
123
18
SchemaScanner::~SchemaScanner() = default;
124
125
0
Status SchemaScanner::start(RuntimeState* state) {
126
0
    if (!_is_init) {
127
0
        return Status::InternalError("call Start before Init.");
128
0
    }
129
130
0
    return Status::OK();
131
0
}
132
133
0
Status SchemaScanner::get_next_block(RuntimeState* state, Block* block, bool* eos) {
134
0
    if (_data_block == nullptr) {
135
0
        return Status::InternalError("No data left!");
136
0
    }
137
0
    DCHECK(_async_thread_running == false);
138
0
    RETURN_IF_ERROR(_scanner_status.status());
139
0
    for (size_t i = 0; i < block->columns(); i++) {
140
0
        insert_column_range(&block->get_by_position(i), _data_block->get_by_position(i), 0,
141
0
                            _data_block->rows());
142
0
    }
143
0
    _data_block->clear_column_data();
144
0
    *eos = _eos;
145
0
    if (!*eos) {
146
0
        RETURN_IF_ERROR(get_next_block_async(state));
147
0
    }
148
0
    return Status::OK();
149
0
}
150
151
0
Status SchemaScanner::get_next_block_async(RuntimeState* state) {
152
0
    _dependency->block();
153
0
    auto task_ctx = state->get_task_execution_context();
154
0
    RETURN_IF_ERROR(ExecEnv::GetInstance()->fragment_mgr()->get_thread_pool()->submit_func(
155
0
            [this, task_ctx, state]() {
156
0
                auto task_lock = task_ctx.lock();
157
0
                if (task_lock == nullptr) {
158
0
                    return;
159
0
                }
160
0
                DCHECK(_async_thread_running == false);
161
0
                SCOPED_ATTACH_TASK(state);
162
0
                _async_thread_running = true;
163
0
                if (!_opened) {
164
0
                    _data_block = Block::create_unique();
165
0
                    _init_block(_data_block.get());
166
0
                    _scanner_status.update(start(state));
167
0
                    _opened = true;
168
0
                }
169
0
                bool eos = false;
170
0
                auto call_next_block_internal = [&]() -> Status {
171
0
                    RETURN_IF_CATCH_EXCEPTION(
172
0
                            { return get_next_block_internal(_data_block.get(), &eos); });
173
0
                };
174
0
                _scanner_status.update(call_next_block_internal());
175
0
                _eos = eos;
176
0
                _async_thread_running = false;
177
0
                _dependency->set_ready();
178
0
            }));
179
0
    return Status::OK();
180
0
}
181
182
7
Status SchemaScanner::init(RuntimeState* state, SchemaScannerParam* param, ObjectPool* pool) {
183
7
    if (_is_init) {
184
0
        return Status::OK();
185
0
    }
186
7
    if (nullptr == param || nullptr == pool) {
187
0
        return Status::InternalError("invalid parameter");
188
0
    }
189
190
7
    _param = param;
191
7
    _timezone = state->timezone();
192
7
    _timezone_obj = state->timezone_obj();
193
7
    _is_init = true;
194
195
7
    if (_param->profile) {
196
0
        _get_db_timer = ADD_TIMER(_param->profile, "GetDbTime");
197
0
        _get_table_timer = ADD_TIMER(_param->profile, "GetTableTime");
198
0
        _get_describe_timer = ADD_TIMER(_param->profile, "GetDescribeTime");
199
0
        _fill_block_timer = ADD_TIMER(_param->profile, "FillBlockTime");
200
0
    }
201
202
7
    return Status::OK();
203
7
}
204
205
3
std::unique_ptr<SchemaScanner> SchemaScanner::create(TSchemaTableType::type type) {
206
3
    switch (type) {
207
0
    case TSchemaTableType::SCH_TABLES:
208
0
        return SchemaTablesScanner::create_unique();
209
0
    case TSchemaTableType::SCH_SCHEMATA:
210
0
        return SchemaSchemataScanner::create_unique();
211
0
    case TSchemaTableType::SCH_COLUMNS:
212
0
        return SchemaColumnsScanner::create_unique();
213
0
    case TSchemaTableType::SCH_CHARSETS:
214
0
        return SchemaCharsetsScanner::create_unique();
215
0
    case TSchemaTableType::SCH_COLLATIONS:
216
0
        return SchemaCollationsScanner::create_unique();
217
0
    case TSchemaTableType::SCH_GLOBAL_VARIABLES:
218
0
        return SchemaVariablesScanner::create_unique(TVarType::GLOBAL);
219
0
    case TSchemaTableType::SCH_SESSION_VARIABLES:
220
0
    case TSchemaTableType::SCH_VARIABLES:
221
0
        return SchemaVariablesScanner::create_unique(TVarType::SESSION);
222
0
    case TSchemaTableType::SCH_VIEWS:
223
0
        return SchemaViewsScanner::create_unique();
224
0
    case TSchemaTableType::SCH_TABLE_PRIVILEGES:
225
0
        return SchemaTablePrivilegesScanner::create_unique();
226
0
    case TSchemaTableType::SCH_SCHEMA_PRIVILEGES:
227
0
        return SchemaSchemaPrivilegesScanner::create_unique();
228
0
    case TSchemaTableType::SCH_USER_PRIVILEGES:
229
0
        return SchemaUserPrivilegesScanner::create_unique();
230
0
    case TSchemaTableType::SCH_FILES:
231
0
        return SchemaFilesScanner::create_unique();
232
0
    case TSchemaTableType::SCH_PARTITIONS:
233
0
        return SchemaPartitionsScanner::create_unique();
234
0
    case TSchemaTableType::SCH_BACKEND_CONFIGURATION:
235
0
        return SchemaBackendConfigurationScanner::create_unique();
236
0
    case TSchemaTableType::SCH_ROWSETS:
237
0
        return SchemaRowsetsScanner::create_unique();
238
0
    case TSchemaTableType::SCH_METADATA_NAME_IDS:
239
0
        return SchemaMetadataNameIdsScanner::create_unique();
240
0
    case TSchemaTableType::SCH_PROFILING:
241
0
        return SchemaProfilingScanner::create_unique();
242
0
    case TSchemaTableType::SCH_BACKEND_ACTIVE_TASKS:
243
0
        return SchemaBackendActiveTasksScanner::create_unique();
244
0
    case TSchemaTableType::SCH_ACTIVE_QUERIES:
245
0
        return SchemaActiveQueriesScanner::create_unique();
246
0
    case TSchemaTableType::SCH_WORKLOAD_GROUPS:
247
0
        return SchemaWorkloadGroupsScanner::create_unique();
248
0
    case TSchemaTableType::SCH_PROCESSLIST:
249
0
        return SchemaProcessListScanner::create_unique();
250
0
    case TSchemaTableType::SCH_PROCEDURES:
251
0
        return SchemaRoutinesScanner::create_unique();
252
0
    case TSchemaTableType::SCH_USER:
253
0
        return SchemaUserScanner::create_unique();
254
0
    case TSchemaTableType::SCH_WORKLOAD_POLICY:
255
0
        return SchemaWorkloadSchedulePolicyScanner::create_unique();
256
0
    case TSchemaTableType::SCH_TABLE_OPTIONS:
257
0
        return SchemaTableOptionsScanner::create_unique();
258
0
    case TSchemaTableType::SCH_WORKLOAD_GROUP_PRIVILEGES:
259
0
        return SchemaWorkloadGroupPrivilegesScanner::create_unique();
260
0
    case TSchemaTableType::SCH_WORKLOAD_GROUP_RESOURCE_USAGE:
261
0
        return SchemaBackendWorkloadGroupResourceUsage::create_unique();
262
0
    case TSchemaTableType::SCH_TABLE_PROPERTIES:
263
0
        return SchemaTablePropertiesScanner::create_unique();
264
0
    case TSchemaTableType::SCH_DATABASE_PROPERTIES:
265
0
        return SchemaDatabasePropertiesScanner::create_unique();
266
0
    case TSchemaTableType::SCH_FILE_CACHE_STATISTICS:
267
0
        return SchemaFileCacheStatisticsScanner::create_unique();
268
0
    case TSchemaTableType::SCH_CATALOG_META_CACHE_STATISTICS:
269
0
        return SchemaCatalogMetaCacheStatsScanner::create_unique();
270
0
    case TSchemaTableType::SCH_BACKEND_KERBEROS_TICKET_CACHE:
271
0
        return SchemaBackendKerberosTicketCacheScanner::create_unique();
272
0
    case TSchemaTableType::SCH_ROUTINE_LOAD_JOBS:
273
0
        return SchemaRoutineLoadJobScanner::create_unique();
274
0
    case TSchemaTableType::SCH_LOAD_JOBS:
275
0
        return SchemaLoadJobScanner::create_unique();
276
0
    case TSchemaTableType::SCH_BACKEND_TABLETS:
277
0
        return SchemaTabletsScanner::create_unique();
278
0
    case TSchemaTableType::SCH_VIEW_DEPENDENCY:
279
0
        return SchemaViewDependencyScanner::create_unique();
280
0
    case TSchemaTableType::SCH_SQL_BLOCK_RULE_STATUS:
281
0
        return SchemaSqlBlockRuleStatusScanner::create_unique();
282
0
    case TSchemaTableType::SCH_ENCRYPTION_KEYS:
283
0
        return SchemaEncryptionKeysScanner::create_unique();
284
0
    case TSchemaTableType::SCH_CLUSTER_SNAPSHOTS:
285
0
        return SchemaClusterSnapshotsScanner::create_unique();
286
0
    case TSchemaTableType::SCH_CLUSTER_SNAPSHOT_PROPERTIES:
287
0
        return SchemaClusterSnapshotPropertiesScanner::create_unique();
288
0
    case TSchemaTableType::SCH_COLUMN_DATA_SIZES:
289
0
        return SchemaColumnDataSizesScanner::create_unique();
290
0
    case TSchemaTableType::SCH_FILE_CACHE_INFO:
291
0
        return SchemaFileCacheInfoScanner::create_unique();
292
0
    case TSchemaTableType::SCH_AUTHENTICATION_INTEGRATIONS:
293
0
        return SchemaAuthenticationIntegrationsScanner::create_unique();
294
1
    case TSchemaTableType::SCH_EXTENSIONS:
295
1
        return SchemaExtensionsScanner::create_unique();
296
1
    case TSchemaTableType::SCH_ROLE_MAPPINGS:
297
1
        return SchemaRoleMappingsScanner::create_unique();
298
0
    case TSchemaTableType::SCH_TABLE_STREAMS:
299
0
        return SchemaTableStreamsScanner::create_unique();
300
0
    case TSchemaTableType::SCH_TABLE_STREAM_CONSUMPTION:
301
0
        return SchemaTableStreamConsumptionScanner::create_unique();
302
0
    case TSchemaTableType::SCH_BE_COMPACTION_TASKS:
303
0
        return SchemaCompactionTasksScanner::create_unique();
304
0
    case TSchemaTableType::SCH_BACKEND_MS_RPC_TABLE_THROTTLERS:
305
0
        return SchemaBackendMsRpcTableThrottlersScanner::create_unique();
306
1
    case TSchemaTableType::SCH_TSO_STATUS:
307
1
        return SchemaTsoStatusScanner::create_unique();
308
0
    default:
309
0
        return SchemaDummyScanner::create_unique();
310
0
        break;
311
3
    }
312
3
}
313
314
7
void SchemaScanner::_init_block(Block* src_block) {
315
7
    const std::vector<SchemaScanner::ColumnDesc>& columns_desc(get_column_desc());
316
51
    for (int i = 0; i < columns_desc.size(); ++i) {
317
44
        auto data_type = DataTypeFactory::instance().create_data_type(columns_desc[i].type, true);
318
44
        src_block->insert(
319
44
                ColumnWithTypeAndName(data_type->create_column(), data_type, columns_desc[i].name));
320
44
    }
321
7
}
322
323
Status SchemaScanner::fill_dest_column_for_range(Block* block, size_t pos,
324
24
                                                 const std::vector<void*>& datas) {
325
24
    const ColumnDesc& col_desc = _columns[pos];
326
24
    MutableColumnPtr column_ptr = IColumn::mutate(std::move(block->get_by_position(pos).column));
327
24
    IColumn* col_ptr = column_ptr.get();
328
329
24
    auto* nullable_column = assert_cast<ColumnNullable*>(col_ptr);
330
331
    // Resize in advance to improve insertion efficiency.
332
24
    size_t fill_num = datas.size();
333
24
    col_ptr = &nullable_column->get_nested_column();
334
61
    for (int i = 0; i < fill_num; ++i) {
335
37
        auto* data = datas[i];
336
37
        if (data == nullptr) {
337
            // For nested column need not insert default.
338
12
            nullable_column->insert_data(nullptr, 0);
339
12
            continue;
340
25
        } else {
341
25
            nullable_column->push_false_to_nullmap(1);
342
25
        }
343
25
        switch (col_desc.type) {
344
0
        case TYPE_HLL: {
345
0
            auto* hll_slot = reinterpret_cast<HyperLogLog*>(data);
346
0
            assert_cast<ColumnHLL*>(col_ptr)->get_data().emplace_back(*hll_slot);
347
0
            break;
348
0
        }
349
0
        case TYPE_VARCHAR:
350
0
        case TYPE_CHAR:
351
13
        case TYPE_STRING: {
352
13
            auto* str_slot = reinterpret_cast<StringRef*>(data);
353
13
            assert_cast<ColumnString*>(col_ptr)->insert_data(str_slot->data, str_slot->size);
354
13
            break;
355
0
        }
356
357
1
        case TYPE_BOOLEAN: {
358
1
            uint8_t num = *reinterpret_cast<bool*>(data);
359
1
            assert_cast<ColumnBool*>(col_ptr)->insert_value(num);
360
1
            break;
361
0
        }
362
363
0
        case TYPE_TINYINT: {
364
0
            int8_t num = *reinterpret_cast<int8_t*>(data);
365
0
            assert_cast<ColumnInt8*>(col_ptr)->insert_value(num);
366
0
            break;
367
0
        }
368
369
0
        case TYPE_SMALLINT: {
370
0
            int16_t num = *reinterpret_cast<int16_t*>(data);
371
0
            assert_cast<ColumnInt16*>(col_ptr)->insert_value(num);
372
0
            break;
373
0
        }
374
375
4
        case TYPE_INT: {
376
4
            int32_t num = *reinterpret_cast<int32_t*>(data);
377
4
            assert_cast<ColumnInt32*>(col_ptr)->insert_value(num);
378
4
            break;
379
0
        }
380
381
3
        case TYPE_BIGINT: {
382
3
            int64_t num = *reinterpret_cast<int64_t*>(data);
383
3
            assert_cast<ColumnInt64*>(col_ptr)->insert_value(num);
384
3
            break;
385
0
        }
386
387
0
        case TYPE_LARGEINT: {
388
0
            __int128 num;
389
0
            memcpy(&num, data, sizeof(__int128));
390
0
            assert_cast<ColumnInt128*>(col_ptr)->insert_value(num);
391
0
            break;
392
0
        }
393
394
0
        case TYPE_FLOAT: {
395
0
            float num = *reinterpret_cast<float*>(data);
396
0
            assert_cast<ColumnFloat32*>(col_ptr)->insert_value(num);
397
0
            break;
398
0
        }
399
400
0
        case TYPE_DOUBLE: {
401
0
            double num = *reinterpret_cast<double*>(data);
402
0
            assert_cast<ColumnFloat64*>(col_ptr)->insert_value(num);
403
0
            break;
404
0
        }
405
406
0
        case TYPE_DATE: {
407
0
            assert_cast<ColumnDate*>(col_ptr)->insert_data(reinterpret_cast<char*>(data), 0);
408
0
            break;
409
0
        }
410
411
0
        case TYPE_DATEV2: {
412
0
            assert_cast<ColumnDateV2*>(col_ptr)->insert_value(
413
0
                    *reinterpret_cast<DateV2Value<DateV2ValueType>*>(data));
414
0
            break;
415
0
        }
416
417
0
        case TYPE_DATETIME: {
418
0
            assert_cast<ColumnDateTime*>(col_ptr)->insert_data(reinterpret_cast<char*>(data), 0);
419
0
            break;
420
0
        }
421
422
4
        case TYPE_DATETIMEV2: {
423
4
            assert_cast<ColumnDateTimeV2*>(col_ptr)->insert_value(
424
4
                    *reinterpret_cast<DateV2Value<DateTimeV2ValueType>*>(data));
425
4
            break;
426
0
        }
427
428
0
        case TYPE_TIMESTAMPTZ: {
429
0
            assert_cast<ColumnTimeStampTz*>(col_ptr)->insert_value(
430
0
                    *reinterpret_cast<TimestampTzValue*>(data));
431
0
            break;
432
0
        }
433
434
0
        case TYPE_DECIMALV2: {
435
0
            const Int128 num = (reinterpret_cast<PackedInt128*>(data))->value;
436
0
            assert_cast<ColumnDecimal128V2*>(col_ptr)->insert_data(
437
0
                    reinterpret_cast<const char*>(&num), 0);
438
0
            break;
439
0
        }
440
0
        case TYPE_DECIMAL128I: {
441
0
            const Int128 num = (reinterpret_cast<PackedInt128*>(data))->value;
442
0
            assert_cast<ColumnDecimal128V3*>(col_ptr)->insert_data(
443
0
                    reinterpret_cast<const char*>(&num), 0);
444
0
            break;
445
0
        }
446
447
0
        case TYPE_DECIMAL32: {
448
0
            const int32_t num = *reinterpret_cast<int32_t*>(data);
449
0
            assert_cast<ColumnDecimal32*>(col_ptr)->insert_data(reinterpret_cast<const char*>(&num),
450
0
                                                                0);
451
0
            break;
452
0
        }
453
454
0
        case TYPE_DECIMAL64: {
455
0
            const int64_t num = *reinterpret_cast<int64_t*>(data);
456
0
            assert_cast<ColumnDecimal64*>(col_ptr)->insert_data(reinterpret_cast<const char*>(&num),
457
0
                                                                0);
458
0
            break;
459
0
        }
460
461
0
        default: {
462
0
            DCHECK(false) << "bad slot type: " << col_desc.type;
463
0
            std::stringstream ss;
464
0
            ss << "Fail to convert schema type:'" << col_desc.type << " on column:`"
465
0
               << std::string(col_desc.name) + "`";
466
0
            return Status::InternalError(ss.str());
467
0
        }
468
25
        }
469
25
    }
470
24
    block->replace_by_position(pos, std::move(column_ptr));
471
24
    return Status::OK();
472
24
}
473
474
0
std::string SchemaScanner::get_db_from_full_name(const std::string& full_name) {
475
0
    std::vector<std::string> part = split(full_name, ".");
476
0
    if (part.size() == 2) {
477
0
        return part[1];
478
0
    }
479
0
    return full_name;
480
0
}
481
482
Status SchemaScanner::insert_block_column(TCell cell, int col_index, Block* block,
483
20
                                          PrimitiveType type) {
484
20
    MutableColumnPtr mutable_col_ptr;
485
20
    mutable_col_ptr = IColumn::mutate(std::move(block->get_by_position(col_index).column));
486
20
    auto* nullable_column = assert_cast<ColumnNullable*>(mutable_col_ptr.get());
487
20
    IColumn* col_ptr = &nullable_column->get_nested_column();
488
489
20
    switch (type) {
490
20
    case TYPE_BIGINT: {
491
20
        reinterpret_cast<ColumnInt64*>(col_ptr)->insert_value(cell.longVal);
492
20
        break;
493
0
    }
494
495
0
    case TYPE_INT: {
496
0
        reinterpret_cast<ColumnInt32*>(col_ptr)->insert_value(cell.intVal);
497
0
        break;
498
0
    }
499
500
0
    case TYPE_FLOAT: {
501
0
        assert_cast<ColumnFloat32*>(col_ptr)->insert_value(cell.doubleVal);
502
0
        break;
503
0
    }
504
505
0
    case TYPE_DOUBLE: {
506
0
        assert_cast<ColumnFloat64*>(col_ptr)->insert_value(cell.doubleVal);
507
0
        break;
508
0
    }
509
510
0
    case TYPE_BOOLEAN: {
511
0
        reinterpret_cast<ColumnUInt8*>(col_ptr)->insert_value(cell.boolVal);
512
0
        break;
513
0
    }
514
515
0
    case TYPE_STRING:
516
0
    case TYPE_VARCHAR:
517
0
    case TYPE_CHAR: {
518
0
        reinterpret_cast<ColumnString*>(col_ptr)->insert_data(cell.stringVal.data(),
519
0
                                                              cell.stringVal.size());
520
0
        break;
521
0
    }
522
523
0
    case TYPE_DATETIME: {
524
0
        std::vector<void*> datas(1);
525
0
        VecDateTimeValue src[1];
526
0
        CastParameters params;
527
0
        CastToDateOrDatetime::from_string_non_strict_mode<DatelikeTargetType::DATE_TIME>(
528
0
                {cell.stringVal.data(), cell.stringVal.size()}, src[0], nullptr, params);
529
0
        datas[0] = src;
530
0
        auto data = datas[0];
531
0
        reinterpret_cast<ColumnDateTime*>(col_ptr)->insert_data(reinterpret_cast<char*>(data), 0);
532
0
        break;
533
0
    }
534
0
    default: {
535
0
        std::stringstream ss;
536
0
        ss << "unsupported column type:" << type;
537
0
        return Status::InternalError(ss.str());
538
0
    }
539
20
    }
540
20
    nullable_column->push_false_to_nullmap(1);
541
20
    block->replace_by_position(col_index, std::move(mutable_col_ptr));
542
20
    return Status::OK();
543
20
}
544
545
} // namespace doris