{"record":{"id":"87f9db341b361dbf","repo":"apache/beam","slug":"only-int64-is-supported-as-the-interval-value-for-bigquery","errorCode":null,"errorMessage":"Only INT64 is supported as the interval value for BigQuery.","messagePattern":"Only INT64 is supported as the interval value for BigQuery\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigquery/BeamBigQuerySqlDialect.java","lineNumber":146,"sourceCode":"        super.unparseCall(writer, call, leftPrec, rightPrec);\n    }\n  }\n\n  /** BigQuery interval syntax: INTERVAL int64 time_unit. */\n  @Override\n  public void unparseSqlIntervalLiteral(\n      SqlWriter writer, SqlIntervalLiteral literal, int leftPrec, int rightPrec) {\n    SqlIntervalLiteral.IntervalValue interval =\n        (SqlIntervalLiteral.IntervalValue) literal.getValue();\n    writer.keyword(\"INTERVAL\");\n    if (interval.getSign() == -1) {\n      writer.print(\"-\");\n    }\n    Long intervalValueInLong;\n    try {\n      intervalValueInLong = Long.parseLong(literal.getValue().toString());\n    } catch (NumberFormatException e) {\n      throw new UnsupportedOperationException(\n          \"Only INT64 is supported as the interval value for BigQuery.\");\n    }\n    writer.literal(intervalValueInLong.toString());\n    unparseSqlIntervalQualifier(writer, interval.getIntervalQualifier(), RelDataTypeSystem.DEFAULT);\n  }\n\n  private void unparseDoubleLiteralWrapperFunction(SqlWriter writer, String funName) {\n    writer.literal(DOUBLE_LITERAL_WRAPPERS.get(funName));\n  }\n\n  private void unparseNumericLiteralWrapperFunction(\n      SqlWriter writer, SqlCall call, int leftPrec, int rightPrec) {\n    writer.literal(\"NUMERIC '\");\n    call.operand(0).unparse(writer, leftPrec, rightPrec);\n    writer.literal(\"'\");\n  }\n\n  /**","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigquery/BeamBigQuerySqlDialect.java#L128-L164","documentation":"BeamBigQuerySqlDialect.unparseSqlIntervalLiteral converts a SQL INTERVAL literal back into BigQuery-compatible syntax. BigQuery only accepts INT64 interval values in this dialect, so when the literal's value cannot be parsed as a Long the dialect throws UnsupportedOperationException instead of emitting invalid SQL.","triggerScenarios":"Unparsing (generating SQL for) an INTERVAL literal whose value string is not parseable by Long.parseLong — e.g. INTERVAL '1.5' DAY or non-numeric interval text — when serializing a Calcite plan for BigQuery.","commonSituations":"Using fractional or non-integer interval constants in queries pushed to BigQuery; passing interval literals created from string/decimal expressions; dialect differences between Calcite-standard intervals and BigQuery's limited interval support.","solutions":["Use whole-number INT64 interval values, e.g. INTERVAL 2 DAY instead of INTERVAL '1.5' DAY","Compute fractional durations with arithmetic on integers (e.g. 1 DAY + 12 HOUR)","Evaluate the interval expression in Beam instead of pushing it to BigQuery"],"exampleFix":"// before\nSELECT * FROM t WHERE ts > CURRENT_TIMESTAMP() - INTERVAL '1.5' DAY\n// after\nSELECT * FROM t WHERE ts > CURRENT_TIMESTAMP() - INTERVAL 1 DAY - INTERVAL 12 HOUR","handlingStrategy":"validation","validationCode":"// validate interval literal before using it in a BigQuery-pushable query\nObject v = literal.getValue();\nLong.parseLong(String.valueOf(v)); // throws NumberFormatException early\nif (!String.valueOf(v).matches(\"^-?\\\\d+$\")) throw new IllegalArgumentException(\"BigQuery dialect requires INT64 interval values\");","typeGuard":"boolean isInt64Interval(RexLiteral l) {\n  try { Long.parseLong(String.valueOf(l.getValue())); return true; }\n  catch (NumberFormatException e) { return false; }\n}","tryCatchPattern":"try {\n  runQuery(sql);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"Only INT64\")) { /* rewrite interval */ }\n  throw e;\n}","preventionTips":["Use integer-valued INTERVAL literals only in queries targeting BigQuery","Compose durations from whole units (DAY/HOUR/SECOND) instead of fractional literals","Unit-test SQL unparse for every interval expression you generate"],"tags":["beam-sql","bigquery","interval","type-mismatch"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}