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
800807std::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>( \
0 commit comments