{"record":{"id":"c1e7a4a7d0b34b9c","repo":"apache/druid","slug":"no-such-stage-s","errorCode":null,"errorMessage":"No such stage [%s]","messagePattern":"No such stage \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"multi-stage-query/src/main/java/org/apache/druid/msq/kernel/QueryDefinitionBuilder.java","lineNumber":82,"sourceCode":"  }\n\n  /**\n   * Returns a number that is higher than all current stage numbers.\n   */\n  public int getNextStageNumber()\n  {\n    return stageBuilders.stream().mapToInt(StageDefinitionBuilder::getStageNumber).max().orElse(-1) + 1;\n  }\n\n  public StageDefinitionBuilder getStageBuilder(final int stageNumber)\n  {\n    for (final StageDefinitionBuilder stageBuilder : stageBuilders) {\n      if (stageBuilder.getStageNumber() == stageNumber) {\n        return stageBuilder;\n      }\n    }\n\n    throw new ISE(\"No such stage [%s]\", stageNumber);\n  }\n\n  public QueryDefinition build()\n  {\n    final List<StageDefinition> stageDefinitions =\n        stageBuilders.stream().map(builder -> builder.build(queryId)).collect(Collectors.toList());\n    return QueryDefinition.create(stageDefinitions, null);\n  }\n}\n","sourceCodeStart":64,"sourceCodeEnd":92,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/multi-stage-query/src/main/java/org/apache/druid/msq/kernel/QueryDefinitionBuilder.java#L64-L92","documentation":"QueryDefinitionBuilder.getStageBuilder(stageNumber) looks up a previously added stage builder by number and throws ISE when no builder with that number exists. It is used by helpers like leftBuilder/rightBuilder to wire inputs into existing stages, so a wrong or out-of-range stage number breaks plan assembly.","triggerScenarios":"Calling leftBuilder/rightBuilder (or getStageBuilder directly) with a stage number that was never added to this builder — e.g. building a join stage that references input stage numbers not yet added or numbered differently than assumed.","commonSituations":"Manual stage numbering mistakes in multi-stage plan construction; assuming stage numbers start at 1 when they start at 0 (or vice versa); referencing stages of another query's builder.","solutions":["Add the input stage builders first, then call leftBuilder/rightBuilder with their actual stage numbers","Use StageDefinitionBuilder's assigned stage number (getStageNumber()) instead of hardcoding indices","Check the builder's stage list size before referencing a stage number"],"exampleFix":"// before: hardcoded stage number\nbuilder.add(StageDefinition.builder().id(new StageId(queryId, 2)).leftStageNumber(0)...);\nStageDefinitionBuilder left = builder.leftBuilder(0); // ok, but fragile with wrong guesses\n// after\nint leftNum = builder.add(leftInputDef).getStageNumber();\nint rightNum = builder.add(rightInputDef).getStageNumber();\nStageDefinitionBuilder left = builder.getStageBuilder(leftNum);","handlingStrategy":"validation","validationCode":"if (builder.hasStage(stageNumber)) { // or track added numbers yourself\n  builder.getStageBuilder(stageNumber);\n} else {\n  throw new IllegalArgumentException(\"Stage \" + stageNumber + \" not added to builder yet\");\n}","typeGuard":"static boolean stageExists(List<StageDefinitionBuilder> builders, int stageNumber) {\n  return builders.stream().anyMatch(b -> b.getStageNumber() == stageNumber);\n}","tryCatchPattern":"try {\n  return builder.getStageBuilder(stageNumber);\n} catch (IllegalStateException e) {\n  throw new PlanBuildException(\"Referenced stage not yet added: \" + stageNumber, e);\n}","preventionTips":["Add input stages before wiring left/right inputs","Capture returned stage numbers instead of hardcoding them","Remember stage numbers are zero-based sequential from the builder"],"tags":["msq","query-definition-builder","missing-stage","stage-number"],"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-14T05:17:10.506Z"}