{"record":{"id":"9442112cb7e71309","repo":"apache/druid","slug":"cannot-create-query-type-helper-from-invalid-type","errorCode":null,"errorMessage":"Cannot create query type helper from invalid type [%s]","messagePattern":"Cannot create query type helper from invalid type \\[(.+?)\\]","errorType":"exception","errorClass":"org.apache.druid.java.util.common.IAE","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategyFactory.java","lineNumber":47,"sourceCode":"{\n  @Override\n  public CardinalityAggregatorColumnSelectorStrategy makeColumnSelectorStrategy(\n      ColumnCapabilities capabilities,\n      ColumnValueSelector selector,\n      String dimension\n  )\n  {\n    switch (capabilities.getType()) {\n      case STRING:\n        return new StringCardinalityAggregatorColumnSelectorStrategy();\n      case LONG:\n        return new LongCardinalityAggregatorColumnSelectorStrategy();\n      case FLOAT:\n        return new FloatCardinalityAggregatorColumnSelectorStrategy();\n      case DOUBLE:\n        return new DoubleCardinalityAggregatorColumnSelectorStrategy();\n      default:\n        throw new IAE(\"Cannot create query type helper from invalid type [%s]\", capabilities.asTypeString());\n    }\n  }\n\n  @Override\n  public boolean supportsComplexTypes()\n  {\n    return false;\n  }\n}\n","sourceCodeStart":29,"sourceCodeEnd":57,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategyFactory.java#L29-L57","documentation":"CardinalityAggregatorColumnSelectorStrategyFactory can only produce column selector strategies for numeric column types (LONG, FLOAT, DOUBLE). When a column's capabilities report any other type (e.g. a complex/serialized type the factory does not handle), it throws this IllegalArgumentException during query tooling setup. It indicates the cardinality aggregator was pointed at a column type it cannot process.","triggerScenarios":"Calling makeColumnSelectorStrategy with ColumnValueSelectorCapabilities whose type is not LONG, FLOAT, or DOUBLE — typically when the cardinality aggregator's field resolves to a complex, STRING, or ARRAY-typed column handled by an unhandled switch default branch.","commonSituations":"Running a cardinality (approximate distinct count) query against a complex metric column (e.g. hyperUnique on a nested/complex column), a schema mismatch after ingestion changes, or a new column type added upstream that the factory does not know about.","solutions":["Check the actual column type of the aggregator field (via /druid/v2/datasources/{ds}/getters or segment metadata) and ensure it is LONG, FLOAT, or DOUBLE.","If the column is a string and you want distinct counts, use the string-typed cardinality path or convert the column (e.g. ingest a numeric expression).","If the column is a complex aggregator output, use the matching aggregator (e.g. hyperUnique/cardinality on its raw input) instead of stacking cardinality over it.","Upgrade Druid if the column type is newer than your version's supported strategy set."],"exampleFix":"// before\n{\"type\":\"cardinality\",\"fields\":[\"complex_metric\"]}\n// after\n{\"type\":\"cardinality\",\"fields\":[\"numeric_dim\"]}","handlingStrategy":"validation","validationCode":"ColumnCapabilities caps = selector.getCapabilities(column);\nif (caps.getType() != ValueType.LONG && caps.getType() != ValueType.FLOAT && caps.getType() != ValueType.DOUBLE) {\n  throw new IllegalArgumentException(\"cardinality supports only numeric columns, got: \" + caps.asTypeString());\n}","typeGuard":"boolean isNumericColumn(ColumnCapabilities c) {\n  return c != null && (c.getType() == ValueType.LONG || c.getType() == ValueType.FLOAT || c.getType() == ValueType.DOUBLE);\n}","tryCatchPattern":"try {\n  strategy = factory.makeColumnSelectorStrategy(caps, selector);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Cannot create query type helper\")) {\n    throw new QueryPlanningException(\"Cardinality requires a numeric column; got \" + caps.asTypeString());\n  }\n  throw e;\n}","preventionTips":["Inspect column types via segment metadata before writing cardinality aggregations.","Avoid stacking cardinality over complex metric columns.","Validate query specs against the datasource schema in CI."],"tags":["druid","aggregation","column-type"],"backgroundTag":"unsupported-dtype","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}