提交 b7ef4a3e 编写于 作者: A Alexey Milovidov

dbms: fixed function visibleWidth for enums [#METR-19265].

上级 21fb1cca
......@@ -125,13 +125,6 @@ public:
bool behavesAsNumber() const override { return true; }
/// Returns length of textual name for an enum element (used in FunctionVisibleWidth)
std::size_t getNameLength(const FieldType & value) const
{
/// @todo length of escaped string should be calculated here
return getNameForValue(value).size;
}
const StringRef & getNameForValue(const FieldType & value) const
{
const auto it = value_to_name_map.find(value);
......
......@@ -347,7 +347,6 @@ template <typename FieldType> struct FormatImpl<DataTypeEnum<FieldType>>
{
static void execute(const FieldType x, WriteBuffer & wb, const DataTypeEnum<FieldType> & type)
{
/// @todo should we escape the string here? Presumably no as it will be escaped twice otherwise
writeString(type.getNameForValue(x), wb);
}
};
......@@ -1724,23 +1723,6 @@ class FunctionCast final : public IFunction
using NameValuePair = std::pair<std::string, ValueType>;
using EnumValues = std::vector<NameValuePair>;
// EnumValues value_intersection;
// std::set_intersection(std::begin(from_values), std::end(from_values),
// std::begin(to_values), std::end(to_values), std::back_inserter(value_intersection),
// [] (auto && from, auto && to) { return from.second < to.second; });
//
// for (const auto & name_value : value_intersection)
// {
// const auto & old_name = name_value.first;
// const auto & new_name = to_type->getNameForValue(name_value.second).toString();
// if (old_name != new_name)
// throw Exception{
// "Enum conversion changes name for value " + toString(name_value.second) +
// " from '" + old_name + "' to '" + new_name + "'",
// ErrorCodes::CANNOT_CONVERT_TYPE
// };
// }
EnumValues name_intersection;
std::set_intersection(std::begin(from_values), std::end(from_values),
std::begin(to_values), std::end(to_values), std::back_inserter(name_intersection),
......
......@@ -145,34 +145,24 @@ namespace VisibleWidth
const auto & in = col->getData();
auto & out = res->getData();
String str;
for (const auto & idx_num : ext::enumerate(in))
{
/// escape name to calculate correct length
{
WriteBufferFromString out{str};
writeEscapedString(type->getNameForValue(idx_num.second), out);
}
out[idx_num.first] = str.size();
StringRef name = type->getNameForValue(idx_num.second);
out[idx_num.first] = stringWidth(
reinterpret_cast<const UInt8 *>(name.data),
reinterpret_cast<const UInt8 *>(name.data) + name.size);
}
return true;
}
else if (const auto col = typeid_cast<const typename DataTypeEnum::ConstColumnType *>(column.get()))
{
String str;
/// escape name to calculate correct length
{
WriteBufferFromString out{str};
writeEscapedString(type->getNameForValue(col->getData()), out);
}
StringRef name = type->getNameForValue(col->getData());
block.getByPosition(result).column = new ColumnConstUInt64{
col->size(), str.size()
};
col->size(), stringWidth(
reinterpret_cast<const UInt8 *>(name.data),
reinterpret_cast<const UInt8 *>(name.data) + name.size)};
return true;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册