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

  1. Remove the table_options section from the JDBC sink config for this dialect
  2. Check whether your target dialect supports sink table options; if not, achieve the equivalent effect via dialect-native DDL on the target table
  3. Upgrade SeaTunnel to a version where your dialect implements validateTableOptions() with support
  4. 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

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


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