{"record":{"id":"a979cc50edce8062","repo":"apache/seatunnel","slug":"seatunnelapierrorcode-config-validation-failed-a979cc","errorCode":"SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED","errorMessage":"Unsupported JDBC table_options for dialect '${dialectName}': ${unsupportedOptions}. Supported keys: ${supportedOptions}","messagePattern":"Unsupported JDBC table_options for dialect '(.+?)': (.+?)\\. Supported keys: (.+?)","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/oracle/OracleDialect.java","lineNumber":546,"sourceCode":"                    .append(\", 'NLS_SORT=\")\n                    .append(collate)\n                    .append(\"')\");\n            return sql.toString();\n        } else {\n            return \"char_val\";\n        }\n    }\n\n    @Override\n    public void validateTableOptions(Map<String, String> tableOptions) {\n        if (tableOptions == null || tableOptions.isEmpty()) {\n            return;\n        }\n\n        Set<String> unsupportedOptions = new LinkedHashSet<>(tableOptions.keySet());\n        unsupportedOptions.removeAll(SUPPORTED_TABLE_OPTIONS);\n        if (!unsupportedOptions.isEmpty()) {\n            throw new JdbcConnectorException(\n                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                    String.format(\n                            \"Unsupported JDBC table_options for dialect '%s': %s. Supported keys: %s\",\n                            dialectName(),\n                            String.join(\", \", unsupportedOptions),\n                            String.join(\", \", SUPPORTED_TABLE_OPTIONS)));\n        }\n\n        for (Map.Entry<String, String> entry : tableOptions.entrySet()) {\n            String key = entry.getKey();\n            String value = entry.getValue();\n            if (StringUtils.isBlank(value)) {\n                throw new JdbcConnectorException(\n                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                        String.format(\n                                \"Invalid JDBC table_options for dialect '%s': key '%s' must not be blank\",\n                                dialectName(), key));\n            }","sourceCodeStart":528,"sourceCodeEnd":564,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleDialect.java#L528-L564","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Remove unsupported keys from table_options, keeping only 'tablespace' and 'pctfree'","Fix typos in option keys to match the supported list exactly (case-sensitively as listed in the error message)","If the option is genuinely needed for Oracle DDL, request/implement support in OracleDialect.SUPPORTED_TABLE_OPTIONS"],"exampleFix":"// before\ntable_options = {\n  ENGINE = \"InnoDB\"\n  pctfree = \"10\"\n}\n// after\ntable_options = {\n  pctfree = \"10\"\n  tablespace = \"USERS\"\n}","handlingStrategy":"validation","validationCode":"Set<String> allowed = Set.of(\"tablespace\", \"pctfree\");\nif (!allowed.containsAll(tableOptions.keySet())) throw new IllegalArgumentException(\"Unsupported table_options for Oracle: \" + tableOptions.keySet());","typeGuard":null,"tryCatchPattern":"try {\n    submitJob(config);\n} catch (JdbcConnectorException e) {\n    if (e.getSeaTunnelApiErrorCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) { /* fix config */ }\n}","preventionTips":["Only use keys documented for the JDBC Oracle dialect in table_options","Never copy table_options between different dialects","Validate config keys before job submission (CI config lint)","Read the supported-keys list printed in the error message"],"tags":["jdbc","oracle","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"}