apache/seatunnel · info

Column {} already exists in table {}. Skipping change column

Error message

Column {} already exists in table {}. Skipping change column operation. event: {}

What it means

During schema-evolution application, when handling a change-column event, JdbcDialect checks whether the new column name already exists while the old one does not. If so, the rename/change was evidently already applied (idempotency guard), so the operation is skipped with this warning and returns without error.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/JdbcDialect.java:528

    default void applySchemaChange(
            Connection connection, TablePath tablePath, SchemaChangeEvent event)
            throws SQLException {
        if (event instanceof AlterTableColumnsEvent) {
            for (AlterTableColumnEvent columnEvent : ((AlterTableColumnsEvent) event).getEvents()) {
                applySchemaChange(connection, tablePath, columnEvent);
            }
        } else {
            if (event instanceof AlterTableChangeColumnEvent) {
                AlterTableChangeColumnEvent changeColumnEvent = (AlterTableChangeColumnEvent) event;
                if (!changeColumnEvent
                        .getOldColumn()
                        .equals(changeColumnEvent.getColumn().getName())) {
                    if (!columnExists(connection, tablePath, changeColumnEvent.getOldColumn())
                            && columnExists(
                                    connection,
                                    tablePath,
                                    changeColumnEvent.getColumn().getName())) {
                        log.warn(
                                "Column {} already exists in table {}. Skipping change column operation. event: {}",
                                changeColumnEvent.getColumn().getName(),
                                tablePath.getFullName(),
                                event);
                        return;
                    }
                }
                applySchemaChange(connection, tablePath, changeColumnEvent);
            } else if (event instanceof AlterTableModifyColumnEvent) {
                applySchemaChange(connection, tablePath, (AlterTableModifyColumnEvent) event);
            } else if (event instanceof AlterTableAddColumnEvent) {
                AlterTableAddColumnEvent addColumnEvent = (AlterTableAddColumnEvent) event;
                if (columnExists(connection, tablePath, addColumnEvent.getColumn().getName())) {
                    log.warn(
                            "Column {} already exists in table {}. Skipping add column operation. event: {}",
                            addColumnEvent.getColumn().getName(),
                            tablePath.getFullName(),
                            event);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. No action needed — the change was already applied; the warning confirms idempotent skip
  2. If the rename was NOT intended, verify the upstream CDC/schema-change configuration and column mapping
  3. Ensure only one pipeline writes schema changes to the same table to avoid duplicate events
Defensive patterns

Strategy: validation

Validate before calling

// idempotency pre-check before applying change-column
if (columnExists(conn, tablePath, newName) && !columnExists(conn, tablePath, oldName)) {
    log.info("change column already applied; skip");
}

Prevention

When it happens

Trigger: applySchemaChange receives an AlterTableChangeColumnEvent whose target column already exists in the target table and whose old column no longer exists — i.e. a duplicate/replayed schema-change event.

Common situations: Schema-change events replayed after checkpoint/task restart; multiple sinks or upstream connectors emitting the same rename; CDC source resending evolution history.

Understand the failure class

Background: "already exists" / EEXIST / FileAlreadyExistsException: what the 'file already exists' error means and how to fix it — this error's family across 37 libraries.

Related errors


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