| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // This file is copied from |
| // https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Field.cpp |
| // and modified by Doris |
| |
| #include "core/field.h" |
| |
| #include "core/accurate_comparison.h" |
| #include "core/data_type/data_type_decimal.h" |
| #include "core/data_type/define_primitive_type.h" |
| #include "core/data_type/primitive_type.h" |
| #include "core/decimal_comparison.h" |
| #include "core/value/bitmap_value.h" |
| #include "core/value/jsonb_value.h" |
| #include "core/value/timestamptz_value.h" |
| #include "core/value/vdatetime_value.h" |
| #include "exprs/function/cast/cast_to_string.h" |
| #include "util/io_helper.h" |
| #include "util/var_int.h" |
| |
| namespace doris { |
| class BufferReadable; |
| class BufferWritable; |
| |
| template <PrimitiveType T> |
| bool dec_equal(typename PrimitiveTypeTraits<T>::CppType x, |
| typename PrimitiveTypeTraits<T>::CppType y, UInt32 x_scale, UInt32 y_scale) { |
| using Comparator = DecimalComparison<T, T, EqualsOp>; |
| return Comparator::compare(x, y, x_scale, y_scale); |
| } |
| |
| template <PrimitiveType T> |
| bool dec_less(typename PrimitiveTypeTraits<T>::CppType x, |
| typename PrimitiveTypeTraits<T>::CppType y, UInt32 x_scale, UInt32 y_scale) { |
| using Comparator = DecimalComparison<T, T, LessOp>; |
| return Comparator::compare(x, y, x_scale, y_scale); |
| } |
| |
| template <PrimitiveType T> |
| bool dec_less_or_equal(typename PrimitiveTypeTraits<T>::CppType x, |
| typename PrimitiveTypeTraits<T>::CppType y, UInt32 x_scale, UInt32 y_scale) { |
| using Comparator = DecimalComparison<T, T, LessOrEqualsOp>; |
| return Comparator::compare(x, y, x_scale, y_scale); |
| } |
| |
| #define DECLARE_DECIMAL_COMPARISON(TYPE, PTYPE) \ |
| template <> \ |
| bool decimal_equal(TYPE x, TYPE y, UInt32 xs, UInt32 ys) { \ |
| return dec_equal<PTYPE>(x, y, xs, ys); \ |
| } \ |
| template <> \ |
| bool decimal_less(TYPE x, TYPE y, UInt32 xs, UInt32 ys) { \ |
| return dec_less<PTYPE>(x, y, xs, ys); \ |
| } \ |
| template <> \ |
| bool decimal_less_or_equal(TYPE x, TYPE y, UInt32 xs, UInt32 ys) { \ |
| return dec_less_or_equal<PTYPE>(x, y, xs, ys); \ |
| } |
| |
| DECLARE_DECIMAL_COMPARISON(Decimal32, TYPE_DECIMAL32) |
| DECLARE_DECIMAL_COMPARISON(Decimal64, TYPE_DECIMAL64) |
| DECLARE_DECIMAL_COMPARISON(DecimalV2Value, TYPE_DECIMALV2) |
| DECLARE_DECIMAL_COMPARISON(Decimal256, TYPE_DECIMAL256) |
| |
| template <> |
| bool decimal_equal(Decimal128V3 x, Decimal128V3 y, UInt32 xs, UInt32 ys) { |
| return dec_equal<TYPE_DECIMAL128I>(x, y, xs, ys); |
| } |
| template <> |
| bool decimal_less(Decimal128V3 x, Decimal128V3 y, UInt32 xs, UInt32 ys) { |
| return dec_less<TYPE_DECIMAL128I>(x, y, xs, ys); |
| } |
| template <> |
| bool decimal_less_or_equal(Decimal128V3 x, Decimal128V3 y, UInt32 xs, UInt32 ys) { |
| return dec_less_or_equal<TYPE_DECIMAL128I>(x, y, xs, ys); |
| } |
| |
| template <PrimitiveType Type> |
| void Field::create_concrete(typename PrimitiveTypeTraits<Type>::CppType&& x) { |
| // In both Field and PODArray, small types may be stored as wider types, |
| // e.g. char is stored as UInt64. Field can return this extended value |
| // with get<StorageType>(). To avoid uninitialized results from get(), |
| // we must initialize the entire wide stored type, and not just the |
| // nominal type. |
| using StorageType = typename PrimitiveTypeTraits<Type>::CppType; |
| new (&storage) StorageType(std::move(x)); |
| type = Type; |
| DCHECK_NE(type, PrimitiveType::INVALID_TYPE); |
| } |
| |
| template <PrimitiveType Type> |
| void Field::create_concrete(const typename PrimitiveTypeTraits<Type>::CppType& x) { |
| // In both Field and PODArray, small types may be stored as wider types, |
| // e.g. char is stored as UInt64. Field can return this extended value |
| // with get<StorageType>(). To avoid uninitialized results from get(), |
| // we must initialize the entire wide stored type, and not just the |
| // nominal type. |
| using StorageType = typename PrimitiveTypeTraits<Type>::CppType; |
| new (&storage) StorageType(x); |
| type = Type; |
| DCHECK_NE(type, PrimitiveType::INVALID_TYPE); |
| } |
| |
| void Field::create(Field&& field) { |
| switch (field.type) { |
| case PrimitiveType::TYPE_NULL: |
| create_concrete<TYPE_NULL>(std::move(field.template get<TYPE_NULL>())); |
| return; |
| case PrimitiveType::TYPE_DATETIMEV2: |
| create_concrete<TYPE_DATETIMEV2>(std::move(field.template get<TYPE_DATETIMEV2>())); |
| return; |
| case PrimitiveType::TYPE_DATEV2: |
| create_concrete<TYPE_DATEV2>(std::move(field.template get<TYPE_DATEV2>())); |
| return; |
| case PrimitiveType::TYPE_TIMESTAMPTZ: |
| create_concrete<TYPE_TIMESTAMPTZ>(std::move(field.template get<TYPE_TIMESTAMPTZ>())); |
| return; |
| case PrimitiveType::TYPE_DATETIME: |
| create_concrete<TYPE_DATETIME>(std::move(field.template get<TYPE_DATETIME>())); |
| return; |
| case PrimitiveType::TYPE_DATE: |
| create_concrete<TYPE_DATE>(std::move(field.template get<TYPE_DATE>())); |
| return; |
| case PrimitiveType::TYPE_BOOLEAN: |
| create_concrete<TYPE_BOOLEAN>(std::move(field.template get<TYPE_BOOLEAN>())); |
| return; |
| case PrimitiveType::TYPE_TINYINT: |
| create_concrete<TYPE_TINYINT>(std::move(field.template get<TYPE_TINYINT>())); |
| return; |
| case PrimitiveType::TYPE_SMALLINT: |
| create_concrete<TYPE_SMALLINT>(std::move(field.template get<TYPE_SMALLINT>())); |
| return; |
| case PrimitiveType::TYPE_INT: |
| create_concrete<TYPE_INT>(std::move(field.template get<TYPE_INT>())); |
| return; |
| case PrimitiveType::TYPE_BIGINT: |
| create_concrete<TYPE_BIGINT>(std::move(field.template get<TYPE_BIGINT>())); |
| return; |
| case PrimitiveType::TYPE_LARGEINT: |
| create_concrete<TYPE_LARGEINT>(std::move(field.template get<TYPE_LARGEINT>())); |
| return; |
| case PrimitiveType::TYPE_IPV4: |
| create_concrete<TYPE_IPV4>(std::move(field.template get<TYPE_IPV4>())); |
| return; |
| case PrimitiveType::TYPE_IPV6: |
| create_concrete<TYPE_IPV6>(std::move(field.template get<TYPE_IPV6>())); |
| return; |
| case PrimitiveType::TYPE_FLOAT: |
| create_concrete<TYPE_FLOAT>(std::move(field.template get<TYPE_FLOAT>())); |
| return; |
| case PrimitiveType::TYPE_TIMEV2: |
| create_concrete<TYPE_TIMEV2>(std::move(field.template get<TYPE_TIMEV2>())); |
| return; |
| case PrimitiveType::TYPE_DOUBLE: |
| create_concrete<TYPE_DOUBLE>(std::move(field.template get<TYPE_DOUBLE>())); |
| return; |
| case PrimitiveType::TYPE_STRING: |
| create_concrete<TYPE_STRING>(std::move(field.template get<TYPE_STRING>())); |
| return; |
| case PrimitiveType::TYPE_CHAR: |
| create_concrete<TYPE_CHAR>(std::move(field.template get<TYPE_CHAR>())); |
| return; |
| case PrimitiveType::TYPE_VARCHAR: |
| create_concrete<TYPE_VARCHAR>(std::move(field.template get<TYPE_VARCHAR>())); |
| return; |
| case PrimitiveType::TYPE_JSONB: |
| create_concrete<TYPE_JSONB>(std::move(field.template get<TYPE_JSONB>())); |
| return; |
| case PrimitiveType::TYPE_ARRAY: |
| create_concrete<TYPE_ARRAY>(std::move(field.template get<TYPE_ARRAY>())); |
| return; |
| case PrimitiveType::TYPE_STRUCT: |
| create_concrete<TYPE_STRUCT>(std::move(field.template get<TYPE_STRUCT>())); |
| return; |
| case PrimitiveType::TYPE_MAP: |
| create_concrete<TYPE_MAP>(std::move(field.template get<TYPE_MAP>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL32: |
| create_concrete<TYPE_DECIMAL32>(std::move(field.template get<TYPE_DECIMAL32>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL64: |
| create_concrete<TYPE_DECIMAL64>(std::move(field.template get<TYPE_DECIMAL64>())); |
| return; |
| case PrimitiveType::TYPE_DECIMALV2: |
| create_concrete<TYPE_DECIMALV2>(std::move(field.template get<TYPE_DECIMALV2>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL128I: |
| create_concrete<TYPE_DECIMAL128I>(std::move(field.template get<TYPE_DECIMAL128I>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL256: |
| create_concrete<TYPE_DECIMAL256>(std::move(field.template get<TYPE_DECIMAL256>())); |
| return; |
| case PrimitiveType::TYPE_VARIANT: |
| create_concrete<TYPE_VARIANT>(std::move(field.template get<TYPE_VARIANT>())); |
| return; |
| case PrimitiveType::TYPE_BITMAP: |
| create_concrete<TYPE_BITMAP>(std::move(field.template get<TYPE_BITMAP>())); |
| return; |
| case PrimitiveType::TYPE_HLL: |
| create_concrete<TYPE_HLL>(std::move(field.template get<TYPE_HLL>())); |
| return; |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| create_concrete<TYPE_QUANTILE_STATE>(std::move(field.template get<TYPE_QUANTILE_STATE>())); |
| return; |
| case PrimitiveType::TYPE_VARBINARY: |
| create_concrete<TYPE_VARBINARY>(std::move(field.template get<TYPE_VARBINARY>())); |
| return; |
| default: |
| throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name())); |
| } |
| } |
| |
| Field::Field(const Field& rhs) { |
| create(rhs); |
| } |
| |
| Field::Field(Field&& rhs) { |
| create(std::move(rhs)); |
| } |
| |
| Field& Field::operator=(const Field& rhs) { |
| if (this != &rhs) { |
| if (type != rhs.type) { |
| destroy(); |
| create(rhs); |
| } else { |
| assign(rhs); /// This assigns string or vector without deallocation of existing buffer. |
| } |
| } |
| return *this; |
| } |
| |
| void Field::create(const Field& field) { |
| switch (field.type) { |
| case PrimitiveType::TYPE_NULL: |
| create_concrete<TYPE_NULL>(field.template get<TYPE_NULL>()); |
| return; |
| case PrimitiveType::TYPE_DATETIMEV2: |
| create_concrete<TYPE_DATETIMEV2>(field.template get<TYPE_DATETIMEV2>()); |
| return; |
| case PrimitiveType::TYPE_DATEV2: |
| create_concrete<TYPE_DATEV2>(field.template get<TYPE_DATEV2>()); |
| return; |
| case PrimitiveType::TYPE_TIMESTAMPTZ: |
| create_concrete<TYPE_TIMESTAMPTZ>(field.template get<TYPE_TIMESTAMPTZ>()); |
| return; |
| case PrimitiveType::TYPE_DATETIME: |
| create_concrete<TYPE_DATETIME>(field.template get<TYPE_DATETIME>()); |
| return; |
| case PrimitiveType::TYPE_DATE: |
| create_concrete<TYPE_DATE>(field.template get<TYPE_DATE>()); |
| return; |
| case PrimitiveType::TYPE_BOOLEAN: |
| create_concrete<TYPE_BOOLEAN>(field.template get<TYPE_BOOLEAN>()); |
| return; |
| case PrimitiveType::TYPE_TINYINT: |
| create_concrete<TYPE_TINYINT>(field.template get<TYPE_TINYINT>()); |
| return; |
| case PrimitiveType::TYPE_SMALLINT: |
| create_concrete<TYPE_SMALLINT>(field.template get<TYPE_SMALLINT>()); |
| return; |
| case PrimitiveType::TYPE_INT: |
| create_concrete<TYPE_INT>(field.template get<TYPE_INT>()); |
| return; |
| case PrimitiveType::TYPE_BIGINT: |
| create_concrete<TYPE_BIGINT>(field.template get<TYPE_BIGINT>()); |
| return; |
| case PrimitiveType::TYPE_LARGEINT: |
| create_concrete<TYPE_LARGEINT>(field.template get<TYPE_LARGEINT>()); |
| return; |
| case PrimitiveType::TYPE_IPV4: |
| create_concrete<TYPE_IPV4>(field.template get<TYPE_IPV4>()); |
| return; |
| case PrimitiveType::TYPE_IPV6: |
| create_concrete<TYPE_IPV6>(field.template get<TYPE_IPV6>()); |
| return; |
| case PrimitiveType::TYPE_FLOAT: |
| create_concrete<TYPE_FLOAT>(field.template get<TYPE_FLOAT>()); |
| return; |
| case PrimitiveType::TYPE_TIMEV2: |
| create_concrete<TYPE_TIMEV2>(field.template get<TYPE_TIMEV2>()); |
| return; |
| case PrimitiveType::TYPE_DOUBLE: |
| create_concrete<TYPE_DOUBLE>(field.template get<TYPE_DOUBLE>()); |
| return; |
| case PrimitiveType::TYPE_STRING: |
| create_concrete<TYPE_STRING>(field.template get<TYPE_STRING>()); |
| return; |
| case PrimitiveType::TYPE_CHAR: |
| create_concrete<TYPE_CHAR>(field.template get<TYPE_CHAR>()); |
| return; |
| case PrimitiveType::TYPE_VARCHAR: |
| create_concrete<TYPE_VARCHAR>(field.template get<TYPE_VARCHAR>()); |
| return; |
| case PrimitiveType::TYPE_JSONB: |
| create_concrete<TYPE_JSONB>(field.template get<TYPE_JSONB>()); |
| return; |
| case PrimitiveType::TYPE_ARRAY: |
| create_concrete<TYPE_ARRAY>(field.template get<TYPE_ARRAY>()); |
| return; |
| case PrimitiveType::TYPE_STRUCT: |
| create_concrete<TYPE_STRUCT>(field.template get<TYPE_STRUCT>()); |
| return; |
| case PrimitiveType::TYPE_MAP: |
| create_concrete<TYPE_MAP>(field.template get<TYPE_MAP>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL32: |
| create_concrete<TYPE_DECIMAL32>(field.template get<TYPE_DECIMAL32>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL64: |
| create_concrete<TYPE_DECIMAL64>(field.template get<TYPE_DECIMAL64>()); |
| return; |
| case PrimitiveType::TYPE_DECIMALV2: |
| create_concrete<TYPE_DECIMALV2>(field.template get<TYPE_DECIMALV2>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL128I: |
| create_concrete<TYPE_DECIMAL128I>(field.template get<TYPE_DECIMAL128I>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL256: |
| create_concrete<TYPE_DECIMAL256>(field.template get<TYPE_DECIMAL256>()); |
| return; |
| case PrimitiveType::TYPE_VARIANT: |
| create_concrete<TYPE_VARIANT>(field.template get<TYPE_VARIANT>()); |
| return; |
| case PrimitiveType::TYPE_BITMAP: |
| create_concrete<TYPE_BITMAP>(field.template get<TYPE_BITMAP>()); |
| return; |
| case PrimitiveType::TYPE_HLL: |
| create_concrete<TYPE_HLL>(field.template get<TYPE_HLL>()); |
| return; |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| create_concrete<TYPE_QUANTILE_STATE>(field.template get<TYPE_QUANTILE_STATE>()); |
| return; |
| case PrimitiveType::TYPE_UINT32: |
| create_concrete<TYPE_UINT32>(field.template get<TYPE_UINT32>()); |
| return; |
| case PrimitiveType::TYPE_UINT64: |
| create_concrete<TYPE_UINT64>(field.template get<TYPE_UINT64>()); |
| return; |
| case PrimitiveType::TYPE_VARBINARY: |
| create_concrete<TYPE_VARBINARY>(field.template get<TYPE_VARBINARY>()); |
| return; |
| default: |
| throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name())); |
| } |
| } |
| |
| void Field::destroy() { |
| switch (type) { |
| case PrimitiveType::TYPE_STRING: |
| destroy<TYPE_STRING>(); |
| break; |
| case PrimitiveType::TYPE_CHAR: |
| destroy<TYPE_CHAR>(); |
| break; |
| case PrimitiveType::TYPE_VARCHAR: |
| destroy<TYPE_VARCHAR>(); |
| break; |
| case PrimitiveType::TYPE_JSONB: |
| destroy<TYPE_JSONB>(); |
| break; |
| case PrimitiveType::TYPE_ARRAY: |
| destroy<TYPE_ARRAY>(); |
| break; |
| case PrimitiveType::TYPE_STRUCT: |
| destroy<TYPE_STRUCT>(); |
| break; |
| case PrimitiveType::TYPE_MAP: |
| destroy<TYPE_MAP>(); |
| break; |
| case PrimitiveType::TYPE_VARIANT: |
| destroy<TYPE_VARIANT>(); |
| break; |
| case PrimitiveType::TYPE_BITMAP: |
| destroy<TYPE_BITMAP>(); |
| break; |
| case PrimitiveType::TYPE_HLL: |
| destroy<TYPE_HLL>(); |
| break; |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| destroy<TYPE_QUANTILE_STATE>(); |
| break; |
| case PrimitiveType::TYPE_VARBINARY: |
| destroy<TYPE_VARBINARY>(); |
| break; |
| default: |
| break; |
| } |
| |
| type = PrimitiveType:: |
| TYPE_NULL; /// for exception safety in subsequent calls to destroy and create, when create fails. |
| } |
| |
| void Field::assign(Field&& field) { |
| switch (field.type) { |
| case PrimitiveType::TYPE_NULL: |
| assign_concrete<TYPE_NULL>(std::move(field.template get<TYPE_NULL>())); |
| return; |
| case PrimitiveType::TYPE_DATETIMEV2: |
| assign_concrete<TYPE_DATETIMEV2>(std::move(field.template get<TYPE_DATETIMEV2>())); |
| return; |
| case PrimitiveType::TYPE_DATETIME: |
| assign_concrete<TYPE_DATETIME>(std::move(field.template get<TYPE_DATETIME>())); |
| return; |
| case PrimitiveType::TYPE_DATE: |
| assign_concrete<TYPE_DATE>(std::move(field.template get<TYPE_DATE>())); |
| return; |
| case PrimitiveType::TYPE_DATEV2: |
| assign_concrete<TYPE_DATEV2>(std::move(field.template get<TYPE_DATEV2>())); |
| return; |
| case PrimitiveType::TYPE_TIMESTAMPTZ: |
| assign_concrete<TYPE_TIMESTAMPTZ>(std::move(field.template get<TYPE_TIMESTAMPTZ>())); |
| return; |
| case PrimitiveType::TYPE_BOOLEAN: |
| assign_concrete<TYPE_BOOLEAN>(std::move(field.template get<TYPE_BOOLEAN>())); |
| return; |
| case PrimitiveType::TYPE_TINYINT: |
| assign_concrete<TYPE_TINYINT>(std::move(field.template get<TYPE_TINYINT>())); |
| return; |
| case PrimitiveType::TYPE_SMALLINT: |
| assign_concrete<TYPE_SMALLINT>(std::move(field.template get<TYPE_SMALLINT>())); |
| return; |
| case PrimitiveType::TYPE_INT: |
| assign_concrete<TYPE_INT>(std::move(field.template get<TYPE_INT>())); |
| return; |
| case PrimitiveType::TYPE_BIGINT: |
| assign_concrete<TYPE_BIGINT>(std::move(field.template get<TYPE_BIGINT>())); |
| return; |
| case PrimitiveType::TYPE_LARGEINT: |
| assign_concrete<TYPE_LARGEINT>(std::move(field.template get<TYPE_LARGEINT>())); |
| return; |
| case PrimitiveType::TYPE_IPV4: |
| assign_concrete<TYPE_IPV4>(std::move(field.template get<TYPE_IPV4>())); |
| return; |
| case PrimitiveType::TYPE_IPV6: |
| assign_concrete<TYPE_IPV6>(std::move(field.template get<TYPE_IPV6>())); |
| return; |
| case PrimitiveType::TYPE_FLOAT: |
| assign_concrete<TYPE_FLOAT>(std::move(field.template get<TYPE_FLOAT>())); |
| return; |
| case PrimitiveType::TYPE_TIMEV2: |
| assign_concrete<TYPE_TIMEV2>(std::move(field.template get<TYPE_TIMEV2>())); |
| return; |
| case PrimitiveType::TYPE_DOUBLE: |
| assign_concrete<TYPE_DOUBLE>(std::move(field.template get<TYPE_DOUBLE>())); |
| return; |
| case PrimitiveType::TYPE_STRING: |
| assign_concrete<TYPE_STRING>(std::move(field.template get<TYPE_STRING>())); |
| return; |
| case PrimitiveType::TYPE_CHAR: |
| assign_concrete<TYPE_CHAR>(std::move(field.template get<TYPE_CHAR>())); |
| return; |
| case PrimitiveType::TYPE_VARCHAR: |
| assign_concrete<TYPE_VARCHAR>(std::move(field.template get<TYPE_VARCHAR>())); |
| return; |
| case PrimitiveType::TYPE_JSONB: |
| assign_concrete<TYPE_JSONB>(std::move(field.template get<TYPE_JSONB>())); |
| return; |
| case PrimitiveType::TYPE_ARRAY: |
| assign_concrete<TYPE_ARRAY>(std::move(field.template get<TYPE_ARRAY>())); |
| return; |
| case PrimitiveType::TYPE_STRUCT: |
| assign_concrete<TYPE_STRUCT>(std::move(field.template get<TYPE_STRUCT>())); |
| return; |
| case PrimitiveType::TYPE_MAP: |
| assign_concrete<TYPE_MAP>(std::move(field.template get<TYPE_MAP>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL32: |
| assign_concrete<TYPE_DECIMAL32>(std::move(field.template get<TYPE_DECIMAL32>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL64: |
| assign_concrete<TYPE_DECIMAL64>(std::move(field.template get<TYPE_DECIMAL64>())); |
| return; |
| case PrimitiveType::TYPE_DECIMALV2: |
| assign_concrete<TYPE_DECIMALV2>(std::move(field.template get<TYPE_DECIMALV2>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL128I: |
| assign_concrete<TYPE_DECIMAL128I>(std::move(field.template get<TYPE_DECIMAL128I>())); |
| return; |
| case PrimitiveType::TYPE_DECIMAL256: |
| assign_concrete<TYPE_DECIMAL256>(std::move(field.template get<TYPE_DECIMAL256>())); |
| return; |
| case PrimitiveType::TYPE_VARIANT: |
| assign_concrete<TYPE_VARIANT>(std::move(field.template get<TYPE_VARIANT>())); |
| return; |
| case PrimitiveType::TYPE_BITMAP: |
| assign_concrete<TYPE_BITMAP>(std::move(field.template get<TYPE_BITMAP>())); |
| return; |
| case PrimitiveType::TYPE_HLL: |
| assign_concrete<TYPE_HLL>(std::move(field.template get<TYPE_HLL>())); |
| return; |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| assign_concrete<TYPE_QUANTILE_STATE>(std::move(field.template get<TYPE_QUANTILE_STATE>())); |
| return; |
| case PrimitiveType::TYPE_VARBINARY: |
| assign_concrete<TYPE_VARBINARY>(std::move(field.template get<TYPE_VARBINARY>())); |
| return; |
| default: |
| throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name())); |
| } |
| } |
| |
| void Field::assign(const Field& field) { |
| switch (field.type) { |
| case PrimitiveType::TYPE_NULL: |
| assign_concrete<TYPE_NULL>(field.template get<TYPE_NULL>()); |
| return; |
| case PrimitiveType::TYPE_DATETIMEV2: |
| assign_concrete<TYPE_DATETIMEV2>(field.template get<TYPE_DATETIMEV2>()); |
| return; |
| case PrimitiveType::TYPE_DATETIME: |
| assign_concrete<TYPE_DATETIME>(field.template get<TYPE_DATETIME>()); |
| return; |
| case PrimitiveType::TYPE_DATE: |
| assign_concrete<TYPE_DATE>(field.template get<TYPE_DATE>()); |
| return; |
| case PrimitiveType::TYPE_DATEV2: |
| assign_concrete<TYPE_DATEV2>(field.template get<TYPE_DATEV2>()); |
| return; |
| case PrimitiveType::TYPE_TIMESTAMPTZ: |
| assign_concrete<TYPE_TIMESTAMPTZ>(field.template get<TYPE_TIMESTAMPTZ>()); |
| return; |
| case PrimitiveType::TYPE_BOOLEAN: |
| assign_concrete<TYPE_BOOLEAN>(field.template get<TYPE_BOOLEAN>()); |
| return; |
| case PrimitiveType::TYPE_TINYINT: |
| assign_concrete<TYPE_TINYINT>(field.template get<TYPE_TINYINT>()); |
| return; |
| case PrimitiveType::TYPE_SMALLINT: |
| assign_concrete<TYPE_SMALLINT>(field.template get<TYPE_SMALLINT>()); |
| return; |
| case PrimitiveType::TYPE_INT: |
| assign_concrete<TYPE_INT>(field.template get<TYPE_INT>()); |
| return; |
| case PrimitiveType::TYPE_BIGINT: |
| assign_concrete<TYPE_BIGINT>(field.template get<TYPE_BIGINT>()); |
| return; |
| case PrimitiveType::TYPE_LARGEINT: |
| assign_concrete<TYPE_LARGEINT>(field.template get<TYPE_LARGEINT>()); |
| return; |
| case PrimitiveType::TYPE_IPV4: |
| assign_concrete<TYPE_IPV4>(field.template get<TYPE_IPV4>()); |
| return; |
| case PrimitiveType::TYPE_IPV6: |
| assign_concrete<TYPE_IPV6>(field.template get<TYPE_IPV6>()); |
| return; |
| case PrimitiveType::TYPE_FLOAT: |
| assign_concrete<TYPE_FLOAT>(field.template get<TYPE_FLOAT>()); |
| return; |
| case PrimitiveType::TYPE_TIMEV2: |
| assign_concrete<TYPE_TIMEV2>(field.template get<TYPE_TIMEV2>()); |
| return; |
| case PrimitiveType::TYPE_DOUBLE: |
| assign_concrete<TYPE_DOUBLE>(field.template get<TYPE_DOUBLE>()); |
| return; |
| case PrimitiveType::TYPE_STRING: |
| assign_concrete<TYPE_STRING>(field.template get<TYPE_STRING>()); |
| return; |
| case PrimitiveType::TYPE_CHAR: |
| assign_concrete<TYPE_CHAR>(field.template get<TYPE_CHAR>()); |
| return; |
| case PrimitiveType::TYPE_VARCHAR: |
| assign_concrete<TYPE_VARCHAR>(field.template get<TYPE_VARCHAR>()); |
| return; |
| case PrimitiveType::TYPE_JSONB: |
| assign_concrete<TYPE_JSONB>(field.template get<TYPE_JSONB>()); |
| return; |
| case PrimitiveType::TYPE_ARRAY: |
| assign_concrete<TYPE_ARRAY>(field.template get<TYPE_ARRAY>()); |
| return; |
| case PrimitiveType::TYPE_STRUCT: |
| assign_concrete<TYPE_STRUCT>(field.template get<TYPE_STRUCT>()); |
| return; |
| case PrimitiveType::TYPE_MAP: |
| assign_concrete<TYPE_MAP>(field.template get<TYPE_MAP>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL32: |
| assign_concrete<TYPE_DECIMAL32>(field.template get<TYPE_DECIMAL32>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL64: |
| assign_concrete<TYPE_DECIMAL64>(field.template get<TYPE_DECIMAL64>()); |
| return; |
| case PrimitiveType::TYPE_DECIMALV2: |
| assign_concrete<TYPE_DECIMALV2>(field.template get<TYPE_DECIMALV2>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL128I: |
| assign_concrete<TYPE_DECIMAL128I>(field.template get<TYPE_DECIMAL128I>()); |
| return; |
| case PrimitiveType::TYPE_DECIMAL256: |
| assign_concrete<TYPE_DECIMAL256>(field.template get<TYPE_DECIMAL256>()); |
| return; |
| case PrimitiveType::TYPE_VARIANT: |
| assign_concrete<TYPE_VARIANT>(field.template get<TYPE_VARIANT>()); |
| return; |
| case PrimitiveType::TYPE_BITMAP: |
| assign_concrete<TYPE_BITMAP>(field.template get<TYPE_BITMAP>()); |
| return; |
| case PrimitiveType::TYPE_HLL: |
| assign_concrete<TYPE_HLL>(field.template get<TYPE_HLL>()); |
| return; |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| assign_concrete<TYPE_QUANTILE_STATE>(field.template get<TYPE_QUANTILE_STATE>()); |
| return; |
| case PrimitiveType::TYPE_UINT32: |
| assign_concrete<TYPE_UINT32>(field.template get<TYPE_UINT32>()); |
| return; |
| case PrimitiveType::TYPE_UINT64: |
| assign_concrete<TYPE_UINT64>(field.template get<TYPE_UINT64>()); |
| return; |
| case PrimitiveType::TYPE_VARBINARY: |
| assign_concrete<TYPE_VARBINARY>(field.template get<TYPE_VARBINARY>()); |
| return; |
| default: |
| throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name())); |
| } |
| } |
| |
| /// Assuming same types. |
| template <PrimitiveType Type> |
| void Field::assign_concrete(typename PrimitiveTypeTraits<Type>::CppType&& x) { |
| auto* MAY_ALIAS ptr = reinterpret_cast<typename PrimitiveTypeTraits<Type>::CppType*>(&storage); |
| *ptr = std::forward<typename PrimitiveTypeTraits<Type>::CppType>(x); |
| } |
| |
| template <PrimitiveType Type> |
| void Field::assign_concrete(const typename PrimitiveTypeTraits<Type>::CppType& x) { |
| auto* MAY_ALIAS ptr = reinterpret_cast<typename PrimitiveTypeTraits<Type>::CppType*>(&storage); |
| *ptr = std::forward<const typename PrimitiveTypeTraits<Type>::CppType>(x); |
| } |
| |
| std::string Field::get_type_name() const { |
| return type_to_string(type); |
| } |
| |
| template <PrimitiveType T> |
| typename PrimitiveTypeTraits<T>::CppType& Field::get() { |
| DCHECK(T == type || (is_string_type(type) && is_string_type(T)) || type == TYPE_NULL) |
| << "Type mismatch: requested " << type_to_string(T) << ", actual " << get_type_name(); |
| auto* MAY_ALIAS ptr = reinterpret_cast<typename PrimitiveTypeTraits<T>::CppType*>(&storage); |
| return *ptr; |
| } |
| |
| template <PrimitiveType T> |
| const typename PrimitiveTypeTraits<T>::CppType& Field::get() const { |
| DCHECK(T == type || (is_string_type(type) && is_string_type(T)) || type == TYPE_NULL) |
| << "Type mismatch: requested " << type_to_string(T) << ", actual " << get_type_name(); |
| const auto* MAY_ALIAS ptr = |
| reinterpret_cast<const typename PrimitiveTypeTraits<T>::CppType*>(&storage); |
| return *ptr; |
| } |
| |
| template <PrimitiveType T> |
| void Field::destroy() { |
| using TargetType = typename PrimitiveTypeTraits<T>::CppType; |
| DCHECK(T == type || ((is_string_type(type) && is_string_type(T)))) |
| << "Type mismatch: requested " << type_to_string(T) << ", actual " << get_type_name(); |
| auto* MAY_ALIAS ptr = reinterpret_cast<TargetType*>(&storage); |
| ptr->~TargetType(); |
| } |
| |
| std::strong_ordering Field::operator<=>(const Field& rhs) const { |
| if (type == PrimitiveType::TYPE_NULL || rhs == PrimitiveType::TYPE_NULL) { |
| return type <=> rhs.type; |
| } |
| if (type != rhs.type) { |
| throw Exception(Status::FatalError("lhs type not equal with rhs, lhs={}, rhs={}", |
| get_type_name(), rhs.get_type_name())); |
| } |
| |
| switch (type) { |
| case PrimitiveType::TYPE_BITMAP: |
| case PrimitiveType::TYPE_HLL: |
| case PrimitiveType::TYPE_QUANTILE_STATE: |
| case PrimitiveType::INVALID_TYPE: |
| case PrimitiveType::TYPE_JSONB: |
| case PrimitiveType::TYPE_NULL: |
| case PrimitiveType::TYPE_ARRAY: |
| case PrimitiveType::TYPE_MAP: |
| case PrimitiveType::TYPE_STRUCT: |
| case PrimitiveType::TYPE_VARIANT: |
| return std::strong_ordering::equal; //TODO: throw Exception? |
| case PrimitiveType::TYPE_DATETIMEV2: |
| return get<PrimitiveType::TYPE_DATETIMEV2>().to_date_int_val() <=> |
| rhs.get<PrimitiveType::TYPE_DATETIMEV2>().to_date_int_val(); |
| case PrimitiveType::TYPE_DATEV2: |
| return get<PrimitiveType::TYPE_DATEV2>().to_date_int_val() <=> |
| rhs.get<PrimitiveType::TYPE_DATEV2>().to_date_int_val(); |
| case PrimitiveType::TYPE_TIMESTAMPTZ: |
| return get<PrimitiveType::TYPE_TIMESTAMPTZ>().to_date_int_val() <=> |
| rhs.get<PrimitiveType::TYPE_TIMESTAMPTZ>().to_date_int_val(); |
| case PrimitiveType::TYPE_DATE: |
| return get<PrimitiveType::TYPE_DATE>() <=> rhs.get<PrimitiveType::TYPE_DATE>(); |
| case PrimitiveType::TYPE_DATETIME: |
| return get<PrimitiveType::TYPE_DATETIME>() <=> rhs.get<PrimitiveType::TYPE_DATETIME>(); |
| case PrimitiveType::TYPE_BIGINT: |
| return get<PrimitiveType::TYPE_BIGINT>() <=> rhs.get<PrimitiveType::TYPE_BIGINT>(); |
| case PrimitiveType::TYPE_BOOLEAN: |
| return get<PrimitiveType::TYPE_BOOLEAN>() <=> rhs.get<PrimitiveType::TYPE_BOOLEAN>(); |
| case PrimitiveType::TYPE_TINYINT: |
| return get<TYPE_TINYINT>() <=> rhs.get<TYPE_TINYINT>(); |
| case PrimitiveType::TYPE_SMALLINT: |
| return get<TYPE_SMALLINT>() <=> rhs.get<TYPE_SMALLINT>(); |
| case PrimitiveType::TYPE_INT: |
| return get<TYPE_INT>() <=> rhs.get<TYPE_INT>(); |
| case PrimitiveType::TYPE_LARGEINT: |
| return get<TYPE_LARGEINT>() <=> rhs.get<TYPE_LARGEINT>(); |
| case PrimitiveType::TYPE_IPV6: |
| return get<TYPE_IPV6>() <=> rhs.get<TYPE_IPV6>(); |
| case PrimitiveType::TYPE_IPV4: |
| return get<TYPE_IPV4>() <=> rhs.get<TYPE_IPV4>(); |
| case PrimitiveType::TYPE_FLOAT: |
| return get<TYPE_FLOAT>() < rhs.get<TYPE_FLOAT>() ? std::strong_ordering::less |
| : get<TYPE_FLOAT>() == rhs.get<TYPE_FLOAT>() ? std::strong_ordering::equal |
| : std::strong_ordering::greater; |
| case PrimitiveType::TYPE_TIMEV2: |
| return get<TYPE_TIMEV2>() < rhs.get<TYPE_TIMEV2>() ? std::strong_ordering::less |
| : get<TYPE_TIMEV2>() == rhs.get<TYPE_TIMEV2>() ? std::strong_ordering::equal |
| : std::strong_ordering::greater; |
| case PrimitiveType::TYPE_DOUBLE: |
| return get<TYPE_DOUBLE>() < rhs.get<TYPE_DOUBLE>() ? std::strong_ordering::less |
| : get<TYPE_DOUBLE>() == rhs.get<TYPE_DOUBLE>() ? std::strong_ordering::equal |
| : std::strong_ordering::greater; |
| case PrimitiveType::TYPE_STRING: |
| return get<TYPE_STRING>() <=> rhs.get<TYPE_STRING>(); |
| case PrimitiveType::TYPE_CHAR: |
| return get<TYPE_CHAR>() <=> rhs.get<TYPE_CHAR>(); |
| case PrimitiveType::TYPE_VARCHAR: |
| return get<TYPE_VARCHAR>() <=> rhs.get<TYPE_VARCHAR>(); |
| case PrimitiveType::TYPE_VARBINARY: |
| return get<TYPE_VARBINARY>() <=> rhs.get<TYPE_VARBINARY>(); |
| case PrimitiveType::TYPE_DECIMAL32: |
| return get<TYPE_DECIMAL32>() <=> rhs.get<TYPE_DECIMAL32>(); |
| case PrimitiveType::TYPE_DECIMAL64: |
| return get<TYPE_DECIMAL64>() <=> rhs.get<TYPE_DECIMAL64>(); |
| case PrimitiveType::TYPE_DECIMALV2: |
| return get<TYPE_DECIMALV2>() <=> rhs.get<TYPE_DECIMALV2>(); |
| case PrimitiveType::TYPE_DECIMAL128I: |
| return get<TYPE_DECIMAL128I>() <=> rhs.get<TYPE_DECIMAL128I>(); |
| case PrimitiveType::TYPE_DECIMAL256: |
| return get<TYPE_DECIMAL256>() <=> rhs.get<TYPE_DECIMAL256>(); |
| default: |
| throw Exception(Status::FatalError("Unsupported type: {}", get_type_name())); |
| } |
| } |
| |
| #define MATCH_PRIMITIVE_TYPE(primitive_type) \ |
| if (type == primitive_type) { \ |
| const auto& v = get<primitive_type>(); \ |
| return std::string_view(reinterpret_cast<const char*>(&v), sizeof(v)); \ |
| } |
| |
| std::string_view Field::as_string_view() const { |
| if (type == PrimitiveType::TYPE_STRING || type == PrimitiveType::TYPE_VARCHAR || |
| type == PrimitiveType::TYPE_CHAR) { |
| const auto& s = get<TYPE_STRING>(); |
| return {s.data(), s.size()}; |
| } |
| if (type == PrimitiveType::TYPE_VARBINARY) { |
| const auto& svf = get<TYPE_VARBINARY>(); |
| return {svf.data(), svf.size()}; |
| } |
| // MATCH_PRIMITIVE_TYPE(INVALID_TYPE); |
| // MATCH_PRIMITIVE_TYPE(TYPE_NULL); |
| MATCH_PRIMITIVE_TYPE(TYPE_BOOLEAN); |
| MATCH_PRIMITIVE_TYPE(TYPE_TINYINT); |
| MATCH_PRIMITIVE_TYPE(TYPE_SMALLINT); |
| MATCH_PRIMITIVE_TYPE(TYPE_INT); |
| MATCH_PRIMITIVE_TYPE(TYPE_BIGINT); |
| MATCH_PRIMITIVE_TYPE(TYPE_LARGEINT); |
| MATCH_PRIMITIVE_TYPE(TYPE_FLOAT) |
| MATCH_PRIMITIVE_TYPE(TYPE_DOUBLE); |
| // MATCH_PRIMITIVE_TYPE(TYPE_VARCHAR); |
| MATCH_PRIMITIVE_TYPE(TYPE_DATE); |
| MATCH_PRIMITIVE_TYPE(TYPE_DATETIME); |
| MATCH_PRIMITIVE_TYPE(TYPE_TIMESTAMPTZ); |
| // MATCH_PRIMITIVE_TYPE(TYPE_BINARY); |
| // MATCH_PRIMITIVE_TYPE(TYPE_DECIMAL); |
| // MATCH_PRIMITIVE_TYPE(TYPE_CHAR); |
| // MATCH_PRIMITIVE_TYPE(TYPE_STRUCT); |
| // MATCH_PRIMITIVE_TYPE(TYPE_ARRAY); |
| // MATCH_PRIMITIVE_TYPE(TYPE_MAP); |
| // MATCH_PRIMITIVE_TYPE(TYPE_HLL); |
| MATCH_PRIMITIVE_TYPE(TYPE_DECIMALV2); |
| MATCH_PRIMITIVE_TYPE(TYPE_TIME); |
| // MATCH_PRIMITIVE_TYPE(TYPE_BITMAP); |
| // MATCH_PRIMITIVE_TYPE(TYPE_STRING); |
| // MATCH_PRIMITIVE_TYPE(TYPE_QUANTILE_STATE); |
| MATCH_PRIMITIVE_TYPE(TYPE_DATEV2); |
| MATCH_PRIMITIVE_TYPE(TYPE_DATETIMEV2); |
| MATCH_PRIMITIVE_TYPE(TYPE_TIMEV2); |
| MATCH_PRIMITIVE_TYPE(TYPE_DECIMAL32); |
| MATCH_PRIMITIVE_TYPE(TYPE_DECIMAL64); |
| MATCH_PRIMITIVE_TYPE(TYPE_DECIMAL128I); |
| // MATCH_PRIMITIVE_TYPE(TYPE_JSONB); |
| // MATCH_PRIMITIVE_TYPE(TYPE_VARIANT); |
| // MATCH_PRIMITIVE_TYPE(TYPE_LAMBDA_FUNCTION); |
| // MATCH_PRIMITIVE_TYPE(TYPE_AGG_STATE); |
| MATCH_PRIMITIVE_TYPE(TYPE_DECIMAL256); |
| MATCH_PRIMITIVE_TYPE(TYPE_IPV4); |
| MATCH_PRIMITIVE_TYPE(TYPE_IPV6); |
| MATCH_PRIMITIVE_TYPE(TYPE_UINT32); |
| MATCH_PRIMITIVE_TYPE(TYPE_UINT64); |
| // MATCH_PRIMITIVE_TYPE(TYPE_FIXED_LENGTH_OBJECT); |
| throw Exception( |
| Status::FatalError("type not supported for as_string_view, type={}", get_type_name())); |
| } |
| |
| #undef MATCH_PRIMITIVE_TYPE |
| |
| #define DECLARE_FUNCTION(FUNC_NAME) \ |
| template void Field::FUNC_NAME<TYPE_NULL>(typename PrimitiveTypeTraits<TYPE_NULL>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_TINYINT>( \ |
| typename PrimitiveTypeTraits<TYPE_TINYINT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_SMALLINT>( \ |
| typename PrimitiveTypeTraits<TYPE_SMALLINT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_INT>(typename PrimitiveTypeTraits<TYPE_INT>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_BIGINT>( \ |
| typename PrimitiveTypeTraits<TYPE_BIGINT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_LARGEINT>( \ |
| typename PrimitiveTypeTraits<TYPE_LARGEINT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATE>(typename PrimitiveTypeTraits<TYPE_DATE>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATETIME>( \ |
| typename PrimitiveTypeTraits<TYPE_DATETIME>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATEV2>( \ |
| typename PrimitiveTypeTraits<TYPE_DATEV2>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATETIMEV2>( \ |
| typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL32>( \ |
| typename PrimitiveTypeTraits<TYPE_DECIMAL32>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL64>( \ |
| typename PrimitiveTypeTraits<TYPE_DECIMAL64>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMALV2>( \ |
| typename PrimitiveTypeTraits<TYPE_DECIMALV2>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL128I>( \ |
| typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL256>( \ |
| typename PrimitiveTypeTraits<TYPE_DECIMAL256>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_CHAR>(typename PrimitiveTypeTraits<TYPE_CHAR>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARCHAR>( \ |
| typename PrimitiveTypeTraits<TYPE_VARCHAR>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_STRING>( \ |
| typename PrimitiveTypeTraits<TYPE_STRING>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARBINARY>( \ |
| typename PrimitiveTypeTraits<TYPE_VARBINARY>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_HLL>(typename PrimitiveTypeTraits<TYPE_HLL>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARIANT>( \ |
| typename PrimitiveTypeTraits<TYPE_VARIANT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_QUANTILE_STATE>( \ |
| typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_ARRAY>( \ |
| typename PrimitiveTypeTraits<TYPE_ARRAY>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIME>(typename PrimitiveTypeTraits<TYPE_TIME>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIME>( \ |
| const typename PrimitiveTypeTraits<TYPE_TIME>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_NULL>( \ |
| const typename PrimitiveTypeTraits<TYPE_NULL>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_TINYINT>( \ |
| const typename PrimitiveTypeTraits<TYPE_TINYINT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_SMALLINT>( \ |
| const typename PrimitiveTypeTraits<TYPE_SMALLINT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_INT>( \ |
| const typename PrimitiveTypeTraits<TYPE_INT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_BIGINT>( \ |
| const typename PrimitiveTypeTraits<TYPE_BIGINT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_LARGEINT>( \ |
| const typename PrimitiveTypeTraits<TYPE_LARGEINT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATE>( \ |
| const typename PrimitiveTypeTraits<TYPE_DATE>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATETIME>( \ |
| const typename PrimitiveTypeTraits<TYPE_DATETIME>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATEV2>( \ |
| const typename PrimitiveTypeTraits<TYPE_DATEV2>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DATETIMEV2>( \ |
| const typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIMESTAMPTZ>( \ |
| const typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIMESTAMPTZ>( \ |
| typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL32>( \ |
| const typename PrimitiveTypeTraits<TYPE_DECIMAL32>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL64>( \ |
| const typename PrimitiveTypeTraits<TYPE_DECIMAL64>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMALV2>( \ |
| const typename PrimitiveTypeTraits<TYPE_DECIMALV2>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL128I>( \ |
| const typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DECIMAL256>( \ |
| const typename PrimitiveTypeTraits<TYPE_DECIMAL256>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_CHAR>( \ |
| const typename PrimitiveTypeTraits<TYPE_CHAR>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARCHAR>( \ |
| const typename PrimitiveTypeTraits<TYPE_VARCHAR>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_STRING>( \ |
| const typename PrimitiveTypeTraits<TYPE_STRING>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARBINARY>( \ |
| const typename PrimitiveTypeTraits<TYPE_VARBINARY>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_HLL>( \ |
| const typename PrimitiveTypeTraits<TYPE_HLL>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_VARIANT>( \ |
| const typename PrimitiveTypeTraits<TYPE_VARIANT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_QUANTILE_STATE>( \ |
| const typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_ARRAY>( \ |
| const typename PrimitiveTypeTraits<TYPE_ARRAY>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_IPV4>(typename PrimitiveTypeTraits<TYPE_IPV4>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_IPV4>( \ |
| const typename PrimitiveTypeTraits<TYPE_IPV4>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_IPV6>(typename PrimitiveTypeTraits<TYPE_IPV6>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_IPV6>( \ |
| const typename PrimitiveTypeTraits<TYPE_IPV6>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_BOOLEAN>( \ |
| typename PrimitiveTypeTraits<TYPE_BOOLEAN>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_BOOLEAN>( \ |
| const typename PrimitiveTypeTraits<TYPE_BOOLEAN>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_FLOAT>( \ |
| typename PrimitiveTypeTraits<TYPE_FLOAT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_FLOAT>( \ |
| const typename PrimitiveTypeTraits<TYPE_FLOAT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_DOUBLE>( \ |
| typename PrimitiveTypeTraits<TYPE_DOUBLE>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_DOUBLE>( \ |
| const typename PrimitiveTypeTraits<TYPE_DOUBLE>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_JSONB>( \ |
| typename PrimitiveTypeTraits<TYPE_JSONB>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_JSONB>( \ |
| const typename PrimitiveTypeTraits<TYPE_JSONB>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_STRUCT>( \ |
| typename PrimitiveTypeTraits<TYPE_STRUCT>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_STRUCT>( \ |
| const typename PrimitiveTypeTraits<TYPE_STRUCT>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_MAP>(typename PrimitiveTypeTraits<TYPE_MAP>::CppType && \ |
| rhs); \ |
| template void Field::FUNC_NAME<TYPE_MAP>( \ |
| const typename PrimitiveTypeTraits<TYPE_MAP>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_BITMAP>( \ |
| typename PrimitiveTypeTraits<TYPE_BITMAP>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_BITMAP>( \ |
| const typename PrimitiveTypeTraits<TYPE_BITMAP>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIMEV2>( \ |
| const typename PrimitiveTypeTraits<TYPE_TIMEV2>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_TIMEV2>( \ |
| typename PrimitiveTypeTraits<TYPE_TIMEV2>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_UINT32>( \ |
| const typename PrimitiveTypeTraits<TYPE_UINT32>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_UINT32>( \ |
| typename PrimitiveTypeTraits<TYPE_UINT32>::CppType && rhs); \ |
| template void Field::FUNC_NAME<TYPE_UINT64>( \ |
| const typename PrimitiveTypeTraits<TYPE_UINT64>::CppType& rhs); \ |
| template void Field::FUNC_NAME<TYPE_UINT64>( \ |
| typename PrimitiveTypeTraits<TYPE_UINT64>::CppType && rhs); |
| DECLARE_FUNCTION(create_concrete) |
| DECLARE_FUNCTION(assign_concrete) |
| #undef DECLARE_FUNCTION |
| |
| #define DECLARE_FUNCTION(TYPE_NAME) \ |
| template typename PrimitiveTypeTraits<TYPE_NAME>::CppType& Field::get<TYPE_NAME>(); \ |
| template const typename PrimitiveTypeTraits<TYPE_NAME>::CppType& Field::get<TYPE_NAME>() \ |
| const; \ |
| template void Field::destroy<TYPE_NAME>(); |
| DECLARE_FUNCTION(TYPE_NULL) |
| DECLARE_FUNCTION(TYPE_TINYINT) |
| DECLARE_FUNCTION(TYPE_SMALLINT) |
| DECLARE_FUNCTION(TYPE_INT) |
| DECLARE_FUNCTION(TYPE_BIGINT) |
| DECLARE_FUNCTION(TYPE_LARGEINT) |
| DECLARE_FUNCTION(TYPE_DATE) |
| DECLARE_FUNCTION(TYPE_DATETIME) |
| DECLARE_FUNCTION(TYPE_DATEV2) |
| DECLARE_FUNCTION(TYPE_DATETIMEV2) |
| DECLARE_FUNCTION(TYPE_TIMESTAMPTZ) |
| DECLARE_FUNCTION(TYPE_DECIMAL32) |
| DECLARE_FUNCTION(TYPE_DECIMAL64) |
| DECLARE_FUNCTION(TYPE_DECIMALV2) |
| DECLARE_FUNCTION(TYPE_DECIMAL128I) |
| DECLARE_FUNCTION(TYPE_DECIMAL256) |
| DECLARE_FUNCTION(TYPE_CHAR) |
| DECLARE_FUNCTION(TYPE_VARCHAR) |
| DECLARE_FUNCTION(TYPE_STRING) |
| DECLARE_FUNCTION(TYPE_VARBINARY) |
| DECLARE_FUNCTION(TYPE_HLL) |
| DECLARE_FUNCTION(TYPE_VARIANT) |
| DECLARE_FUNCTION(TYPE_QUANTILE_STATE) |
| DECLARE_FUNCTION(TYPE_ARRAY) |
| DECLARE_FUNCTION(TYPE_TIME) |
| DECLARE_FUNCTION(TYPE_IPV4) |
| DECLARE_FUNCTION(TYPE_IPV6) |
| DECLARE_FUNCTION(TYPE_BOOLEAN) |
| DECLARE_FUNCTION(TYPE_FLOAT) |
| DECLARE_FUNCTION(TYPE_DOUBLE) |
| DECLARE_FUNCTION(TYPE_JSONB) |
| DECLARE_FUNCTION(TYPE_STRUCT) |
| DECLARE_FUNCTION(TYPE_MAP) |
| DECLARE_FUNCTION(TYPE_BITMAP) |
| DECLARE_FUNCTION(TYPE_TIMEV2) |
| DECLARE_FUNCTION(TYPE_UINT32) |
| DECLARE_FUNCTION(TYPE_UINT64) |
| #undef DECLARE_FUNCTION |
| } // namespace doris |