{"record":{"id":"8e605ade17f136a4","repo":"apache/druid","slug":"unknown-string-comparator-s","errorCode":null,"errorMessage":"Unknown string comparator[%s]","messagePattern":"Unknown string comparator\\[(.+?)\\]","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java","lineNumber":47,"sourceCode":"{\n  @JsonCreator\n  public static StringComparator fromString(String type)\n  {\n    switch (StringUtils.toLowerCase(type)) {\n      case StringComparators.LEXICOGRAPHIC_NAME:\n        return StringComparators.LEXICOGRAPHIC;\n      case StringComparators.ALPHANUMERIC_NAME:\n        return StringComparators.ALPHANUMERIC;\n      case StringComparators.STRLEN_NAME:\n        return StringComparators.STRLEN;\n      case StringComparators.NUMERIC_NAME:\n        return StringComparators.NUMERIC;\n      case StringComparators.VERSION_NAME:\n        return StringComparators.VERSION;\n      case StringComparators.NATURAL_NAME:\n        return StringComparators.NATURAL;\n      default:\n        throw new IAE(\"Unknown string comparator[%s]\", type);\n    }\n  }\n\n  public abstract byte[] getCacheKey();\n}\n","sourceCodeStart":29,"sourceCodeEnd":53,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java#L29-L53","documentation":"StringComparator.fromString maps comparator names (lexicographic, alphanumeric, numeric, version, natural) to comparator instances. An unknown name is rejected with an IAE. This validates the comparator string supplied in query JSON (e.g. on DimFilter, extractor sort orders).","triggerScenarios":"Query JSON contains \"comparator\": \"<typo>\" or a comparator name unsupported by the running Druid version, passed to StringComparator.fromString.","commonSituations":"Hand-written JSON with a misspelled comparator (e.g. \"lexographic\"); client SDK serializing a comparator string not supported by the server version; using the enum name instead of its string form.","solutions":["Use one of the valid names: lexicographic, alphanumeric, numeric, version, natural","Check server version — newer comparators on an older broker will fail","Correct the query JSON field name and value"],"exampleFix":"// before\n\"sortOrder\": {\"type\": \"lexographic\"}\n// after\n\"sortOrder\": {\"type\": \"lexicographic\"}","handlingStrategy":"validation","validationCode":"final Set<String> VALID = Set.of(\"lexicographic\",\"alphanumeric\",\"numeric\",\"version\",\"natural\");\nif (comparator != null && !VALID.contains(comparator)) {\n  throw new IllegalArgumentException(\"unknown comparator: \" + comparator);\n}","typeGuard":null,"tryCatchPattern":"try {\n  submitQuery(queryJson);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Unknown string comparator\")) {\n    submitQuery(fixComparator(queryJson));\n  } else throw e;\n}","preventionTips":["Use the Druid Java enum/constant instead of raw strings when building queries","Validate query JSON against the version's schema before submission"],"tags":["comparator","sorting","invalid-enum","query-json"],"backgroundTag":"invalid-enum-value","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}