apache/seatunnel · warning

The timestamp_tz column {} type datetime_tz({}) is out of ra

Error message

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

What it means

A log warning in DmdbTypeConverter.reconvert for TIMESTAMP_TZ columns: the offset-aware timestamp scale exceeds MAX_TIMESTAMP_SCALE, so it is clamped and mapped to Dameng's datetime-with-timezone type (DM_DATETIME_WITH_TIME_ZONE) with reduced sub-second precision.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/dm/DmdbTypeConverter.java:502

                                        + "it will be converted to timestamp({})",
                                column.getName(),
                                column.getScale(),
                                MAX_TIMESTAMP_SCALE,
                                timestampScale);
                    }
                    builder.columnType(String.format("%s(%s)", DM_TIMESTAMP, timestampScale));
                    builder.scale(timestampScale);
                } else {
                    builder.columnType(DM_TIMESTAMP);
                }
                break;
            case TIMESTAMP_TZ:
                builder.dataType(DM_DATETIME_WITH_TIME_ZONE);
                if (column.getScale() != null && column.getScale() > 0) {
                    Integer timestampTzScale = column.getScale();
                    if (timestampTzScale > MAX_TIMESTAMP_SCALE) {
                        timestampTzScale = MAX_TIMESTAMP_SCALE;
                        log.warn(
                                "The timestamp_tz column {} type datetime_tz({}) is out of range, "
                                        + "which exceeds the maximum scale of {}, "
                                        + "it will be converted to datetime_tz({})",
                                column.getName(),
                                column.getScale(),
                                MAX_TIMESTAMP_SCALE,
                                timestampTzScale);
                    }
                    builder.columnType(
                            String.format("DATETIME(%s) WITH TIME ZONE", timestampTzScale));
                    builder.scale(timestampTzScale);
                } else {
                    builder.columnType(DM_DATETIME_WITH_TIME_ZONE);
                }
                break;
            default:
                throw CommonError.convertToConnectorTypeError(
                        DatabaseIdentifier.DAMENG,

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Cap the source timestamptz scale within MAX_TIMESTAMP_SCALE
  2. Accept clamped datetime_tz(x) precision
  3. Pre-create the DM column and exclude it from automatic conversion
  4. Normalize timezone handling/precision upstream with a transform

Example fix

// before
TIMESTAMP(9) WITH TIME ZONE
// after
TIMESTAMP(6) WITH TIME ZONE -- clamped
Defensive patterns

Strategy: validation

Validate before calling

if (column.getScale() != null && column.getScale() > MAX_TIMESTAMP_SCALE) {
    // reduce timestamptz precision before sync
}

Prevention

When it happens

Trigger: reconvert() on a column of logical type TIMESTAMP_TZ with scale > MAX_TIMESTAMP_SCALE (e.g. TIMESTAMP(9) WITH TIME ZONE sources).

Common situations: Syncing timezone-aware timestamps (Postgres TIMESTAMPTZ(6), Oracle TIMESTAMP WITH TIME ZONE) into Dameng; fractional-second precision loss in the target.

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/a0561e8aa8ea7354. Report an issue: GitHub.