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
- No action needed if the existing column matches the event's definition — the schema is already correct
- Verify the existing column's type/nullability matches the event; if different, alter it manually to align
- 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
- Treat add-column DDL as idempotent; always check existence first
- Deduplicate replayed schema-change events
- Align column types when the pre-existing column differs from the event
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
- Column {} already exists in table {}. Skipping change column
- Column {} does not exist in table {}. Skipping drop column o
- SQL_OPERATION_FAILED
- Column {} already exists in table {}. Skipping change column
- Unsupported schemaChangeEvent: {event.getClass().getName()}
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/456361b0fc0b9871.
Report an issue: GitHub.