{"record":{"id":"2f8d843b39c003ea","repo":"apache/seatunnel","slug":"invalid-table-path","errorCode":"INVALID_TABLE_PATH","errorMessage":"table_path is required in tables_configs","messagePattern":"table_path is required in tables_configs","errorType":"error_code","errorClass":"SalesforceConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-salesforce/src/main/java/org/apache/seatunnel/connectors/seatunnel/salesforce/source/SalesforceSource.java","lineNumber":115,"sourceCode":"                    SalesforceConnectorErrorCode.DESCRIBE_OBJECT_FAILED,\n                    \"Failed to build Salesforce table configs\",\n                    e);\n        }\n    }\n\n    private SalesforceTableConfig buildOneTableConfig(\n            ReadonlyConfig tableConfig, SalesforceClient client) {\n        String tablePath =\n                tableConfig\n                        .getOptional(SalesforceSourceOptions.TABLE_PATH)\n                        .orElseThrow(\n                                () ->\n                                        new SalesforceConnectorException(\n                                                SalesforceConnectorErrorCode.INVALID_TABLE_PATH,\n                                                \"table_path is required in tables_configs\"));\n        String[] parts = tablePath.split(\"\\\\.\", 2);\n        if (parts.length != 2 || StringUtils.isBlank(parts[1])) {\n            throw new SalesforceConnectorException(\n                    SalesforceConnectorErrorCode.INVALID_TABLE_PATH,\n                    \"table_path must be 'database.ObjectName', got: \" + tablePath);\n        }\n        String database = parts[0];\n        String objectName = parts[1];\n        String soql = buildSoql(tableConfig, objectName);\n        CatalogTable table = client.describeObject(database, objectName);\n        return new SalesforceTableConfig(soql, objectName, table);\n    }\n\n    /**\n     * Builds the SOQL the Bulk API job will run for one object. Always selects every\n     * describe-discovered field via FIELDS(ALL) so the emitted rows stay positionally aligned with\n     * the CatalogTable schema. An optional filter is appended verbatim as the WHERE clause.\n     */\n    private String buildSoql(ReadonlyConfig config, String objectName) {\n        StringBuilder soql = new StringBuilder(\"SELECT FIELDS(ALL) FROM \").append(objectName);\n        String filter = config.getOptional(SalesforceSourceOptions.FILTER).orElse(null);","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-salesforce/src/main/java/org/apache/seatunnel/connectors/seatunnel/salesforce/source/SalesforceSource.java#L97-L133","documentation":"Thrown by SalesforceSource.buildOneTableConfig when a tables_configs entry lacks table_path, or when table_path is not in 'database.ObjectName' form. It enforces the required composite path format used to derive database, object name, and SOQL.","triggerScenarios":"A tables_configs entry missing the table_path key; table_path with no '.' separator; table_path like 'Account.' with a blank object name after the dot.","commonSituations":"Copy-pasting a config template that omits table_path; writing only the object name ('Account') without the database prefix; trailing dot from generated configs.","solutions":["Add table_path to every tables_configs entry","Format table_path as 'database.ObjectName', e.g. \"default.Account\"","Fix entries with a missing object part after the dot (blank object name)"],"exampleFix":"// before\ntable_path = \"Account\"\n// after\ntable_path = \"default.Account\"","handlingStrategy":"validation","validationCode":"// pre-validate every entry\nfor (Map<String,Object> t : tablesConfigs) {\n    String tp = (String) t.get(\"table_path\");\n    if (tp == null || !tp.matches(\"[^.]+\\\\.[^.]+\")) {\n        throw new IllegalArgumentException(\"table_path must be 'database.ObjectName': \" + tp);\n    }\n}","typeGuard":"boolean isValidTablePath(String p) {\n    return p != null && p.contains(\".\") && !p.endsWith(\".\") && !p.startsWith(\".\");\n}","tryCatchPattern":null,"preventionTips":["Always include table_path as 'database.ObjectName' in each entry","Lint configs for the dot separator and non-blank object segment","Copy the exact format from working example configs"],"tags":["config","salesforce","table-path"],"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-14T16:17:12.679Z"}