{"record":{"id":"17dcb0eb5ffe33a0","repo":"apache/cassandra","slug":"invalid-operation-s-for-frozen-collection-colum","errorCode":null,"errorMessage":"Invalid operation (%s) for frozen collection column %s","messagePattern":"Invalid operation \\((.+?)\\) for frozen collection column (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/Operation.java","lineNumber":252,"sourceCode":"    }\n\n    public static class SetElement implements RawUpdate\n    {\n        private final Term.Raw selector;\n        private final Term.Raw value;\n\n        public SetElement(Term.Raw selector, Term.Raw value)\n        {\n            this.selector = selector;\n            this.value = value;\n        }\n\n        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException\n        {\n            if (!(receiver.type instanceof CollectionType))\n                throw new InvalidRequestException(String.format(\"Invalid operation (%s) for non collection column %s\", toString(receiver), receiver.name));\n            else if (!(receiver.type.isMultiCell()))\n                throw new InvalidRequestException(String.format(\"Invalid operation (%s) for frozen collection column %s\", toString(receiver), receiver.name));\n\n            switch (((CollectionType<?>)receiver.type).kind)\n            {\n                case LIST:\n                    Term idx = selector.prepare(metadata.keyspace, Lists.indexSpecOf(receiver));\n                    Term lval = value.prepare(metadata.keyspace, Lists.valueSpecOf(receiver));\n                    return new Lists.SetterByIndex(receiver, idx, lval);\n                case SET:\n                    throw new InvalidRequestException(String.format(\"Invalid operation (%s) for set column %s\", toString(receiver), receiver.name));\n                case MAP:\n                    Term key = selector.prepare(metadata.keyspace, Maps.keySpecOf(receiver));\n                    Term mval = value.prepare(metadata.keyspace, Maps.valueSpecOf(receiver));\n                    return new Maps.SetterByKey(receiver, key, mval);\n            }\n            throw new AssertionError();\n        }\n\n        protected String toString(ColumnSpecification column)","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/Operation.java#L234-L270","documentation":"Cassandra throws this during statement preparation when a non-frozen-safe collection operation targets a frozen collection column. Frozen collections are updated as a single opaque blob, so granular in-place operations (append, set-by-index, put-by-key) are rejected; the whole value must be rewritten.","triggerScenarios":"Using operations like c[k]=v, c+=v, c+=... or list index assignment on a column declared frozen<list<T>>, frozen<map<K,V>> or frozen<set<T>>; e.g. 'UPDATE t SET tags = tags + {\"x\"}' where tags is frozen<set<text>>.","commonSituations":"Tables created with frozen collections carried over from pre-3.x modelling; developer assumes collections behave like non-frozen ones; ORM generates partial-update statements against frozen columns.","solutions":["Rewrite the statement to replace the whole frozen value (SET col = <full new collection>)","If granular updates are needed, migrate the column to a non-frozen collection (new column + copy data, since ALTER cannot un-freeze)","Change the ORM/query builder to emit full-value replacement for frozen collections","Re-model the schema so only the truly immutable collections stay frozen"],"exampleFix":"// before (tags frozen<set<text>>)\nUPDATE users SET tags = tags + {'new'} WHERE id = 1;\n// after\nUPDATE users SET tags = {'a','new'} WHERE id = 1;  -- replace whole frozen value","handlingStrategy":"validation","validationCode":"AbstractType<?> t = tm.getColumn(col).getType();\nif (t instanceof CollectionType && !t.isMultiCell())\n    throw new IllegalArgumentException(col + \" is frozen; replace the whole value instead of partial updates\");","typeGuard":"boolean isFrozenCollection(AbstractType<?> t) { return t instanceof CollectionType && !t.isMultiCell(); }","tryCatchPattern":"try { session.execute(update); } catch (InvalidRequestException e) { if (e.getMessage().contains(\"frozen collection\")) replaceWholeValue(); else throw e; }","preventionTips":["Track which columns are FROZEN in your schema metadata and route updates accordingly","Prefer non-frozen collections unless the immutable-blob semantics are required","Write integration tests covering updates to frozen columns"],"tags":["cql","cassandra","frozen-collection"],"backgroundTag":"unsupported-operation","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"}