{"record":{"id":"f9eb47d36a0221fe","repo":"cube-js/cube","slug":"multi-stage-member-multistagemember-lacks-fro","errorCode":null,"errorMessage":"Multi stage member '${multiStageMember}' lacks FROM clause in sub query: ${JSON.stringify(subQueryOptions)}","messagePattern":"Multi stage member '(.+?)' lacks FROM clause in sub query: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cubejs-schema-compiler/src/adapter/BaseQuery.js","lineNumber":1857,"sourceCode":"      memberToAlias: this.options.memberToAlias,\n      from: fromSql && {\n        sql: fromSql,\n        alias: `${withQuery.alias}_join`,\n      },\n      // TODO condition should something else instead of rank\n      multiStageQuery: !!withQuery.measures.find(d => {\n        const { type } = this.newMeasure(d).definition();\n        return type === 'rank' || CubeSymbols.isCalculatedMeasureType(type);\n      }),\n      disableExternalPreAggregations: true,\n    };\n    const subQuery = this.newSubQuery(subQueryOptions);\n\n    if (!subQuery.from) {\n      const allSubQueryMembers = R.flatten(subQuery.collectFromMembers(false, subQuery.collectMemberNamesFor.bind(subQuery), 'collectMemberNamesFor'));\n      const multiStageMember = allSubQueryMembers.find(m => this.memberInstanceByPath(m).isMultiStage());\n      if (multiStageMember) {\n        throw new Error(`Multi stage member '${multiStageMember}' lacks FROM clause in sub query: ${JSON.stringify(subQueryOptions)}`);\n      }\n    }\n\n    return {\n      query: subQuery.evaluateSymbolSqlWithContext(\n        () => subQuery.buildParamAnnotatedSql(),\n        renderedReferenceContext,\n      ),\n      alias: withQuery.alias\n    };\n  }\n\n  dimensionsJoinCondition(leftAlias, rightAlias) {\n    const dimensionAliases = this.dimensionAliasNames();\n    if (!dimensionAliases.length) {\n      return '1 = 1';\n    }\n    return dimensionAliases","sourceCodeStart":1839,"sourceCodeEnd":1875,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js#L1839-L1875","documentation":"This error is thrown when a sub query created for a multi-stage member does not have a FROM clause. Cube checks each sub query produced by newSubQuery(): if subQuery.from is missing, it searches all sub query members for one flagged isMultiStage(); if found, it throws because multi-stage (rolled-up) members require an explicit FROM clause to be evaluated correctly.","triggerScenarios":"Defining a multi-stage (multi-fact / rolled-up) measure or dimension whose generated sub query options lack a FROM clause — typically when the multi-stage member is referenced inside a sub query definition (subQueryOptions) built without a base cube/join tree.","commonSituations":"Schema mistakes: referencing a multi-stage measure inside another measure's subQuery/sql, defining a multi-stage member in a view without specifying the underlying cube, or passing hand-crafted subQueryOptions that omit `from`.","solutions":["Give the multi-stage member an explicit cube context so the sub query can resolve a FROM clause (e.g. define it in the cube that owns the underlying data, or set the cube in the sub query options).","Rewrite the multi-stage member as a regular sub query measure (sql: ${...}.subQuery with a defined subQuery) instead of relying on implicit multi-stage rollup.","If composing subQueryOptions manually, include a valid `from` (cube/join tree) in the options.","Upgrade Cube — this validation has been refined over time; check release notes for multi-stage member fixes."],"exampleFix":"// before (view member referencing multi-stage measure without cube context)\nmeasures: {\n  ratio: { type: 'number', sql: `${users.total} / NULLIF(${sessions.count}, 0)` }\n}\n// after (pin each member to its cube / use a defined sub query)\nmeasures: {\n  ratio: {\n    type: 'number',\n    sql: `${users.total} / NULLIF(${sessionsSubQuery.count}, 0)`,\n    subQuery: true\n  }\n}","handlingStrategy":"validation","validationCode":"// Before compiling, ensure multi-stage members live in cubes with resolvable context\nfunction assertMultiStageHasContext(schema, memberPath) {\n  const member = schema.memberByPath(memberPath);\n  if (member && member.isMultiStage && member.isMultiStage() && !member.cube) {\n    throw new Error(`Multi-stage member ${memberPath} must be defined within a cube to get a FROM clause`);\n  }\n}","typeGuard":"function isMultiStageMemberSafe(member) {\n  return !member.isMultiStage || !member.isMultiStage() || Boolean(member.cube);\n}","tryCatchPattern":"try {\n  const result = await cube.query(query);\n} catch (e) {\n  if (/lacks FROM clause in sub query/.test(e.message)) {\n    throw new Error('Schema error: give the multi-stage member an explicit cube context or rewrite as subQuery');\n  }\n  throw e;\n}","preventionTips":["Define multi-stage members inside a cube, never in bare view fragments without a base cube","Prefer explicit subQuery measures over implicit multi-stage rollups when composing across cubes","Run schema compiler unit tests in CI to catch unresolved sub query options before deploy"],"tags":["schema-compiler","multi-stage","sub-query"],"backgroundTag":"multi-stage-member-missing-from-clause","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}