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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions