mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Allow casting Tuple as Map.
SELECT CAST(([1, 2, 3], ['1', '2', 'foo']), 'Map(UInt8, String)') AS map
This commit is contained in:
parent
483be134b2
commit
e0d85ffd1d
@ -2164,6 +2164,27 @@ private:
|
||||
|
||||
WrapperType createMapWrapper(const DataTypePtr & from_type_untyped, const DataTypeMap * to_type) const
|
||||
{
|
||||
if (const auto from_tuple = checkAndGetDataType<DataTypeTuple>(from_type_untyped.get()))
|
||||
{
|
||||
if (from_tuple->getElements().size() != to_type->getElements().size())
|
||||
throw Exception{"CAST AS Map from tuple with not enough elements.\n"
|
||||
"Left type: " + from_tuple->getName() + ", right type: " + to_type->getName(), ErrorCodes::TYPE_MISMATCH};
|
||||
|
||||
return []
|
||||
(ColumnsWithTypeAndName & arguments, const DataTypePtr &, const ColumnNullable * /*nullable_source*/, size_t /*input_rows_count*/)
|
||||
{
|
||||
const auto col = arguments.front().column.get();
|
||||
const auto & column_tuple = typeid_cast<const ColumnTuple &>(*col);
|
||||
|
||||
Columns converted_columns(2);
|
||||
converted_columns[0] = column_tuple.getColumns()[0];
|
||||
converted_columns[1] = column_tuple.getColumns()[1];
|
||||
|
||||
return ColumnMap::create(converted_columns);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
const auto from_type = checkAndGetDataType<DataTypeMap>(from_type_untyped.get());
|
||||
if (!from_type)
|
||||
throw Exception{"CAST AS Map can only be performed between map types.\nLeft type: "
|
||||
|
Loading…
Reference in New Issue
Block a user