mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
More strict checks on compositions of columns [#CLICKHOUSE-2].
This commit is contained in:
parent
ddd475ec68
commit
abf53189bb
@ -23,24 +23,13 @@ namespace ErrorCodes
|
||||
ColumnNullable::ColumnNullable(ColumnPtr nested_column_, ColumnPtr null_map_)
|
||||
: nested_column{nested_column_}, null_map{null_map_}
|
||||
{
|
||||
if (nested_column->isColumnNullable())
|
||||
throw Exception{"A nullable column cannot contain another nullable column", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
if (nested_column->isColumnConst())
|
||||
throw Exception{"A nullable column cannot contain constant nested column", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
/// TODO Also check for Nullable(Array(...)). But they are occasionally used somewhere in tests.
|
||||
|
||||
if (typeid_cast<const ColumnTuple *>(nested_column.get()))
|
||||
throw Exception{"Nullable(Tuple(...)) is illegal", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
if (typeid_cast<const ColumnAggregateFunction *>(nested_column.get()))
|
||||
throw Exception{"Nullable(AggregateFunction(...)) is illegal", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
/// ColumnNullable cannot have constant nested column. But constant argument could be passed. Materialize it.
|
||||
if (auto nested_column_materialized = nested_column->convertToFullColumnIfConst())
|
||||
nested_column = nested_column_materialized;
|
||||
|
||||
if (!nested_column->canBeInsideNullable())
|
||||
throw Exception{getName() + " cannot be inside Nullable column", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
if (null_map->isColumnConst())
|
||||
throw Exception{"ColumnNullable cannot have constant null map", ErrorCodes::ILLEGAL_COLUMN};
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ namespace DB
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int ILLEGAL_COLUMN;
|
||||
extern const int NOT_IMPLEMENTED;
|
||||
extern const int CANNOT_INSERT_VALUE_OF_DIFFERENT_SIZE_INTO_TUPLE;
|
||||
}
|
||||
@ -32,6 +33,9 @@ std::string ColumnTuple::getName() const
|
||||
|
||||
ColumnTuple::ColumnTuple(const Columns & columns) : columns(columns)
|
||||
{
|
||||
for (const auto & column : columns)
|
||||
if (column->isColumnConst())
|
||||
throw Exception{"ColumnTuple cannot have ColumnConst as its element", ErrorCodes::ILLEGAL_COLUMN};
|
||||
}
|
||||
|
||||
ColumnPtr ColumnTuple::cloneEmpty() const
|
||||
|
@ -250,6 +250,13 @@ public:
|
||||
using ColumnCallback = std::function<void(ColumnPtr&)>;
|
||||
virtual void forEachSubcolumn(ColumnCallback) {}
|
||||
|
||||
/** Some columns can contain another columns inside.
|
||||
* So, we have a tree of columns. But not all combinations are possible.
|
||||
* There are the following rules:
|
||||
*
|
||||
* ColumnConst may be only at top. It cannot be inside any column.
|
||||
* ColumnNullable can contain only simple columns.
|
||||
*/
|
||||
|
||||
/// Various properties on behaviour of column type.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user