Coverage Report

Created: 2026-03-27 16:28

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