提交 6f651762 编写于 作者: A Alexey Milovidov

Explicitly disallow dummy data types and special Null data type to be in table...

Explicitly disallow dummy data types and special Null data type to be in table declaration [#CLICKHOUSE-4].
上级 69d7432f
......@@ -372,6 +372,7 @@ namespace ErrorCodes
extern const int TOO_MUCH_FETCHES = 367;
extern const int BAD_CAST = 368;
extern const int ALL_REPLICAS_ARE_STALE = 369;
extern const int DATA_TYPE_CANNOT_BE_USED_IN_TABLES = 370;
extern const int KEEPER_EXCEPTION = 999;
extern const int POCO_EXCEPTION = 1000;
......
......@@ -26,6 +26,11 @@ public:
return true;
}
bool notForTables() const override
{
return true;
}
DataTypePtr clone() const override
{
return std::make_shared<DataTypeNull>();
......
......@@ -43,6 +43,9 @@ public:
/// relevant for it? True for numbers. False for Date and DateTime types.
virtual bool behavesAsNumber() const { return false; }
/// If this data type cannot appear in table declaration - only for intermediate values of calculations.
virtual bool notForTables() const { return false; }
virtual DataTypePtr clone() const = 0;
/** Binary serialization for range of values in column - for writing to disk/network, etc.
......
......@@ -14,35 +14,40 @@ namespace DB
class IDataTypeDummy : public IDataType
{
private:
bool notForTables() const override
{
return true;
}
void throwNoSerialization() const
{
throw Exception("Serialization is not implemented for data type " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
public:
void serializeBinary(const Field & field, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeBinary(Field & field, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeBinary(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeBinary(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeBinary(const Field & field, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeBinary(Field & field, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeBinary(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeBinary(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeBinaryBulk(const IColumn & column, WriteBuffer & ostr,
size_t offset, size_t limit) const override { throwNoSerialization(); }
void deserializeBinaryBulk(IColumn & column, ReadBuffer & istr, size_t limit, double avg_value_size_hint) const override { throwNoSerialization(); }
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeTextEscaped(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeTextQuoted(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeTextQuoted(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void deserializeTextQuoted(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, bool) const override { throwNoSerialization(); }
void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, bool) const override { throwNoSerialization(); }
void deserializeTextJSON(IColumn & column, ReadBuffer & istr) const override { throwNoSerialization(); }
void serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override { throwNoSerialization(); }
void deserializeTextCSV(IColumn & column, ReadBuffer & istr, const char delimiter) const override { throwNoSerialization(); }
void deserializeTextCSV(IColumn & column, ReadBuffer & istr, const char delimiter) const override { throwNoSerialization(); }
ColumnPtr createColumn() const override
{
......
......@@ -51,6 +51,7 @@ namespace ErrorCodes
extern const int FUNCTION_CANNOT_HAVE_PARAMETERS;
extern const int TYPE_MISMATCH;
extern const int INCORRECT_NUMBER_OF_COLUMNS;
extern const int DATA_TYPE_CANNOT_BE_USED_IN_TABLES;
}
......@@ -224,6 +225,15 @@ static void setGraphitePatternsFromConfig(const Context & context,
}
/// Some types are only for intermediate values of expressions and cannot be used in tables.
static void checkAllTypesAreAllowedInTable(const NamesAndTypesList & names_and_types)
{
for (const auto & elem : names_and_types)
if (elem.type->notForTables())
throw Exception("Data type " + elem.type->getName() + " cannot be used in tables", ErrorCodes::DATA_TYPE_CANNOT_BE_USED_IN_TABLES);
}
StoragePtr StorageFactory::get(
const String & name,
const String & data_path,
......@@ -239,6 +249,10 @@ StoragePtr StorageFactory::get(
bool attach,
bool has_force_restore_data_flag) const
{
checkAllTypesAreAllowedInTable(*columns);
checkAllTypesAreAllowedInTable(materialized_columns);
checkAllTypesAreAllowedInTable(alias_columns);
if (name == "Log")
{
return StorageLog::create(
......
......@@ -11,6 +11,7 @@ class Context;
/** Allows you to create a table by the name of the engine.
* In 'columns', 'materialized_columns', etc., Nested data structures must be flattened.
*/
class StorageFactory : public Singleton<StorageFactory>
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册