apache/seatunnel · warning

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

Error message

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

What it means

Databend's SchemaChangeManager handles AlterTableChangeColumnEvent schema changes. When the old column does not exist but the new column name already exists in the table, the change (rename/modify) is considered already applied or conflicting, so it is skipped with this warning instead of failing. The schema change is a no-op.

Source

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

        }
    }

    private void applySchemaChange(
            Connection connection, TablePath tablePath, AlterTableColumnEvent event)
            throws SQLException, IOException {
        if (event instanceof AlterColumnCommentEvent) {
            // Databend does not support comment synchronization, including nested column events.
            log.info(
                    "Ignoring comment change event for table {} - Databend sink does not support comment sync: {}",
                    tablePath.getFullName(),
                    event.getClass().getSimpleName());
        } 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;
                }
                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(),

View on GitHub (pinned to cf67b549a7)

Solutions

  1. No action needed — the desired schema state already exists; confirm the column definition matches expectations
  2. If it's a genuine conflict (different type/comment on the existing column), drop or alter the existing column manually and re-apply
  3. Ensure schema-change events are applied once per pipeline to avoid duplicate DDL

Example fix

// before (duplicate application)
ALTER TABLE db.t RENAME COLUMN old TO new; -- run twice via replay
// after — guard/skip when new column exists (connector does this automatically)
Defensive patterns

Strategy: retry

Validate before calling

// Pre-check target state before applying change
boolean oldExists = columnExists(conn, tablePath, oldName);
boolean newExists = columnExists(conn, tablePath, newName);
if (!oldExists && newExists) { /* already applied; skip */ }

Prevention

When it happens

Trigger: Applying a change-column event where target column name already exists and the source (old) column is gone — i.e., the rename was already performed (e.g. schema-change replay/at-least-once delivery, or two jobs applying the same CDC schema change).

Common situations: Replaying a CDC stream after a restart; multiple consumers applying the same DDL; manually renaming a column in Databend that the pipeline also renames.

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