Contexte
arrow_dataset_to_duckdb() (R/utils.R:30-44) matérialise un dataset Arrow via CREATE TEMP TABLE ... AS SELECT * FROM read_parquet([...]). Trois fragilités :
- Échappement : les chemins de fichiers sont interpolés entre quotes simples sans échappement — un fichier ou dossier contenant
' (ex. l'export.parquet, courant en français) casse la requête avec une erreur SQL brute. Même remarque pour duckdb_memory_limit et tempdir() interpolés dans les SET de compare_datasets_from_yaml.R.
- Schéma :
read_parquet([files]) sur la liste brute perd les garanties du schéma Arrow unifié — pas de union_by_name=1 (binding faux ou échec si schémas hétérogènes entre fichiers) et colonnes de partition hive dépendantes de l'auto-détection DuckDB, alors que le fallback arrow::to_duckdb() les conserve toujours. Le même dataset peut donc donner des colonnes différentes selon la branche prise.
- Tests : aucun test dédié à cette fonction (la branche
read_parquet vs fallback n'est couverte qu'indirectement, et tout test-parquet.R skippe sans arrow/duckdb).
Reprex
library(datadiff); library(arrow)
d <- file.path(tempdir(), "l'export") # apostrophe dans le chemin
dir.create(d)
write_parquet(data.frame(id = 1:3, x = 1:3), file.path(d, "part-0.parquet"))
ds <- open_dataset(d)
compare_datasets_from_yaml(ds, ds, key = "id")
#> Error: ... syntax error (requête SQL cassée par l'apostrophe)
Critères de succès
Contexte
arrow_dataset_to_duckdb()(R/utils.R:30-44) matérialise un dataset Arrow viaCREATE TEMP TABLE ... AS SELECT * FROM read_parquet([...]). Trois fragilités :'(ex.l'export.parquet, courant en français) casse la requête avec une erreur SQL brute. Même remarque pourduckdb_memory_limitettempdir()interpolés dans lesSETde compare_datasets_from_yaml.R.read_parquet([files])sur la liste brute perd les garanties du schéma Arrow unifié — pas deunion_by_name=1(binding faux ou échec si schémas hétérogènes entre fichiers) et colonnes de partition hive dépendantes de l'auto-détection DuckDB, alors que le fallbackarrow::to_duckdb()les conserve toujours. Le même dataset peut donc donner des colonnes différentes selon la branche prise.read_parquetvs fallback n'est couverte qu'indirectement, et tout test-parquet.R skippe sans arrow/duckdb).Reprex
Critères de succès
'doublé ouDBI::dbQuoteString) ; le reprex passe.union_by_name=1(et option hive explicite) dans leread_parquet, ou test prouvant l'équivalence de schéma avec le fallback sur fichiers hétérogènes.duckdb_memory_limit(format attendu) avant interpolation dansSET.to_duckdb().