Fix incorrect inference for other formats

This commit is contained in:
Blargian 2024-06-06 10:02:19 +02:00
parent 655262d1a1
commit 418fc7f443
2 changed files with 49 additions and 28 deletions

View File

@ -318,19 +318,40 @@ namespace
type_indexes.erase(TypeIndex::UInt64);
}
/// if setting try_infer_variant is true
/// and nested types are not equal then we convert to type variant.
/// if setting 'try_infer_variant' is true then we convert to type variant.
void transformVariant(DataTypes & data_types, TypeIndexesSet & type_indexes)
{
auto typesAreEqual = checkIfTypesAreEqual(data_types);
auto typesContainVariant = checkIfTypesContainVariant(data_types);
if (typesAreEqual || typesContainVariant)
if (typesAreEqual)
return;
DataTypes new_data_types;
TypeIndexesSet new_type_indexes;
std::shared_ptr<DataTypeVariant> variant_type;
/// extract the nested types of variant and make a new variant with the nested types and the other type.
/// eg. Type 1: variant<String, Array>, Type 2: Date -> variant<String, Array, Date>.
if (typesContainVariant)
{
DataTypes extracted_types;
for (size_t i=0; i<data_types.size(); i++)
{
if (isVariant(data_types[i]))
{
if (const auto * variant = typeid_cast<const DataTypeVariant *>(data_types[i].get()))
extracted_types = variant->getVariants();
}
else
extracted_types.push_back(data_types[i]);
}
variant_type = std::make_shared<DataTypeVariant>(extracted_types);
}
else
{
variant_type = std::make_shared<DataTypeVariant>(data_types);
}
auto variant_type = std::make_shared<DataTypeVariant>(data_types);
size_t i = 0;
while (i != data_types.size())
{

View File

@ -1,9 +1,9 @@
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ arr ┃ toTypeName(arr) ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
1. │ [1,'Hello',(32)] │ Array(Variant(Int64, String, Tuple(…│
│ │… a Nullable(Int64))))
└──────────────────┴─────────────────────────────────────┘
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ arr ┃ toTypeName(arr)
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. │ [1,'Hello',(32)] │ Array(Variant(Int64, String, Tuple(
a Nullable(Int64)))) │
└──────────────────┴─────────────────────────────────────────────────────────────
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ x ┃ toTypeName(x) ┃
┡━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
@ -11,21 +11,21 @@
├───────┼────────────────────────┤
2. │ Hello │ Variant(Int64, String) │
└───────┴────────────────────────┘
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ x ┃ toTypeName(x) ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
1. │ [1,2,3] │ Variant(Array(Nullable(Int64)), Tuple(…│
│ │… a Nullable(Int64)))
├─────────┼────────────────────────────────────────┤
2. │ (42) │ Variant(Array(Nullable(Int64)), Tuple(…│
│ │… a Nullable(Int64)))
└─────────┴────────────────────────────────────────┘
┏━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ c1 ┃ toTypeName(c1) ┃ c2 ┃ toTypeName(c2) ┃
┡━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
1. │ 1 │ Nullable(Int64) │ Hello World! │ Nullable(String) │
├────┼─────────────────┼──────────────┼──────────────────┤
2. │ 2 │ Nullable(Int64) │ [1,2,3] │ Nullable(String) │
├────┼─────────────────┼──────────────┼──────────────────┤
3. │ 3 │ Nullable(Int64) │ 2020-01-01 │ Nullable(String) │
└────┴─────────────────┴──────────────┴──────────────────┘
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ x ┃ toTypeName(x)
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. │ [1,2,3] │ Variant(Array(Nullable(Int64)), Tuple(
a Nullable(Int64))) │
├─────────┼───────────────────────────────────────────────────────────────
2. │ (42) │ Variant(Array(Nullable(Int64)), Tuple(
a Nullable(Int64))) │
└─────────┴───────────────────────────────────────────────────────────────
┏━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ c1 ┃ toTypeName(c1) ┃ c2 ┃ toTypeName(c2)
┡━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. │ 1 │ Nullable(Int64) │ Hello World! │ Variant(Array(Nullable(Int64)), String) │
├────┼─────────────────┼──────────────┼─────────────────────────────────────────
2. │ 2 │ Nullable(Int64) │ [1,2,3] │ Variant(Array(Nullable(Int64)), String) │
├────┼─────────────────┼──────────────┼─────────────────────────────────────────
3. │ 3 │ Nullable(Int64) │ 2020-01-01 │ Variant(Array(Nullable(Int64)), String) │
└────┴─────────────────┴──────────────┴─────────────────────────────────────────