blob: 4567fa20905097c55801468fc7109b49aef38f11 [file] [log] [blame]
// 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 "vec/core/field.h"
#include "runtime/define_primitive_type.h"
#include "runtime/jsonb_value.h"
#include "runtime/primitive_type.h"
#include "util/bitmap_value.h"
#include "vec/core/accurate_comparison.h"
#include "vec/core/decimal_comparison.h"
#include "vec/data_types/data_type_decimal.h"
#include "vec/functions/cast/cast_to_string.h"
#include "vec/io/io_helper.h"
#include "vec/io/var_int.h"
#include "vec/runtime/timestamptz_value.h"
#include "vec/runtime/vdatetime_value.h"
namespace doris::vectorized {
class BufferReadable;
class BufferWritable;
template <PrimitiveType T>
bool dec_equal(typename PrimitiveTypeTraits<T>::ColumnItemType x,
typename PrimitiveTypeTraits<T>::ColumnItemType 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>::ColumnItemType x,
typename PrimitiveTypeTraits<T>::ColumnItemType 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>::ColumnItemType x,
typename PrimitiveTypeTraits<T>::ColumnItemType 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(Decimal128V2, 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>::NearestFieldType&& 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>::NearestFieldType;
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>::NearestFieldType& 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>::NearestFieldType;
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<typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATETIMEV2:
create_concrete<TYPE_DATETIMEV2>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATEV2:
create_concrete<TYPE_DATEV2>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_TIMESTAMPTZ:
create_concrete<TYPE_TIMESTAMPTZ>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATETIME:
case PrimitiveType::TYPE_DATE:
case PrimitiveType::TYPE_BOOLEAN:
case PrimitiveType::TYPE_TINYINT:
case PrimitiveType::TYPE_SMALLINT:
case PrimitiveType::TYPE_INT:
case PrimitiveType::TYPE_BIGINT:
create_concrete<TYPE_BIGINT>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_LARGEINT:
create_concrete<TYPE_LARGEINT>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_IPV4:
create_concrete<TYPE_IPV4>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_IPV6:
create_concrete<TYPE_IPV6>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_FLOAT:
case PrimitiveType::TYPE_TIMEV2:
case PrimitiveType::TYPE_DOUBLE:
create_concrete<TYPE_DOUBLE>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_STRING:
create_concrete<TYPE_STRING>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_CHAR:
create_concrete<TYPE_CHAR>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARCHAR:
create_concrete<TYPE_VARCHAR>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_JSONB:
create_concrete<TYPE_JSONB>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_ARRAY:
create_concrete<TYPE_ARRAY>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_STRUCT:
create_concrete<TYPE_STRUCT>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_MAP:
create_concrete<TYPE_MAP>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL32:
create_concrete<TYPE_DECIMAL32>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL64:
create_concrete<TYPE_DECIMAL64>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMALV2:
create_concrete<TYPE_DECIMALV2>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL128I:
create_concrete<TYPE_DECIMAL128I>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL256:
create_concrete<TYPE_DECIMAL256>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARIANT:
create_concrete<TYPE_VARIANT>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_BITMAP:
create_concrete<TYPE_BITMAP>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_HLL:
create_concrete<TYPE_HLL>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_QUANTILE_STATE:
create_concrete<TYPE_QUANTILE_STATE>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARBINARY:
create_concrete<TYPE_VARBINARY>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType>()));
return;
default:
throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name()));
}
}
void Field::create(const Field& field) {
switch (field.type) {
case PrimitiveType::TYPE_NULL:
create_concrete<TYPE_NULL>(
field.template get<typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATETIMEV2:
create_concrete<TYPE_DATETIMEV2>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATEV2:
create_concrete<TYPE_DATEV2>(
field.template get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_TIMESTAMPTZ:
create_concrete<TYPE_TIMESTAMPTZ>(
field.template get<
typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATETIME:
case PrimitiveType::TYPE_DATE:
case PrimitiveType::TYPE_BOOLEAN:
case PrimitiveType::TYPE_TINYINT:
case PrimitiveType::TYPE_SMALLINT:
case PrimitiveType::TYPE_INT:
case PrimitiveType::TYPE_BIGINT:
create_concrete<TYPE_BIGINT>(
field.template get<typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_LARGEINT:
create_concrete<TYPE_LARGEINT>(
field.template get<
typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_IPV4:
create_concrete<TYPE_IPV4>(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType>());
return;
case PrimitiveType::TYPE_IPV6:
create_concrete<TYPE_IPV6>(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType>());
return;
case PrimitiveType::TYPE_FLOAT:
case PrimitiveType::TYPE_TIMEV2:
case PrimitiveType::TYPE_DOUBLE:
create_concrete<TYPE_DOUBLE>(
field.template get<typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType>());
return;
case PrimitiveType::TYPE_STRING:
create_concrete<TYPE_STRING>(
field.template get<typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType>());
return;
case PrimitiveType::TYPE_CHAR:
create_concrete<TYPE_CHAR>(
field.template get<typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARCHAR:
create_concrete<TYPE_VARCHAR>(
field.template get<typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType>());
return;
case PrimitiveType::TYPE_JSONB:
create_concrete<TYPE_JSONB>(
field.template get<typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType>());
return;
case PrimitiveType::TYPE_ARRAY:
create_concrete<TYPE_ARRAY>(
field.template get<typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType>());
return;
case PrimitiveType::TYPE_STRUCT:
create_concrete<TYPE_STRUCT>(
field.template get<typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_MAP:
create_concrete<TYPE_MAP>(
field.template get<typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL32:
create_concrete<TYPE_DECIMAL32>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL64:
create_concrete<TYPE_DECIMAL64>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMALV2:
create_concrete<TYPE_DECIMALV2>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL128I:
create_concrete<TYPE_DECIMAL128I>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL256:
create_concrete<TYPE_DECIMAL256>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARIANT:
create_concrete<TYPE_VARIANT>(
field.template get<typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_BITMAP:
create_concrete<TYPE_BITMAP>(
field.template get<typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType>());
return;
case PrimitiveType::TYPE_HLL:
create_concrete<TYPE_HLL>(
field.template get<typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType>());
return;
case PrimitiveType::TYPE_QUANTILE_STATE:
create_concrete<TYPE_QUANTILE_STATE>(
field.template get<
typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType>());
return;
case PrimitiveType::TYPE_UINT32:
create_concrete<TYPE_UINT32>(
field.template get<typename PrimitiveTypeTraits<TYPE_UINT32>::NearestFieldType>());
return;
case PrimitiveType::TYPE_UINT64:
create_concrete<TYPE_UINT64>(
field.template get<typename PrimitiveTypeTraits<TYPE_UINT64>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARBINARY:
create_concrete<TYPE_VARBINARY>(
field.template get<
typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType>());
return;
default:
throw Exception(Status::FatalError("type not supported, type={}", field.get_type_name()));
}
}
void Field::destroy() {
switch (type) {
case PrimitiveType::TYPE_STRING:
destroy<typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType>();
break;
case PrimitiveType::TYPE_CHAR:
destroy<typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType>();
break;
case PrimitiveType::TYPE_VARCHAR:
destroy<typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType>();
break;
case PrimitiveType::TYPE_JSONB:
destroy<typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType>();
break;
case PrimitiveType::TYPE_ARRAY:
destroy<typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType>();
break;
case PrimitiveType::TYPE_STRUCT:
destroy<typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType>();
break;
case PrimitiveType::TYPE_MAP:
destroy<typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType>();
break;
case PrimitiveType::TYPE_VARIANT:
destroy<typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType>();
break;
case PrimitiveType::TYPE_BITMAP:
destroy<typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType>();
break;
case PrimitiveType::TYPE_HLL:
destroy<typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType>();
break;
case PrimitiveType::TYPE_QUANTILE_STATE:
destroy<typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType>();
break;
case PrimitiveType::TYPE_VARBINARY:
destroy<typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType>();
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<typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATETIMEV2:
assign_concrete<TYPE_DATETIMEV2>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATETIME:
assign_concrete<TYPE_DATETIME>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIME>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATE:
assign_concrete<TYPE_DATE>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DATEV2:
assign_concrete<TYPE_DATEV2>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_TIMESTAMPTZ:
assign_concrete<TYPE_TIMESTAMPTZ>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_BOOLEAN:
case PrimitiveType::TYPE_TINYINT:
case PrimitiveType::TYPE_SMALLINT:
case PrimitiveType::TYPE_INT:
case PrimitiveType::TYPE_BIGINT:
assign_concrete<TYPE_BIGINT>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_LARGEINT:
assign_concrete<TYPE_LARGEINT>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_IPV4:
assign_concrete<TYPE_IPV4>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_IPV6:
assign_concrete<TYPE_IPV6>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DOUBLE:
assign_concrete<TYPE_DOUBLE>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_STRING:
assign_concrete<TYPE_STRING>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_CHAR:
assign_concrete<TYPE_CHAR>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARCHAR:
assign_concrete<TYPE_VARCHAR>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_JSONB:
assign_concrete<TYPE_JSONB>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_ARRAY:
assign_concrete<TYPE_ARRAY>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_STRUCT:
assign_concrete<TYPE_STRUCT>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_MAP:
assign_concrete<TYPE_MAP>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL32:
assign_concrete<TYPE_DECIMAL32>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL64:
assign_concrete<TYPE_DECIMAL64>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMALV2:
assign_concrete<TYPE_DECIMALV2>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL128I:
assign_concrete<TYPE_DECIMAL128I>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_DECIMAL256:
assign_concrete<TYPE_DECIMAL256>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARIANT:
assign_concrete<TYPE_VARIANT>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_BITMAP:
assign_concrete<TYPE_BITMAP>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_HLL:
assign_concrete<TYPE_HLL>(std::move(
field.template get<typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_QUANTILE_STATE:
assign_concrete<TYPE_QUANTILE_STATE>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType>()));
return;
case PrimitiveType::TYPE_VARBINARY:
assign_concrete<TYPE_VARBINARY>(
std::move(field.template get<
typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType>()));
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<typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATETIMEV2:
assign_concrete<TYPE_DATETIMEV2>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATETIME:
assign_concrete<TYPE_DATETIME>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DATETIME>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATE:
assign_concrete<TYPE_DATE>(
field.template get<typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DATEV2:
assign_concrete<TYPE_DATEV2>(
field.template get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_TIMESTAMPTZ:
assign_concrete<TYPE_TIMESTAMPTZ>(
field.template get<
typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType>());
return;
case PrimitiveType::TYPE_BOOLEAN:
case PrimitiveType::TYPE_TINYINT:
case PrimitiveType::TYPE_SMALLINT:
case PrimitiveType::TYPE_INT:
case PrimitiveType::TYPE_BIGINT:
assign_concrete<TYPE_BIGINT>(
field.template get<typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_LARGEINT:
assign_concrete<TYPE_LARGEINT>(
field.template get<
typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_IPV4:
assign_concrete<TYPE_IPV4>(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType>());
return;
case PrimitiveType::TYPE_IPV6:
assign_concrete<TYPE_IPV6>(
field.template get<typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DOUBLE:
assign_concrete<TYPE_DOUBLE>(
field.template get<typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType>());
return;
case PrimitiveType::TYPE_STRING:
assign_concrete<TYPE_STRING>(
field.template get<typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType>());
return;
case PrimitiveType::TYPE_CHAR:
assign_concrete<TYPE_CHAR>(
field.template get<typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARCHAR:
assign_concrete<TYPE_VARCHAR>(
field.template get<typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType>());
return;
case PrimitiveType::TYPE_JSONB:
assign_concrete<TYPE_JSONB>(
field.template get<typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType>());
return;
case PrimitiveType::TYPE_ARRAY:
assign_concrete<TYPE_ARRAY>(
field.template get<typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType>());
return;
case PrimitiveType::TYPE_STRUCT:
assign_concrete<TYPE_STRUCT>(
field.template get<typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_MAP:
assign_concrete<TYPE_MAP>(
field.template get<typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL32:
assign_concrete<TYPE_DECIMAL32>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL64:
assign_concrete<TYPE_DECIMAL64>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMALV2:
assign_concrete<TYPE_DECIMALV2>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL128I:
assign_concrete<TYPE_DECIMAL128I>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType>());
return;
case PrimitiveType::TYPE_DECIMAL256:
assign_concrete<TYPE_DECIMAL256>(
field.template get<
typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARIANT:
assign_concrete<TYPE_VARIANT>(
field.template get<typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType>());
return;
case PrimitiveType::TYPE_BITMAP:
assign_concrete<TYPE_BITMAP>(
field.template get<typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType>());
return;
case PrimitiveType::TYPE_HLL:
assign_concrete<TYPE_HLL>(
field.template get<typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType>());
return;
case PrimitiveType::TYPE_QUANTILE_STATE:
assign_concrete<TYPE_QUANTILE_STATE>(
field.template get<
typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType>());
return;
case PrimitiveType::TYPE_UINT32:
assign_concrete<TYPE_UINT32>(
field.template get<typename PrimitiveTypeTraits<TYPE_UINT32>::NearestFieldType>());
return;
case PrimitiveType::TYPE_UINT64:
assign_concrete<TYPE_UINT64>(
field.template get<typename PrimitiveTypeTraits<TYPE_UINT64>::NearestFieldType>());
return;
case PrimitiveType::TYPE_VARBINARY:
assign_concrete<TYPE_VARBINARY>(
field.template get<
typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType>());
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>::NearestFieldType&& x) {
auto* MAY_ALIAS ptr =
reinterpret_cast<typename PrimitiveTypeTraits<Type>::NearestFieldType*>(&storage);
*ptr = std::forward<typename PrimitiveTypeTraits<Type>::NearestFieldType>(x);
}
template <PrimitiveType Type>
void Field::assign_concrete(const typename PrimitiveTypeTraits<Type>::NearestFieldType& x) {
auto* MAY_ALIAS ptr =
reinterpret_cast<typename PrimitiveTypeTraits<Type>::NearestFieldType*>(&storage);
*ptr = std::forward<const typename PrimitiveTypeTraits<Type>::NearestFieldType>(x);
}
std::string Field::get_type_name() const {
return type_to_string(type);
}
#define MATCH_PRIMITIVE_TYPE(primite_type) \
if (type == primite_type) { \
const auto& v = get<typename PrimitiveTypeTraits<primite_type>::NearestFieldType>(); \
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<String>();
return {s.data(), s.size()};
}
if (type == PrimitiveType::TYPE_VARBINARY) {
const auto& svf = get<StringViewField>();
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 MATCH_NUMBER_TYPE(primite_type) \
if (type == primite_type) { \
const auto& v = get<typename PrimitiveTypeTraits<primite_type>::NearestFieldType>(); \
return CastToString::from_number(v); \
}
#define MATCH_DECIMAL_TYPE(primite_type) \
if (type == primite_type) { \
const auto& v = get<typename PrimitiveTypeTraits<primite_type>::NearestFieldType>(); \
return CastToString::from_decimal(v.get_value(), v.get_scale()); \
}
std::string Field::to_string() const {
if (type == PrimitiveType::TYPE_STRING || type == PrimitiveType::TYPE_VARCHAR ||
type == PrimitiveType::TYPE_CHAR) {
const auto& s = get<String>();
return {s.data(), s.size()};
}
if (type == PrimitiveType::TYPE_VARBINARY) {
const auto& svf = get<StringViewField>();
return {svf.data(), svf.size()};
}
MATCH_DECIMAL_TYPE(TYPE_DECIMAL32);
MATCH_DECIMAL_TYPE(TYPE_DECIMAL64);
MATCH_DECIMAL_TYPE(TYPE_DECIMALV2);
MATCH_DECIMAL_TYPE(TYPE_DECIMAL128I);
MATCH_DECIMAL_TYPE(TYPE_DECIMAL256);
if (type == TYPE_DATE || type == TYPE_DATETIME) {
const auto& v = binary_cast<int64_t, doris::VecDateTimeValue>(
get<typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType>());
return CastToString::from_date_or_datetime(v);
}
if (type == TYPE_DATEV2) {
const auto& v = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
(uint32_t)get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>());
return CastToString::from_datev2(v);
}
if (type == TYPE_DATETIMEV2) {
const auto& v = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
(uint64_t)get<typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>());
return CastToString::from_datetimev2(v);
}
if (type == TYPE_TIMESTAMPTZ) {
const auto& v = binary_cast<uint64_t, TimestampTzValue>(
(uint64_t)get<typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType>());
return CastToString::from_timestamptz(v, 6);
}
MATCH_NUMBER_TYPE(TYPE_BOOLEAN);
MATCH_NUMBER_TYPE(TYPE_TINYINT);
MATCH_NUMBER_TYPE(TYPE_SMALLINT);
MATCH_NUMBER_TYPE(TYPE_INT);
MATCH_NUMBER_TYPE(TYPE_BIGINT);
MATCH_NUMBER_TYPE(TYPE_LARGEINT);
MATCH_NUMBER_TYPE(TYPE_FLOAT);
MATCH_NUMBER_TYPE(TYPE_DOUBLE);
throw Exception(
Status::FatalError("type not supported for to_string, type={}", get_type_name()));
}
#undef MATCH_NUMBER_TYPE
#undef MATCH_DECIMAL_TYPE
#define DECLARE_FUNCTION(FUNC_NAME) \
template void Field::FUNC_NAME<TYPE_NULL>( \
typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_TINYINT>( \
typename PrimitiveTypeTraits<TYPE_TINYINT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_SMALLINT>( \
typename PrimitiveTypeTraits<TYPE_SMALLINT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_INT>( \
typename PrimitiveTypeTraits<TYPE_INT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_BIGINT>( \
typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_LARGEINT>( \
typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DATE>( \
typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DATETIME>( \
typename PrimitiveTypeTraits<TYPE_DATETIME>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DATEV2>( \
typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DATETIMEV2>( \
typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL32>( \
typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL64>( \
typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMALV2>( \
typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL128I>( \
typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL256>( \
typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_CHAR>( \
typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_VARCHAR>( \
typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_STRING>( \
typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_VARBINARY>( \
typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_HLL>( \
typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_VARIANT>( \
typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_QUANTILE_STATE>( \
typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_ARRAY>( \
typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_NULL>( \
const typename PrimitiveTypeTraits<TYPE_NULL>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_TINYINT>( \
const typename PrimitiveTypeTraits<TYPE_TINYINT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_SMALLINT>( \
const typename PrimitiveTypeTraits<TYPE_SMALLINT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_INT>( \
const typename PrimitiveTypeTraits<TYPE_INT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_BIGINT>( \
const typename PrimitiveTypeTraits<TYPE_BIGINT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_LARGEINT>( \
const typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DATE>( \
const typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DATETIME>( \
const typename PrimitiveTypeTraits<TYPE_DATETIME>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DATEV2>( \
const typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DATETIMEV2>( \
const typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_TIMESTAMPTZ>( \
const typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_TIMESTAMPTZ>( \
typename PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL32>( \
const typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL64>( \
const typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DECIMALV2>( \
const typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL128I>( \
const typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DECIMAL256>( \
const typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_CHAR>( \
const typename PrimitiveTypeTraits<TYPE_CHAR>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_VARCHAR>( \
const typename PrimitiveTypeTraits<TYPE_VARCHAR>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_STRING>( \
const typename PrimitiveTypeTraits<TYPE_STRING>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_VARBINARY>( \
const typename PrimitiveTypeTraits<TYPE_VARBINARY>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_HLL>( \
const typename PrimitiveTypeTraits<TYPE_HLL>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_VARIANT>( \
const typename PrimitiveTypeTraits<TYPE_VARIANT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_QUANTILE_STATE>( \
const typename PrimitiveTypeTraits<TYPE_QUANTILE_STATE>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_ARRAY>( \
const typename PrimitiveTypeTraits<TYPE_ARRAY>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_IPV4>( \
typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_IPV4>( \
const typename PrimitiveTypeTraits<TYPE_IPV4>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_IPV6>( \
typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_IPV6>( \
const typename PrimitiveTypeTraits<TYPE_IPV6>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_BOOLEAN>( \
typename PrimitiveTypeTraits<TYPE_BOOLEAN>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_BOOLEAN>( \
const typename PrimitiveTypeTraits<TYPE_BOOLEAN>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_FLOAT>( \
typename PrimitiveTypeTraits<TYPE_FLOAT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_FLOAT>( \
const typename PrimitiveTypeTraits<TYPE_FLOAT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_DOUBLE>( \
typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_DOUBLE>( \
const typename PrimitiveTypeTraits<TYPE_DOUBLE>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_JSONB>( \
typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_JSONB>( \
const typename PrimitiveTypeTraits<TYPE_JSONB>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_STRUCT>( \
typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_STRUCT>( \
const typename PrimitiveTypeTraits<TYPE_STRUCT>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_MAP>( \
typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_MAP>( \
const typename PrimitiveTypeTraits<TYPE_MAP>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_BITMAP>( \
typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_BITMAP>( \
const typename PrimitiveTypeTraits<TYPE_BITMAP>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_TIMEV2>( \
const typename PrimitiveTypeTraits<TYPE_TIMEV2>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_TIMEV2>( \
typename PrimitiveTypeTraits<TYPE_TIMEV2>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_UINT32>( \
const typename PrimitiveTypeTraits<TYPE_UINT32>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_UINT32>( \
typename PrimitiveTypeTraits<TYPE_UINT32>::NearestFieldType && rhs); \
template void Field::FUNC_NAME<TYPE_UINT64>( \
const typename PrimitiveTypeTraits<TYPE_UINT64>::NearestFieldType& rhs); \
template void Field::FUNC_NAME<TYPE_UINT64>( \
typename PrimitiveTypeTraits<TYPE_UINT64>::NearestFieldType && rhs);
DECLARE_FUNCTION(create_concrete)
DECLARE_FUNCTION(assign_concrete)
#undef DECLARE_FUNCTION
} // namespace doris::vectorized