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

This WARN log is emitted by SchemaChangeManager.applySchemaChange when an AlterTableAddColumnEvent arrives for a column that already exists in the target Doris table. The add operation is skipped (early return) so that idempotent replays of schema-change events do not fail the pipeline. The library treats an existing identically-named column as 'add already done'.

Source

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

                        .getOldColumn()
                        .equals(changeColumnEvent.getColumn().getName())) {
                    if (!columnExists(tablePath, changeColumnEvent.getOldColumn())
                            && columnExists(tablePath, changeColumnEvent.getColumn().getName())) {
                        log.warn(
                                "Column {} already exists in table {}. Skipping change column operation. event: {}",
                                changeColumnEvent.getColumn().getName(),
                                tablePath.getFullName(),
                                event);
                        return;
                    }
                }
                applySchemaChange(tablePath, changeColumnEvent);
            } else if (event instanceof AlterTableModifyColumnEvent) {
                applySchemaChange(tablePath, (AlterTableModifyColumnEvent) event);
            } else if (event instanceof AlterTableAddColumnEvent) {
                AlterTableAddColumnEvent addColumnEvent = (AlterTableAddColumnEvent) event;
                if (columnExists(tablePath, addColumnEvent.getColumn().getName())) {
                    log.warn(
                            "Column {} already exists in table {}. Skipping add column operation. event: {}",
                            addColumnEvent.getColumn().getName(),
                            tablePath.getFullName(),
                            event);
                    return;
                }
                applySchemaChange(tablePath, addColumnEvent);
            } else if (event instanceof AlterTableDropColumnEvent) {
                AlterTableDropColumnEvent dropColumnEvent = (AlterTableDropColumnEvent) event;
                if (!columnExists(tablePath, dropColumnEvent.getColumn())) {
                    log.warn(
                            "Column {} does not exist in table {}. Skipping drop column operation. event: {}",
                            dropColumnEvent.getColumn(),
                            tablePath.getFullName(),
                            event);
                    return;
                }
                applySchemaChange(tablePath, dropColumnEvent);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Confirm via DESC tbl / SHOW CREATE TABLE that the column exists with the correct type; if it matches, the warning is benign and can be ignored.
  2. If the existing column has the WRONG type, drop it (ALTER TABLE ... DROP COLUMN) and restart the job so the add event runs with the correct definition.
  3. Ensure a single pipeline owns schema changes for this table; disable schema_evolution or point the duplicate pipeline at a different table.
  4. Restart from the latest checkpoint/savepoint so schema events are not replayed from an old offset.

Example fix

// before: replayed ADD COLUMN against a table that already has the column
ALTER TABLE db.tbl ADD COLUMN extra_col INT;
// after: guard/pre-clean
// ALTER TABLE db.tbl DROP COLUMN extra_col;  -- if type differs
// or restart from latest checkpoint so the event is not duplicated
Defensive patterns

Strategy: validation

Validate before calling

// Pre-check the Doris table before enabling schema evolution
DESC db.tbl;  -- confirm which columns already exist
// Skip or pre-drop conflicting columns before (re)starting the job

Type guard

boolean addAlreadyApplied(DorisTableSchema schema, String column) {
    return schema.hasColumn(column);  // if true, expect the skip warning
}

Prevention

When it happens

Trigger: columnExists(tablePath, addColumnEvent.getColumn().getName()) returns true when the add event is processed — e.g. the same add event is replayed after checkpoint restore, the schema lock/coordination allowed another writer to add it first, or the user manually added the column to Doris before running the job.

Common situations: Restarting a Flink/Spark CDC job from an older savepoint so pending schema events re-execute; a DBA pre-added the column; running two pipelines from the same source database into one Doris table; Doris light-schema-change already applied the column in a prior attempt.

Related errors


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