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

While applying a schema-change (DDL) event like RenameColumn/ChangeColumn, the connector detected the target column name already exists in the StarRocks table while the old column does not. It logs this warning and skips the operation, treating the change as already applied (idempotent replay).

Source

Thrown at seatunnel-connectors-v2/connector-starrocks/src/main/java/org/apache/seatunnel/connectors/seatunnel/starrocks/util/SchemaUtils.java:78

    public static void applySchemaChange(
            SchemaChangeEvent event, Connection connection, TablePath tablePath)
            throws SQLException {
        if (event instanceof AlterTableColumnsEvent) {
            for (AlterTableColumnEvent columnEvent : ((AlterTableColumnsEvent) event).getEvents()) {
                applySchemaChange(columnEvent, connection, tablePath);
            }
        } 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 if the schema is already correct — the operation is safely skipped
  2. If the skip is unexpected, compare target table schema (DESC table) with the event and reconcile manually
  3. Ensure checkpoints/restore state are consistent so the same DDL event isn't repeatedly replayed
Defensive patterns

Strategy: fallback

Validate before calling

// before applying, check target state yourself
SHOW COLUMNS FROM <table> LIKE '<newColumn>';

Try / catch

try {
  schemaChangeHandler.applySchemaChange(event);
} catch (Exception e) {
  // skipped-due-to-existing-column is a benign warning; only retry on real failures
  if (!e.getMessage().contains("already exists")) throw e;
}

Prevention

When it happens

Trigger: applySchemaChange receives a change-column event whose new column already exists in the target table and the old column no longer does — typically the event was applied in a previous run and is being replayed.

Common situations: CDC job restarted from an earlier checkpoint; schema changes applied manually to StarRocks before the job; multiple jobs applying overlapping DDL.

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