{"record":{"id":"1dc9aa92d10998c0","repo":"prestodb/presto","slug":"position-is-not-valid-1dc9aa","errorCode":null,"errorMessage":"position is not valid","messagePattern":"position is not valid","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/block/ShortArrayBlockBuilder.java","lineNumber":328,"sourceCode":"        return new ShortArrayBlock(0, length, newValueIsNull, newValues);\n    }\n\n    @Override\n    public String getEncodingName()\n    {\n        return ShortArrayBlockEncoding.NAME;\n    }\n\n    @Override\n    public String toString()\n    {\n        return format(\"ShortArrayBlockBuilder(%d){positionCount=%d}\", hashCode(), getPositionCount());\n    }\n\n    private void checkReadablePosition(int position)\n    {\n        if (position < 0 || position >= getPositionCount()) {\n            throw new IllegalArgumentException(\"position is not valid\");\n        }\n    }\n\n    @Override\n    public short getShortUnchecked(int internalPosition)\n    {\n        assert internalPositionInRange(internalPosition, getOffsetBase(), getPositionCount());\n        return values[internalPosition];\n    }\n\n    @Override\n    public boolean isNullUnchecked(int internalPosition)\n    {\n        assert mayHaveNull() : \"no nulls present\";\n        assert internalPositionInRange(internalPosition, getOffsetBase(), getPositionCount());\n        return valueIsNull[internalPosition];\n    }\n","sourceCodeStart":310,"sourceCodeEnd":346,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/block/ShortArrayBlockBuilder.java#L310-L346","documentation":"ShortArrayBlockBuilder.checkReadablePosition validates positions before reads (getByte, isNull, writePositionTo, getSingleValueBlock, copyPositions). Positions must satisfy 0 <= position < positionCount (built entries so far). Out-of-range positions throw IllegalArgumentException(\"position is not valid\").","triggerScenarios":"Reading from a ShortArrayBlockBuilder before it has enough entries, or with a negative index; e.g. calling getPositionCount()-dependent accessors with stale index after builder.reset().","commonSituations":"Reading a builder that was just reset (positionCount = 0), reading position positionCount-1 + 1 in a loop, mixing up builder entry count with expected row count, off-by-one in composite-type field access (getByte with wrong field offset confusion).","solutions":["Verify builder.getPositionCount() > position before reading.","After reset()/newInstance, do not reuse old indices; re-read entries only up to the new positionCount.","Ensure the builder was fully populated (close/advance entry) before reading its values."],"exampleFix":"// before\nbuilder.reset();\nshort v = builder.getShort(0, 0); // throws: positionCount is 0\n// after\nbuilder.reset();\nif (builder.getPositionCount() > 0) {\n    short v = builder.getShort(0, 0);\n}","handlingStrategy":"validation","validationCode":"if (position < 0 || position >= builder.getPositionCount()) {\n    throw new IllegalArgumentException(\"position \" + position + \" not yet written to builder (count=\" + builder.getPositionCount() + \")\");\n}","typeGuard":"boolean builderHasPosition(BlockBuilder builder, int position) {\n    return position >= 0 && position < builder.getPositionCount();\n}","tryCatchPattern":"try {\n    value = builder.getShort(position, 0);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().equals(\"position is not valid\")) {\n        log.warn(\"read at %d but builder has %d entries\", position, builder.getPositionCount());\n        return null;\n    }\n    throw e;\n}","preventionTips":["Do not reuse position indices after builder.reset() or newInstance().","Finish each entry (closeEntry/beginBlock) before reading it back.","Track built-entry count separately and assert reads stay below it."],"tags":["presto","block-builder","bounds-check","position-out-of-range"],"backgroundTag":"position-out-of-range","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"}