Coverage Report

Created: 2024-11-20 15:53

/root/doris/be/src/vec/columns/column.h
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
// This file is copied from
18
// https://github.com/ClickHouse/ClickHouse/blob/master/src/Columns/IColumn.h
19
// and modified by Doris
20
21
#pragma once
22
23
#include <fmt/format.h>
24
#include <glog/logging.h>
25
#include <stdint.h>
26
#include <sys/types.h>
27
28
#include <algorithm>
29
#include <functional>
30
#include <ostream>
31
#include <string>
32
#include <type_traits>
33
#include <utility>
34
#include <vector>
35
36
#include "common/status.h"
37
#include "gutil/integral_types.h"
38
#include "olap/olap_common.h"
39
#include "runtime/define_primitive_type.h"
40
#include "vec/common/cow.h"
41
#include "vec/common/pod_array_fwd.h"
42
#include "vec/common/string_ref.h"
43
#include "vec/common/typeid_cast.h"
44
#include "vec/core/field.h"
45
#include "vec/core/types.h"
46
47
class SipHash;
48
49
#define DO_CRC_HASHES_FUNCTION_COLUMN_IMPL()                                         \
50
5
    if (null_data == nullptr) {                                                      \
51
0
        for (size_t i = 0; i < s; i++) {                                             \
52
0
            hashes[i] = HashUtil::zlib_crc_hash(&data[i], sizeof(T), hashes[i]);     \
53
0
        }                                                                            \
54
5
    } else {                                                                         \
55
10
        for (size_t i = 0; i < s; i++) {                                             \
56
5
            if (null_data[i] == 0)                                                   \
57
5
                hashes[i] = HashUtil::zlib_crc_hash(&data[i], sizeof(T), hashes[i]); \
58
5
        }                                                                            \
59
5
    }
60
61
namespace doris::vectorized {
62
63
class Arena;
64
class ColumnSorter;
65
66
using EqualFlags = std::vector<uint8_t>;
67
using EqualRange = std::pair<int, int>;
68
69
/// Declares interface to store columns in memory.
70
class IColumn : public COW<IColumn> {
71
private:
72
    friend class COW<IColumn>;
73
74
    /// Creates the same column with the same data.
75
    /// This is internal method to use from COW.
76
    /// It performs shallow copy with copy-ctor and not useful from outside.
77
    /// If you want to copy column for modification, look at 'mutate' method.
78
    virtual MutablePtr clone() const = 0;
79
80
public:
81
    // 64bit offsets now only Array type used, so we make it protected
82
    // to avoid use IColumn::Offset64 directly.
83
    // please use ColumnArray::Offset64 instead if we need.
84
    using Offset64 = UInt64;
85
    using Offsets64 = PaddedPODArray<Offset64>;
86
87
    // 32bit offsets for string
88
    using Offset = UInt32;
89
    using Offsets = PaddedPODArray<Offset>;
90
91
    /// Name of a Column. It is used in info messages.
92
118
    virtual std::string get_name() const { return get_family_name(); }
93
94
    /// Name of a Column kind, without parameters (example: FixedString, Array).
95
    virtual const char* get_family_name() const = 0;
96
97
    /** If column isn't constant, returns nullptr (or itself).
98
      * If column is constant, transforms constant to full column (if column type allows such transform) and return it.
99
      */
100
17.0k
    virtual Ptr convert_to_full_column_if_const() const { return get_ptr(); }
101
102
    /** If in join. the StringColumn size may overflow uint32_t, we need convert to uint64_t to ColumnString64
103
  * The Column: ColumnString, ColumnNullable, ColumnArray, ColumnStruct need impl the code
104
  */
105
0
    virtual Ptr convert_column_if_overflow() { return get_ptr(); }
106
107
    /// If column isn't ColumnLowCardinality, return itself.
108
    /// If column is ColumnLowCardinality, transforms is to full column.
109
191
    virtual Ptr convert_to_full_column_if_low_cardinality() const { return get_ptr(); }
110
111
    /// If column isn't ColumnDictionary, return itself.
112
    /// If column is ColumnDictionary, transforms is to predicate column.
113
0
    virtual MutablePtr convert_to_predicate_column_if_dictionary() { return get_ptr(); }
114
115
    /// If column is ColumnDictionary, and is a range comparison predicate, convert dict encoding
116
4.05k
    virtual void convert_dict_codes_if_necessary() {}
117
118
    /// If column is ColumnDictionary, and is a bloom filter predicate, generate_hash_values
119
0
    virtual void initialize_hash_values_for_runtime_filter() {}
120
121
    /// Creates empty column with the same type.
122
94
    virtual MutablePtr clone_empty() const { return clone_resized(0); }
123
124
    /// Creates column with the same type and specified size.
125
    /// If size is less current size, then data is cut.
126
    /// If size is greater, than default values are appended.
127
0
    virtual MutablePtr clone_resized(size_t s) const {
128
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
129
0
                               "Method clone_resized is not supported for " + get_name());
130
0
        return nullptr;
131
0
    }
132
133
    // shrink the end zeros for CHAR type or ARRAY<CHAR> type
134
0
    virtual MutablePtr get_shrinked_column() {
135
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
136
0
                               "Method get_shrinked_column is not supported for " + get_name());
137
0
        return nullptr;
138
0
    }
139
140
    // check the column whether could shrinked
141
    // now support only in char type, or the nested type in complex type: array{char}, struct{char}, map{char}
142
0
    virtual bool could_shrinked_column() { return false; }
143
144
    /// Some columns may require finalization before using of other operations.
145
0
    virtual void finalize() {}
146
147
    // Only used on ColumnDictionary
148
347
    virtual void set_rowset_segment_id(std::pair<RowsetId, uint32_t> rowset_segment_id) {}
