apache/seatunnel · error · JdbcConnectorException
CONFIG_VALIDATION_FAILED
CONFIG_VALIDATION_FAILED
Error message
JDBC table_options are not supported for dialect '%s' yet.
What it means
The default JdbcDialect.validateTableOptions() rejects any non-empty user-supplied table_options map, because only dialects that explicitly support sink-side table options override it. It is thrown during connector validation (via validate()) before any data is written, so the job fails fast at configuration time with code CONFIG_VALIDATION_FAILED.
Source
Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/JdbcDialect.java:929
StringUtils.isNotBlank(collate) ? "char_val COLLATE " + collate : "char_val";
return getCollate;
}
default String dualTable() {
return "";
}
/**
* Validate sink table options for auto-create mode.
*
* <p>Default behavior is fail-fast for any non-empty table options. Dialects should override
* this when they support sink-specific table options.
*/
default void validateTableOptions(Map<String, String> tableOptions) {
if (tableOptions == null || tableOptions.isEmpty()) {
return;
}
throw new JdbcConnectorException(
SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
String.format(
"JDBC table_options are not supported for dialect '%s' yet.",
dialectName()));
}
}
View on GitHub (pinned to cf67b549a7)
Solutions
- Remove the table_options section from the JDBC sink config for this dialect
- Check whether your target dialect supports sink table options; if not, achieve the equivalent effect via dialect-native DDL on the target table
- Upgrade SeaTunnel to a version where your dialect implements validateTableOptions() with support
- If you own a custom dialect, override validateTableOptions() to accept and apply the options
Example fix
// before
sink {
Jdbc {
url = "jdbc:oracle:thin:@host:1521:orcl"
table_options = { "key" = "value" }
}
}
// after: drop unsupported table_options
sink {
Jdbc {
url = "jdbc:oracle:thin:@host:1521:orcl"
}
} Defensive patterns
Strategy: validation
Validate before calling
// validate config before submit
if (sinkConfig.containsKey('table_options') && !dialectSupportsTableOptions(dialectName)) {
throw new Error('table_options not supported for dialect ' + dialectName);
} Try / catch
try {
jobConfig.validate();
} catch (JdbcConnectorException e) {
if (e.getCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) {
log.error("Remove table_options for dialect {}: {}", dialectName, e.getMessage());
}
throw e;
} Prevention
- Only set table_options on dialects documented to support sink table options (e.g. MySQL, StarRocks)
- Run the job with the validate/submit dry-run before production
- Apply dialect-specific table attributes via DDL on the target database instead of connector options
- Keep config templates per-dialect rather than copying between databases
When it happens
Trigger: Configuring a JDBC sink with a table_options block (or option map) while using a dialect whose JdbcDialect does not override validateTableOptions(), then triggering config validation (job submit / validate API).
Common situations: Copy-pasting a working JDBC sink config (e.g. written for MySQL or StarRocks dialect with table_options) to another database like Oracle or DB2 whose dialect lacks table-option support; typos leading to options being routed into table_options; using a newer config key on an older SeaTunnel version where the dialect has no override.
Understand the failure class
Background: Config validation failed: what "invalid value for {key}" and settings-rejection errors mean across 19 open-source libraries — this error's family across 19 libraries.
Related errors
- CONFIG_VALIDATION_FAILED
- CONFIG_VALIDATION_FAILED
- SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED
- SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED
- Invalid Oracle JDBC URL format: [%s], expected pattern: jdbc
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/96b39f3dca111ede.
Report an issue: GitHub.