@@ -183,26 +183,24 @@ namespace DB
183183 return IPAddressVariant (IPTrait<kind>::getElement (col_addr, n));
184184 }
185185
186+ #pragma clang diagnostic ignored "-Wshadow"
187+ #define EXEC_IMPL (col, func, ...) \
188+ if (const auto * ipv4_column = dynamic_cast <const ColumnIPv4 *>(&(col))) \
189+ return func<IPKind::IPv4>(ipv4_column, __VA_ARGS__); \
190+ else if (const auto * ipv6_column = dynamic_cast <const ColumnIPv6 *>(&(col))) \
191+ return func<IPKind::IPv6>(ipv6_column, __VA_ARGS__); \
192+ else if (const auto * string_column = dynamic_cast <const ColumnString *>(&(col))) \
193+ return func<IPKind::String>(string_column, __VA_ARGS__);
194+
186195 static std::optional<IPAddressVariant> parseConstantIP (const ColumnConst & col_addr)
187196 {
188- if (const auto * ipv4_column = dynamic_cast <const ColumnIPv4 *>(&col_addr.getDataColumn ()))
189- return parseIP<IPKind::IPv4>(ipv4_column, 0 );
190- else if (const auto * ipv6_column = dynamic_cast <const ColumnIPv6 *>(&col_addr.getDataColumn ()))
191- return parseIP<IPKind::IPv6>(ipv6_column, 0 );
192- else if (const auto * string_column = dynamic_cast <const ColumnString *>(&col_addr.getDataColumn ()))
193- return parseIP<IPKind::String>(string_column, 0 );
197+ EXEC_IMPL (col_addr.getDataColumn (), parseIP, 0 )
194198 else if (col_addr.onlyNull ())
195199 return std::nullopt ;
196200 else if (const auto * nullable_column = dynamic_cast <const ColumnNullable *>(&col_addr.getDataColumn ()))
197201 {
198- if (const auto * inner_ipv4_column = dynamic_cast <const ColumnIPv4 *>(&nullable_column->getNestedColumn ()))
199- return parseIP<IPKind::IPv4>(inner_ipv4_column, 0 );
200- else if (const auto * inner_ipv6_column = dynamic_cast <const ColumnIPv6 *>(&nullable_column->getNestedColumn ()))
201- return parseIP<IPKind::IPv6>(inner_ipv6_column, 0 );
202- else if (const auto * inner_string_column = dynamic_cast <const ColumnString *>(&nullable_column->getNestedColumn ()))
203- return parseIP<IPKind::String>(inner_string_column, 0 );
202+ EXEC_IMPL (nullable_column->getNestedColumn (), parseIP, 0 ) // /NO-LINT
204203 }
205-
206204 throw Exception (ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, " The IP column type must be one of: String, IPv4, IPv6, Nullable(IPv4), Nullable(IPv6), or Nullable(String)." );
207205 }
208206
@@ -215,16 +213,11 @@ namespace DB
215213 {
216214 if (const auto * col_cidr_const = checkAndGetAnyColumnConst (col_cidr))
217215 return executeImpl (*col_addr_const, *col_cidr_const, input_rows_count);
218- else
219- return executeImpl (*col_addr_const, *col_cidr, input_rows_count);
220- }
221- else
222- {
223- if (const auto * col_cidr_const = checkAndGetAnyColumnConst (col_cidr))
224- return executeImpl (*col_addr, *col_cidr_const, input_rows_count);
225- else
226- return executeImpl (*col_addr, *col_cidr, input_rows_count);
216+ return executeImpl (*col_addr_const, *col_cidr, input_rows_count);
227217 }
218+ if (const auto * col_cidr_const = checkAndGetAnyColumnConst (col_cidr))
219+ return executeImpl (*col_addr, *col_cidr_const, input_rows_count);
220+ return executeImpl (*col_addr, *col_cidr, input_rows_count);
228221 }
229222
230223 DataTypePtr getReturnTypeImpl (const DataTypes & arguments) const override
@@ -244,8 +237,8 @@ namespace DB
244237 if (!(type.isString () || type.isIPv4 () || type.isIPv6 ()) || !isString (prefix_type))
245238 throw Exception (
246239 ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
247- " The first arguments of function {} must be one of: String, IPv4, IPv6, Nullable(IPv4 ), Nullable(IPv6 ), or "
248- " Nullable(String ) and the second argument must be String. Get first type : {} and second type : {}" ,
240+ " The first argument of function {} must be one of: String, IPv4, IPv6, Nullable(String ), Nullable(IPv4 ), or "
241+ " Nullable(IPv6 ) and the second argument must be String. Type of the first argument : {}, type of the second argument : {}" ,
249242 getName (),
250243 addr_type->getName (),
251244 prefix_type->getName ());
@@ -320,8 +313,8 @@ namespace DB
320313
321314 template <IPKind kind>
322315 static ColumnPtr executeImpl (
323- const ColumnNullable * nullable_column,
324316 const IPTrait<kind>::ColumnType * col_addr,
317+ const ColumnNullable * nullable_column,
325318 const IPAddressCIDR & cidr,
326319 size_t input_rows_count)
327320 {
@@ -344,22 +337,11 @@ namespace DB
344337 template <typename T>
345338 static ColumnPtr executeImpl (const IColumn & col_addr, const T & cidr, size_t input_rows_count)
346339 {
347- if (const auto * ipv4_column = dynamic_cast <const ColumnIPv4 *>(&col_addr))
348- return executeImpl<IPKind::IPv4>(ipv4_column, cidr, input_rows_count);
349- else if (const auto * ipv6_column = dynamic_cast <const ColumnIPv6 *>(&col_addr))
350- return executeImpl<IPKind::IPv6>(ipv6_column, cidr, input_rows_count);
351- else if (const auto * string_column = dynamic_cast <const ColumnString *>(&col_addr))
352- return executeImpl<IPKind::String>(string_column, cidr, input_rows_count);
340+ EXEC_IMPL (col_addr, executeImpl, cidr, input_rows_count)
353341 else if (const auto * nullable_column = dynamic_cast <const ColumnNullable *>(&col_addr))
354342 {
355- if (const auto * inner_ipv4_column = dynamic_cast <const ColumnIPv4 *>(&nullable_column->getNestedColumn ()))
356- return executeImpl<IPKind::IPv4>(nullable_column, inner_ipv4_column, cidr, input_rows_count);
357- else if (const auto * inner_ipv6_column = dynamic_cast <const ColumnIPv6 *>(&nullable_column->getNestedColumn ()))
358- return executeImpl<IPKind::IPv6>(nullable_column, inner_ipv6_column, cidr, input_rows_count);
359- else if (const auto * inner_string_column = dynamic_cast <const ColumnString *>(&nullable_column->getNestedColumn ()))
360- return executeImpl<IPKind::String>(nullable_column, inner_string_column, cidr, input_rows_count);
343+ EXEC_IMPL (nullable_column->getNestedColumn (), executeImpl, nullable_column, cidr, input_rows_count)
361344 }
362-
363345 throw Exception (ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, " The IP column type must be one of: String, IPv4, IPv6, Nullable(IPv4), Nullable(IPv6), or Nullable(String)." );
364346 }
365347
@@ -387,8 +369,8 @@ namespace DB
387369
388370 template <IPKind kind>
389371 static ColumnPtr executeImpl (
390- const ColumnNullable * nullable_column,
391372 const IPTrait<kind>::ColumnType * col_addr,
373+ const ColumnNullable * nullable_column,
392374 const IColumn & col_cidr,
393375 size_t input_rows_count)
394376 {
0 commit comments