{"record":{"id":"037b472ff0409fab","repo":"prestodb/presto","slug":"invalid-array-block","errorCode":null,"errorMessage":"Invalid array block: ","messagePattern":"Invalid array block: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/block/ColumnarArray.java","lineNumber":44,"sourceCode":"    private final int offsetsOffset;\n    private final int[] offsets;\n    private final Block elementsBlock;\n    private final long retainedSizeInBytes;\n    private final long estimatedSerializedSizeInBytes;\n\n    public static ColumnarArray toColumnarArray(Block block)\n    {\n        requireNonNull(block, \"block is null\");\n\n        if (block instanceof DictionaryBlock) {\n            return toColumnarArray((DictionaryBlock) block);\n        }\n        if (block instanceof RunLengthEncodedBlock) {\n            return toColumnarArray((RunLengthEncodedBlock) block);\n        }\n\n        if (!(block instanceof AbstractArrayBlock)) {\n            throw new IllegalArgumentException(\"Invalid array block: \" + block.getClass().getName());\n        }\n\n        AbstractArrayBlock arrayBlock = (AbstractArrayBlock) block;\n        Block elementsBlock = arrayBlock.getRawElementBlock();\n\n        // trim elements to just visible region\n        int elementsOffset = 0;\n        int elementsLength = 0;\n        if (arrayBlock.getPositionCount() > 0) {\n            elementsOffset = arrayBlock.getOffset(0);\n            elementsLength = arrayBlock.getOffset(arrayBlock.getPositionCount()) - elementsOffset;\n        }\n        elementsBlock = elementsBlock.getRegion(elementsOffset, elementsLength);\n\n        return new ColumnarArray(\n                block,\n                arrayBlock.getOffsetBase(),\n                arrayBlock.getOffsets(),","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/block/ColumnarArray.java#L26-L62","documentation":"ColumnarArray.toColumnarArray converts a Block into a columnar (element-wise) view of an ARRAY-typed block. It only supports RunLengthEncodedBlock and AbstractArrayBlock subclasses; any other Block type cannot expose a raw element block, so the library throws IllegalArgumentException with the block's class name. This is an unsupported-block-type guard, typically meaning the block is not actually an ARRAY block.","triggerScenarios":"Passing a non-array Block (e.g. ByteArrayBlock, LongArrayBlock, dictionary-wrapped block not extending AbstractArrayBlock) to toColumnarArray(Block) or ColumnarArray.columnarArray(Block); calling it on a block of the wrong SQL type due to a corrupted type mapping; a custom Block implementation that does not extend AbstractArrayBlock.","commonSituations":"Expression/optimizer code assuming a type that the page actually does not carry after a plan change; exchange/serialization bugs producing mislabeled blocks; third-party connectors returning custom block classes not extending AbstractArrayBlock.","solutions":["Verify the block's type is the expected ARRAY type before calling toColumnarArray (e.g. via the associated Type)","Ensure custom block implementations extend AbstractArrayBlock (and implement getRawElementBlock/getOffsets)","Handle RunLengthEncodedBlock separately or rely on toColumnarArray's existing RLE overload","Check upstream page producers/connectors for blocks mislabeled as array type"],"exampleFix":"// before\nColumnarArray arr = toColumnarArray(block); // throws for non-array block\n// after\nif (block instanceof AbstractArrayBlock || block instanceof RunLengthEncodedBlock) {\n    ColumnarArray arr = toColumnarArray(block);\n} else {\n    throw new IllegalStateException(\"expected ARRAY block, got \" + block.getClass().getName());\n}","handlingStrategy":"type-guard","validationCode":"if (!(block instanceof AbstractArrayBlock) && !(block instanceof RunLengthEncodedBlock)) {\n    throw new IllegalArgumentException(\"not an array block: \" + block.getClass().getName());\n}\nColumnarArray arr = ColumnarArray.toColumnarArray(block);\n","typeGuard":"boolean isArrayBlock(Block block) {\n    return block instanceof AbstractArrayBlock || block instanceof RunLengthEncodedBlock;\n}\n","tryCatchPattern":"try {\n    ColumnarArray arr = ColumnarArray.toColumnarArray(block);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Invalid array block:\")) {\n        throw new IllegalStateException(\"block is not ARRAY-typed: \" + e.getMessage(), e);\n    }\n    throw e;\n}\n","preventionTips":["Confirm the block's declared SQL type is ARRAY before extracting a columnar array view","Extend AbstractArrayBlock for custom array block implementations","Verify page-to-type alignment after plan or connector changes"],"tags":["presto","type-mismatch","illegal-argument","array-block"],"backgroundTag":"unsupported-block-type","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"}