{"record":{"id":"05a6437754e5f4d8","repo":"cube-js/cube","slug":"pre-aggregation-schema-for-ksql-source-with-partit","errorCode":null,"errorMessage":"Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter","messagePattern":"Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cubejs-ksql-driver/src/KsqlQuery.ts","lineNumber":123,"sourceCode":"  public groupByClause() {\n    if (this.ungrouped) {\n      return '';\n    }\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  }","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-ksql-driver/src/KsqlQuery.ts#L105-L141","documentation":"A schema-validation guard in KsqlQuery.preAggregationStartEndQueries: a ksql pre-aggregation that declares partitionGranularity must define a refreshRangeStart (buildRangeStart) parameter so the driver can compute the partition window's start boundary for incremental refresh; without it the rollup schedule cannot be built and compilation is aborted. The input at fault is a pre-aggregation object with partitionGranularity but no buildRangeStart/refreshRangeStart.","triggerScenarios":"Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:123 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add refreshRangeStart (e.g. refreshRangeStart: { sql: 'SELECT MIN(...)' }) to the pre-aggregation definition in the cube","When partitionGranularity is set, always define both refreshRangeStart and refreshRangeEnd SQL snippets","Validate the schema at compile time so this is caught before query execution"],"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"}