149
150
0
    virtual std::pair<RowsetId, uint32_t> get_rowset_segment_id() const { return {}; }
151
152
    /// Returns number of values in column.
153
    virtual size_t size() const = 0;
154
155
    /// There are no values in columns.
156
10.8k
    bool empty() const { return size() == 0; }
157
158
    /// Returns value of n-th element in universal Field representation.
159
    /// Is used in rare cases, since creation of Field instance is expensive usually.
160
    virtual Field operator[](size_t n) const = 0;
161
162
    /// Like the previous one, but avoids extra copying if Field is in a container, for example.
163
    virtual void get(size_t n, Field& res) const = 0;
164
165
    /// If possible, returns pointer to memory chunk which contains n-th element (if it isn't possible, throws an exception)
166
    /// Is used to optimize some computations (in aggregation, for example).
167
    virtual StringRef get_data_at(size_t n) const = 0;
168
169
    /// If column stores integers, it returns n-th element transformed to UInt64 using static_cast.
170
    /// If column stores floating point numbers, bits of n-th elements are copied to lower bits of UInt64, the remaining bits are zeros.
171
    /// Is used to optimize some computations (in aggregation, for example).
172
0
    virtual UInt64 get64(size_t /*n*/) const {
173
0
        LOG(FATAL) << "Method get64 is not supported for ";
174
0
        return 0;
175
0
    }
176
177
    /// If column stores native numeric type, it returns n-th element casted to Float64
178
    /// Is used in regression methods to cast each features into uniform type
179
0
    virtual Float64 get_float64(size_t /*n*/) const {
180
0
        LOG(FATAL) << "Method get_float64 is not supported for " << get_name();
181
0
        return 0;
182
0
    }
183
184
    /** If column is numeric, return value of n-th element, casted to UInt64.
185
      * For NULL values of Nullable column it is allowed to return arbitrary value.
186
      * Otherwise throw an exception.
187
      */
188
0
    virtual UInt64 get_uint(size_t /*n*/) const {
189
0
        LOG(FATAL) << "Method get_uint is not supported for " << get_name();
190
0
        return 0;
191
0
    }
192
193
0
    virtual Int64 get_int(size_t /*n*/) const {
194
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
195
0
                               "Method get_int is not supported for " + get_name());
196
0
        return 0;
197
0
    }
198
199
0
    virtual bool is_default_at(size_t n) const { return get64(n) == 0; }
200
1.66k
    virtual bool is_null_at(size_t /*n*/) const { return false; }
201
202
    /** If column is numeric, return value of n-th element, casted to bool.
203
      * For NULL values of Nullable column returns false.
204
      * Otherwise throw an exception.
205
      */
206
0
    virtual bool get_bool(size_t /*n*/) const {
207
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
208
0
                               "Method get_bool is not supported for " + get_name());
209
0
        return false;
210
0
    }
211
212
    /// Removes all elements outside of specified range.
213
    /// Is used in LIMIT operation, for example.
214
0
    virtual Ptr cut(size_t start, size_t length) const {
215
0
        MutablePtr res = clone_empty();
216
0
        res->insert_range_from(*this, start, length);
217
0
        return res;
218
0
    }
219
220
    /// Appends new value at the end of column (column's size is increased by 1).
221
    /// Is used to transform raw strings to Blocks (for example, inside input format parsers)
222
    virtual void insert(const Field& x) = 0;
223
224
    /// Appends n-th element from other column with the same type.
225
    /// Is used in merge-sort and merges. It could be implemented in inherited classes more optimally than default implementation.
226
    virtual void insert_from(const IColumn& src, size_t n);
227
228
    /// Appends range of elements from other column with the same type.
229
    /// Could be used to concatenate columns.
230
    /// TODO: we need `insert_range_from_const` for every column type.
231
    virtual void insert_range_from(const IColumn& src, size_t start, size_t length) = 0;
232
233
    /// Appends range of elements from other column with the same type.
234
    /// Do not need throw execption in ColumnString overflow uint32, only
235
    /// use in join
236
    virtual void insert_range_from_ignore_overflow(const IColumn& src, size_t start,
237
0
                                                   size_t length) {
238
0
        insert_range_from(src, start, length);
239
0
    }
240
241
    /// Appends one element from other column with the same type multiple times.
242
18
    virtual void insert_many_from(const IColumn& src, size_t position, size_t length) {
243
36
        for (size_t i = 0; i < length; ++i) {
244
18
            insert_from(src, position);
245
18
        }
246
18
    }
247
248
    virtual void insert_from_multi_column(const std::vector<const IColumn*>& srcs,
249
                                          std::vector<size_t> positions);
250
251
    /// Appends a batch elements from other column with the same type
252
    /// indices_begin + indices_end represent the row indices of column src
253
    virtual void insert_indices_from(const IColumn& src, const uint32_t* indices_begin,
254
                                     const uint32_t* indices_end) = 0;
255
256
    /// Appends data located in specified memory chunk if it is possible (throws an exception if it cannot be implemented).
257
    /// Is used to optimize some computations (in aggregation, for example).
258
    /// Parameter length could be ignored if column values have fixed size.
259
    /// All data will be inserted as single element
260
    virtual void insert_data(const char* pos, size_t length) = 0;
261
262
0
    virtual void insert_many_fix_len_data(const char* pos, size_t num) {
263
0
        throw doris::Exception(
264
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
265
0
                "Method insert_many_fix_len_data is not supported for " + get_name());
266
0
    }
267
268
    // todo(zeno) Use dict_args temp object to cover all arguments
269
    virtual void insert_many_dict_data(const int32_t* data_array, size_t start_index,
270
                                       const StringRef* dict, size_t data_num,
271
0
                                       uint32_t dict_num = 0) {
272
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
273
0
                               "Method insert_many_dict_data is not supported for " + get_name());
