{"record":{"id":"572181043a406718","repo":"apache/seatunnel","slug":"unsupported-resolve-schemachangeevent-just-ski","errorCode":null,"errorMessage":"Unsupported resolve schemaChangeEvent {}, just skip.","messagePattern":"Unsupported resolve schemaChangeEvent (.+?), just skip\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/debezium/row/SeaTunnelRowDebeziumDeserializeSchema.java","lineNumber":147,"sourceCode":"\n    private void deserializeSchemaChangeRecord(\n            SourceRecord record, Collector<SeaTunnelRow> collector) {\n        SchemaChangeEvent schemaChangeEvent = null;\n        try {\n            if (schemaChangeResolver != null) {\n                schemaChangeEvent = schemaChangeResolver.resolve(record, tables);\n            }\n        } catch (SchemaEvolutionException e) {\n            // A resolver uses SchemaEvolutionException only when continuing would make the\n            // produced row schema diverge from the source relation. Keep generic parser failures\n            // backward-compatible, but fail fast for an explicitly classified schema error.\n            throw e;\n        } catch (Exception e) {\n            log.warn(\"Failed to resolve schemaChangeEvent, just skip.\", e);\n            return;\n        }\n        if (schemaChangeEvent == null) {\n            log.warn(\"Unsupported resolve schemaChangeEvent {}, just skip.\", record);\n            return;\n        }\n\n        // Filter before updating the produced schema, so the produced row shape stays in lockstep\n        // with the (filtered) sink schema. Only surviving events are applied below.\n        if (schemaChangeEventFilter != null) {\n            schemaChangeEvent = schemaChangeEventFilter.filter(schemaChangeEvent);\n        }\n        if (schemaChangeEvent == null) {\n            log.debug(\n                    \"Schema change event is fully filtered out by schema-changes.include/exclude, not applied to schema and not sent downstream.\");\n            return;\n        }\n\n        boolean tableExist = false;\n        for (int i = 0; i < tables.size(); i++) {\n            CatalogTable changeBefore = tables.get(i);\n            if (!schemaChangeEvent.tablePath().equals(changeBefore.getTablePath())) {","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/debezium/row/SeaTunnelRowDebeziumDeserializeSchema.java#L129-L165","documentation":"After asking the schema resolver to translate a DDL change record, the resolver returned null — meaning it recognized the event but could not produce a supported schema change. The connector logs this warning (including the record) and skips the event rather than failing the job, so the sink schema does not receive the change.","triggerScenarios":"deserializeSchemaChangeRecord (invoked from deserialize for DDL records) receives a schema change whose operation/table/type is not supported by the configured SchemaChangeEventResolver, so resolve() returns null instead of throwing.","commonSituations":"ALTER TABLE operations the resolver deliberately does not support (e.g. unsupported column types); DDL on tables not part of the pipeline's table list; events filtered out by schemaChangeEventFilter upstream leaving unsupported kinds; connector lacking support for a database-specific change kind.","solutions":["Inspect the logged record to identify which DDL event was unsupported and whether its table is in your pipeline.","If the event belongs to an unrelated table, the skip is expected and safe.","If the change is needed downstream, apply it manually to the sink and restart the job so the reader matches the new schema.","Configure or extend the schemaChangeEventFilter/resolver so supported events are handled instead of returned as null.","Upgrade the connector if the unsupported event kind is newly supported upstream."],"exampleFix":"// before: event silently skipped, sink misses the column\nif (schemaChangeEvent == null) {\n    log.warn(\"Unsupported resolve schemaChangeEvent {}, just skip.\", record);\n    return;\n}\n// after: surface the unsupported event so drift is visible/trackable\nif (schemaChangeEvent == null) {\n    throw new UnsupportedOperationException(\n        \"Unsupported schema change event for table \" + tableId + \": \" + record);\n}","handlingStrategy":"validation","validationCode":"// check resolver support before enabling schema evolution in the pipeline\nif (!resolver.supports(ddlOperation, tableId)) {\n    log.warn(\"Resolver does not support {} on {}; sink must be updated manually\", ddlOperation, tableId);\n}","typeGuard":"boolean isHandled(SchemaChangeEvent e) { return e != null; }","tryCatchPattern":"SchemaChangeEvent evt = resolver.resolve(record);\nif (evt == null) {\n    log.warn(\"Unsupported schema change for {} — apply manually or upgrade connector\", tableId);\n    return; // or throw if silent drift is unacceptable\n}","preventionTips":["Review which DDL operations your SchemaChangeEventResolver supports before migrating schemas on live CDC tables.","Restrict schema migrations to supported operations and column types.","Alert on this warning so silent schema drift is caught early.","Upgrade the connector when your database emits newer DDL syntax."],"tags":["cdc","schema-evolution","debezium","ddl"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}