cube-js/cube · error · Error
Cannot transform interval expression "${interval}" to CubeSt
Error message
Cannot transform interval expression "${interval}" to CubeStore dialect What it means
CubeStoreQuery.formatInterval translates parsed interval expressions into Cube Store's interval literal syntax. Intervals whose unit combinations aren't among the supported branches (single units, minute+second, etc.) hit the final throw. Microseconds are explicitly unsupported.
Source
Thrown at packages/cubejs-schema-compiler/src/adapter/CubeStoreQuery.ts:149
} else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intKeys === 3) {
return `'${intervalParsed.day} DAY ${intervalParsed.hour} HOUR ${intervalParsed.minute} MINUTE'`;
} else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 4) {
return `'${intervalParsed.day} DAY ${intervalParsed.hour} HOUR ${intervalParsed.minute} MINUTE ${intervalParsed.second} SECOND'`;
} else if (intervalParsed.hour && intKeys === 1) {
return `'${intervalParsed.hour} HOUR'`;
} else if (intervalParsed.hour && intervalParsed.minute && intKeys === 2) {
return `'${intervalParsed.hour} HOUR ${intervalParsed.minute} MINUTE'`;
} else if (intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 3) {
return `'${intervalParsed.hour} HOUR ${intervalParsed.minute} MINUTE ${intervalParsed.second} SECOND'`;
} else if (intervalParsed.minute && intKeys === 1) {
return `'${intervalParsed.minute} MINUTE'`;
} else if (intervalParsed.minute && intervalParsed.second && intKeys === 2) {
return `'${intervalParsed.minute} MINUTE ${intervalParsed.second} SECOND'`;
}
// No need to support microseconds.
throw new Error(`Cannot transform interval expression "${interval}" to CubeStore dialect`);
}
public escapeColumnName(name) {
return `\`${name}\``;
}
public seriesSql(timeDimension) {
return timeDimension.timeSeries().map(
([from, to]) => `select to_timestamp('${from}') date_from, to_timestamp('${to}') date_to`
).join(' UNION ALL ');
}
public concatStringsSql(strings: string[]) {
return `CONCAT(${strings.join(', ')})`;
}
public unixTimestampSql() {
return 'UNIX_TIMESTAMP()';View on GitHub (pinned to 7d981676b3)
Solutions
- Rewrite the interval as a supported combination, e.g. single unit or 'X MINUTE Y SECOND'.
- Convert sub-second intervals to milliseconds/seconds at the finest supported granularity.
- Extend formatInterval with a new branch if the unit combination is essential.
Example fix
// before
rollingWindow: { trailing: '1 day 12 hours' }
// after
rollingWindow: { trailing: '36 hours' } Defensive patterns
Strategy: validation
Validate before calling
const supported = /^-?\d+\s*(second|minute|hour|day|week|month|year)s?$|^\d+ MINUTE \d+ SECOND$/i;
if (!supported.test(interval)) throw new Error(`Interval "${interval}" unsupported by CubeStore`); Try / catch
try { await cube.load(q) } catch (e) { if (/Cannot transform interval expression/.test(e.message)) { /* normalize interval to a single unit */ } else throw e; } Prevention
- Avoid mixed-unit intervals and microseconds with Cube Store
- Convert all windows to a single unit (e.g. seconds)
- Add unit tests compiling schemas against CubeStoreQuery
When it happens
Trigger: A rolling window or date range interval like '1 second 500 milliseconds', 'quarter', or any mixed-unit interval not matching the supported patterns is used in a query against Cube Store.
Common situations: Schemas ported from other databases with rich interval syntax; sub-second precision windows (microseconds) against Cube Store; typos in interval strings.
Related errors
- Cannot transform interval expression "${interval}" to BigQue
- Mixed offset rolling window querying is not supported
- Unsupported table data passed to ${this.constructor}
- Unable to import (as rows) in Cube Store: empty columns. Mos
- Unable to import (as csv) in Cube Store: empty columns. Most
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/8d72016f0377c612.
Report an issue: GitHub.