274
0
    }
275
276
    virtual void insert_many_binary_data(char* data_array, uint32_t* len_array,
277
0
                                         uint32_t* start_offset_array, size_t num) {
278
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
279
0
                               "Method insert_many_binary_data is not supported for " + get_name());
280
0
    }
281
282
    /// Insert binary data into column from a continuous buffer, the implementation maybe copy all binary data
283
    /// in one single time.
284
    virtual void insert_many_continuous_binary_data(const char* data, const uint32_t* offsets,
285
0
                                                    const size_t num) {
286
0
        throw doris::Exception(
287
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
288
0
                "Method insert_many_continuous_binary_data is not supported for " + get_name());
289
0
    }
290
291
0
    virtual void insert_many_strings(const StringRef* strings, size_t num) {
292
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
293
0
                               "Method insert_many_strings is not supported for " + get_name());
294
0
    }
295
296
    virtual void insert_many_strings_overflow(const StringRef* strings, size_t num,
297
0
                                              size_t max_length) {
298
0
        throw doris::Exception(
299
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
300
0
                "Method insert_many_strings_overflow is not supported for " + get_name());
301
0
    }
302
303
    // Here `pos` points to the memory data type is the same as the data type of the column.
304
    // This function is used by `insert_keys_into_columns` in AggregationNode.
305
0
    virtual void insert_many_raw_data(const char* pos, size_t num) {
306
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
307
0
                               "Method insert_many_raw_data is not supported for " + get_name());
308
0
    }
309
310
6
    void insert_many_data(const char* pos, size_t length, size_t data_num) {
311
12
        for (size_t i = 0; i < data_num; ++i) {
312
6
            insert_data(pos, length);
313
6
        }
314
6
    }
315
316
    /// Appends "default value".
317
    /// Is used when there are need to increase column size, but inserting value doesn't make sense.
318
    /// For example, ColumnNullable(Nested) absolutely ignores values of nested column if it is marked as NULL.
319
    virtual void insert_default() = 0;
320
321
    /// Appends "default value" multiple times.
322
3
    virtual void insert_many_defaults(size_t length) {
323
26
        for (size_t i = 0; i < length; ++i) {
324
23
            insert_default();
325
23
        }
326
3
    }
327
328
    /** Removes last n elements.
329
      * Is used to support exception-safety of several operations.
330
      *  For example, sometimes insertion should be reverted if we catch an exception during operation processing.
331
      * If column has less than n elements or n == 0 - undefined behavior.
332
      */
333
    virtual void pop_back(size_t n) = 0;
334
335
    /** Serializes n-th element. Serialized element should be placed continuously inside Arena's memory.
336
      * Serialized value can be deserialized to reconstruct original object. Is used in aggregation.
337
      * The method is similar to get_data_at(), but can work when element's value cannot be mapped to existing continuous memory chunk,
338
      *  For example, to obtain unambiguous representation of Array of strings, strings data should be interleaved with their sizes.
339
      * Parameter begin should be used with Arena::alloc_continue.
340
      */
341
    virtual StringRef serialize_value_into_arena(size_t n, Arena& arena,
342
                                                 char const*& begin) const = 0;
343
344
    /// Deserializes a value that was serialized using IColumn::serialize_value_into_arena method.
345
    /// Returns pointer to the position after the read data.
346
    virtual const char* deserialize_and_insert_from_arena(const char* pos) = 0;
347
348
    /// Return the size of largest row.
349
    /// This is for calculating the memory size for vectorized serialization of aggregation keys.
350
0
    virtual size_t get_max_row_byte_size() const {
351
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
352
0
                               "Method get_max_row_byte_size is not supported for " + get_name());
353
0
        return 0;
354
0
    }
355
356
    virtual void serialize_vec(std::vector<StringRef>& keys, size_t num_rows,
357
0
                               size_t max_row_byte_size) const {
358
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
359
0
                               "Method serialize_vec is not supported for " + get_name());
360
0
        __builtin_unreachable();
361
0
    }
362
363
    virtual void serialize_vec_with_null_map(std::vector<StringRef>& keys, size_t num_rows,
364
0
                                             const uint8_t* null_map) const {
365
0
        throw doris::Exception(
366
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
367
0
                "Method serialize_vec_with_null_map is not supported for " + get_name());
368
0
        __builtin_unreachable();
369
0
    }
370
371
    // This function deserializes group-by keys into column in the vectorized way.
372
0
    virtual void deserialize_vec(std::vector<StringRef>& keys, const size_t num_rows) {
373
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
374
0
                               "Method deserialize_vec is not supported for " + get_name());
375
0
        __builtin_unreachable();
376
0
    }
377
378
    // Used in ColumnNullable::deserialize_vec
379
    virtual void deserialize_vec_with_null_map(std::vector<StringRef>& keys, const size_t num_rows,
380
0
                                               const uint8_t* null_map) {
381
0
        throw doris::Exception(
382
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
383
0
                "Method deserialize_vec_with_null_map is not supported for " + get_name());
384
0
        __builtin_unreachable();
385
0
    }
386
387
    /// TODO: SipHash is slower than city or xx hash, rethink we should have a new interface
388
    /// Update state of hash function with value of n-th element.
389
    /// On subsequent calls of this method for sequence of column values of arbitrary types,
390
    ///  passed bytes to hash must identify sequence of values unambiguously.
391
0
    virtual void update_hash_with_value(size_t n, SipHash& hash) const {
392
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
393
0
                               "Method update_hash_with_value is not supported for " + get_name());
394
0
    }
395
396
    /// Update state of hash function with value of n elements to avoid the virtual function call
397
    /// null_data to mark whether need to do hash compute, null_data == nullptr
398
    /// means all element need to do hash function, else only *null_data != 0 need to do hash func
