@@ -72,35 +72,30 @@ struct IPTrait<IPKind::String>
7272class IPAddressVariant
7373{
7474public:
75+ explicit IPAddressVariant (UInt32 addr_): addr(addr_)
76+ {
77+ }
7578
76- template <IPKind kind>
77- static IPAddressVariant create (IPTrait<kind>::ElementType address)
79+ explicit IPAddressVariant (UInt128 addr_)
7880 {
79- IPAddressVariant ip;
80- if constexpr (kind == IPKind::IPv4)
81- ip.addr = address;
82- else if constexpr (kind == IPKind::IPv6)
83- {
84- ip.addr = IPv6AddrType ();
85- auto * dst = std::get<IPv6AddrType>(ip.addr ).data ();
86- const char * src = reinterpret_cast <const char *>(&address.items );
87- memcpy (dst, src, IPV6_BINARY_LENGTH);
88- }
81+ addr = IPv6AddrType ();
82+ auto * dst = std::get<IPv6AddrType>(addr).data ();
83+ const char * src = reinterpret_cast <const char *>(&addr_.items );
84+ memcpy (dst, src, IPV6_BINARY_LENGTH);
85+ }
86+
87+ explicit IPAddressVariant (std::string_view addr_)
88+ {
89+ UInt32 v4;
90+ if (DB::parseIPv4whole (addr_.data (), addr_.data () + addr_.size (), reinterpret_cast <unsigned char *>(&v4)))
91+ addr = v4;
8992 else
9093 {
91- UInt32 v4;
92- if (DB::parseIPv4whole (address.data (), address.data () + address.size (), reinterpret_cast <unsigned char *>(&v4)))
93- ip.addr = v4;
94- else
95- {
96- ip.addr = IPv6AddrType ();
97- bool success = DB::parseIPv6whole (address.data (), address.data () + address.size (), std::get<IPv6AddrType>(ip.addr ).data ());
98- if (!success)
99- throw DB::Exception (DB::ErrorCodes::CANNOT_PARSE_TEXT, " Neither IPv4 nor IPv6 address: '{}'" , address);
100- }
94+ addr = IPv6AddrType ();
95+ bool success = DB::parseIPv6whole (addr_.data (), addr_.data () + addr_.size (), std::get<IPv6AddrType>(addr).data ());
96+ if (!success)
97+ throw DB::Exception (DB::ErrorCodes::CANNOT_PARSE_TEXT, " Neither IPv4 nor IPv6 address: '{}'" , addr_);
10198 }
102-
103- return ip;
10499 }
105100
106101 UInt32 asV4 () const
@@ -140,7 +135,7 @@ IPAddressCIDR parseIPWithCIDR(std::string_view cidr_str)
140135 throw DB::Exception (DB::ErrorCodes::CANNOT_PARSE_TEXT, " The text does not contain '/': {}" , std::string (cidr_str));
141136
142137 std::string_view addr_str = cidr_str.substr (0 , pos_slash);
143- auto addr = IPAddressVariant::create<IPKind::String> (addr_str);
138+ auto addr = IPAddressVariant (addr_str);
144139
145140 uint8_t prefix = 0 ;
146141 auto prefix_str = cidr_str.substr (pos_slash+1 );
@@ -185,7 +180,7 @@ namespace DB
185180 template <IPKind kind>
186181 static inline IPAddressVariant parseIP (const IPTrait<kind>::ColumnType * col_addr, size_t n)
187182 {
188- return IPAddressVariant::create<kind> (IPTrait<kind>::getElement (col_addr, n));
183+ return IPAddressVariant (IPTrait<kind>::getElement (col_addr, n));
189184 }
190185
191186 static std::optional<IPAddressVariant> parseConstantIP (const ColumnConst & col_addr)
0 commit comments