{"record":{"id":"a3e6a4e906674918","repo":"apache/druid","slug":"dimensionspec-s-cannot-vectorize","errorCode":null,"errorMessage":"DimensionSpec[%s] cannot vectorize","messagePattern":"DimensionSpec\\[(.+?)\\] cannot vectorize","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/dimension/DimensionSpec.java","lineNumber":78,"sourceCode":"\n  /**\n   * Decorate a {@link DimensionSelector}, allowing custom transformation of underlying behavior (e.g. performing\n   * extraction functions in the case of {@link ExtractionDimensionSpec}, regex filtering in the case of\n   * {@link RegexFilteredDimensionSpec}, and so on).\n   */\n  DimensionSelector decorate(DimensionSelector selector);\n\n  /**\n   * Vectorized analog of {@link #decorate(DimensionSelector)} for {@link SingleValueDimensionVectorSelector}, most\n   * likely produced with\n   * {@link org.apache.druid.segment.vector.VectorColumnSelectorFactory#makeSingleValueDimensionSelector(DimensionSpec)}\n   *\n   * Decoration allows a {@link DimensionSpec} to customize the behavior of the underlying selector, for example\n   * transforming or filtering values.\n   */\n  default SingleValueDimensionVectorSelector decorate(SingleValueDimensionVectorSelector selector)\n  {\n    throw new UOE(\"DimensionSpec[%s] cannot vectorize\", getClass().getName());\n  }\n\n  /**\n   * Vectorized analog of {@link #decorate(DimensionSelector) for {@link MultiValueDimensionVectorSelector}, most likely\n   * produced with\n   * {@link org.apache.druid.segment.vector.VectorColumnSelectorFactory#makeMultiValueDimensionSelector(DimensionSpec)}\n   *\n   * Decoration allows a {@link DimensionSpec} to customize the behavior of the underlying selector, for example\n   * transforming or filtering values.\n   */\n  default MultiValueDimensionVectorSelector decorate(MultiValueDimensionVectorSelector selector)\n  {\n    throw new UOE(\"DimensionSpec[%s] cannot vectorize\", getClass().getName());\n  }\n\n  /**\n   * Does this DimensionSpec require that decorate() be called to produce correct results?\n   */","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/dimension/DimensionSpec.java#L60-L96","documentation":"DimensionSpec.decorate for vectorized selectors (SingleValueDimensionVectorSelector) throws UOE(\"DimensionSpec[%s] cannot vectorize\") by default; only dimension specs that support vectorization override it. When the vectorized query engine processes a column with a non-vectorizable DimensionSpec, this error aborts the query.","triggerScenarios":"Running a vector-enabled query (default when possible) whose groupBy/timeseries/topN uses a DimensionSpec that lacks vector support — e.g. certain extraction-fn or decorated specs, or custom DimensionSpec implementations.","commonSituations":"Custom DimensionSpec plugins not updated for vectorized engines; query JSON using extraction functions incompatible with vectorization; cluster where vectorization auto-enabled but specs predate it.","solutions":["Disable vectorization for the query: set \"vectorize\": false (or vectorizeDimension:false) in the query context","Replace the DimensionSpec with a vectorization-compatible one (e.g. DefaultDimensionSpec) or pre-transform data at ingestion","Implement/override decorate(SingleValueDimensionVectorSelector) and decorate(MultiValueDimensionVectorSelector) in your custom DimensionSpec","Check server logs/druid.query.vectorize config to confirm which component refused to vectorize"],"exampleFix":"// before\n{\"queryType\":\"timeseries\", \"dimensions\":[{\"type\":\"myCustomSpec\",...}], ...}\n// after\n{\"queryType\":\"timeseries\", \"dimensions\":[{\"type\":\"default\",\"dimension\":\"page\",...}], \"context\":{\"vectorize\":false}}","handlingStrategy":"fallback","validationCode":"// reject non-vectorizable specs up front\nif (!spec.getType().equals(\"default\") && query.getContextBoolean(\"vectorize\", true)) {\n  log.warn(\"DimensionSpec may not vectorize; set vectorize=false or use DefaultDimensionSpec\");\n}","typeGuard":"boolean canVectorize(DimensionSpec s) { return s instanceof DefaultDimensionSpec || s instanceof IndexedDimensionSpec; }","tryCatchPattern":"try { return factory.makeVectorSelector(spec); } catch (UnsupportedOperationException | UOE e) { return factory.makeDimensionSelector(spec); /* non-vector path */ }","preventionTips":["Prefer DefaultDimensionSpec for vector-enabled queries","Set \"vectorize\": false in query context when using exotic specs","Implement vector decorate(...) overrides in custom DimensionSpecs","Check query planning logs for vectorization fallbacks"],"tags":["vectorization","dimension-spec","query"],"backgroundTag":"unsupported-operation","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"}