[R][Parquet] ParquetReaderProperties does not expose page_checksum_verification, so a corrupt page CRC reads silently
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
- #53289 par @gitedmond — fermée sans fusion
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
Piste de recherche
Commence dans r/R/parquet.R autour de la classe ParquetReaderProperties, où les accesseurs existants de thrift_string_size_limit montrent le modèle à suivre, puis vérifie les fonctions cpp11 correspondantes dans r/src/parquet.cpp et les exports dans NAMESPACE. Confirme que le getter et le setter C++ dans cpp/src/parquet/properties.h sont accessibles depuis le shim. C'est terminé lorsque la classe R expose les méthodes get et set de page_checksum_verification, et que la lecture de datapage_v1-corrupt-checksum.parquet avec cette option activée lève une erreur. Vérifie d'abord si les mainteneurs souhaitent cette modification avant d'ouvrir une pull request.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
The R bindings do not expose page_checksum_verification, so an R user has no way to turn on page-CRC verification when reading Parquet. Arrow's own deliberately-corrupt test files are read without error.
C++ has the option and Python exposes it; only R does not.
| C++ | cpp/src/parquet/properties.h:148-150 — page_checksum_verification() / set_page_checksum_verification(bool check_crc), defaulting to false at line 166 |
| Python | python/pyarrow/parquet/core.py:269,325,346 — a documented page_checksum_verification=False parameter |
| R | r/R/parquet.R:656-682 — ParquetReaderProperties declares and implements only thrift_string_size_limit and thrift_container_size_limit |
Reproduction
Using the files parquet-testing ships expressly so readers can be shown to reject a bad CRC — datapage_v1-corrupt-checksum.parquet ("uncompressed INT32 columns in v1 data pages with a mismatching CRC") and rle-dict-uncompressed-corrupt-checksum.parquet:
library(arrow)
packageVersion("arrow") # 25.0.0, libarrow 25.0.0
nrow(read_parquet("datapage_v1-corrupt-checksum.parquet")) # 5120 -- no error
nrow(read_parquet("rle-dict-uncompressed-corrupt-checksum.parquet")) # 1000 -- no error
ls(ParquetReaderProperties$create())
#> [1] "class_title" "clone" "initialize" "pointer" "print" "set_pointer"
#> [7] "set_thrift_container_size_limit" "set_thrift_string_size_limit"
#> [9] "thrift_container_size_limit" "thrift_string_size_limit"
# no page_checksum_verification
Measured on linux/aarch64, R 4.5.3, arrow 25.0.0 / libarrow 25.0.0, with parquet-testing at e74785d85a4e (the cpp/submodules/parquet-testing commit at apache-arrow-25.0.0).
Why it matters
Reading without CRC verification is a reasonable default — it matches C++ and Python. The gap is that R offers no way to opt in, so an R pipeline cannot detect page-level corruption even when it wants to. Silent corruption is the failure mode page CRCs exist to prevent, and the files above exist to prove a reader catches it.
It also means Arrow's own conformance corpus cannot be used from R for its intended purpose: those two files are supposed to fail, and from R they are indistinguishable from the matching-CRC files beside them (datapage_v1-uncompressed-checksum.parquet, plain-dict-uncompressed-checksum.parquet).
Component(s)
R, Parquet
Sketch of a fix
Not offering a PR, but the shape looks small — two accessors alongside the existing thrift ones in r/R/parquet.R:
page_checksum_verification = function() {
parquet___arrow___ReaderProperties__get_page_checksum_verification(self)
},
set_page_checksum_verification = function(check_crc) {
parquet___arrow___ReaderProperties__set_page_checksum_verification(self, check_crc)
},
plus the two cpp11 shims in r/src/parquet.cpp forwarding to the existing C++ getter/setter, and a line each in the @description block and NAMESPACE. Happy to be told if there is a reason it was left out deliberately — #36997 touched the same class for a different reason and did not add it.
- Langage dominant
- C++
- Étoiles
- 17.3k
- Forks
- 4.4k
- Merge moyen
- 3 j 20 h
- PR mergées (30 j)
- 82
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/arrow
-
[CI][Docs] Pull requests closed by the PR limit workflow cannot be reopened by their authorsOuverteComponent: Continuous Integration Component: Documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
apache/arrow#54696 · 2 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
[C++][Python] IPC reader rejects a DictionaryEncoding without indexType, which the format allowsPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. OuverteComponent: C++ Component: Python Type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
[R] Silent loss of metadata integrity for date-time and numeric attributes in write_parquet()/read_parquet()Peut-être à nouveau libre @james-finn-travers l’a pris il y a 34 jours, et aucune pull request n’est ouverte. OuverteComponent: R Type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/arrow#51695 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
[R] Expose ignore_extra_columns and pad_short_rows CSV parse optionsPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. OuverteComponent: R good-first-issue Type: enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
apache/arrow#51659 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Component: C++
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/arrow
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
llvm/offload-test-suite#1703 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
BGI-shenzhen/PopLDdecay#25 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 79/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 1-3 heures Accessibilité débutants 68/100
eic/TimeframeBuilder#102 ·