apache/seatunnel · warning

The timestamp column

Error message

The timestamp column {} type time({}) is out of range, which exceeds the maximum scale of {}, it will be converted to time({})

What it means

When converting a TIME column for Snowflake, its scale (fractional-second digits) exceeds 9, the maximum Snowflake supports. SeaTunnel logs this warning and maps the column to Snowflake TIME with scale 9, so sub-nanosecond precision is truncated.

Solutions

  1. Set the source time column scale to <= 9.
  2. Pre-create the Snowflake table with TIME(9) and cast/round values upstream.
  3. Accept the warning if nanosecond (9-digit) precision is sufficient.
  4. If extra digits matter, carry the column as STRING instead of TIME.

Example fix

// before
new Column with sqlType=TIME, scale=12
// after
new Column with sqlType=TIME, scale=9
Defensive patterns

Strategy: validation

Validate before calling

if (column.getScale() != null && column.getScale() > 9) {
    log.warn("TIME column {} scale {} will be truncated to 9 for Snowflake",
        column.getName(), column.getScale());
}

Type guard

boolean fitsSnowflakeTimeScale(Column c) {
    return c.getScale() == null || c.getScale() <= 9;
}

Prevention

When it happens

Trigger: reconvert() handles a Column with sqlType TIME and column.getScale() > 9, e.g. sources declaring time(12).

Common situations: MySQL time(6) is fine, but engines with higher fractional precision (rare, e.g. theoretical nanosecond+ sources or misconfigured schema files) trigger this when syncing to Snowflake.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/73eb01334bbe6915. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/snowflake/SnowflakeTypeConverter.java:313

                        builder.dataType(SNOWFLAKE_STRING);
                    }
                } else {
                    builder.columnType(SNOWFLAKE_STRING);
                    builder.dataType(SNOWFLAKE_STRING);
                }
                builder.length(column.getColumnLength());
                break;
            case DATE:
                builder.columnType(SNOWFLAKE_DATE);
                builder.dataType(SNOWFLAKE_DATE);
                break;
            case BYTES:
                builder.columnType(SNOWFLAKE_GEOMETRY);
                builder.dataType(SNOWFLAKE_GEOMETRY);
                break;
            case TIME:
                if (column.getScale() != null && column.getScale() > 9) {
                    log.warn(
                            "The timestamp column {} type time({}) is out of range, "
                                    + "which exceeds the maximum scale of {}, "
                                    + "it will be converted to time({})",
                            column.getName(),
                            column.getScale(),
                            9,
                            9);
                }
                builder.columnType(SNOWFLAKE_TIME);
                builder.dataType(SNOWFLAKE_TIME);
                break;
            case TIMESTAMP:
                if (column.getScale() != null && column.getScale() > 9) {
                    log.warn(
                            "The timestamp column {} type timestamp({}) is out of range, "
                                    + "which exceeds the maximum scale of {}, "
                                    + "it will be converted to timestamp({})",
                            column.getName(),

View on GitHub (pinned to cf67b549a7)