cube-js/cube · error · UserError
Unsupported measure type replacement for
Error message
Unsupported measure type replacement for ${sourceMeasure}: ${aggType} => ${newMeasureType} What it means
When a rolled-up/patched measure replaces an average-type aggregation (avg, etc.) with count_distinct_approx, Cube allows it only in specific cases; for the avg source branch, any newMeasureType not in the whitelisted set (count/count_distinct family that ignores input value) is rejected with this UserError. Averaging measures depend on their input values, so changing to an incompatible aggregation would silently produce wrong numbers.
Solutions
- Change the newMeasureType to one supported for the avg source (e.g. count, count_distinct_approx)
- Define a separate measure for the desired aggregation instead of patching the avg measure
- Remove the measure replacement from the rollup configuration so the original type is preserved
- If it must be summed, define the measure as type: 'sum' in the data model rather than patching
Example fix
// before (rollup patch)
measures: { 'Orders.avgTotal': { aggType: 'avg' } } // patched to newMeasureType 'sum'
// after — define a dedicated measure in schema
measures: { total: { type: 'sum', sql: 'amount' } } Defensive patterns
Strategy: try-catch
Validate before calling
// Ensure rollup measure replacements keep compatible aggregation types
function checkMeasureReplacement(m) {
if (m.aggType?.startsWith('avg') && m.newMeasureType &&
!['count','count_distinct','count_distinct_approx'].includes(m.newMeasureType)) {
throw new Error(`Cannot patch avg measure to ${m.newMeasureType}`);
}
} Try / catch
try {
await cubeApi.load(query);
} catch (e) {
if (e.message.startsWith('Unsupported measure type replacement')) {
console.error('Rollup measure type mismatch:', e.message);
// rebuild query without the patched measure
}
throw e;
} Prevention
- Only patch avg measures toward count-family aggregations
- Define dedicated measures in the schema for each needed aggregation type
- Keep rollup definitions in sync with measure definitions
- Add schema-level tests for rollup configurations
When it happens
Trigger: Calling query.rollup() or building a rollup query with a measure replacement (aggType from an avg-family measure patched to a newMeasureType like 'avg'->'sum' or 'avg'->'countDistinct' variant not permitted), via the query patch API (preAggregation rollups, rollupMeasure with modified aggregation).
Common situations: Defining pre-aggregation rollups where measure types don't match; refactoring data models and reusing a rolled-up measure under a different agg; programmatic query generation replacing measure types.
Related errors
- Unsupported additional filters for measure
- Only fixed rolling windows are supported by Cube Store but…
- Unknown pre-aggregation type
- Approximate distinct count is not supported by this DB
- Can't find join path to join
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/c717fa8f17b0539d.
Report an issue: GitHub.
Appendix: source
Thrown at packages/cubejs-schema-compiler/src/adapter/BaseMeasure.ts:43
switch (aggType) {
case 'sum':
case 'avg':
case 'min':
case 'max':
switch (newMeasureType) {
case 'sum':
case 'avg':
case 'min':
case 'max':
case 'count_distinct':
case 'countDistinct':
case 'count_distinct_approx':
case 'countDistinctApprox':
// Can change from avg/... to count_distinct
// Latter does not care what input value is
// ok, do nothing
break;
default:
throw new UserError(
`Unsupported measure type replacement for ${sourceMeasure}: ${aggType} => ${newMeasureType}`
);
}
break;
case 'count_distinct':
case 'countDistinct':
case 'count_distinct_approx':
case 'countDistinctApprox':
switch (newMeasureType) {
case 'count_distinct':
case 'countDistinct':
case 'count_distinct_approx':
case 'countDistinctApprox':
// ok, do nothing
break;
default:
// Can not change from count_distinct to avg/...View on GitHub (pinned to 7d981676b3)