mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-19 16:20:50 +00:00
Merge 6ee197ea59
into a2a1b47ee3
This commit is contained in:
commit
b8268c5c42
@ -300,7 +300,7 @@ void ColumnDynamic::get(size_t n, Field & res) const
|
||||
auto value_data = shared_variant.getDataAt(variant_col.offsetAt(n));
|
||||
ReadBufferFromMemory buf(value_data.data, value_data.size);
|
||||
auto type = decodeDataType(buf);
|
||||
getVariantSerialization(type)->deserializeBinary(res, buf, getFormatSettings());
|
||||
type->getDefaultSerialization()->deserializeBinary(res, buf, getFormatSettings());
|
||||
}
|
||||
|
||||
|
||||
@ -736,8 +736,7 @@ StringRef ColumnDynamic::serializeValueIntoArena(size_t n, Arena & arena, const
|
||||
{
|
||||
const auto & variant_type = assert_cast<const DataTypeVariant &>(*variant_info.variant_type).getVariant(discr);
|
||||
encodeDataType(variant_type, buf);
|
||||
getVariantSerialization(variant_type, variant_info.variant_names[discr])
|
||||
->serializeBinary(variant_col.getVariantByGlobalDiscriminator(discr), variant_col.offsetAt(n), buf, getFormatSettings());
|
||||
variant_type->getDefaultSerialization()->serializeBinary(variant_col.getVariantByGlobalDiscriminator(discr), variant_col.offsetAt(n), buf, getFormatSettings());
|
||||
type_and_value = buf.str();
|
||||
}
|
||||
|
||||
@ -870,7 +869,7 @@ int ColumnDynamic::doCompareAt(size_t n, size_t m, const IColumn & rhs, int nan_
|
||||
/// We have both values serialized in binary format, so we need to
|
||||
/// create temporary column, insert both values into it and compare.
|
||||
auto tmp_column = left_data_type->createColumn();
|
||||
const auto & serialization = getVariantSerialization(left_data_type, left_data_type_name);
|
||||
const auto & serialization = left_data_type->getDefaultSerialization();
|
||||
serialization->deserializeBinary(*tmp_column, buf_left, getFormatSettings());
|
||||
serialization->deserializeBinary(*tmp_column, buf_right, getFormatSettings());
|
||||
return tmp_column->compareAt(0, 1, *tmp_column, nan_direction_hint);
|
||||
@ -892,7 +891,7 @@ int ColumnDynamic::doCompareAt(size_t n, size_t m, const IColumn & rhs, int nan_
|
||||
/// We have left value serialized in binary format, we need to
|
||||
/// create temporary column, insert the value into it and compare.
|
||||
auto tmp_column = left_data_type->createColumn();
|
||||
getVariantSerialization(left_data_type, left_data_type_name)->deserializeBinary(*tmp_column, buf_left, getFormatSettings());
|
||||
left_data_type->getDefaultSerialization()->deserializeBinary(*tmp_column, buf_left, getFormatSettings());
|
||||
return tmp_column->compareAt(0, right_variant.offsetAt(m), right_variant.getVariantByGlobalDiscriminator(right_discr), nan_direction_hint);
|
||||
}
|
||||
/// Check if only right value is in shared data.
|
||||
@ -912,7 +911,7 @@ int ColumnDynamic::doCompareAt(size_t n, size_t m, const IColumn & rhs, int nan_
|
||||
/// We have right value serialized in binary format, we need to
|
||||
/// create temporary column, insert the value into it and compare.
|
||||
auto tmp_column = right_data_type->createColumn();
|
||||
getVariantSerialization(right_data_type, right_data_type_name)->deserializeBinary(*tmp_column, buf_right, getFormatSettings());
|
||||
right_data_type->getDefaultSerialization()->deserializeBinary(*tmp_column, buf_right, getFormatSettings());
|
||||
return left_variant.getVariantByGlobalDiscriminator(left_discr).compareAt(left_variant.offsetAt(n), 0, *tmp_column, nan_direction_hint);
|
||||
}
|
||||
/// Otherwise both values are regular variants.
|
||||
|
@ -414,7 +414,7 @@ public:
|
||||
/// Insert value into shared variant. Also updates Variant discriminators and offsets.
|
||||
void insertValueIntoSharedVariant(const IColumn & src, const DataTypePtr & type, const String & type_name, size_t n);
|
||||
|
||||
const SerializationPtr & getVariantSerialization(const DataTypePtr & variant_type, const String & variant_name) const
|
||||
const SerializationPtr & getVariantSerialization(const DataTypePtr & variant_type, const String & variant_name)
|
||||
{
|
||||
/// Get serialization for provided data type.
|
||||
/// To avoid calling type->getDefaultSerialization() every time we use simple cache with max size.
|
||||
@ -428,7 +428,7 @@ public:
|
||||
return serialization_cache.emplace(variant_name, variant_type->getDefaultSerialization()).first->second;
|
||||
}
|
||||
|
||||
const SerializationPtr & getVariantSerialization(const DataTypePtr & variant_type) const { return getVariantSerialization(variant_type, variant_type->getName()); }
|
||||
const SerializationPtr & getVariantSerialization(const DataTypePtr & variant_type) { return getVariantSerialization(variant_type, variant_type->getName()); }
|
||||
|
||||
private:
|
||||
void createVariantInfo(const DataTypePtr & variant_type);
|
||||
@ -473,7 +473,7 @@ private:
|
||||
/// We can use serializations of different data types to serialize values into shared variant.
|
||||
/// To avoid creating the same serialization multiple times, use simple cache.
|
||||
static const size_t SERIALIZATION_CACHE_MAX_SIZE = 256;
|
||||
mutable std::unordered_map<String, SerializationPtr> serialization_cache;
|
||||
std::unordered_map<String, SerializationPtr> serialization_cache;
|
||||
};
|
||||
|
||||
void extendVariantColumn(
|
||||
|
@ -185,7 +185,7 @@ std::unique_ptr<IDataType::SubstreamData> DataTypeDynamic::getDynamicSubcolumnDa
|
||||
auto type = decodeDataType(buf);
|
||||
if (type->getName() == subcolumn_type_name)
|
||||
{
|
||||
dynamic_column.getVariantSerialization(subcolumn_type, subcolumn_type_name)->deserializeBinary(*subcolumn, buf, format_settings);
|
||||
subcolumn_type->getDefaultSerialization()->deserializeBinary(*subcolumn, buf, format_settings);
|
||||
null_map.push_back(0);
|
||||
}
|
||||
else
|
||||
|
@ -489,9 +489,8 @@ void SerializationDynamic::serializeBinary(const IColumn & column, size_t row_nu
|
||||
}
|
||||
|
||||
const auto & variant_type = assert_cast<const DataTypeVariant &>(*variant_info.variant_type).getVariant(global_discr);
|
||||
const auto & variant_type_name = variant_info.variant_names[global_discr];
|
||||
encodeDataType(variant_type, ostr);
|
||||
dynamic_column.getVariantSerialization(variant_type, variant_type_name)->serializeBinary(variant_column.getVariantByGlobalDiscriminator(global_discr), variant_column.offsetAt(row_num), ostr, settings);
|
||||
variant_type->getDefaultSerialization()->serializeBinary(variant_column.getVariantByGlobalDiscriminator(global_discr), variant_column.offsetAt(row_num), ostr, settings);
|
||||
}
|
||||
|
||||
template <typename ReturnType = void, typename DeserializeFunc>
|
||||
@ -629,7 +628,7 @@ static void serializeTextImpl(
|
||||
ReadBufferFromMemory buf(value.data, value.size);
|
||||
auto variant_type = decodeDataType(buf);
|
||||
auto tmp_variant_column = variant_type->createColumn();
|
||||
auto variant_serialization = dynamic_column.getVariantSerialization(variant_type);
|
||||
auto variant_serialization = variant_type->getDefaultSerialization();
|
||||
variant_serialization->deserializeBinary(*tmp_variant_column, buf, settings);
|
||||
nested_serialize(*variant_serialization, *tmp_variant_column, 0, ostr);
|
||||
}
|
||||
|
@ -0,0 +1,4 @@
|
||||
str 3 \N
|
||||
str 3 \N
|
||||
str 3 \N
|
||||
str 3 \N
|
@ -0,0 +1,4 @@
|
||||
set allow_experimental_dynamic_type=1;
|
||||
set cast_keep_nullable=1;
|
||||
SELECT toFixedString('str', 3), 3, CAST(if(1 = 0, toInt8(3), NULL), 'Int32') AS x from numbers(10) GROUP BY GROUPING SETS ((CAST(toInt32(1), 'Int32')), ('str', 3), (CAST(toFixedString('str', 3), 'Dynamic')), (CAST(toFixedString(toFixedString('str', 3), 3), 'Dynamic')));
|
||||
|
Loading…
Reference in New Issue
Block a user