{"record":{"id":"97cecd99cbbbf2d4","repo":"apache/iceberg","slug":"readdoubles-is-not-supported","errorCode":null,"errorMessage":"readDoubles is not supported","messagePattern":"readDoubles is not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedValuesReader.java","lineNumber":100,"sourceCode":"\n  /** Read `total` integers into `vec` starting at `vec[rowId]` */\n  default void readIntegers(int total, FieldVector vec, int rowId) {\n    throw new UnsupportedOperationException(\"readIntegers is not supported\");\n  }\n\n  /** Read `total` longs into `vec` starting at `vec[rowId]` */\n  default void readLongs(int total, FieldVector vec, int rowId) {\n    throw new UnsupportedOperationException(\"readLongs is not supported\");\n  }\n\n  /** Read `total` floats into `vec` starting at `vec[rowId]` */\n  default void readFloats(int total, FieldVector vec, int rowId) {\n    throw new UnsupportedOperationException(\"readFloats is not supported\");\n  }\n\n  /** Read `total` doubles into `vec` starting at `vec[rowId]` */\n  default void readDoubles(int total, FieldVector vec, int rowId) {\n    throw new UnsupportedOperationException(\"readDoubles is not supported\");\n  }\n\n  /**\n   * Initialize the reader from a page. See {@link ValuesReader#initFromPage(int,\n   * ByteBufferInputStream)}.\n   */\n  void initFromPage(int valueCount, ByteBufferInputStream in) throws IOException;\n}\n","sourceCodeStart":82,"sourceCodeEnd":109,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedValuesReader.java#L82-L109","documentation":"readDoubles(total, vec, rowId) is the batch double read on VectorizedValuesReader; its default body throws UnsupportedOperationException. Concrete readers override it to bulk-decode doubles into an Arrow Float8Vector. When nextVals() reaches the default implementation, the active reader class does not implement bulk double decoding.","triggerScenarios":"nextVals(total) attempts to bulk-fill a double Arrow vector for a Parquet DOUBLE column while the selected reader subclass has no readDoubles() override.","commonSituations":"Vectorized scans of double columns on Iceberg versions whose reader only implements numeric batch paths for integers/longs; pages with encodings lacking a dedicated batch reader; custom reader implementations.","solutions":["Disable vectorized reads (read.arrow.enabled=false) so doubles go through the standard reader.","Upgrade Iceberg to a release with vectorized double batch support.","Override readDoubles() in the concrete reader to fill vec[rowId..rowId+total)."],"exampleFix":"// before\n// default readDoubles throws\n// after\n@Override\npublic void readDoubles(int total, FieldVector vec, int rowId) {\n  for (int i = 0; i < total; i++) ((Float8Vector) vec).setSafe(rowId + i, readDouble());\n}","handlingStrategy":"try-catch","validationCode":"// check double support before enabling vectorization\nif (schema.columns().stream().anyMatch(c -> c.type().equals(Types.DoubleType.get())) && !doublesBatchSupported) {\n  props.put(\"read.arrow.enabled\", \"false\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  vectorizedScan();\n} catch (UnsupportedOperationException e) {\n  rowScan();\n}","preventionTips":["Verify readDoubles is overridden in whatever reader your reader factory instantiates.","Test vectorized scans over every double column before rollout.","Upgrade Iceberg when vectorized double batch reads are required."],"tags":["arrow","parquet","vectorized-read","batch-read","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}