Skip to content

Commit 671eb25

Browse files
Gabriel39kaka11chen
authored andcommitted
[fix](float) Fix float field to_string (#58176)
1 parent 7c8df01 commit 671eb25

File tree

2 files changed

+36
-51
lines changed

2 files changed

+36
-51
lines changed

be/src/vec/core/field.cpp

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "vec/core/accurate_comparison.h"
2828
#include "vec/core/decimal_comparison.h"
2929
#include "vec/data_types/data_type_decimal.h"
30+
#include "vec/functions/cast/cast_to_string.h"
3031
#include "vec/io/io_helper.h"
3132
#include "vec/io/var_int.h"
3233
#include "vec/runtime/timestamptz_value.h"
@@ -791,10 +792,16 @@ std::string_view Field::as_string_view() const {
791792

792793
#undef MATCH_PRIMITIVE_TYPE
793794

794-
#define MATCH_PRIMITIVE_TYPE(primite_type) \
795+
#define MATCH_NUMBER_TYPE(primite_type) \
796+
if (type == primite_type) { \
797+
const auto& v = get<typename PrimitiveTypeTraits<primite_type>::NearestFieldType>(); \
798+
return CastToString::from_number(v); \
799+
}
800+
801+
#define MATCH_DECIMAL_TYPE(primite_type) \
795802
if (type == primite_type) { \
796803
const auto& v = get<typename PrimitiveTypeTraits<primite_type>::NearestFieldType>(); \
797-
return std::to_string(v); \
804+
return CastToString::from_decimal(v.get_value(), v.get_scale()); \
798805
}
799806

800807
std::string Field::to_string() const {
@@ -803,63 +810,41 @@ std::string Field::to_string() const {
803810
const auto& s = get<String>();
804811
return {s.data(), s.size()};
805812
}
806-
if (type == TYPE_DECIMAL32) {
807-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DECIMAL32>::NearestFieldType>();
808-
return v.get_value().to_string(v.get_scale());
809-
}
810-
if (type == TYPE_DECIMAL64) {
811-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DECIMAL64>::NearestFieldType>();
812-
return v.get_value().to_string(v.get_scale());
813-
}
814-
if (type == TYPE_DECIMALV2) {
815-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DECIMALV2>::NearestFieldType>();
816-
return v.get_value().to_string(v.get_scale());
817-
}
818-
if (type == TYPE_DECIMAL128I) {
819-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DECIMAL128I>::NearestFieldType>();
820-
return v.get_value().to_string(v.get_scale());
821-
}
822-
if (type == TYPE_DECIMAL256) {
823-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DECIMAL256>::NearestFieldType>();
824-
return v.get_value().to_string(v.get_scale());
825-
}
826-
if (type == TYPE_LARGEINT) {
827-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_LARGEINT>::NearestFieldType>();
828-
return int128_to_string(v);
829-
}
813+
MATCH_DECIMAL_TYPE(TYPE_DECIMAL32);
814+
MATCH_DECIMAL_TYPE(TYPE_DECIMAL64);
815+
MATCH_DECIMAL_TYPE(TYPE_DECIMALV2);
816+
MATCH_DECIMAL_TYPE(TYPE_DECIMAL128I);
817+
MATCH_DECIMAL_TYPE(TYPE_DECIMAL256);
818+
830819
if (type == TYPE_DATE || type == TYPE_DATETIME) {
831-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType>();
832-
std::string buf(40, 0);
833-
auto* to = binary_cast<int64_t, doris::VecDateTimeValue>(v).to_string(buf.data());
834-
buf.resize(to - buf.data() - 1);
835-
return buf;
820+
const auto& v = binary_cast<int64_t, doris::VecDateTimeValue>(
821+
get<typename PrimitiveTypeTraits<TYPE_DATE>::NearestFieldType>());
822+
return CastToString::from_date_or_datetime(v);
836823
}
837824
if (type == TYPE_DATEV2) {
838-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>();
839-
return binary_cast<uint32_t, DateV2Value<DateV2ValueType>>((uint32_t)v).to_string();
825+
const auto& v = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
826+
(uint32_t)get<typename PrimitiveTypeTraits<TYPE_DATEV2>::NearestFieldType>());
827+
return CastToString::from_datev2(v);
840828
}
841829
if (type == TYPE_DATETIMEV2) {
842-
const auto& v = get<typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>();
843-
return binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(v).to_string();
830+
const auto& v = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
831+
(uint64_t)get<typename PrimitiveTypeTraits<TYPE_DATETIMEV2>::NearestFieldType>());
832+
return CastToString::from_datetimev2(v);
844833
}
845-
MATCH_PRIMITIVE_TYPE(TYPE_BOOLEAN);
846-
MATCH_PRIMITIVE_TYPE(TYPE_TINYINT);
847-
MATCH_PRIMITIVE_TYPE(TYPE_SMALLINT);
848-
MATCH_PRIMITIVE_TYPE(TYPE_INT);
849-
MATCH_PRIMITIVE_TYPE(TYPE_BIGINT);
850-
MATCH_PRIMITIVE_TYPE(TYPE_FLOAT);
851-
MATCH_PRIMITIVE_TYPE(TYPE_DOUBLE);
852-
MATCH_PRIMITIVE_TYPE(TYPE_TIME);
853-
MATCH_PRIMITIVE_TYPE(TYPE_TIMEV2);
854-
// MATCH_PRIMITIVE_TYPE(TYPE_IPV4);
855-
// MATCH_PRIMITIVE_TYPE(TYPE_IPV6);
856-
MATCH_PRIMITIVE_TYPE(TYPE_UINT32);
857-
MATCH_PRIMITIVE_TYPE(TYPE_UINT64);
834+
MATCH_NUMBER_TYPE(TYPE_BOOLEAN);
835+
MATCH_NUMBER_TYPE(TYPE_TINYINT);
836+
MATCH_NUMBER_TYPE(TYPE_SMALLINT);
837+
MATCH_NUMBER_TYPE(TYPE_INT);
838+
MATCH_NUMBER_TYPE(TYPE_BIGINT);
839+
MATCH_NUMBER_TYPE(TYPE_LARGEINT);
840+
MATCH_NUMBER_TYPE(TYPE_FLOAT);
841+
MATCH_NUMBER_TYPE(TYPE_DOUBLE);
858842
throw Exception(
859843
Status::FatalError("type not supported for to_string, type={}", get_type_name()));
860844
}
861845