399
    /// do xxHash here, faster than other sip hash
400
    virtual void update_hashes_with_value(uint64_t* __restrict hashes,
401
0
                                          const uint8_t* __restrict null_data = nullptr) const {
402
0
        throw doris::Exception(
403
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
404
0
                "Method update_hashes_with_value is not supported for " + get_name());
405
0
    }
406
407
    // use range for one hash value to avoid virtual function call in loop
408
    virtual void update_xxHash_with_value(size_t start, size_t end, uint64_t& hash,
409
0
                                          const uint8_t* __restrict null_data) const {
410
0
        throw doris::Exception(
411
0
                ErrorCode::NOT_IMPLEMENTED_ERROR,
412
0
                "Method update_xxHash_with_value is not supported for " + get_name());
413
0
    }
414
415
    /// Update state of crc32 hash function with value of n elements to avoid the virtual function call
416
    /// null_data to mark whether need to do hash compute, null_data == nullptr
417
    /// means all element need to do hash function, else only *null_data != 0 need to do hash func
418
    virtual void update_crcs_with_value(uint32_t* __restrict hash, PrimitiveType type,
419
                                        uint32_t rows, uint32_t offset = 0,
420
0
                                        const uint8_t* __restrict null_data = nullptr) const {
421
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
422
0
                               "Method update_crcs_with_value is not supported for " + get_name());
423
0
    }
424
425
    // use range for one hash value to avoid virtual function call in loop
426
    virtual void update_crc_with_value(size_t start, size_t end, uint32_t& hash,
427
0
                                       const uint8_t* __restrict null_data) const {
428
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
429
0
                               "Method update_crc_with_value is not supported for " + get_name());
430
0
    }
431
432
    /** Removes elements that don't match the filter.
433
      * Is used in WHERE and HAVING operations.
434
      * If result_size_hint > 0, then makes advance reserve(result_size_hint) for the result column;
435
      *  if 0, then don't makes reserve(),
436
      *  otherwise (i.e. < 0), makes reserve() using size of source column.
437
      */
438
    using Filter = PaddedPODArray<UInt8>;
439
    virtual Ptr filter(const Filter& filt, ssize_t result_size_hint) const = 0;
440
441
    /// This function will modify the original table.
442
    /// Return rows number after filtered.
443
    virtual size_t filter(const Filter& filter) = 0;
444
445
    /**
446
     *  used by lazy materialization to filter column by selected rowids
447
     *  Q: Why use IColumn* as args type instead of MutablePtr or ImmutablePtr ?
448
     *  A: If use MutablePtr/ImmutablePtr as col_ptr's type, which means there could be many 
449
     *  convert(convert MutablePtr to ImmutablePtr or convert ImmutablePtr to MutablePtr)
450
     *  happends in filter_by_selector because of mem-reuse logic or ColumnNullable, I think this is meaningless;
451
     *  So using raw ptr directly here.
452
     *  NOTICE: only column_nullable and predict_column, column_dictionary now support filter_by_selector
453
     */
454
0
    virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) {
455
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
456
0
                               "Method filter_by_selector is not supported for {}, only "
457
0
                               "column_nullable, column_dictionary and predict_column support",
458
0
                               get_name());
459
0
        __builtin_unreachable();
460
0
    }
461
462
    /// Permutes elements using specified permutation. Is used in sortings.
463
    /// limit - if it isn't 0, puts only first limit elements in the result.
464
    using Permutation = PaddedPODArray<size_t>;
465
    virtual Ptr permute(const Permutation& perm, size_t limit) const = 0;
466
467
    /// Creates new column with values column[indexes[:limit]]. If limit is 0, all indexes are used.
468
    /// Indexes must be one of the ColumnUInt. For default implementation, see select_index_impl from ColumnsCommon.h
469
0
    virtual Ptr index(const IColumn& indexes, size_t limit) const {
470
0
        LOG(FATAL) << "column not support index";
471
0
        __builtin_unreachable();
472
0
    }
473
474
    /** Compares (*this)[n] and rhs[m]. Column rhs should have the same type.
475
      * Returns negative number, 0, or positive number (*this)[n] is less, equal, greater than rhs[m] respectively.
476
      * Is used in sortings.
477
      *
478
      * If one of element's value is NaN or NULLs, then:
479
      * - if nan_direction_hint == -1, NaN and NULLs are considered as least than everything other;
480
      * - if nan_direction_hint ==  1, NaN and NULLs are considered as greatest than everything other.
481
      * For example, if nan_direction_hint == -1 is used by descending sorting, NaNs will be at the end.
482
      *
483
      * For non Nullable and non floating point types, nan_direction_hint is ignored.
484
      * For array/map/struct types, we compare with nested column element and offsets size
485
      */
486
    virtual int compare_at(size_t n, size_t m, const IColumn& rhs,
487
                           int nan_direction_hint) const = 0;
488
489
    /**
490
     * To compare all rows in this column with another row (with row_id = rhs_row_id in column rhs)
491
     * @param nan_direction_hint and direction indicates the ordering.
492
     * @param cmp_res if we already has a comparison result for row i, e.g. cmp_res[i] = 1, we can skip row i
493
     * @param filter this stores comparison results for all rows. filter[i] = 1 means row i is less than row rhs_row_id in rhs
494
     */
495
    virtual void compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint,
496
                                  int direction, std::vector<uint8>& cmp_res,
497
                                  uint8* __restrict filter) const;
498
499
    /** Returns a permutation that sorts elements of this column,
500
      *  i.e. perm[i]-th element of source column should be i-th element of sorted column.
501
      * reverse - reverse ordering (ascending).
502
      * limit - if isn't 0, then only first limit elements of the result column could be sorted.
503
      * nan_direction_hint - see above.
504
      */
