{"record":{"id":"bf83538bbb19632e","repo":"apache/druid","slug":"subnet-arg-has-an-invalid-format-s-bf8353","errorCode":null,"errorMessage":"subnet arg has an invalid format: %s","messagePattern":"subnet arg has an invalid format: (.+?)","errorType":"validation","errorClass":"DruidException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/expression/IPv6AddressMatchExprMacro.java","lineNumber":119,"sourceCode":"          return ExpressionType.LONG;\n        }\n      }\n\n      return new IPv6AddressMatchExpr(args);\n    }\n    catch (Exception e) {\n      throw processingFailed(e, \"failed to parse address\");\n    }\n  }\n\n  private IPAddressString getSubnetInfo(List<Expr> args)\n  {\n    String subnetArgName = \"subnet\";\n    Expr arg = args.get(ARG_SUBNET);\n    validationHelperCheckArgIsLiteral(arg, subnetArgName);\n    String subnet = (String) arg.getLiteralValue();\n    if (!IPv6AddressExprUtils.isValidIPv6Subnet(subnet)) {\n      throw validationFailed(subnetArgName + \" arg has an invalid format: \" + subnet);\n    }\n    return new IPAddressString(subnet);\n  }\n}\n","sourceCodeStart":101,"sourceCodeEnd":124,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/expression/IPv6AddressMatchExprMacro.java#L101-L124","documentation":"IPV6_MATCH's subnet argument must be a string literal that passes IPv6AddressExprUtils.isValidIPv6Subnet (valid IPv6 address plus /prefix). getSubnetInfo throws a validation failure naming the offending value when the literal is not a valid IPv6 subnet, preventing downstream parse failures.","triggerScenarios":"Calling IPV6_MATCH(addr, '<subnet>') where the subnet literal is not valid IPv6 CIDR: IPv4 subnet like '10.0.0.0/8', missing prefix like 'fe80::1', prefix >128, or empty/blank string.","commonSituations":"Copy-pasting IPv4 CIDRs into IPV6_MATCH; forgetting the /prefix on an IPv6 address; template concatenation producing empty subnet strings.","solutions":["Provide full IPv6 CIDR notation, e.g. IPV6_MATCH(addr, '2001:db8::/32').","Verify the prefix is a decimal 0-128 and the address part is valid IPv6.","If the subnet is dynamic, validate with IPv6AddressExprUtils.isValidIPv6Subnet before building the expression."],"exampleFix":"-- before\nSELECT IPV6_MATCH(ip, '2001:db8::1') FROM t\n-- after\nSELECT IPV6_MATCH(ip, '2001:db8::/32') FROM t","handlingStrategy":"validation","validationCode":"// Java\nif (!IPv6AddressExprUtils.isValidIPv6Subnet(subnet)) { throw new IllegalArgumentException(\"subnet must be valid IPv6 CIDR: \" + subnet); }","typeGuard":"static boolean isValidIpv6Cidr(String s) {\n  int slash = s == null ? -1 : s.lastIndexOf('/');\n  return slash > 0 && Integer.parseInt(s.substring(slash + 1)) <= 128 && s.contains(\":\");\n}","tryCatchPattern":"try {\n  return runDruidQuery(query);\n} catch (ExpressionValidationException e) {\n  if (e.getMessage().contains(\"invalid format\")) {\n    throw new UserInputException(\"IPV6_MATCH subnet must be IPv6 CIDR like 2001:db8::/32\");\n  }\n  throw e;\n}","preventionTips":["Never reuse IPv4 CIDR strings in IPV6_MATCH calls.","Always include the /prefix (0-128) in IPv6 subnets.","Validate dynamic subnets with isValidIPv6Subnet before query emission."],"tags":["druid","expression","ipv6","cidr","validation"],"backgroundTag":"invalid-argument-format","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}