{"record":{"id":"fc81a6bb542e7984","repo":"apache/cassandra","slug":"appendall-can-only-be-called-on-non-frozen-colle","errorCode":null,"errorMessage":"appendAll() can only be called on non-frozen collections","messagePattern":"appendAll\\(\\) can only be called on non-frozen collections","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/SimpleBuilders.java","lineNumber":386,"sourceCode":"        }\n\n        public Row.SimpleBuilder add(String columnName, Object value)\n        {\n            return add(columnName, value, true);\n        }\n\n        public Row.SimpleBuilder appendAll(String columnName, Object value)\n        {\n            return add(columnName, value, false);\n        }\n\n        private Row.SimpleBuilder add(String columnName, Object value, boolean overwriteForCollection)\n        {\n            maybeInit();\n            ColumnMetadata column = getColumn(columnName);\n\n            if (!overwriteForCollection && !(column.type.isMultiCell() && column.type.isCollection()))\n                throw new IllegalArgumentException(\"appendAll() can only be called on non-frozen collections\");\n\n            columns.add(column);\n\n            if (!column.type.isMultiCell())\n            {\n                builder.addCell(cell(column, toByteBuffer(value, column.type), null));\n                return this;\n            }\n\n            assert column.type instanceof CollectionType : \"Collection are the only multi-cell types supported so far\";\n\n            if (value == null)\n            {\n                builder.addComplexDeletion(column, DeletionTime.build(timestamp, nowInSec));\n                return this;\n            }\n\n            // Erase previous entry if any.","sourceCodeStart":368,"sourceCodeEnd":404,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/SimpleBuilders.java#L368-L404","documentation":"Row.SimpleBuilder.add() is called with overwriteForCollection=true (via appendAll) only when the target column is a non-frozen (multi-cell) collection. If the column type is not a multi-cell collection, add throws IllegalArgumentException, because appending elements to a frozen collection is not a valid write semantics — frozen collections must be replaced wholesale.","triggerScenarios":"Calling builder.appendAll(\"col\", value) (or add with overwriteForCollection=true) on a frozen<list/map/set> column, or on a non-collection column entirely.","commonSituations":"Schema changed from non-frozen to frozen collections (or the test/schema uses frozen) while the builder code still calls appendAll; developer confuses appendAll with set semantics on frozen collections in test builders.","solutions":["Use plain set/add (overwriteForCollection=false) to replace the frozen collection value instead of appendAll","Change the schema column to a non-frozen collection (e.g. map<text,text> instead of frozen<map<text,text>>) if append semantics are desired","Check ColumnMetadata.getType() with an assertion before calling appendAll in builder code"],"exampleFix":"// before\nrowBuilder.appendAll(\"tags\", listOf(\"a\",\"b\"));  // tags is frozen<list<text>>\n// after\nrowBuilder.add(\"tags\", listOf(\"a\",\"b\"));       // replace frozen collection wholesale","handlingStrategy":"type-guard","validationCode":"ColumnMetadata column = getColumn(columnName);\nif (overwriteForCollection && !(column.type.isMultiCell() && column.type.isCollection()))\n    throw new IllegalArgumentException(columnName + \" is not a non-frozen collection\");","typeGuard":"boolean isAppendable(ColumnMetadata c) { return c.type.isMultiCell() && c.type.isCollection(); }","tryCatchPattern":"try { builder.appendAll(col, value); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"appendAll\")) { builder.add(col, value); } else throw e; }","preventionTips":["Check the schema (frozen vs non-frozen) before choosing appendAll vs add","Keep builder code in sync with schema migrations affecting collection types","Prefer add() unless true append semantics on a multi-cell collection are required"],"tags":["cql","collections","builder","invalid-argument"],"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"}