{"record":{"id":"bd25c86cd7d613b5","repo":"apache/seatunnel","slug":"invalid-table-name-tablestr","errorCode":null,"errorMessage":"Invalid table name: ${tableStr}","messagePattern":"Invalid table name: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/oracle/config/OracleSourceConfigFactory.java","lineNumber":138,"sourceCode":"\n        if (schemaList != null) {\n            props.setProperty(\"schema.include.list\", String.join(\",\", schemaList));\n        }\n        if (tableList != null) {\n            // Oracle identifier is of the form schemaName.tableName\n            props.setProperty(\n                    \"table.include.list\",\n                    tableList.stream()\n                            .map(\n                                    tableStr -> {\n                                        String[] splits = tableStr.split(\"\\\\.\");\n                                        if (splits.length == 2) {\n                                            return tableStr;\n                                        }\n                                        if (splits.length == 3) {\n                                            return String.join(\".\", splits[1], splits[2]);\n                                        }\n                                        throw new IllegalArgumentException(\n                                                \"Invalid table name: \" + tableStr);\n                                    })\n                            .collect(Collectors.joining(\",\")));\n        }\n\n        // override the user-defined debezium properties\n        if (dbzProperties != null) {\n            String debeziumSchemaChanges =\n                    dbzProperties.getProperty(\n                            SCHEMA_CHANGE_KEY, String.valueOf(schemaChangeEnabled));\n            String debeziumLogMiningStrategy = dbzProperties.getProperty(LOG_MINING_STRATEGY_KEY);\n            if (Boolean.parseBoolean(debeziumSchemaChanges)\n                    && LOG_MINING_STRATEGY_DEFAULT.equals(debeziumLogMiningStrategy)) {\n                throw new IllegalArgumentException(\n                        \"Debezium log mining strategy must be set to redo_log_catalog when schema changes are enabled\");\n            }\n            props.putAll(dbzProperties);\n        }","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/oracle/config/OracleSourceConfigFactory.java#L120-L156","documentation":"Thrown by OracleSourceConfigFactory.create while normalizing table identifiers for Debezium. Each table name is split on '.'; only 2-part (schema.table) or 3-part (database.schema.table) names are accepted — a 3-part name has the database segment dropped because Oracle CDC supports a single database. Any other segment count (1, 4+, empty segments) makes the name impossible to normalize, so the factory rejects it.","triggerScenarios":"Calling create() on an OracleSourceConfigFactory whose tableList contains an entry that is not 'SCHEMA.TABLE' and not 'DATABASE.SCHEMA.TABLE', e.g. a bare table name 'MY_TABLE' or a fully-qualified name with extra parts 'DB.SCHEMA.TABLE.PARTITION'.","commonSituations":"Users copy a MySQL-style table path, paste a table name without schema qualification, or include quoted/dotted identifiers with extra dot segments; also happens after renaming a config key so the value no longer matches the expected format.","solutions":["Qualify the table as SCHEMA.TABLE (e.g. HR.EMPLOYEES) in table-names.","If specifying the PDB/database, use exactly DATABASE.SCHEMA.TABLE (e.g. ORCLPDB1.HR.EMPLOYEES); the database part must match database-list.","Check for stray dots or empty segments in the table name string (trailing '.' etc.).","Ensure case matches: Oracle identifiers must be uppercase unless quoted."],"exampleFix":"// before\ntable-names = [\"employees\"]\n// after\ntable-names = [\"HR.EMPLOYEES\"]","handlingStrategy":"validation","validationCode":"for (String t : tableList) {\n    String[] p = t.split(\"\\\\.\");\n    if (p.length != 2 && p.length != 3) throw new IllegalArgumentException(\"Bad table name: \" + t);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always qualify tables as SCHEMA.TABLE or DATABASE.SCHEMA.TABLE.","Trim and sanity-check table names read from variables/templates before building the factory."],"tags":["oracle-cdc","config-validation","table-name-format"],"backgroundTag":"invalid-argument-format","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}