{"record":{"id":"22d3ed9fc6106015","repo":"apache/cassandra","slug":"invalid-unset-value-for-field-s-of-user-defined","errorCode":null,"errorMessage":"Invalid unset value for field '%s' of user defined type %s","messagePattern":"Invalid unset value for field '(.+?)' of user defined type (.+?)","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/UserType.java","lineNumber":697,"sourceCode":"    public List<byte[]> filterSortAndValidateElementsFromArrays(List<byte[]> buffers)\n    {\n        return filterSortAndValidateElements(buffers, ByteArrayUtil.UNSET_BYTE_ARRAY, ByteArrayAccessor.instance);\n    }\n\n    private <T> List<T> filterSortAndValidateElements(List<T> buffers, T unsetValue, ValueAccessor<T> valueAccessor)\n    {\n        if (buffers.size() > size())\n            throw new MarshalException(String.format(\"UDT value contained too many fields (expected %s, got %s)\", size(), buffers.size()));\n\n        for (int i = 0; i < buffers.size(); i++)\n        {\n            // Since a frozen UDT value is always written in its entirety Cassandra can't preserve a pre-existing\n            // value by 'not setting' the new value. Reject the query.\n            T buffer = buffers.get(i);\n            if (buffer == null)\n                continue;\n            if (!isMultiCell() && buffer == unsetValue)\n                throw new MarshalException(String.format(\"Invalid unset value for field '%s' of user defined type %s\", fieldNameAsString(i), getNameAsString()));\n            type(i).validate(buffer, valueAccessor);\n        }\n\n        return buffers;\n    }\n\n    @Override\n    public SchemaElementType elementType()\n    {\n        return SchemaElementType.TYPE;\n    }\n\n    @Override\n    public String elementKeyspace()\n    {\n        return keyspace;\n    }\n","sourceCodeStart":679,"sourceCodeEnd":715,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/UserType.java#L679-L715","documentation":"Unset sentinel values are only legal for multi-cell (non-frozen) UDTs. While validating elements, if the type is frozen (not multiCell) and a field's buffer equals the unset sentinel, this MarshalException names the field and type, because frozen values must be written in full.","triggerScenarios":"Binding UNSET_BYTE_ARRAY / unset for a field of a frozen UDT in a constructor path; a prepared-statement bind variable left 'unset' for a frozen UDT field.","commonSituations":"Client using unset() on frozen UDT fields hoping to preserve existing values (explicitly unsupported); ORM-generated binds defaulting to unset; migration of code that worked when the UDT was later changed to frozen.","solutions":["Provide an explicit value for every field of the frozen UDT (use null to overwrite with an empty field if desired)","Unfreeze the UDT (recreate as multi-cell) if partial updates with unset are required","Check each buffer for the unset sentinel before constructing the value"],"exampleFix":"// before\nbuffers.set(1, Unset); // frozen UDT -> MarshalException\n// after\nif (!udt.isMultiCell() && buffer == unsetValue)\n    buffer = fieldDefault; // explicit value instead of unset\nbuffers.set(1, buffer);","handlingStrategy":"validation","validationCode":"if (!udt.isMultiCell()) for (int i=0;i<buffers.size();i++) if (buffers.get(i) == unsetValue) throw new IllegalArgumentException(\"unset not allowed for frozen field \" + udt.fieldNameAsString(i));","typeGuard":"boolean unsetAllowed(UserType udt, Object buffer) { return udt.isMultiCell() || buffer != unsetValue; }","tryCatchPattern":"try { v = new UserType.Value(udt, buffers); } catch (MarshalException e) { throw new BindingException(\"frozen UDT cannot contain unset fields\"); }","preventionTips":["Never use unset() with frozen UDT columns","Provide complete values for frozen types; recreate the UDT as non-frozen for partial updates","Detect unset sentinels at the binding layer"],"tags":["cassandra","udt","frozen","unset"],"backgroundTag":"schema-validation-failed","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}