CLICKHOUSE-3772: Add size column

This commit is contained in:
alesapin 2018-07-23 19:52:11 +03:00
parent 24a9bebec9
commit f2451210d0
2 changed files with 34 additions and 18 deletions

View File

@ -12,32 +12,33 @@ namespace
{
void setTypePropertries(const DataTypePtr data_type, MutableColumns & res_columns)
{
res_columns[3]->insert(UInt64(data_type->isParametric()));
res_columns[4]->insert(UInt64(data_type->haveSubtypes()));
res_columns[5]->insert(UInt64(data_type->cannotBeStoredInTables()));
res_columns[6]->insert(UInt64(data_type->isComparable()));
res_columns[7]->insert(UInt64(data_type->canBeComparedWithCollation()));
res_columns[8]->insert(UInt64(data_type->canBeUsedAsVersion()));
res_columns[9]->insert(UInt64(data_type->isSummable()));
res_columns[10]->insert(UInt64(data_type->canBeUsedInBitOperations()));
res_columns[11]->insert(UInt64(data_type->canBeUsedInBooleanContext()));
res_columns[12]->insert(UInt64(data_type->isCategorial()));
res_columns[13]->insert(UInt64(data_type->isNullable()));
res_columns[14]->insert(UInt64(data_type->onlyNull()));
res_columns[15]->insert(UInt64(data_type->canBeInsideNullable()));
res_columns[4]->insert(UInt64(data_type->isParametric()));
res_columns[5]->insert(UInt64(data_type->haveSubtypes()));
res_columns[6]->insert(UInt64(data_type->cannotBeStoredInTables()));
res_columns[7]->insert(UInt64(data_type->isComparable()));
res_columns[8]->insert(UInt64(data_type->canBeComparedWithCollation()));
res_columns[9]->insert(UInt64(data_type->canBeUsedAsVersion()));
res_columns[10]->insert(UInt64(data_type->isSummable()));
res_columns[11]->insert(UInt64(data_type->canBeUsedInBitOperations()));
res_columns[12]->insert(UInt64(data_type->canBeUsedInBooleanContext()));
res_columns[13]->insert(UInt64(data_type->isCategorial()));
res_columns[14]->insert(UInt64(data_type->isNullable()));
res_columns[15]->insert(UInt64(data_type->onlyNull()));
res_columns[16]->insert(UInt64(data_type->canBeInsideNullable()));
}
void setComplexTypeProperties(const String & name, MutableColumns & res_columns)
{
res_columns[3]->insert(UInt64(1)); //complex types are always parametric
res_columns[3]->insert(Null());
res_columns[4]->insert(UInt64(1)); //complex types are always parametric
if (name == "AggregateFunction")
res_columns[4]->insert(UInt64(0));
res_columns[5]->insert(UInt64(0));
else if (name == "Tuple")
res_columns[4]->insert(Null());
res_columns[5]->insert(Null());
else
res_columns[4]->insert(UInt64(1));
res_columns[5]->insert(UInt64(1));
for (size_t i = 5; i < StorageSystemDataTypeFamilies::getNamesAndTypes().size(); ++i)
for (size_t i = 6; i < StorageSystemDataTypeFamilies::getNamesAndTypes().size(); ++i)
res_columns[i]->insert(Null());
}
@ -80,13 +81,27 @@ void StorageSystemDataTypeFamilies::fillData(MutableColumns & res_columns) const
try
{
DataTypePtr type_ptr;
Field size = Null();
// hardcoded cases for simple parametric types
if (boost::starts_with(name, "Enum"))
{
type_ptr = factory.get(name, createFakeEnumCreationAst());
size = type_ptr->getMaximumSizeOfValueInMemory();
}
else if (name == "FixedString" || name == "BINARY")
{
type_ptr = factory.get(name, createFakeFixedStringAst());
}
else
{
type_ptr = factory.get(name);
if (type_ptr->haveMaximumSizeOfValue())
size = type_ptr->getMaximumSizeOfValueInMemory();
}
res_columns[3]->insert(size);
setTypePropertries(type_ptr, res_columns);
}
catch (Exception & ex)

View File

@ -27,6 +27,7 @@ public:
{"name", std::make_shared<DataTypeString>()},
{"case_insensivie", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt8>())},
{"alias_to", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeString>())},
{"size_in_bytes", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt16>())},
{"parametric", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt8>())},
{"have_subtypes", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt8>())},
{"cannot_be_stored_in_tables", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt8>())},