{"record":{"id":"6e1f02b8545e97e2","repo":"apache/seatunnel","slug":"unsupported-alter-table-event-event","errorCode":null,"errorMessage":"Unsupported alter table event: ${event}","messagePattern":"Unsupported alter table event: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/schema/handler/AlterPaimonTableSchemaEventHandler.java","lineNumber":94,"sourceCode":"        this.paimonCatalog = paimonCatalog;\n        this.sinkPaimonTableSchema = sinkPaimonTableSchema;\n        this.paimonTablePath = paimonTablePath;\n        this.branch = branch;\n    }\n\n    public TableSchema apply(SchemaChangeEvent event) {\n        TableSchema newSchema = TABLESCHEMACHANGER.reset(sourceTableSchema).apply(event);\n        if (event instanceof AlterTableColumnsEvent) {\n            for (AlterTableColumnEvent columnEvent : ((AlterTableColumnsEvent) event).getEvents()) {\n                applySingleSchemaChangeEvent(columnEvent);\n            }\n        } else if (event instanceof AlterTableColumnEvent) {\n            applySingleSchemaChangeEvent(event);\n        } else if (event instanceof AlterTableCommentEvent) {\n            // Table-level comment changes, handle gracefully\n            applySingleSchemaChangeEvent(event);\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported alter table event: \" + event);\n        }\n        return newSchema;\n    }\n\n    private void applySingleSchemaChangeEvent(SchemaChangeEvent event) {\n        Identifier identifier = toIdentifier();\n        if (event instanceof AlterTableAddColumnEvent) {\n            AlterTableAddColumnEvent alterTableAddColumnEvent = (AlterTableAddColumnEvent) event;\n            Column column = alterTableAddColumnEvent.getColumn();\n            String afterColumnName = alterTableAddColumnEvent.getAfterColumn();\n            SchemaChange.Move move =\n                    StringUtils.isBlank(afterColumnName)\n                            ? null\n                            : SchemaChange.Move.after(column.getName(), afterColumnName);\n            BasicTypeDefine<DataType> reconvertColumn = PaimonTypeMapper.INSTANCE.reconvert(column);\n            DataType nativeType = reconvertColumn.getNativeType();\n            List<SchemaChange> schemaChanges = new ArrayList<>();\n            schemaChanges.add(","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/schema/handler/AlterPaimonTableSchemaEventHandler.java#L76-L112","documentation":"AlterPaimonTableSchemaEventHandler.apply() dispatches a SchemaChangeEvent to a known handler branch (AddColumn, DropColumn, RenameColumn, AlterColumnType, AlterTableColumn, AlterTableComment). Any other event type reaches the final else branch and is rejected with UnsupportedOperationException because Paimon sink cannot sync it.","triggerScenarios":"Feeding a schema-change event not covered by the if/else chain (e.g. unsupported Paimon SchemaChangeEvent subclass) into apply() while evolving a Paimon table schema from upstream CDC events.","commonSituations":"CDC pipelines forwarding raw schema-change events from MySQL/other sources into Paimon where the upstream emits an event type the handler has no branch for (e.g. new event types added in a newer connector or catalog version).","solutions":["Log the event's class name and check which SchemaChangeEvent types AlterPaimonTableSchemaEventHandler supports","Filter/drop the unsupported event upstream before applying schema evolution","Add an explicit handler branch for the event type if Paimon can express the change","Upgrade the connector version which may support more event types"],"exampleFix":"// before\nif (event instanceof SomeNewEvent) { handler.apply(event); }\n// after\nif (event instanceof SomeNewEvent && isSupported(event)) { handler.apply(event); }\nelse { log.warn(\"Skipping unsupported event {}\", event.getClass()); }","handlingStrategy":"try-catch","validationCode":"boolean supported = event instanceof AddColumnEvent || event instanceof DropColumnEvent || event instanceof RenameColumnEvent || event instanceof AlterColumnTypeEvent || event instanceof AlterTableColumnEvent || event instanceof AlterTableCommentEvent;","typeGuard":"boolean isSupportedSchemaEvent(SchemaChangeEvent e) { return e instanceof AddColumnEvent || e instanceof DropColumnEvent || e instanceof RenameColumnEvent || e instanceof AlterColumnTypeEvent || e instanceof AlterTableColumnEvent || e instanceof AlterTableCommentEvent; }","tryCatchPattern":"try { handler.apply(event); } catch (UnsupportedOperationException e) { log.warn(\"Skipping schema event {}: {}\", event.getClass().getSimpleName(), e.getMessage()); }","preventionTips":["Filter schema-change events to supported types before schema evolution","Keep connector-paimon and CDC source versions aligned","Log unsupported event classes for monitoring instead of failing the job"],"tags":["schema-evolution","paimon","unsupported-event","cdc"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}