505
    virtual void get_permutation(bool reverse, size_t limit, int nan_direction_hint,
506
                                 Permutation& res) const = 0;
507
508
    /** Copies each element according offsets parameter.
509
      * (i-th element should be copied offsets[i] - offsets[i - 1] times.)
510
      * It is necessary in ARRAY JOIN operation.
511
      */
512
    virtual Ptr replicate(const Offsets& offsets) const = 0;
513
514
    /// Appends one field multiple times. Can be optimized in inherited classes.
515
0
    virtual void insert_many(const Field& field, size_t length) {
516
0
        for (size_t i = 0; i < length; ++i) {
517
0
            insert(field);
518
0
        }
519
0
    }
520
    /// Returns indices of values in column, that not equal to default value of column.
521
    virtual void get_indices_of_non_default_rows(Offsets64& indices, size_t from,
522
0
                                                 size_t limit) const {
523
0
        LOG(FATAL) << "column not support get_indices_of_non_default_rows";
524
0
        __builtin_unreachable();
525
0
    }
526
527
    template <typename Derived>
528
    void get_indices_of_non_default_rows_impl(IColumn::Offsets64& indices, size_t from,
529
                                              size_t limit) const;
530
531
    /** Split column to smaller columns. Each value goes to column index, selected by corresponding element of 'selector'.
532
      * Selector must contain values from 0 to num_columns - 1.
533
      * For default implementation, see scatter_impl.
534
      */
535
    using ColumnIndex = UInt64;
536
    using Selector = PaddedPODArray<ColumnIndex>;
537
538
    virtual void append_data_by_selector(MutablePtr& res, const Selector& selector) const = 0;
539
540
    virtual void append_data_by_selector(MutablePtr& res, const Selector& selector, size_t begin,
541
                                         size_t end) const = 0;
542
543
    /// Insert data from several other columns according to source mask (used in vertical merge).
544
    /// For now it is a helper to de-virtualize calls to insert*() functions inside gather loop
545
    /// (descendants should call gatherer_stream.gather(*this) to implement this function.)
546
    /// TODO: interface decoupled from ColumnGathererStream that allows non-generic specializations.
547
    //    virtual void gather(ColumnGathererStream & gatherer_stream) = 0;
548
549
    /// Reserves memory for specified amount of elements. If reservation isn't possible, does nothing.
550
    /// It affects performance only (not correctness).
551
0
    virtual void reserve(size_t /*n*/) {}
552
553
    /// Resize memory for specified amount of elements. If reservation isn't possible, does nothing.
554
    /// It affects performance only (not correctness).
555
0
    virtual void resize(size_t /*n*/) {}
556
557
    /// Size of column data in memory (may be approximate) - for profiling. Zero, if could not be determined.
558
    virtual size_t byte_size() const = 0;
559
560
    /// Size of memory, allocated for column.
561
    /// This is greater or equals to byte_size due to memory reservation in containers.
562
    /// Zero, if could not be determined.
563
    virtual size_t allocated_bytes() const = 0;
564
565
    /// If the column contains subcolumns (such as Array, Nullable, etc), do callback on them.
566
    /// Shallow: doesn't do recursive calls; don't do call for itself.
567
    using ColumnCallback = std::function<void(WrappedPtr&)>;
568
    using ImutableColumnCallback = std::function<void(const IColumn&)>;
569
43.5k
    virtual void for_each_subcolumn(ColumnCallback) {}
570
571
    /// Columns have equal structure.
572
    /// If true - you can use "compare_at", "insert_from", etc. methods.
573
0
    virtual bool structure_equals(const IColumn&) const {
574
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
575
0
                               "Method structure_equals is not supported for " + get_name());
576
0
        return false;
577
0
    }
578
579
45.1k
    MutablePtr mutate() const&& {
580
45.1k
        MutablePtr res = shallow_mutate();
581
45.1k
        res->for_each_subcolumn(
582
45.1k
                [](WrappedPtr& subcolumn) { subcolumn = std::move(*subcolumn).mutate(); });
583
45.1k
        return res;
584
45.1k
    }
585
586
0
    static MutablePtr mutate(Ptr ptr) {
587
0
        MutablePtr res = ptr->shallow_mutate(); /// Now use_count is 2.
588
0
        ptr.reset();                            /// Reset use_count to 1.
589
0
        res->for_each_subcolumn(
590
0
                [](WrappedPtr& subcolumn) { subcolumn = std::move(*subcolumn).mutate(); });
591
0
        return res;
592
0
    }
593
594
    /** Some columns can contain another columns inside.
595
      * So, we have a tree of columns. But not all combinations are possible.
596
      * There are the following rules:
597
      *
598
      * ColumnConst may be only at top. It cannot be inside any column.
599
      * ColumnNullable can contain only simple columns.
600
      */
601
602
    /// Various properties on behaviour of column type.
603
604
    /// True if column contains something nullable inside. It's true for ColumnNullable, can be true or false for ColumnConst, etc.
605
30.8k
    virtual bool is_nullable() const { return false; }
606
607
0
    virtual bool is_bitmap() const { return false; }
608
609
0
    virtual bool is_hll() const { return false; }
610
611
    // true if column has null element
612
0
    virtual bool has_null() const { return false; }
613
614
    // true if column has null element [0,size)
615
1.65k
    virtual bool has_null(size_t size) const { return false; }
616
617
6
    virtual bool is_exclusive() const { return use_count() == 1; }
618
619
    /// Clear data of column, just like vector clear
620
    virtual void clear() = 0;
