Skip to content

Commit 7e15c10

Browse files
author
Vadim Averin
committed
Add subnet match
1 parent 02cbf0f commit 7e15c10

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

ydb/library/yql/udfs/common/ip_base/lib/ip_base_udf.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,14 @@ namespace {
210210
return res;
211211
}
212212

213-
TMaybe<TString> SerializeSubnet(const TIpAddressRange& range) {
213+
TString SerializeSubnet(const TIpAddressRange& range) {
214214
TString res;
215215
if (range.Type() == TIpv6Address::Ipv4) {
216216
auto subnet4 = TRawIp4Subnet::FromIpRange(range);
217217
res = TString(reinterpret_cast<const char *>(&subnet4), sizeof subnet4);
218218
} else if (range.Type() == TIpv6Address::Ipv6) {
219219
auto subnet6 = TRawIp6Subnet::FromIpRange(range);
220220
res = TString(reinterpret_cast<const char *>(&subnet6), sizeof subnet6);
221-
} else {
222-
return Nothing();
223221
}
224222
return res;
225223
}
@@ -237,7 +235,7 @@ namespace {
237235
TString str(strRef.Data(), strRef.Data() + strRef.Size());
238236
TIpAddressRange range = TIpAddressRange::FromCompactString(str);
239237
auto res = SerializeSubnet(range);
240-
return res ? valueBuilder->NewString(res.GetRef()) : TUnboxedValue(TUnboxedValuePod());
238+
return res ? valueBuilder->NewString(res) : TUnboxedValue(TUnboxedValuePod());
241239
}
242240

243241
SIMPLE_UDF(TToString, char*(TAutoMapString)) {
@@ -253,6 +251,18 @@ namespace {
253251
return valueBuilder->NewString(result);
254252
}
255253

254+
SIMPLE_UDF(TSubnetMatch, bool(TAutoMapString, TAutoMapString)) {
255+
Y_UNUSED(valueBuilder);
256+
auto range1 = DeserializeSubnet(args[0].AsStringRef());
257+
if (args[1].AsStringRef().Size() == sizeof(TRawIp4) || args[1].AsStringRef().Size() == sizeof(TRawIp6)) {
258+
auto addr2 = DeserializeAddress(args[1].AsStringRef());
259+
return TUnboxedValuePod(range1.Contains(addr2));
260+
} else { // second argument is a whole subnet, not a single address
261+
auto range2 = DeserializeSubnet(args[1].AsStringRef());
262+
return TUnboxedValuePod(range1.Contains(range2));
263+
}
264+
}
265+
256266
SIMPLE_STRICT_UDF(TIsIPv4, bool(TOptionalString)) {
257267
Y_UNUSED(valueBuilder);
258268
bool result = false;
@@ -334,7 +344,6 @@ namespace {
334344
TIsIPv6, \
335345
TIsEmbeddedIPv4, \
336346
TConvertToIPv6, \
337-
TGetSubnet
338-
}
339-
340-
347+
TGetSubnet, \
348+
TSubnetMatch
349+
}

0 commit comments

Comments
 (0)