{"record":{"id":"96b39f3dca111ede","repo":"apache/seatunnel","slug":"config-validation-failed-96b39f","errorCode":"CONFIG_VALIDATION_FAILED","errorMessage":"JDBC table_options are not supported for dialect '%s' yet.","messagePattern":"JDBC table_options are not supported for dialect '(.+?)' yet\\.","errorType":"validation","errorClass":"JdbcConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/JdbcDialect.java","lineNumber":929,"sourceCode":"                StringUtils.isNotBlank(collate) ? \"char_val COLLATE \" + collate : \"char_val\";\n        return getCollate;\n    }\n\n    default String dualTable() {\n        return \"\";\n    }\n\n    /**\n     * Validate sink table options for auto-create mode.\n     *\n     * <p>Default behavior is fail-fast for any non-empty table options. Dialects should override\n     * this when they support sink-specific table options.\n     */\n    default void validateTableOptions(Map<String, String> tableOptions) {\n        if (tableOptions == null || tableOptions.isEmpty()) {\n            return;\n        }\n        throw new JdbcConnectorException(\n                SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                String.format(\n                        \"JDBC table_options are not supported for dialect '%s' yet.\",\n                        dialectName()));\n    }\n}\n","sourceCodeStart":911,"sourceCodeEnd":936,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/JdbcDialect.java#L911-L936","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\nsink {\n  Jdbc {\n    url = \"jdbc:oracle:thin:@host:1521:orcl\"\n    table_options = { \"key\" = \"value\" }\n  }\n}\n// after: drop unsupported table_options\nsink {\n  Jdbc {\n    url = \"jdbc:oracle:thin:@host:1521:orcl\"\n  }\n}","handlingStrategy":"validation","validationCode":"// validate config before submit\nif (sinkConfig.containsKey('table_options') && !dialectSupportsTableOptions(dialectName)) {\n  throw new Error('table_options not supported for dialect ' + dialectName);\n}","typeGuard":null,"tryCatchPattern":"try {\n  jobConfig.validate();\n} catch (JdbcConnectorException e) {\n  if (e.getCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) {\n    log.error(\"Remove table_options for dialect {}: {}\", dialectName, e.getMessage());\n  }\n  throw e;\n}","preventionTips":["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"],"tags":["jdbc","config-validation","table-options"],"backgroundTag":"unsupported-config-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}