apache/seatunnel · error · JdbcConnectorException

SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED

SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED

Error message

Unsupported JDBC table_options for dialect '${dialectName}': ${unsupportedOptions}. Supported keys: ${supportedOptions}

What it means

OracleDialect.validateTableOptions checks the user-supplied table_options map against the Oracle-supported keys (tablespace, pctfree). Any option outside that allowlist causes a JdbcConnectorException with CONFIG_VALIDATION_FAILED listing the unsupported and supported keys. This fails fast before DDL generation rather than silently dropping options.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleDialect.java:546

                    .append(", 'NLS_SORT=")
                    .append(collate)
                    .append("')");
            return sql.toString();
        } else {
            return "char_val";
        }
    }

    @Override
    public void validateTableOptions(Map<String, String> tableOptions) {
        if (tableOptions == null || tableOptions.isEmpty()) {
            return;
        }

        Set<String> unsupportedOptions = new LinkedHashSet<>(tableOptions.keySet());
        unsupportedOptions.removeAll(SUPPORTED_TABLE_OPTIONS);
        if (!unsupportedOptions.isEmpty()) {
            throw new JdbcConnectorException(
                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                    String.format(
                            "Unsupported JDBC table_options for dialect '%s': %s. Supported keys: %s",
                            dialectName(),
                            String.join(", ", unsupportedOptions),
                            String.join(", ", SUPPORTED_TABLE_OPTIONS)));
        }

        for (Map.Entry<String, String> entry : tableOptions.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (StringUtils.isBlank(value)) {
                throw new JdbcConnectorException(
                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                        String.format(
                                "Invalid JDBC table_options for dialect '%s': key '%s' must not be blank",
                                dialectName(), key));
            }

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Remove unsupported keys from table_options, keeping only 'tablespace' and 'pctfree'
  2. Fix typos in option keys to match the supported list exactly (case-sensitively as listed in the error message)
  3. If the option is genuinely needed for Oracle DDL, request/implement support in OracleDialect.SUPPORTED_TABLE_OPTIONS

Example fix

// before
table_options = {
  ENGINE = "InnoDB"
  pctfree = "10"
}
// after
table_options = {
  pctfree = "10"
  tablespace = "USERS"
}
Defensive patterns

Strategy: validation

Validate before calling

Set<String> allowed = Set.of("tablespace", "pctfree");
if (!allowed.containsAll(tableOptions.keySet())) throw new IllegalArgumentException("Unsupported table_options for Oracle: " + tableOptions.keySet());

Try / catch

try {
    submitJob(config);
} catch (JdbcConnectorException e) {
    if (e.getSeaTunnelApiErrorCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) { /* fix config */ }
}

Prevention

When it happens

Trigger: A JDBC sink creating an Oracle table with table_options containing keys other than 'tablespace' or 'pctfree' (typos, MySQL-style options like ENGINE/CHARSET copied from another dialect config).

Common situations: Copy-pasting table_options from a MySQL/Doris connector config into an Oracle sink; misspelling 'pctfree' or 'tablespace'; adding extra tuning options not implemented by the Oracle dialect.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/a979cc50edce8062. Report an issue: GitHub.