cube-js/cube · error · Error
Pre aggregation schema for kSql source with partition granul
Error message
Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter
What it means
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.
Source
Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:123
public groupByClause() {
if (this.ungrouped) {
return '';
}
const dimensionsForSelect: any[] = this.dimensionsForSelect();
const dimensionColumns = dimensionsForSelect.map(s => s.selectColumns() && s.dimensionSql())
.reduce((a, b) => a.concat(b), [])
.filter((s: any) => !!s);
return dimensionColumns.length ? ` GROUP BY ${dimensionColumns.join(', ')}` : '';
}
public partitionInvalidateKeyQueries(_cube: string, _preAggregation: any) {
return [];
}
public preAggregationStartEndQueries(cube: string, preAggregation: any) {
if (preAggregation.partitionGranularity) {
if (!preAggregation.refreshRangeStart) {
throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter');
}
if (!preAggregation.refreshRangeEnd) {
throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeEnd parameter');
}
}
const res = this.evaluateSymbolSqlWithContext(() => [
preAggregation.refreshRangeStart && [this.evaluateSql(cube, preAggregation.refreshRangeStart.sql, {}), [], { external: true }],
preAggregation.refreshRangeEnd && [this.evaluateSql(cube, preAggregation.refreshRangeEnd.sql, {}), [], { external: true }]
], { preAggregationQuery: true });
return res;
}
public preAggregationReadOnly(cube: string, preAggregation: any) {
const [sql] = this.preAggregationSql(cube, preAggregation);
return preAggregation.type === 'originalSql' && Boolean(KsqlQuery.extractTableFromSimpleSelectAsteriskQuery(sql)) ||
preAggregation.type === 'rollup' && !!this.dimensionsForSelect().find(d => d.definition().primaryKey);
}View on GitHub (pinned to 7d981676b3)
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
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:123 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/05a6437754e5f4d8.
Report an issue: GitHub.