@@ -78,7 +78,7 @@ namespace {
78
78
SIMPLE_STRICT_UDF (TFromString , TOptionalString (TAutoMapString )) {
79
79
TIpv6Address addr = TIpv6Address ::FromString (args [0 ].AsStringRef ());
80
80
auto res = SerializeAddress (addr );
81
- return res ? valueBuilder -> NewString (res .GetRef ()) : TUnboxedValue (TUnboxedValuePod () );
81
+ return res ? valueBuilder -> NewString (res .GetRef ()) : TUnboxedValue ();
82
82
}
83
83
84
84
SIMPLE_UDF (TToString , char * (TAutoMapString )) {
@@ -122,7 +122,8 @@ namespace {
122
122
if (ref .Size () == 16 ) {
123
123
return valueBuilder -> NewString (ref );
124
124
} else if (ref .Size () == 4 ) {
125
- auto addr6 = TIpv6Address ::FromString ("::ffff:" + DeserializeAddress (ref ).ToString (false));
125
+ TIpv6Address addr4 = DeserializeAddress (ref );
126
+ auto addr6 = TIpv6Address (ui128 (addr4 ) | ui128 (0xFFFF ) << 32 , TIpv6Address ::Ipv6 );
126
127
return valueBuilder -> NewString (SerializeAddress (addr6 ).GetRef ());
127
128
} else {
128
129
ythrow yexception () << "Incorrect size of input, expected "
@@ -152,8 +153,7 @@ namespace {
152
153
ythrow yexception () << "Incorrect size of input, expected "
153
154
<< "4 or 16, got " << ref .Size ();
154
155
}
155
- ui128 mask = ui128 (-1 ) << int ((addr .Type () == TIpv6Address ::Ipv6 ? 128 : 32 ) - subnetSize );
156
- TIpv6Address beg (ui128 (addr ) & mask , addr .Type ());
156
+ TIpv6Address beg = LowerBoundForPrefix (addr , subnetSize );
157
157
return valueBuilder -> NewString (SerializeAddress (beg ).GetRef ());
158
158
}
159
159
0 commit comments