apache/seatunnel · error · SalesforceConnectorException
INVALID_TABLE_PATH
INVALID_TABLE_PATH
Error message
table_path is required in tables_configs
What it means
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.
Source
Thrown at seatunnel-connectors-v2/connector-salesforce/src/main/java/org/apache/seatunnel/connectors/seatunnel/salesforce/source/SalesforceSource.java:115
SalesforceConnectorErrorCode.DESCRIBE_OBJECT_FAILED,
"Failed to build Salesforce table configs",
e);
}
}
private SalesforceTableConfig buildOneTableConfig(
ReadonlyConfig tableConfig, SalesforceClient client) {
String tablePath =
tableConfig
.getOptional(SalesforceSourceOptions.TABLE_PATH)
.orElseThrow(
() ->
new SalesforceConnectorException(
SalesforceConnectorErrorCode.INVALID_TABLE_PATH,
"table_path is required in tables_configs"));
String[] parts = tablePath.split("\\.", 2);
if (parts.length != 2 || StringUtils.isBlank(parts[1])) {
throw new SalesforceConnectorException(
SalesforceConnectorErrorCode.INVALID_TABLE_PATH,
"table_path must be 'database.ObjectName', got: " + tablePath);
}
String database = parts[0];
String objectName = parts[1];
String soql = buildSoql(tableConfig, objectName);
CatalogTable table = client.describeObject(database, objectName);
return new SalesforceTableConfig(soql, objectName, table);
}
/**
* Builds the SOQL the Bulk API job will run for one object. Always selects every
* describe-discovered field via FIELDS(ALL) so the emitted rows stay positionally aligned with
* the CatalogTable schema. An optional filter is appended verbatim as the WHERE clause.
*/
private String buildSoql(ReadonlyConfig config, String objectName) {
StringBuilder soql = new StringBuilder("SELECT FIELDS(ALL) FROM ").append(objectName);
String filter = config.getOptional(SalesforceSourceOptions.FILTER).orElse(null);View on GitHub (pinned to cf67b549a7)
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)
Example fix
// before table_path = "Account" // after table_path = "default.Account"
Defensive patterns
Strategy: validation
Validate before calling
// pre-validate every entry
for (Map<String,Object> t : tablesConfigs) {
String tp = (String) t.get("table_path");
if (tp == null || !tp.matches("[^.]+\\.[^.]+")) {
throw new IllegalArgumentException("table_path must be 'database.ObjectName': " + tp);
}
} Type guard
boolean isValidTablePath(String p) {
return p != null && p.contains(".") && !p.endsWith(".") && !p.startsWith(".");
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: Copy-pasting a config template that omits table_path; writing only the object name ('Account') without the database prefix; trailing dot from generated configs.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Vitess CDC requires database-qualified table paths, but tabl
- DUPLICATE_OBJECT
- DESCRIBE_OBJECT_FAILED
- Schema config can not be empty
- Can not find catalog table with factoryId [%s]
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/2f8d843b39c003ea.
Report an issue: GitHub.