Coverage Report

Created: 2025-04-30 19:30

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