Skip to content

[robustesse] arrow_dataset_to_duckdb : chemins non échappés dans le SQL, schéma non unifié (union_by_name), aucun test dédié #30

Description

@VincentGuyader

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 :

  1. É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.
  2. 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.
  3. 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

  • Chemins échappés (' doublé ou DBI::dbQuoteString) ; le reprex passe.
  • union_by_name=1 (et option hive explicite) dans le read_parquet, ou test prouvant l'équivalence de schéma avec le fallback sur fichiers hétérogènes.
  • Validation basique de duckdb_memory_limit (format attendu) avant interpolation dans SET.
  • Tests unitaires dédiés : chemin avec apostrophe, dataset multi-fichiers à schémas décalés, fallback to_duckdb().

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions