{"record":{"id":"3777334b25b142e1","repo":"prestodb/presto","slug":"declared-positions-s-does-not-match-block-s-s","errorCode":null,"errorMessage":"Declared positions (%s) does not match block %s's number of entries (%s)","messagePattern":"Declared positions \\((.+?)\\) does not match block (.+?)'s number of entries \\((.+?)\\)","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/PageBuilder.java","lineNumber":168,"sourceCode":"        // as it has much better performance.\n        long retainedSizeInBytes = 0;\n        for (BlockBuilder blockBuilder : blockBuilders) {\n            retainedSizeInBytes += blockBuilder.getRetainedSizeInBytes();\n        }\n        return retainedSizeInBytes;\n    }\n\n    public Page build()\n    {\n        if (blockBuilders.length == 0) {\n            return new Page(declaredPositions);\n        }\n\n        Block[] blocks = new Block[blockBuilders.length];\n        for (int i = 0; i < blocks.length; i++) {\n            blocks[i] = blockBuilders[i].build();\n            if (blocks[i].getPositionCount() != declaredPositions) {\n                throw new IllegalStateException(String.format(\"Declared positions (%s) does not match block %s's number of entries (%s)\", declaredPositions, i, blocks[i].getPositionCount()));\n            }\n        }\n\n        return Page.wrapBlocksWithoutCopy(declaredPositions, blocks);\n    }\n\n    private static void checkArgument(boolean expression, String errorMessage)\n    {\n        if (!expression) {\n            throw new IllegalArgumentException(errorMessage);\n        }\n    }\n}\n","sourceCodeStart":150,"sourceCodeEnd":182,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/PageBuilder.java#L150-L182","documentation":"PageBuilder.build() finalizes all column block builders into a Page. It throws this IllegalStateException if any built block's position count differs from declaredPositions (the row count the builder tracked when rows were begun), because all channels in a page must contain the same number of entries. This usually means some column builders received more or fewer values than others.","triggerScenarios":"Calling pageBuilder.build() after writing a different number of values to different column builders since the last build()/declarePosition() — e.g. appending to one block builder but forgetting another, or calling build() mid-row.","commonSituations":"Operator output code where a conditional branch skips writing a value for one column; writing N values for a nested/array-typed column while other columns got a different count; forgetting to reset/rebuild builders consistently across pages.","solutions":["Audit the code between declarePosition() (or row start) and build(): every column builder must receive exactly one value (or null via appendNull) per declared row.","Call pageBuilder.reset() or build() only at consistent row boundaries; never call build() while a row is partially written.","For skipped rows, explicitly call appendNull() on every column builder that did not get a value.","Add a debug assertion comparing each blockBuilder.getPositionCount() before build() to find which column diverges."],"exampleFix":"// before\npageBuilder.declarePosition();\ncolumnBuilderA.writeLong(value);\n// forgot to write columnBuilderB\nPage page = pageBuilder.build(); // IllegalStateException\n// after\npageBuilder.declarePosition();\ncolumnBuilderA.writeLong(value);\nif (value == null) { columnBuilderB.appendNull(); } else { columnBuilderB.writeLong(value); }\nPage page = pageBuilder.build();","handlingStrategy":"validation","validationCode":"for (BlockBuilder builder : pageBuilder.getBlockBuilders()) {\n    if (builder.getPositionCount() != expectedRows) {\n        throw new IllegalStateException(\"column builder row count mismatch: \"\n            + builder.getPositionCount() + \" != \" + expectedRows);\n    }\n}\nPage page = pageBuilder.build();","typeGuard":null,"tryCatchPattern":"try {\n    Page page = pageBuilder.build();\n} catch (IllegalStateException e) {\n    pageBuilder.reset();\n    throw new IllegalStateException(\"incomplete row written to PageBuilder; page discarded\", e);\n}","preventionTips":["Write exactly one value or appendNull() to every column builder per declarePosition().","Never call build() in the middle of writing a row.","Use pageBuilder.reset() when aborting a partially written page.","Log per-builder position counts when a mismatch occurs to locate the offending column."],"tags":["presto","pagebuilder","block","inconsistent-state"],"backgroundTag":"row-count-mismatch","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"}