{"record":{"id":"dbfccf343aeaeaed","repo":"apache/cassandra","slug":"invalid-operation-s-for-non-list-column-s","errorCode":null,"errorMessage":"Invalid operation (%s) for non list column %s","messagePattern":"Invalid operation \\((.+?)\\) for non list column (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/Operation.java","lineNumber":466,"sourceCode":"            return !(other instanceof SetValue);\n        }\n    }\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","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/Operation.java#L448-L484","documentation":"InvalidRequestException from Operation.Prepend.prepare: a prepend ('+ value on the left') update operation was applied to a column whose type is not a list. Only list columns support prepend semantics; the receiver's type is checked against ListType after preparing the value term.","triggerScenarios":"`UPDATE t SET s = [1] + s` where s is a set, map, or scalar column — prepend syntax only works on lists.","commonSituations":"Mixing up set/list syntax in queries; schema changed from list to set after the query was written; copy-paste between columns of different collection kinds.","solutions":["Target a list column with the prepend syntax","For sets, use set addition: s = {x} + s","For maps use map addition syntax","Correct the literal to match the column's collection kind"],"exampleFix":"// before (s is set<text>)\nUPDATE t SET s = ['a'] + s WHERE k=1;\n// after\nUPDATE t SET s = {'a'} + s 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.startsWith(\"list\")) throw new IllegalStateException(\"prepend requires a list column, got \" + type);","typeGuard":null,"tryCatchPattern":"try { session.execute(update); } catch (InvalidQueryException e) { if (e.getMessage().contains(\"non list column\")) { /* use collection-kind-appropriate syntax */ } else throw e; }","preventionTips":["Use [x] + l only on list columns; use {x} + s for sets","Confirm collection kinds after schema changes","Keep literal syntax consistent with column kind"],"tags":["cql","lists","collections","type-mismatch"],"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"}