{"record":{"id":"8923d806ad75bc18","repo":"prestodb/presto","slug":"singlemapblock-does-not-support-appendnull","errorCode":null,"errorMessage":"SingleMapBlock does not support appendNull()","messagePattern":"SingleMapBlock does not support appendNull\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/block/SingleMapBlock.java","lineNumber":161,"sourceCode":"    public Block getValueBlock()\n    {\n        return mapBlock.getRawValueBlock().getRegion(positionInMap, positionCount / 2);\n    }\n\n    public Block getBaseMapBlock()\n    {\n        return mapBlock;\n    }\n\n    public int getPositionInMap()\n    {\n        return positionInMap;\n    }\n\n    @Override\n    public Block appendNull()\n    {\n        throw new UnsupportedOperationException(\"SingleMapBlock does not support appendNull()\");\n    }\n\n    @Nullable\n    int[] getHashTable()\n    {\n        return mapBlock.getHashTables().get();\n    }\n\n    /**\n     * @return position of the value under {@code nativeValue} key. -1 when key is not found.\n     */\n    public int seekKey(Object nativeValue, MethodHandle keyNativeHashCode, MethodHandle keyBlockNativeEquals, MethodHandle keyBlockHashCode)\n    {\n        if (positionCount == 0) {\n            return -1;\n        }\n\n        mapBlock.ensureHashTableLoaded(keyBlockHashCode);","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/block/SingleMapBlock.java#L143-L179","documentation":"SingleMapBlock represents a single map entry backed by an immutable MapBlock and does not support mutation. Calling appendNull() throws UnsupportedOperationException because appending a null row to a view over an existing map would violate the block's immutability contract.","triggerScenarios":"Calling appendNull() on a SingleMapBlock, typically in generic Block-merging or null-padding code that assumes all Block types are mutable.","commonSituations":"Generic block-combining algorithms (e.g. building output pages row by row) hitting a map-typed column; code that copies blocks via append* assuming uniform API; accidentally using SingleMapBlock where MapBlockBuilder was intended.","solutions":["Use a MapBlockBuilder (or generic BlockBuilder for the map type) and construct null/empty maps there instead of calling appendNull on the SingleMapBlock.","Detect immutable blocks before appending: check instanceof SingleMapBlock and use a builder-based path.","Copy values via writePositionTo into a new builder rather than append on the source block."],"exampleFix":"// before\nBlock value = mapColumn.getBlock(position);\nBlock out = value.appendNull(); // UnsupportedOperationException\n// after\nMapBlockBuilder out = (MapBlockBuilder) type.createBlockBuilder(null, 1);\nout.appendNull(); // appends a NULL map row to the builder\nvalue.writePositionTo(position, /* use a dedicated builder */ null); // copy instead of mutate","handlingStrategy":"type-guard","validationCode":"if (block instanceof SingleMapBlock || block instanceof SingleRowBlock) {\n    // immutable view: copy into a builder instead of appending\n}","typeGuard":"boolean isMutableBlock(Block block) {\n    return !(block instanceof SingleMapBlock) && !(block instanceof SingleRowBlock) && !(block instanceof AbstractSingleArrayBlock);\n}","tryCatchPattern":"try {\n    newBlock = block.appendNull();\n} catch (UnsupportedOperationException e) {\n    BlockBuilder builder = type.createBlockBuilder(null, block.getPositionCount() + 1);\n    block.writePositionTo(position, builder);\n    builder.appendNull();\n    newBlock = builder.build();\n}","preventionTips":["Never call append* on blocks returned from getBlock/getRegion — treat them as immutable views.","For output assembly, always go through a BlockBuilder of the correct type.","Document in shared utilities that Single*Block types are read-only."],"tags":["presto","block","unsupported-operation","immutable"],"backgroundTag":"unsupported-block-mutation","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}