{"record":{"id":"6be26b36078eb9fd","repo":"apache/cassandra","slug":"invalid-operation-s-for-frozen-list-column-s","errorCode":null,"errorMessage":"Invalid operation (%s) for frozen list column %s","messagePattern":"Invalid operation \\((.+?)\\) for frozen list column (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/Operation.java","lineNumber":468,"sourceCode":"    }\n\n    public static class Prepend implements RawUpdate\n    {\n        private final Term.Raw value;\n\n        public Prepend(Term.Raw value)\n        {\n            this.value = value;\n        }\n\n        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException\n        {\n            Term v = value.prepare(metadata.keyspace, receiver);\n\n            if (!(receiver.type instanceof ListType))\n                throw new InvalidRequestException(String.format(\"Invalid operation (%s) for non list column %s\", toString(receiver), receiver.name));\n            else if (!(receiver.type.isMultiCell()))\n                throw new InvalidRequestException(String.format(\"Invalid operation (%s) for frozen list column %s\", toString(receiver), receiver.name));\n\n            return new Lists.Prepender(receiver, v);\n        }\n\n        protected String toString(ColumnSpecification column)\n        {\n            return String.format(\"%s = %s - %s\", column.name, value, column.name);\n        }\n\n        public boolean isCompatibleWith(RawUpdate other)\n        {\n            return !(other instanceof SetValue);\n        }\n    }\n\n    public static class ColumnDeletion implements RawDeletion\n    {\n        private final ColumnIdentifier id;","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/Operation.java#L450-L486","documentation":"A list prepend (`l = [x] + l`) was applied to a frozen<list<...>> column. Frozen lists are immutable as collections — only full replacement is allowed — so prepare rejects element-level prepend on non-multi-cell list columns.","triggerScenarios":"`UPDATE t SET l = [x] + l` where the column is declared frozen<list<text>>.","commonSituations":"Column declared frozen intentionally (e.g. for use in a primary key) while queries assume mutating semantics; tutorials using non-frozen lists applied to frozen schemas.","solutions":["Change the column to a non-frozen list (recreate table/column) to enable prepend","Replace the whole frozen list: read, modify client-side, write full value","Use an append/prepend-friendly non-frozen schema going forward","If frozen is required (PK usage), model history as separate rows instead"],"exampleFix":"// before\nl frozen<list<int>>; UPDATE t SET l = [0] + l WHERE k=1;\n// after\nl list<int>; UPDATE t SET l = [0] + l WHERE k=1;","handlingStrategy":"validation","validationCode":"String type = session.execute(\"SELECT type FROM system_schema.columns WHERE keyspace_name=? AND table_name=? AND column_name=?\", ks, table, col).one().getString(\"type\");\nif (type.contains(\"frozen\")) throw new IllegalStateException(\"frozen lists cannot be prepended; replace whole value\");","typeGuard":null,"tryCatchPattern":"try { session.execute(update); } catch (InvalidQueryException e) { if (e.getMessage().contains(\"frozen list\")) { /* read-modify-write full value */ } else throw e; }","preventionTips":["Prefer non-frozen list columns when prepend/append is required","Use frozen collections only where immutability or PK placement is needed","Cache schema types and guard mutation operations accordingly"],"tags":["cql","lists","frozen","schema"],"backgroundTag":"unsupported-operation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}