862-
#undef MATCH_PRIMITIVE_TYPE
846+
#undef MATCH_NUMBER_TYPE
847+
#undef MATCH_DECIMAL_TYPE
863848

864849
#define DECLARE_FUNCTION(FUNC_NAME) \
865850
template void Field::FUNC_NAME<TYPE_NULL>( \

be/src/vec/functions/cast/cast_to_string.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct CastToString {
6161
static inline void push_datev2(const DateV2Value<DateV2ValueType>& from, BufferWritable& bw);
6262

6363
static inline std::string from_datetimev2(const DateV2Value<DateTimeV2ValueType>& from,
64-
UInt32 scale);
64+
UInt32 scale = -1);
6565
static inline std::string from_timestamptz(const TimestampTzValue& from, UInt32 scale,
6666
const cctz::time_zone* timezone = nullptr);
6767
static inline void push_datetimev2(const DateV2Value<DateTimeV2ValueType>& from, UInt32 scale,
@@ -563,4 +563,4 @@ inline WrapperType create_string_wrapper(const DataTypePtr& from_type) {
563563

564564
}; // namespace CastWrapper
565565
} // namespace doris::vectorized
566-
#include "common/compile_check_end.h"
566+
#include "common/compile_check_end.h"

0 commit comments

Comments
 (0)