{"record":{"id":"8ec3da0e66fc738f","repo":"apache/druid","slug":"selector-of-class-s-does-not-have-a-dictionary-8ec3da","errorCode":null,"errorMessage":"Selector of class[%s] does not have a dictionary, cannot use it.","messagePattern":"Selector of class\\[(.+?)\\] does not have a dictionary, cannot use it\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/virtual/SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector.java","lineNumber":58,"sourceCode":" *\n * @see SingleStringInputDeferredEvaluationExpressionDimensionSelector for the non-vectorized version of this selector.\n */\npublic class SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector\n    implements SingleValueDimensionVectorSelector\n{\n  private final SingleValueDimensionVectorSelector selector;\n  private final ExprVectorProcessor<Object[]> stringProcessor;\n  private final StringLookupVectorInputBindings inputBinding;\n\n  public SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector(\n      SingleValueDimensionVectorSelector selector,\n      Expr expression\n  )\n  {\n    // Verify selector has a working dictionary.\n    if (selector.getValueCardinality() == DimensionDictionarySelector.CARDINALITY_UNKNOWN\n        || !selector.nameLookupPossibleInAdvance()) {\n      throw new ISE(\n          \"Selector of class[%s] does not have a dictionary, cannot use it.\",\n          selector.getClass().getName()\n      );\n    }\n    this.selector = selector;\n    this.inputBinding = new StringLookupVectorInputBindings();\n    this.stringProcessor = expression.asVectorProcessor(inputBinding);\n  }\n\n  @Override\n  public int getValueCardinality()\n  {\n    return CARDINALITY_UNKNOWN;\n  }\n\n  @Nullable\n  @Override\n  public String lookupName(int id)","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/virtual/SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector.java#L40-L76","documentation":"Vector counterpart of the same constraint: SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector needs a vector dimension selector with a working dictionary (known cardinality and advance name lookup) to map vector rows to string values. Selectors without dictionaries are rejected with an ISE that includes the selector's class name.","triggerScenarios":"Vectorized query planning constructs this selector with a selector reporting CARDINALITY_UNKNOWN or nameLookupPossibleInAdvance()==false.","commonSituations":"Vector engine encountering non-dictionary-encoded string columns under expression virtual columns; switching a column's encoding between versions can flip which selector path is chosen and expose this.","solutions":["Use a dictionary-encoded column/vector dimension selector","Disable vectorization (vectorize=false in query context) as a workaround","Fall back to the non-vector deferred selector for non-dictionary inputs","Implement nameLookupPossibleInAdvance() correctly in custom vector dimension selectors"],"exampleFix":"// before\nnew SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector(unknownCardSelector, expr)\n// after\nif (sel.getValueCardinality() == CARDINALITY_UNKNOWN) {\n  return singleInputDeferredColumnSelector(sel, expr); // non-dictionary fallback\n}","handlingStrategy":"type-guard","validationCode":"if (sel.getValueCardinality() == CARDINALITY_UNKNOWN || !sel.nameLookupPossibleInAdvance()) {\n  // use non-vector path or disable vectorization\n}","typeGuard":"static boolean vectorDictionaryUsable(VectorDimensionSelector sel) {\n  return sel.getValueCardinality() != CARDINALITY_UNKNOWN && sel.nameLookupPossibleInAdvance();\n}","tryCatchPattern":"try {\n  return new SingleStringInputDeferredEvaluationExpressionDimensionVectorSelector(sel, expr);\n} catch (ISE e) {\n  queryContext.put(\"vectorize\", \"false\");\n  return nonVectorSelector(sel, expr);\n}","preventionTips":["Keep string columns dictionary-encoded for vectorized expression queries","Verify vector selector dictionaries in query planning before construction","Use query context vectorize=false when working with non-dictionary columns"],"tags":["druid","vectorized-query","expression","dictionary-encoding"],"backgroundTag":"invalid-argument-value","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"}