| 1 | #include <Core/Field.h> |
| 2 | #include <Interpreters/castColumn.h> |
| 3 | #include <Interpreters/ExpressionActions.h> |
| 4 | #include <DataTypes/DataTypeString.h> |
| 5 | #include <Functions/IFunctionAdaptors.h> |
| 6 | #include <Functions/FunctionsConversion.h> |
| 7 | |
| 8 | |
| 9 | namespace DB |
| 10 | { |
| 11 | |
| 12 | ColumnPtr castColumn(const ColumnWithTypeAndName & arg, const DataTypePtr & type) |
| 13 | { |
| 14 | if (arg.type->equals(*type)) |
| 15 | return arg.column; |
| 16 | |
| 17 | Block temporary_block |
| 18 | { |
| 19 | arg, |
| 20 | { |
| 21 | DataTypeString().createColumnConst(arg.column->size(), type->getName()), |
| 22 | std::make_shared<DataTypeString>(), |
| 23 | "" |
| 24 | }, |
| 25 | { |
| 26 | nullptr, |
| 27 | type, |
| 28 | "" |
| 29 | } |
| 30 | }; |
| 31 | |
| 32 | FunctionOverloadResolverPtr func_builder_cast = std::make_shared<FunctionOverloadResolverAdaptor>(CastOverloadResolver::createImpl()); |
| 33 | |
| 34 | ColumnsWithTypeAndName arguments{ temporary_block.getByPosition(0), temporary_block.getByPosition(1) }; |
| 35 | auto func_cast = func_builder_cast->build(arguments); |
| 36 | |
| 37 | func_cast->execute(temporary_block, {0, 1}, 2, arg.column->size()); |
| 38 | return temporary_block.getByPosition(2).column; |
| 39 | } |
| 40 | |
| 41 | ColumnPtr castColumn(const ColumnWithTypeAndName & arg, const DataTypePtr & type, const Context &) |
| 42 | { |
| 43 | return castColumn(arg, type); |
| 44 | } |
| 45 | |
| 46 | } |
| 47 | |