提交 37d4dcb5 编写于 作者: A Alexey Milovidov

dbms: fixed CAST String to Enum [#METR-19265].

上级 c20a51c5
......@@ -137,14 +137,13 @@ public:
return it->second;
}
FieldType getValue(const std::string & name) const
FieldType getValue(StringRef name) const
{
const auto it = name_to_value_map.find(StringRef{name});
const auto it = name_to_value_map.find(name);
if (it == std::end(name_to_value_map))
throw Exception{
"Unknown element '" + name + "' for type " + getName(),
ErrorCodes::LOGICAL_ERROR
};
"Unknown element '" + name.toString() + "' for type " + getName(),
ErrorCodes::LOGICAL_ERROR};
return it->second;
}
......@@ -175,7 +174,7 @@ public:
{
std::string name;
readString(name, istr);
field = nearestFieldType(getValue(name));
field = nearestFieldType(getValue(StringRef(name)));
}
void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const override
......@@ -187,7 +186,7 @@ public:
{
std::string name;
readEscapedString(name, istr);
field = nearestFieldType(getValue(name));
field = nearestFieldType(getValue(StringRef(name)));
}
void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const override
......@@ -199,7 +198,7 @@ public:
{
std::string name;
readQuotedString(name, istr);
field = nearestFieldType(getValue(name));
field = nearestFieldType(getValue(StringRef(name)));
}
void serializeTextJSON(const Field & field, WriteBuffer & ostr) const override
......
......@@ -1744,7 +1744,8 @@ class FunctionCast final : public IFunction
template <typename ColumnStringType, typename EnumType>
auto createStringToEnumWrapper()
{
return [] (Block & block, const ColumnNumbers & arguments, const size_t result) {
return [] (Block & block, const ColumnNumbers & arguments, const size_t result)
{
const auto first_col = block.getByPosition(arguments.front()).column.get();
auto & col_with_type_and_name = block.getByPosition(result);
......@@ -1755,12 +1756,12 @@ class FunctionCast final : public IFunction
{
const auto size = col->size();
const auto res = result_type.createColumn();
auto & out_data = static_cast<typename EnumType::ColumnType &>(*result_col).getData();
auto res = result_type.createColumn();
auto & out_data = static_cast<typename EnumType::ColumnType &>(*res).getData();
out_data.resize(size);
for (const auto i : ext::range(0, size))
out_data[i] = result_type.getValue(col->getDataAt(i).toString());
out_data[i] = result_type.getValue(col->getDataAt(i));
result_col = res;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册