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

  1. Rewrite the interval as a supported combination, e.g. single unit or 'X MINUTE Y SECOND'.
  2. Convert sub-second intervals to milliseconds/seconds at the finest supported granularity.
  3. 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

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


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/8d72016f0377c612. Report an issue: GitHub.