{"record":{"id":"37b87233a994a2bb","repo":"prestodb/presto","slug":"iceberg-bad-data-37b872","errorCode":"ICEBERG_BAD_DATA","errorMessage":"Failed to parse WKB geometry at position %d","messagePattern":"Failed to parse WKB geometry at position (.+?)","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergUpdateablePageSource.java","lineNumber":468,"sourceCode":"    }\n\n    private Block transformGeometryBlock(Block block, Type type)\n    {\n        block = block.getLoadedBlock();\n        int positionCount = block.getPositionCount();\n        BlockBuilder builder = type.createBlockBuilder(null, positionCount);\n        for (int position = 0; position < positionCount; position++) {\n            if (block.isNull(position)) {\n                builder.appendNull();\n            }\n            else {\n                try {\n                    OGCGeometry geometry = OGCGeometry.fromBinary(ByteBuffer.wrap(type.getSlice(block, position).getBytes()));\n                    geometry.setSpatialReference(null);\n                    type.writeSlice(builder, EsriGeometrySerde.serialize(geometry));\n                }\n                catch (Exception e) {\n                    throw new PrestoException(ICEBERG_BAD_DATA, format(\"Failed to parse WKB geometry at position %d\", position), e);\n                }\n            }\n        }\n        return builder.build();\n    }\n\n    private Block transformArrayBlock(Block block, ArrayType type)\n    {\n        block = block.getLoadedBlock();\n        Type elementType = type.getElementType();\n        ColumnarArray columnarArray = toColumnarArray(block);\n\n        Block transformedElements;\n        if (needDataTransform(elementType)) {\n            transformedElements = transformBlock(columnarArray.getElementsBlock(), elementType);\n        }\n        else {\n            return block;","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergUpdateablePageSource.java#L450-L486","documentation":"When transforming blocks for updateable reads, transformGeometryBlock re-encodes WKB geometry values: it decodes each value with OGCGeometry.fromBinary and re-serializes it via EsriGeometrySerde. If any value fails to decode as valid WKB, the connector wraps the failure in ICEBERG_BAD_DATA, pointing at the offending row position.","triggerScenarios":"A geometry column value in the data file is not valid WKB — truncated bytes, wrong endianness marker, non-geometry binary blob, or corrupt data written by another writer.","commonSituations":"Data ingested by external tools writing malformed geometries; schema drift where a binary column is being read as geometry; corrupted Parquet/ORC files after failed writes or storage issues.","solutions":["Locate and inspect the offending row (position is in the message) and fix or remove the malformed geometry at the source.","Re-ingest the data with a tool that emits valid WKB (verify with ST_GeometryFromText/isValid checks upstream).","If the column is not truly geometry, correct the table schema/column type mapping.","Validate files after ingestion by scanning the geometry column in a read-only query before running UPDATEs."],"exampleFix":"// before: raw bytes inserted into geometry column\nINSERT INTO t VALUES (from_big_endian_64(...))\n// after\nINSERT INTO t VALUES (ST_AsBinary(ST_GeometryFromText('POINT(1 2)')))","handlingStrategy":"try-catch","validationCode":"// validate geometry values upstream before writing\nSlice wkb = ...;\ntry {\n    OGCGeometry.fromBinary(ByteBuffer.wrap(wkb.getBytes()));\n} catch (Exception e) {\n    throw new IllegalArgumentException(\"Invalid WKB at ingestion\", e);\n}","typeGuard":null,"tryCatchPattern":"try {\n    rows = readUpdateableRows(...);\n} catch (PrestoException e) {\n    if (e.getErrorCode() == ICEBERG_BAD_DATA.toErrorCode() &&\n        e.getMessage().contains(\"Failed to parse WKB geometry\")) {\n        // quarantine/repair the file containing the malformed geometry, then retry\n        repairOrRewriteSourceFile();\n        rows = readUpdateableRows(...);\n    } else { throw e; }\n}","preventionTips":["Write geometry columns only via ST_AsBinary or a trusted WKB writer","Validate geometries (non-empty, correct SRID, parseable) at ingestion time","Guard against schema drift so binary columns are not read as geometry","Scan geometry columns in a read-only query after bulk ingestion to catch corruption early"],"tags":["iceberg","geometry","wkb","corrupt-data","bad-data"],"backgroundTag":"corrupt-data","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"}