{"record":{"id":"b2de2d2f87878847","repo":"apache/seatunnel","slug":"invalid-table-name-tablestr-postgres-identifi","errorCode":null,"errorMessage":"Invalid table name: ${tableStr} ,Postgres identifier is of the form schemaName.tableName","messagePattern":"Invalid table name: (.+?) ,Postgres identifier is of the form schemaName\\.tableName","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-postgres/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/postgres/config/PostgresSourceConfigFactory.java","lineNumber":101,"sourceCode":"        if (schemaList != null) {\n            props.setProperty(\"schema.include.list\", String.join(\",\", schemaList));\n        }\n\n        if (tableList != null) {\n            // pg 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: \"\n                                                        + tableStr\n                                                        + \" ,Postgres identifier is of the form schemaName.tableName\");\n                                    })\n                            .collect(Collectors.joining(\",\")));\n        }\n\n        if (dbzProperties != null) {\n            props.putAll(dbzProperties);\n        }\n        // Debezium PostgreSQL does not emit DDL records, but SeaTunnel uses this flag to enable\n        // synthetic schema records produced from pgoutput RELATION messages. Apply it after the\n        // Debezium pass-through properties so the SeaTunnel option remains authoritative.\n        props.setProperty(\"include.schema.changes\", String.valueOf(schemaChangeEnabled));\n        if (startupConfig != null && startupConfig.getStartupMode() == StartupMode.SNAPSHOT_ONLY) {\n            props.setProperty(\"snapshot.mode\", \"initial_only\");\n        } else if (startupConfig != null\n                && startupConfig.getStartupMode() == StartupMode.COMMITTED_OFFSET) {","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-postgres/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/postgres/config/PostgresSourceConfigFactory.java#L83-L119","documentation":"PostgresSourceConfigFactory.create parses each table-list entry expecting 2 or 3 dot-separated parts (schema.table or db.schema.table). Any other shape (wrong number of parts) fails fast with IllegalArgumentException because a valid PostgreSQL identifier must resolve to schemaName.tableName.","triggerScenarios":"table-names entry with 1 part (e.g. 'mytable'), more than 3 parts, or 3 parts where dropping the first is wrong — thrown during create() called by PostgresDialect, LsnOffsetFactory and startup-offset validation.","commonSituations":"Users passing just a table name without schema; copying MySQL-style identifiers; unquoted names containing dots; region-qualified 'catalog.schema.table' confusion.","solutions":["Use fully qualified 'schemaName.tableName' (e.g. public.orders) in table-names.","If you must use database.schema.table, ensure exactly 3 parts so the first is stripped.","Quote identifiers containing dots or mixed case with double quotes per Postgres rules.","Check for typos like trailing dots or spaces that create empty parts."],"exampleFix":"// before\ntable-names = [\"orders\"]\n// after\ntable-names = [\"public.orders\"]","handlingStrategy":"validation","validationCode":"boolean isValid = tableStr.matches(\"([^.]+\\\\.)?[^.]+\\\\.[^.]+\"); // schema.table or db.schema.table\nif (!isValid) throw new IllegalArgumentException(\"Use schemaName.tableName: \" + tableStr);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write table-names as 'schema.table' (usually public.<table>).","Quote identifiers that contain dots or mixed case.","Lint configs for empty segments before deployment."],"tags":["postgres","cdc","config","table-names"],"backgroundTag":"invalid-identifier-format","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"}