{"record":{"id":"ee63dc62b7f6e06d","repo":"apache/druid","slug":"no-such-virtual-column-s","errorCode":null,"errorMessage":"No such virtual column[%s]","messagePattern":"No such virtual column\\[(.+?)\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/VirtualColumns.java","lineNumber":553,"sourceCode":"    // id doesn't matter as there is only one kind of \"VirtualColumns\", so use 0.\n    return new CacheKeyBuilder((byte) 0).appendCacheablesIgnoringOrder(virtualColumns).build();\n  }\n\n  public boolean isEmpty()\n  {\n    return virtualColumns.isEmpty();\n  }\n\n  public List<String> getColumnNames()\n  {\n    return virtualColumnNames;\n  }\n\n  private VirtualColumn getVirtualColumnForSelector(String columnName)\n  {\n    VirtualColumn virtualColumn = getVirtualColumn(columnName);\n    if (virtualColumn == null) {\n      throw new IAE(\"No such virtual column[%s]\", columnName);\n    }\n    return virtualColumn;\n  }\n\n  /**\n   * Detects cycles in the dependencies of a {@link VirtualColumn}.\n   *\n   * @param virtualColumn virtual column to check\n   * @param visited       null on initial call. Internally, this method operates recursively, and uses this parameter\n   *                      to pass down the list of already-visited columns.\n   */\n  private void detectCycles(VirtualColumn virtualColumn, @Nullable Set<String> visited)\n  {\n    // Copy \"visited\" to avoid modifying it\n    final Set<String> visitedCopy = visited == null\n                                    ? Sets.newHashSet(virtualColumn.getOutputName())\n                                    : Sets.newHashSet(visited);\n","sourceCodeStart":535,"sourceCodeEnd":571,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/VirtualColumns.java#L535-L571","documentation":"VirtualColumns throws IAE when a selector requests a virtual column by name that does not exist in the VirtualColumns instance. It is a lookup failure: getVirtualColumn returned null for the requested columnName, meaning no virtual column with that name was configured.","triggerScenarios":"Calling VirtualColumns.getVirtualColumnForSelector(columnName) (directly or via virtualColumn(...)) with a name that is not a registered virtualized column.","commonSituations":"Typo in the column name in a Druid query or ingestion spec; referencing a virtual column expression by its alias before it is defined; query referencing a column removed between query versions; SQL planner passing a name that only exists in a different VirtualColumns scope.","solutions":["Verify the column name is exactly the virtual column alias defined in the query/virtualColumns list (case-sensitive)","Add or correct the virtual column definition in the query's virtualColumns block so the name exists","If the column should be a regular column, remove it from the virtual-columns reference and use it directly"],"exampleFix":"// before\nVirtualColumns.of(\"concat_expr\") // referenced as \"concat\" in the filter\n// after\n// reference the alias exactly: filters on \"concat_expr\" or define the virtual column with the alias used in the query","handlingStrategy":"validation","validationCode":"if (!knownVirtualColumnNames.contains(columnName)) { throw new IllegalArgumentException(\"Unknown virtual column: \" + columnName); }\nVirtualColumns.of(...).getVirtualColumnForSelector(columnName);","typeGuard":null,"tryCatchPattern":"try { VirtualColumn vc = virtualColumns.virtualColumnForSelector(name); } catch (IAE e) { /* fall back to regular column lookup */ }","preventionTips":["Keep a registry of defined virtual column aliases and validate query references against it","Unit-test query specs against the exact VirtualColumns instance","Avoid hand-typed column names; derive them from shared constants"],"tags":["druid","virtual-columns","resource-not-found"],"backgroundTag":"resource-not-found","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"}