#include #include #include #include #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; } DataTypeArray::DataTypeArray(const DataTypePtr & nested_) : nested{nested_} { } MutableColumnPtr DataTypeArray::createColumn() const { return ColumnArray::create(nested->createColumn(), ColumnArray::ColumnOffsets::create()); } Field DataTypeArray::getDefault() const { return Array(); } bool DataTypeArray::equals(const IDataType & rhs) const { return typeid(rhs) == typeid(*this) && nested->equals(*static_cast(rhs).nested); } SerializationPtr DataTypeArray::doGetDefaultSerialization() const { return std::make_shared(nested->getDefaultSerialization()); } size_t DataTypeArray::getNumberOfDimensions() const { const DataTypeArray * nested_array = typeid_cast(nested.get()); if (!nested_array) return 1; return 1 + nested_array->getNumberOfDimensions(); /// Every modern C++ compiler optimizes tail recursion. } static DataTypePtr create(const ASTPtr & arguments) { if (!arguments || arguments->children.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Array data type family must have exactly one argument - type of elements"); return std::make_shared(DataTypeFactory::instance().get(arguments->children[0])); } void registerDataTypeArray(DataTypeFactory & factory) { factory.registerDataType("Array", create); } }