mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge pull request #12275 from ClickHouse/supertype-low-cardinality
Supertype for LowCardinality
This commit is contained in:
commit
3f0c257389
@ -9,6 +9,7 @@
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeTuple.h>
|
||||
#include <DataTypes/DataTypeNullable.h>
|
||||
#include <DataTypes/DataTypeLowCardinality.h>
|
||||
#include <DataTypes/DataTypeNothing.h>
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
@ -160,6 +161,39 @@ DataTypePtr getLeastSupertype(const DataTypes & types)
|
||||
}
|
||||
}
|
||||
|
||||
/// For LowCardinality. This is above Nullable, because LowCardinality can contain Nullable but cannot be inside Nullable.
|
||||
{
|
||||
bool have_low_cardinality = false;
|
||||
bool have_not_low_cardinality = false;
|
||||
|
||||
DataTypes nested_types;
|
||||
nested_types.reserve(types.size());
|
||||
|
||||
for (const auto & type : types)
|
||||
{
|
||||
if (const DataTypeLowCardinality * type_low_cardinality = typeid_cast<const DataTypeLowCardinality *>(type.get()))
|
||||
{
|
||||
have_low_cardinality = true;
|
||||
nested_types.emplace_back(type_low_cardinality->getDictionaryType());
|
||||
}
|
||||
else
|
||||
{
|
||||
have_not_low_cardinality = true;
|
||||
nested_types.emplace_back(type);
|
||||
}
|
||||
}
|
||||
|
||||
/// All LowCardinality gives LowCardinality.
|
||||
/// LowCardinality with high cardinality gives high cardinality.
|
||||
if (have_low_cardinality)
|
||||
{
|
||||
if (have_not_low_cardinality)
|
||||
return getLeastSupertype(nested_types);
|
||||
else
|
||||
return std::make_shared<DataTypeLowCardinality>(getLeastSupertype(nested_types));
|
||||
}
|
||||
}
|
||||
|
||||
/// For Nullable
|
||||
{
|
||||
bool have_nullable = false;
|
||||
|
@ -0,0 +1,71 @@
|
||||
hello
|
||||
hello
|
||||
String
|
||||
String
|
||||
---
|
||||
---
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
---
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
---
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
-
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
---
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
---
|
||||
['abc','def']
|
||||
['abc','def']
|
||||
['abc','def']
|
@ -0,0 +1,71 @@
|
||||
SELECT 'hello' UNION ALL SELECT toLowCardinality('hello');
|
||||
SELECT toTypeName(x) FROM (SELECT 'hello' AS x UNION ALL SELECT toLowCardinality('hello'));
|
||||
|
||||
SELECT '---';
|
||||
|
||||
create temporary table t1(a String);
|
||||
create temporary table t2(a LowCardinality(String));
|
||||
select a from t1 union all select a from t2;
|
||||
|
||||
SELECT '---';
|
||||
|
||||
CREATE TEMPORARY TABLE a (x String);
|
||||
CREATE TEMPORARY TABLE b (x LowCardinality(String));
|
||||
CREATE TEMPORARY TABLE c (x Nullable(String));
|
||||
CREATE TEMPORARY TABLE d (x LowCardinality(Nullable(String)));
|
||||
|
||||
INSERT INTO a VALUES ('hello');
|
||||
INSERT INTO b VALUES ('hello');
|
||||
INSERT INTO c VALUES ('hello');
|
||||
INSERT INTO d VALUES ('hello');
|
||||
|
||||
SELECT x FROM a;
|
||||
SELECT x FROM b;
|
||||
SELECT x FROM c;
|
||||
SELECT x FROM d;
|
||||
|
||||
SELECT '---';
|
||||
|
||||
SELECT x FROM a UNION ALL SELECT x FROM b;
|
||||
SELECT '-';
|
||||
SELECT x FROM a UNION ALL SELECT x FROM c;
|
||||
SELECT '-';
|
||||
SELECT x FROM a UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM b UNION ALL SELECT x FROM a;
|
||||
SELECT '-';
|
||||
SELECT x FROM b UNION ALL SELECT x FROM c;
|
||||
SELECT '-';
|
||||
SELECT x FROM b UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM c UNION ALL SELECT x FROM a;
|
||||
SELECT '-';
|
||||
SELECT x FROM c UNION ALL SELECT x FROM b;
|
||||
SELECT '-';
|
||||
SELECT x FROM c UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM d UNION ALL SELECT x FROM a;
|
||||
SELECT '-';
|
||||
SELECT x FROM d UNION ALL SELECT x FROM c;
|
||||
SELECT '-';
|
||||
SELECT x FROM d UNION ALL SELECT x FROM b;
|
||||
|
||||
SELECT '---';
|
||||
|
||||
SELECT x FROM b UNION ALL SELECT x FROM c UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM a UNION ALL SELECT x FROM c UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM a UNION ALL SELECT x FROM b UNION ALL SELECT x FROM d;
|
||||
SELECT '-';
|
||||
SELECT x FROM a UNION ALL SELECT x FROM b UNION ALL SELECT x FROM c;
|
||||
|
||||
SELECT '---';
|
||||
|
||||
SELECT x FROM a UNION ALL SELECT x FROM b UNION ALL SELECT x FROM c UNION ALL SELECT x FROM d;
|
||||
|
||||
SELECT '---';
|
||||
|
||||
SELECT [CAST('abc' AS LowCardinality(String)), CAST('def' AS Nullable(String))];
|
||||
SELECT [CAST('abc' AS LowCardinality(String)), CAST('def' AS FixedString(3))];
|
||||
SELECT [CAST('abc' AS LowCardinality(String)), CAST('def' AS LowCardinality(FixedString(3)))];
|
Loading…
Reference in New Issue
Block a user