621
622
    /** Memory layout properties.
623
      *
624
      * Each value of a column can be placed in memory contiguously or not.
625
      *
626
      * Example: simple columns like UInt64 or FixedString store their values contiguously in single memory buffer.
627
      *
628
      * Example: Tuple store values of each component in separate subcolumn, so the values of Tuples with at least two components are not contiguous.
629
      * Another example is Nullable. Each value have null flag, that is stored separately, so the value is not contiguous in memory.
630
      *
631
      * There are some important cases, when values are not stored contiguously, but for each value, you can get contiguous memory segment,
632
      *  that will unambiguously identify the value. In this case, methods get_data_at and insert_data are implemented.
633
      * Example: String column: bytes of strings are stored concatenated in one memory buffer
634
      *  and offsets to that buffer are stored in another buffer. The same is for Array of fixed-size contiguous elements.
635
      *
636
      * To avoid confusion between these cases, we don't have isContiguous method.
637
      */
638
639
    /// Values in column have fixed size (including the case when values span many memory segments).
640
0
    virtual bool values_have_fixed_size() const { return is_fixed_and_contiguous(); }
641
642
    /// Values in column are represented as continuous memory segment of fixed size. Implies values_have_fixed_size.
643
0
    virtual bool is_fixed_and_contiguous() const { return false; }
644
645
    /// If is_fixed_and_contiguous, returns the underlying data array, otherwise throws an exception.
646
0
    virtual StringRef get_raw_data() const {
647
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
648
0
                               "Column {} is not a contiguous block of memory", get_name());
649
0
        return StringRef {};
650
0
    }
651
652
    /// If values_have_fixed_size, returns size of value, otherwise throw an exception.
653
0
    virtual size_t size_of_value_if_fixed() const {
654
0
        throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
655
0
                               "Values of column {} are not fixed size.", get_name());
656
0
        return 0;
657
0
    }
658
659
    /// Returns ratio of values in column, that are equal to default value of column.
660
    /// Checks only @sample_ratio ratio of rows.
661
0
    virtual double get_ratio_of_default_rows(double sample_ratio = 1.0) const {
662
0
        LOG(FATAL) << fmt::format("get_ratio_of_default_rows of column {} are not implemented.",
663
0
                                  get_name());
664
0
        return 0.0;
665
0
    }
666
667
    /// Template is to devirtualize calls to 'isDefaultAt' method.
668
    template <typename Derived>
669
    double get_ratio_of_default_rows_impl(double sample_ratio) const;
670
671
    /// Column is ColumnVector of numbers or ColumnConst of it. Note that Nullable columns are not numeric.
672
    /// Implies is_fixed_and_contiguous.
673
0
    virtual bool is_numeric() const { return false; }
674
675
    // Column is ColumnString/ColumnArray/ColumnMap or other variable length column at every row
676
3
    virtual bool is_variable_length() const { return false; }
677
678
3
    virtual bool is_column_string() const { return false; }
679
680
0
    virtual bool is_column_string64() const { return false; }
681
682
0
    virtual bool is_column_decimal() const { return false; }
683
684
4.16k
    virtual bool is_column_dictionary() const { return false; }
685
686
0
    virtual bool is_column_array() const { return false; }
687
688
8
    virtual bool is_column_map() const { return false; }
689
690
0
    virtual bool is_column_struct() const { return false; }
691
692
    /// If the only value column can contain is NULL.
693
532
    virtual bool only_null() const { return false; }
694
695
    virtual void sort_column(const ColumnSorter* sorter, EqualFlags& flags,
696
                             IColumn::Permutation& perms, EqualRange& range,
697
                             bool last_column) const;
698
699
39.1k
    virtual ~IColumn() = default;
700
39.1k
    IColumn() = default;
701
4
    IColumn(const IColumn&) = default;
702
703
    /** Print column name, size, and recursively print all subcolumns.
704
      */
705
    String dump_structure() const;
706
707
    // only used in agg value replace
708
    // ColumnString should replace according to 0,1,2... ,size,0,1,2...
709
    virtual void replace_column_data(const IColumn&, size_t row, size_t self_row = 0) = 0;
710
711
    // only used in ColumnNullable replace_column_data
712
    virtual void replace_column_data_default(size_t self_row = 0) = 0;
713
714
0
    virtual void replace_column_null_data(const uint8_t* __restrict null_map) {}
715
716
500k
    virtual bool is_date_type() const { return is_date; }
717
500k
    virtual bool is_datetime_type() const { return is_date_time; }
718
719
138
    virtual void set_date_type() { is_date = true; }
720
280
    virtual void set_datetime_type() { is_date_time = true; }
721
722
51
    void copy_date_types(const IColumn& col) {
723
51
        if (col.is_date_type()) {
724
1
            set_date_type();
725
1
        }
726
51
        if (col.is_datetime_type()) {
727
4
            set_datetime_type();
728
4
        }
729
51
    }
730
731
    // todo(wb): a temporary implemention, need re-abstract here
732
    bool is_date = false;
733
    bool is_date_time = false;
734
735
protected:
736
    template <typename Derived>
737
    void append_data_by_selector_impl(MutablePtr& res, const Selector& selector) const;
738
    template <typename Derived>
739
    void append_data_by_selector_impl(MutablePtr& res, const Selector& selector, size_t begin,
740
                                      size_t end) const;
