{"record":{"id":"e7b4af63b0861c3d","repo":"cube-js/cube","slug":"pre-aggregation-schema-for-ksql-source-with-partit-e7b4af","errorCode":null,"errorMessage":"Pre aggregation schema for kSql source with partition granularity must contains buildRangeEnd parameter","messagePattern":"Pre aggregation schema for kSql source with partition granularity must contains buildRangeEnd parameter","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cubejs-ksql-driver/src/KsqlQuery.ts","lineNumber":126,"sourceCode":"    }\n    const dimensionsForSelect: any[] = this.dimensionsForSelect();\n    const dimensionColumns = dimensionsForSelect.map(s => s.selectColumns() && s.dimensionSql())\n      .reduce((a, b) => a.concat(b), [])\n      .filter((s: any) => !!s);\n    return dimensionColumns.length ? ` GROUP BY ${dimensionColumns.join(', ')}` : '';\n  }\n\n  public partitionInvalidateKeyQueries(_cube: string, _preAggregation: any) {\n    return [];\n  }\n\n  public preAggregationStartEndQueries(cube: string, preAggregation: any) {\n    if (preAggregation.partitionGranularity) {\n      if (!preAggregation.refreshRangeStart) {\n        throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter');\n      }\n      if (!preAggregation.refreshRangeEnd) {\n        throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeEnd parameter');\n      }\n    }\n    const res = this.evaluateSymbolSqlWithContext(() => [\n\n      preAggregation.refreshRangeStart && [this.evaluateSql(cube, preAggregation.refreshRangeStart.sql, {}), [], { external: true }],\n      preAggregation.refreshRangeEnd && [this.evaluateSql(cube, preAggregation.refreshRangeEnd.sql, {}), [], { external: true }]\n    ], { preAggregationQuery: true });\n    return res;\n  }\n\n  public preAggregationReadOnly(cube: string, preAggregation: any) {\n    const [sql] = this.preAggregationSql(cube, preAggregation);\n    return preAggregation.type === 'originalSql' && Boolean(KsqlQuery.extractTableFromSimpleSelectAsteriskQuery(sql)) ||\n      preAggregation.type === 'rollup' && !!this.dimensionsForSelect().find(d => d.definition().primaryKey);\n  }\n\n  public preAggregationAllowUngroupingWithPrimaryKey(_cube: any, _preAggregation: any) {\n    return true;","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-ksql-driver/src/KsqlQuery.ts#L108-L144","documentation":"The paired validation guard in KsqlQuery.preAggregationStartEndQueries: a ksql pre-aggregation with partitionGranularity must also define a refreshRangeEnd (buildRangeEnd) parameter so the partition window's end boundary is known; missing it aborts compilation. The input at fault is a pre-aggregation declaring partitionGranularity whose buildRangeEnd is absent (buildRangeStart alone is insufficient).","triggerScenarios":"Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:126 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add refreshRangeEnd to the pre-aggregation definition alongside refreshRangeStart","Ensure both range endpoints are present whenever partitionGranularity is declared","Add schema validation to fail fast during compilation rather than at query time"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}