{"record":{"id":"47ca437735c41452","repo":"apache/seatunnel","slug":"vitess-cdc-does-not-support-schema-qualified-table","errorCode":null,"errorMessage":"Vitess CDC does not support schema-qualified table paths. Table '%s' contains an unexpected schema component.","messagePattern":"Vitess CDC does not support schema-qualified table paths\\. Table '(.+?)' contains an unexpected schema component\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-vitess/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/vitess/config/VitessSourceConfig.java","lineNumber":104,"sourceCode":"        }\n\n        String keyspace = options.get(VitessSourceOptions.KEYSPACE);\n        for (CatalogTable catalogTable : catalogTables) {\n            String databaseName = catalogTable.getTablePath().getDatabaseName();\n            if (databaseName == null) {\n                throw new IllegalArgumentException(\n                        String.format(\n                                \"Vitess CDC requires database-qualified table paths, but table '%s' does not define a database name.\",\n                                catalogTable.getTablePath()));\n            }\n            if (!keyspace.equals(databaseName)) {\n                throw new IllegalArgumentException(\n                        String.format(\n                                \"Vitess CDC captures one keyspace per source. Table '%s' does not belong to keyspace '%s'.\",\n                                catalogTable.getTablePath(), keyspace));\n            }\n            if (catalogTable.getTablePath().getSchemaName() != null) {\n                throw new IllegalArgumentException(\n                        String.format(\n                                \"Vitess CDC does not support schema-qualified table paths. Table '%s' contains an unexpected schema component.\",\n                                catalogTable.getTablePath()));\n            }\n        }\n\n        StartupMode startupMode = options.get(VitessSourceOptions.STARTUP_MODE);\n        String specificVgtid =\n                options.getOptional(VitessSourceOptions.STARTUP_SPECIFIC_OFFSET_VGTID).orElse(null);\n        if (startupMode == StartupMode.SPECIFIC) {\n            if (specificVgtid == null) {\n                throw new IllegalArgumentException(\n                        \"startup.specific-offset.vgtid is required when startup.mode=specific.\");\n            }\n            // Parse eagerly so configuration failures surface before the source thread starts.\n            Vgtid.of(specificVgtid);\n        }\n","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-vitess/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/vitess/config/VitessSourceConfig.java#L86-L122","documentation":"Thrown during Vitess CDC source validation when a table path includes a schema component. Vitess (MySQL-compatible) only has a two-part naming model (keyspace.table), so a three-part or schema-qualified path is invalid for this connector.","triggerScenarios":"Calling VitessSourceConfig.of with a CatalogTable whose TablePath.getSchemaName() is non-null, i.e. the table path was parsed with an extra schema segment (e.g. database.schema.table).","commonSituations":"Reusing table path formats from PostgreSQL-style CDC sources (db.schema.table); programmatically building TablePath with setSchemaName; pasting fully-qualified JDBC identifiers into the Vitess source config.","solutions":["Remove the schema component and use only keyspace.table","Rebuild the TablePath without a schema name","If a schema-like layer exists, fold it into the table name or use a different connector"],"exampleFix":"// before\ntablePath = \"commerce.public.orders\"\n// after\ntablePath = \"commerce.orders\"","handlingStrategy":"validation","validationCode":"if (tablePath.getSchemaName() != null) {\n    throw new IllegalArgumentException(\"Vitess table paths must be keyspace.table: \" + tablePath);\n}","typeGuard":null,"tryCatchPattern":"try { VitessSourceConfig.of(tables, options); } catch (IllegalArgumentException e) { /* strip schema segment and retry */ }","preventionTips":["Never reuse PostgreSQL-style three-part paths in Vitess configs","Build TablePath with only databaseName and tableName","Assert two-segment paths in config validation scripts"],"tags":["cdc","vitess","table-path"],"backgroundTag":"invalid-argument-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}