741
};
742
743
using ColumnPtr = IColumn::Ptr;
744
using MutableColumnPtr = IColumn::MutablePtr;
745
using Columns = std::vector<ColumnPtr>;
746
using MutableColumns = std::vector<MutableColumnPtr>;
747
using ColumnPtrs = std::vector<ColumnPtr>;
748
using ColumnRawPtrs = std::vector<const IColumn*>;
749
750
template <typename... Args>
751
struct IsMutableColumns;
752
753
template <typename Arg, typename... Args>
754
struct IsMutableColumns<Arg, Args...> {
755
    static const bool value =
756
            std::is_assignable<MutableColumnPtr&&, Arg>::value && IsMutableColumns<Args...>::value;
757
};
758
759
template <>
760
struct IsMutableColumns<> {
761
    static const bool value = true;
762
};
763
764
template <typename Type>
765
3.86k
const Type* check_and_get_column(const IColumn& column) {
766
3.86k
    return typeid_cast<const Type*>(&column);
767
3.86k
}
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnArrayEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
18
const Type* check_and_get_column(const IColumn& column) {
766
18
    return typeid_cast<const Type*>(&column);
767
18
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIhEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
71
const Type* check_and_get_column(const IColumn& column) {
766
71
    return typeid_cast<const Type*>(&column);
767
71
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIdEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
7
const Type* check_and_get_column(const IColumn& column) {
766
7
    return typeid_cast<const Type*>(&column);
767
7
}
_ZN5doris10vectorized20check_and_get_columnINS0_14ColumnNullableEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
2.24k
const Type* check_and_get_column(const IColumn& column) {
766
2.24k
    return typeid_cast<const Type*>(&column);
767
2.24k
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE5EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE5EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE11EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE11EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE12EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE12EEEEEPKT_RKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIiEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
93
const Type* check_and_get_column(const IColumn& column) {
766
93
    return typeid_cast<const Type*>(&column);
767
93
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIaEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
35
const Type* check_and_get_column(const IColumn& column) {
766
35
    return typeid_cast<const Type*>(&column);
767
35
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIsEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
30
const Type* check_and_get_column(const IColumn& column) {
766
30
    return typeid_cast<const Type*>(&column);
767
30
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIlEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
37
const Type* check_and_get_column(const IColumn& column) {
766
37
    return typeid_cast<const Type*>(&column);
767
37
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorInEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
19
const Type* check_and_get_column(const IColumn& column) {
766
19
    return typeid_cast<const Type*>(&column);
767
19
}
_ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalInEEEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
10
const Type* check_and_get_column(const IColumn& column) {
766
10
    return typeid_cast<const Type*>(&column);
767
10
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIfEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
10
const Type* check_and_get_column(const IColumn& column) {
766
10
    return typeid_cast<const Type*>(&column);
767
10
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIjEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
17
const Type* check_and_get_column(const IColumn& column) {
766
17
    return typeid_cast<const Type*>(&column);
767
17
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorImEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
17
const Type* check_and_get_column(const IColumn& column) {
766
17
    return typeid_cast<const Type*>(&column);
767
17
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_14ColumnNullableEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
27
const Type* check_and_get_column(const IColumn& column) {
766
27
    return typeid_cast<const Type*>(&column);
767
27
}
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnConstEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
1.06k
const Type* check_and_get_column(const IColumn& column) {
766
1.06k
    return typeid_cast<const Type*>(&column);
767
1.06k
}
_ZN5doris10vectorized20check_and_get_columnINS0_9ColumnStrIjEEEEPKT_RKNS0_7IColumnE
Line
Count
Source
765
166
const Type* check_and_get_column(const IColumn& column) {
766
166
    return typeid_cast<const Type*>(&column);
767
166
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIiEEEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_11ColumnConstEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIoEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_16ColumnDictionaryIiEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE15EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE15EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE23EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE23EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE25EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE25EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_9ColumnMapEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnStructEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnObjectEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorItEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorINS0_7UInt128EEEEEPKT_RKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIhEEEEPKT_RKNS0_7IColumnE
768
769
template <typename Type>
770
28.0k
const Type* check_and_get_column(const IColumn* column) {
771
28.0k
    return typeid_cast<const Type*>(column);
772
28.0k
}
_ZN5doris10vectorized20check_and_get_columnINS0_14ColumnNullableEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
553
const Type* check_and_get_column(const IColumn* column) {
771
553
    return typeid_cast<const Type*>(column);
772
553
}
_ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE5EEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
4.07k
const Type* check_and_get_column(const IColumn* column) {
771
4.07k
    return typeid_cast<const Type*>(column);
772
4.07k
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE11EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE12EEEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnINS0_9ColumnStrIjEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
227
const Type* check_and_get_column(const IColumn* column) {
771
227
    return typeid_cast<const Type*>(column);
772
227
}
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnArrayEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
35
const Type* check_and_get_column(const IColumn* column) {
771
35
    return typeid_cast<const Type*>(column);
772
35
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIhEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
56
const Type* check_and_get_column(const IColumn* column) {
771
56
    return typeid_cast<const Type*>(column);
772
56
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorItEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
21
const Type* check_and_get_column(const IColumn* column) {
771
21
    return typeid_cast<const Type*>(column);
772
21
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIjEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
60
const Type* check_and_get_column(const IColumn* column) {
771
60
    return typeid_cast<const Type*>(column);
772
60
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorImEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
61
const Type* check_and_get_column(const IColumn* column) {
771
61
    return typeid_cast<const Type*>(column);
772
61
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIaEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
58
const Type* check_and_get_column(const IColumn* column) {
771
58
    return typeid_cast<const Type*>(column);
772
58
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIsEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
51
const Type* check_and_get_column(const IColumn* column) {
771
51
    return typeid_cast<const Type*>(column);
772
51
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIiEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
68
const Type* check_and_get_column(const IColumn* column) {
771
68
    return typeid_cast<const Type*>(column);
772
68
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIlEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
96
const Type* check_and_get_column(const IColumn* column) {
771
96
    return typeid_cast<const Type*>(column);
772
96
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorInEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
18
const Type* check_and_get_column(const IColumn* column) {
771
18
    return typeid_cast<const Type*>(column);
772
18
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIfEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
13
const Type* check_and_get_column(const IColumn* column) {
771
13
    return typeid_cast<const Type*>(column);
772
13
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIdEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
26
const Type* check_and_get_column(const IColumn* column) {
771
26
    return typeid_cast<const Type*>(column);
772
26
}
_ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIiEEEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
1
const Type* check_and_get_column(const IColumn* column) {
771
1
    return typeid_cast<const Type*>(column);
772
1
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalInEEEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_16ColumnDictionaryIiEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE15EEEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE23EEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
20
const Type* check_and_get_column(const IColumn* column) {
771
20
    return typeid_cast<const Type*>(column);
772
20
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE25EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnConstEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
22.4k
const Type* check_and_get_column(const IColumn* column) {
771
22.4k
    return typeid_cast<const Type*>(column);
772
22.4k
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_9ColumnMapEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnIKNS0_11ColumnArrayEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
70
const Type* check_and_get_column(const IColumn* column) {
771
70
    return typeid_cast<const Type*>(column);
772
70
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_14ColumnNullableEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
12
const Type* check_and_get_column(const IColumn* column) {
771
12
    return typeid_cast<const Type*>(column);
772
12
}
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIoEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
_ZN5doris10vectorized20check_and_get_columnINS0_17ColumnComplexTypeINS_11BitmapValueEEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
8
const Type* check_and_get_column(const IColumn* column) {
771
8
    return typeid_cast<const Type*>(column);
772
8
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnStructEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIhEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
4
const Type* check_and_get_column(const IColumn* column) {
771
4
    return typeid_cast<const Type*>(column);
772
4
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIaEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIsEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIiEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIlEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorInEEEEPKT_PKNS0_7IColumnE
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIdEEEEPKT_PKNS0_7IColumnE
Line
Count
Source
770
2
const Type* check_and_get_column(const IColumn* column) {
771
2
    return typeid_cast<const Type*>(column);
772
2
}
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_17ColumnComplexTypeINS_11HyperLogLogEEEEEPKT_PKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnObjectEEEPKT_PKNS0_7IColumnE
773
774
template <typename Type>
775
22.8k
bool check_column(const IColumn& column) {
776
22.8k
    return check_and_get_column<Type>(&column);
777
22.8k
}
_ZN5doris10vectorized12check_columnINS0_14ColumnNullableEEEbRKNS0_7IColumnE
Line
Count
Source
775
355
bool check_column(const IColumn& column) {
776
355
    return check_and_get_column<Type>(&column);
777
355
}
_ZN5doris10vectorized12check_columnINS0_11ColumnConstEEEbRKNS0_7IColumnE
Line
Count
Source
775
22.4k
bool check_column(const IColumn& column) {
776
22.4k
    return check_and_get_column<Type>(&column);
777
22.4k
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIhEEEEbRKNS0_7IColumnE
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIaEEEEbRKNS0_7IColumnE
Line
Count
Source
775
2
bool check_column(const IColumn& column) {
776
2
    return check_and_get_column<Type>(&column);
777
2
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIsEEEEbRKNS0_7IColumnE
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIiEEEEbRKNS0_7IColumnE
Line
Count
Source
775
3
bool check_column(const IColumn& column) {
776
3
    return check_and_get_column<Type>(&column);
777
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIlEEEEbRKNS0_7IColumnE
Line
Count
Source
775
5
bool check_column(const IColumn& column) {
776
5
    return check_and_get_column<Type>(&column);
777
5
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorInEEEEbRKNS0_7IColumnE
Line
Count
Source
775
1
bool check_column(const IColumn& column) {
776
1
    return check_and_get_column<Type>(&column);
777
1
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIfEEEEbRKNS0_7IColumnE
Line
Count
Source
775
1
bool check_column(const IColumn& column) {
776
1
    return check_and_get_column<Type>(&column);
777
1
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIdEEEEbRKNS0_7IColumnE
Line
Count
Source
775
1
bool check_column(const IColumn& column) {
776
1
    return check_and_get_column<Type>(&column);
777
1
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIiEEEEEEbRKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEbRKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEbRKNS0_7IColumnE
_ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalInEEEEEEbRKNS0_7IColumnE
Line
Count
Source
775
2
bool check_column(const IColumn& column) {
776
2
    return check_and_get_column<Type>(&column);
777
2
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEbRKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIjEEEEbRKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorImEEEEbRKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_9ColumnStrIjEEEEbRKNS0_7IColumnE
778
779
template <typename Type>
780
36
bool check_column(const IColumn* column) {
781
36
    return check_and_get_column<Type>(column);
782
36
}
_ZN5doris10vectorized12check_columnINS0_11ColumnArrayEEEbPKNS0_7IColumnE
Line
Count
Source
780
15
bool check_column(const IColumn* column) {
781
15
    return check_and_get_column<Type>(column);
782
15
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_9ColumnMapEEEbPKNS0_7IColumnE
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorItEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIjEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorImEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIaEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIsEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIiEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIlEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorInEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIoEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIfEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIdEEEEbPKNS0_7IColumnE
_ZN5doris10vectorized12check_columnINS0_12ColumnVectorIhEEEEbPKNS0_7IColumnE
Line
Count
Source
780
3
bool check_column(const IColumn* column) {
781
3
    return check_and_get_column<Type>(column);
782
3
}
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIiEEEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalInEEEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEbPKNS0_7IColumnE
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_9ColumnStrIjEEEEbPKNS0_7IColumnE
783
784
/// True if column's an ColumnConst instance. It's just a syntax sugar for type check.
785
bool is_column_const(const IColumn& column);
786
787
/// True if column's an ColumnNullable instance. It's just a syntax sugar for type check.
788
bool is_column_nullable(const IColumn& column);
789
} // namespace doris::vectorized
790
791
// Wrap `ColumnPtr` because `ColumnPtr` can't be used in forward declaration.
792
namespace doris {
793
struct ColumnPtrWrapper {
794
    vectorized::ColumnPtr column_ptr;
795
796
196
    ColumnPtrWrapper(vectorized::ColumnPtr col) : column_ptr(col) {}
797
};
798
} // namespace doris