apache/seatunnel · warning

Column {} already exists in table {}. Skipping add column op

Error message

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

What it means

Databend's SchemaChangeManager handles AlterTableAddColumnEvent. If the column to add already exists in the target table, the add operation is skipped with this warning rather than throwing, making the DDL idempotent. The event is a no-op.

Source

Thrown at seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/schema/SchemaChangeManager.java:122

                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;
                }
                applyRenameColumn(connection, tablePath, changeColumnEvent);
            }
        } else if (event instanceof AlterTableModifyColumnEvent) {
            applyModifyColumn(connection, tablePath, (AlterTableModifyColumnEvent) event);
        } else if (event instanceof AlterTableAddColumnEvent) {
            // handle column
            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);
                return;
            }
            applyAddColumn(connection, tablePath, addColumnEvent);
        } else if (event instanceof AlterTableDropColumnEvent) {
            AlterTableDropColumnEvent dropColumnEvent = (AlterTableDropColumnEvent) event;
            if (!columnExists(connection, tablePath, dropColumnEvent.getColumn())) {
                log.warn(
                        "Column {} does not exist in table {}. Skipping drop column operation. event: {}",
                        dropColumnEvent.getColumn(),
                        tablePath.getFullName(),
                        event);
                return;
            }
            applyDropColumn(connection, tablePath, dropColumnEvent);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. No action needed if the existing column matches the event's definition — the schema is already correct
  2. Verify the existing column's type/nullability matches the event; if different, alter it manually to align
  3. Deduplicate schema-change events or make delivery exactly-once if duplicate DDL noise is a problem

Example fix

// before
-- replayed: ALTER TABLE db.t ADD COLUMN extra STRING; (column already there)
// after — connector skips automatically; ensure event dedup upstream if noisy
Defensive patterns

Strategy: retry

Validate before calling

// Pre-check before applying add column
if (columnExists(conn, tablePath, columnName)) { /* already applied; skip */ }

Prevention

When it happens

Trigger: Applying an add-column event for a column name that already exists in the Databend table — typically due to event replay, at-least-once schema-change delivery, or the column being added manually beforehand.

Common situations: CDC pipelines replaying schema change events after restart; concurrent pipelines applying the same DDL; users pre-creating the column in Databend.

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