/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 | 7 |     if (null_data == nullptr) {                                                      \ | 
| 50 | 32 |         for (size_t i = 0; i < s; i++) {                                             \ | 
| 51 | 30 |             hashes[i] = HashUtil::zlib_crc_hash(&data[i], sizeof(T), hashes[i]);     \ | 
| 52 | 30 |         }                                                                            \ | 
| 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 | 494 |     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 | 1.33M |     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 | 1 |     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.6k |     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 | 1.63k |     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 | 10.4k |     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 | 266k |     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 | 8.09k |     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 | 15 |     virtual Ptr cut(size_t start, size_t length) const final { | 
| 189 | 15 |         MutablePtr res = clone_empty(); | 
| 190 | 15 |         res->insert_range_from(*this, start, length); | 
| 191 | 15 |         return res; | 
| 192 | 15 |     } | 
| 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 | 18 |                                                    size_t length) { | 
| 221 | 18 |         insert_range_from(src, start, length); | 
| 222 | 18 |     } | 
| 223 |  |  | 
| 224 |  |     /// Appends one element from other column with the same type multiple times. | 
| 225 | 18 |     virtual void insert_many_from(const IColumn& src, size_t position, size_t length) { | 
| 226 | 96 |         for (size_t i = 0; i < length; ++i) {  Branch (226:28): [True: 78, False: 18]
 | 
| 227 | 78 |             insert_from(src, position); | 
| 228 | 78 |         } | 
| 229 | 18 |     } | 
| 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 | 1 |     virtual void insert_many_fix_len_data(const char* pos, size_t num) { | 
| 246 | 1 |         throw doris::Exception( | 
| 247 | 1 |                 ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 248 | 1 |                 "Method insert_many_fix_len_data is not supported for " + get_name()); | 
| 249 | 1 |     } | 
| 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 | 1 |                                        uint32_t dict_num = 0) { | 
| 255 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 256 | 1 |                                "Method insert_many_dict_data is not supported for " + get_name()); | 
| 257 | 1 |     } | 
| 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 | 1 |                                                     const size_t num) { | 
| 269 | 1 |         throw doris::Exception( | 
| 270 | 1 |                 ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 271 | 1 |                 "Method insert_many_continuous_binary_data is not supported for " + get_name()); | 
| 272 | 1 |     } | 
| 273 |  |  | 
| 274 | 1 |     virtual void insert_many_strings(const StringRef* strings, size_t num) { | 
| 275 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 276 | 1 |                                "Method insert_many_strings is not supported for " + get_name()); | 
| 277 | 1 |     } | 
| 278 |  |  | 
| 279 |  |     virtual void insert_many_strings_overflow(const StringRef* strings, size_t num, | 
| 280 | 1 |                                               size_t max_length) { | 
| 281 | 1 |         throw doris::Exception( | 
| 282 | 1 |                 ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 283 | 1 |                 "Method insert_many_strings_overflow is not supported for " + get_name()); | 
| 284 | 1 |     } | 
| 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 | 1 |     virtual void insert_many_raw_data(const char* pos, size_t num) { | 
| 289 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 290 | 1 |                                "Method insert_many_raw_data is not supported for " + get_name()); | 
| 291 | 1 |     } | 
| 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) {  Branch (294:28): [True: 12, False: 12]
 | 
| 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 | 17.5k |     virtual void insert_many_defaults(size_t length) { | 
| 306 | 196k |         for (size_t i = 0; i < length; ++i) {  Branch (306:28): [True: 179k, False: 17.5k]
 | 
| 307 | 179k |             insert_default(); | 
| 308 | 179k |         } | 
| 309 | 17.5k |     } | 
| 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 | 1 |     virtual size_t get_max_row_byte_size() const { | 
| 334 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 335 | 1 |                                "Method get_max_row_byte_size is not supported for " + get_name()); | 
| 336 | 0 |         return 0; | 
| 337 | 1 |     } | 
| 338 |  |  | 
| 339 |  |     virtual void serialize_vec(std::vector<StringRef>& keys, size_t num_rows, | 
| 340 | 1 |                                size_t max_row_byte_size) const { | 
| 341 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 342 | 1 |                                "Method serialize_vec is not supported for " + get_name()); | 
| 343 | 0 |         __builtin_unreachable(); | 
| 344 | 1 |     } | 
| 345 |  |  | 
| 346 |  |     virtual void serialize_vec_with_null_map(std::vector<StringRef>& keys, size_t num_rows, | 
| 347 | 1 |                                              const uint8_t* null_map) const { | 
| 348 | 1 |         throw doris::Exception( | 
| 349 | 1 |                 ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 350 | 1 |                 "Method serialize_vec_with_null_map is not supported for " + get_name()); | 
| 351 | 0 |         __builtin_unreachable(); | 
| 352 | 1 |     } | 
| 353 |  |  | 
| 354 |  |     // This function deserializes group-by keys into column in the vectorized way. | 
| 355 | 1 |     virtual void deserialize_vec(std::vector<StringRef>& keys, const size_t num_rows) { | 
| 356 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 357 | 1 |                                "Method deserialize_vec is not supported for " + get_name()); | 
| 358 | 0 |         __builtin_unreachable(); | 
| 359 | 1 |     } | 
| 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 | 1 |                                                const uint8_t* null_map) { | 
| 364 | 1 |         throw doris::Exception( | 
| 365 | 1 |                 ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 366 | 1 |                 "Method deserialize_vec_with_null_map is not supported for " + get_name()); | 
| 367 | 0 |         __builtin_unreachable(); | 
| 368 | 1 |     } | 
| 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 | 1 |     virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) { | 
| 440 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 441 | 1 |                                "Method filter_by_selector is not supported for {}, only " | 
| 442 | 1 |                                "column_nullable, column_dictionary and predict_column support", | 
| 443 | 1 |                                get_name()); | 
| 444 | 0 |         __builtin_unreachable(); | 
| 445 | 1 |     } | 
| 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 | 7 |     virtual int compare_at(size_t n, size_t m, const IColumn& rhs, int nan_direction_hint) const { | 
| 465 | 7 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 466 | 7 |                                "compare_at for " + std::string(get_family_name())); | 
| 467 | 7 |     } | 
| 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 | 120 |     virtual void insert_many(const Field& field, size_t length) { | 
| 499 | 5.04k |         for (size_t i = 0; i < length; ++i) {  Branch (499:28): [True: 4.92k, False: 120]
 | 
| 500 | 4.92k |             insert(field); | 
| 501 | 4.92k |         } | 
| 502 | 120 |     } | 
| 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 | 450 |     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 | 61.5k |     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 | 1 |     virtual bool structure_equals(const IColumn&) const { | 
| 547 | 1 |         throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, | 
| 548 | 1 |                                "Method structure_equals is not supported for " + get_name()); | 
| 549 | 0 |         return false; | 
| 550 | 1 |     } | 
| 551 |  |  | 
| 552 | 70.5k |     MutablePtr mutate() const&& { | 
| 553 | 70.5k |         MutablePtr res = shallow_mutate(); | 
| 554 | 70.5k |         res->for_each_subcolumn( | 
| 555 | 70.5k |                 [](WrappedPtr& subcolumn) { subcolumn = std::move(*subcolumn).mutate(); }); | 
| 556 | 70.5k |         return res; | 
| 557 | 70.5k |     } | 
| 558 |  |  | 
| 559 | 52 |     static MutablePtr mutate(Ptr ptr) { | 
| 560 | 52 |         MutablePtr res = ptr->shallow_mutate(); /// Now use_count is 2. | 
| 561 | 52 |         ptr.reset();                            /// Reset use_count to 1. | 
| 562 | 52 |         res->for_each_subcolumn( | 
| 563 | 420 |                 [](WrappedPtr& subcolumn) { subcolumn = std::move(*subcolumn).mutate(); }); | 
| 564 | 52 |         return res; | 
| 565 | 52 |     } | 
| 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 | 783k |     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 | 52 |     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 | 36 |     virtual bool is_column_string() const { return false; } | 
| 641 |  |  | 
| 642 | 1 |     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 | 119k |     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 | 21.3k |     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 | 2.55M |     virtual ~IColumn() = default; | 
| 662 | 2.55M |     IColumn() = default; | 
| 663 | 809 |     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 | 142 |     virtual void set_date_type() { is_date = true; } | 
| 679 | 299 |     virtual void set_datetime_type() { is_date_time = true; } | 
| 680 |  |  | 
| 681 | 84 |     void copy_date_types(const IColumn& col) { | 
| 682 | 84 |         if (col.is_date_type()) {  Branch (682:13): [True: 1, False: 83]
 | 
| 683 | 1 |             set_date_type(); | 
| 684 | 1 |         } | 
| 685 | 84 |         if (col.is_datetime_type()) {  Branch (685:13): [True: 4, False: 80]
 | 
| 686 | 4 |             set_datetime_type(); | 
| 687 | 4 |         } | 
| 688 | 84 |     } | 
| 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 | 292k | const Type* check_and_get_column(const IColumn& column) { | 
| 726 | 292k |     return typeid_cast<const Type*>(&column); | 
| 727 | 292k | } _ZN5doris10vectorized20check_and_get_columnINS0_11ColumnArrayEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 44 | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 44 |     return typeid_cast<const Type*>(&column); |  | 727 | 44 | } | 
_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_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_14ColumnNullableEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 267k | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 267k |     return typeid_cast<const Type*>(&column); |  | 727 | 267k | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE5EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE5EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE11EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE11EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE12EEEEEPKT_RKNS0_7IColumnEUnexecuted 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 | 21 | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 21 |     return typeid_cast<const Type*>(&column); |  | 727 | 21 | } | 
_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_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_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_12ColumnObjectEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 4.37k | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 4.37k |     return typeid_cast<const Type*>(&column); |  | 727 | 4.37k | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIiEEEEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 10 | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 10 |     return typeid_cast<const Type*>(&column); |  | 727 | 10 | } | 
_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 | 16.1k | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 16.1k |     return typeid_cast<const Type*>(&column); |  | 727 | 16.1k | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 10 | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 10 |     return typeid_cast<const Type*>(&column); |  | 727 | 10 | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_11ColumnConstEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_16ColumnDictionaryIiEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE15EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE15EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE23EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE23EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE25EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE25EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_RKNS0_7IColumnE_ZN5doris10vectorized20check_and_get_columnINS0_9ColumnMapEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 2.30k | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 2.30k |     return typeid_cast<const Type*>(&column); |  | 727 | 2.30k | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnStructEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorItEEEEPKT_RKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIN4wide7integerILm128EjEEEEEEPKT_RKNS0_7IColumnE_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnObjectEEEPKT_RKNS0_7IColumnE| Line | Count | Source |  | 725 | 611 | const Type* check_and_get_column(const IColumn& column) { |  | 726 | 611 |     return typeid_cast<const Type*>(&column); |  | 727 | 611 | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIhEEEEPKT_RKNS0_7IColumnE | 
| 728 |  |  | 
| 729 |  | template <typename Type> | 
| 730 | 5.94M | const Type* check_and_get_column(const IColumn* column) { | 
| 731 | 5.94M |     return typeid_cast<const Type*>(column); | 
| 732 | 5.94M | } _ZN5doris10vectorized20check_and_get_columnINS0_14ColumnNullableEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 3.93M | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 3.93M |     return typeid_cast<const Type*>(column); |  | 732 | 3.93M | } | 
_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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE12EEEEEPKT_PKNS0_7IColumnE_ZN5doris10vectorized20check_and_get_columnINS0_9ColumnStrIjEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 1.15k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 1.15k |     return typeid_cast<const Type*>(column); |  | 732 | 1.15k | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnArrayEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 5.43k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 5.43k |     return typeid_cast<const Type*>(column); |  | 732 | 5.43k | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_11ColumnConstEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 1.92M | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 1.92M |     return typeid_cast<const Type*>(column); |  | 732 | 1.92M | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_9ColumnStrImEEEEPKT_PKNS0_7IColumnE_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 | 922 | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 922 |     return typeid_cast<const Type*>(column); |  | 732 | 922 | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIsEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 623 | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 623 |     return typeid_cast<const Type*>(column); |  | 732 | 623 | } | 
_ZN5doris10vectorized20check_and_get_columnINS0_12ColumnVectorIiEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 494 | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 494 |     return typeid_cast<const Type*>(column); |  | 732 | 494 | } | 
_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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE3EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE4EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE6EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE7EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE8EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE9EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE20EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE28EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE29EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE30EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE35EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_16ColumnDictionaryIiEEEEPKT_PKNS0_7IColumnEUnexecuted 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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE26EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE2EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE36EEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_19PredicateColumnTypeILNS_13PrimitiveTypeE37EEEEEPKT_PKNS0_7IColumnEUnexecuted 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 | 12.1k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 12.1k |     return typeid_cast<const Type*>(column); |  | 732 | 12.1k | } | 
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIsEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 9.88k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 9.88k |     return typeid_cast<const Type*>(column); |  | 732 | 9.88k | } | 
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIiEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 9.95k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 9.95k |     return typeid_cast<const Type*>(column); |  | 732 | 9.95k | } | 
_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIlEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 12.8k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 12.8k |     return typeid_cast<const Type*>(column); |  | 732 | 12.8k | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorInEEEEPKT_PKNS0_7IColumnE_ZN5doris10vectorized20check_and_get_columnIKNS0_12ColumnVectorIdEEEEPKT_PKNS0_7IColumnE| Line | Count | Source |  | 730 | 22.6k | const Type* check_and_get_column(const IColumn* column) { |  | 731 | 22.6k |     return typeid_cast<const Type*>(column); |  | 732 | 22.6k | } | 
Unexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_17ColumnComplexTypeINS_11HyperLogLogEEEEEPKT_PKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized20check_and_get_columnINS0_12ColumnObjectEEEPKT_PKNS0_7IColumnE | 
| 733 |  |  | 
| 734 |  | template <typename Type> | 
| 735 | 1.92M | bool check_column(const IColumn& column) { | 
| 736 | 1.92M |     return check_and_get_column<Type>(&column); | 
| 737 | 1.92M | } Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_9ColumnStrIjEEEEbRKNS0_7IColumnE_ZN5doris10vectorized12check_columnINS0_11ColumnConstEEEbRKNS0_7IColumnE| Line | Count | Source |  | 735 | 1.92M | bool check_column(const IColumn& column) { |  | 736 | 1.92M |     return check_and_get_column<Type>(&column); |  | 737 | 1.92M | } | 
Unexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_9ColumnStrImEEEEbRKNS0_7IColumnE_ZN5doris10vectorized12check_columnINS0_14ColumnNullableEEEbRKNS0_7IColumnE| Line | Count | Source |  | 735 | 747 | bool check_column(const IColumn& column) { |  | 736 | 747 |     return check_and_get_column<Type>(&column); |  | 737 | 747 | } | 
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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEbRKNS0_7IColumnEUnexecuted 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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIjEEEEbRKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorImEEEEbRKNS0_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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorInEEEEbPKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIoEEEEbPKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_12ColumnVectorIfEEEEbPKNS0_7IColumnEUnexecuted 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_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIlEEEEEEbPKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalInEEEEEEbPKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_12Decimal128V3EEEEEbPKNS0_7IColumnEUnexecuted instantiation: _ZN5doris10vectorized12check_columnINS0_13ColumnDecimalINS0_7DecimalIN4wide7integerILm256EiEEEEEEEEbPKNS0_7IColumnEUnexecuted 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.7k |     ColumnPtrWrapper(vectorized::ColumnPtr col) : column_ptr(std::move(col)) {} | 
| 757 |  | }; | 
| 758 |  | } // namespace doris |