{"record":{"id":"d72069719a589a0c","repo":"apache/seatunnel","slug":"e-message","errorCode":null,"errorMessage":"${e.message}","messagePattern":"\\$\\{e\\.message\\}","errorType":"validation","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonTableOptionsConditionExtension.java","lineNumber":57,"sourceCode":"\n    @Override\n    public String description() {\n        return \"must use non-blank keys and non-null values; applied only to SaveMode auto-create\"\n                + \" schema options (not merged into runtime paimon.table.write-props; see Paimon\"\n                + \" connector docs)\";\n    }\n\n    @Override\n    public boolean evaluate(ReadonlyConfig config, Map<String, String> value)\n            throws OptionValidationException {\n        if (value == null || value.isEmpty()) {\n            return true;\n        }\n        try {\n            PaimonTableOptionsValidator.validate(config, value);\n            return true;\n        } catch (SeaTunnelRuntimeException e) {\n            throw new OptionValidationException(e.getMessage());\n        }\n    }\n}\n","sourceCodeStart":39,"sourceCodeEnd":61,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonTableOptionsConditionExtension.java#L39-L61","documentation":"PaimonTableOptionsConditionExtension.evaluate validates the sink's table_options via PaimonTableOptionsValidator; if validation raises a SeaTunnelRuntimeException, it is re-thrown as an OptionValidationException carrying the original message. The displayed message is thus whatever the validator produced (e.g. blank key or null value in table_options).","triggerScenarios":"Calling evaluate() during option/condition processing with a table_options map that fails PaimonTableOptionsValidator — blank property key, null value, or an invalid timestamp/offset configuration.","commonSituations":"Copy-pasted table_options with an empty key (`\"\" = \"value\"`); YAML/HOCON parsing producing null values; invalid `scan.timestamp-millis` style options rejected by the validator.","solutions":["Fix the offending table_options entry identified in the wrapped message (remove blank keys, supply values)","Validate table_options keys/values before submission","Consult PaimonTableOptionsValidator rules for required companion options (e.g. timestamp start/end modes)"],"exampleFix":"// before\ntable_options = { \"\" = \"x\" }\n// after\ntable_options = { \"bucket\" = \"2\" }\n","handlingStrategy":"try-catch","validationCode":"for (Map.Entry<String,String> e : tableOptions.entrySet()) { if (e.getKey() == null || e.getKey().isBlank() || e.getValue() == null) { throw new IllegalArgumentException(\"Invalid table_options entry: \" + e); } }","typeGuard":null,"tryCatchPattern":"try { ext.evaluate(config, value); } catch (OptionValidationException ex) { log.error(\"table_options validation failed: {}\", ex.getMessage()); /* fix config and resubmit */ }","preventionTips":["Reject blank keys/values at config-load time","Keep table_options keys explicit in templates","Read the wrapped validator message for the exact offending option"],"tags":["paimon","config","validation"],"backgroundTag":"schema-validation-failed","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"}