fix: local corpus paths were unreadable on Windows (backslashes eaten)
gsub() in regex mode treats backslashes in the REPLACEMENT string as
escape sequences and silently drops them. A Windows corpus path is full of
them, so C:\Users\RUNNER\AppData\... was substituted into the view SQL
as C:UsersRUNNERAppData... and every DuckDB read failed with 'No files
found that match the pattern'.
Effect: uscogdata could not read a LOCAL corpus on Windows at all -- the
bundled fixture included, so the entire test suite failed there, and any
cog_mirror() copy was unusable. Remote https URLs were unaffected, having
no backslashes, which is part of why it stayed hidden.
The bug predates the {long_files} token; it lived in the original {url}
substitution since that code was written. Nothing ever ran on Windows
until the GitHub mirror's check matrix existed, which found it on its
first run: 14 of 15 Windows failures were this, the 15th a downstream
consequence of view registration failing.
fixed = TRUE treats pattern and replacement as literal text. The
regression test reproduces on any platform -- it is string handling, not
filesystem behaviour, so it needs no Windows runner.
This commit is contained in:
@@ -122,9 +122,25 @@
|
||||
#' fallback -- correct for the local temp corpora the direct-execution tests
|
||||
#' build.
|
||||
#' @noRd
|
||||
#' `fixed = TRUE` is load-bearing, not a style choice.
|
||||
#'
|
||||
#' In regex mode, `gsub()` interprets backslashes in the REPLACEMENT string as
|
||||
#' escape sequences and silently drops them. A Windows corpus path is full of
|
||||
#' them, so `C:\Users\RUNNER\AppData\...` was substituted in as
|
||||
#' `C:UsersRUNNERAppData...` and every DuckDB read failed with "No files found
|
||||
#' that match the pattern". `fixed = TRUE` treats pattern and replacement as
|
||||
#' literal text, which is what a filesystem path needs.
|
||||
#'
|
||||
#' This is why the package could not read a LOCAL corpus on Windows at all --
|
||||
#' including the test fixture, hence the entire suite, and any `cog_mirror()`
|
||||
#' copy. Remote https URLs were unaffected, having no backslashes, which is
|
||||
#' part of why it stayed hidden: the bug predates the `{long_files}` token and
|
||||
#' lived in the original `{url}` substitution, unnoticed because nothing ever
|
||||
#' ran on Windows until the mirror's check matrix existed.
|
||||
#' @noRd
|
||||
.render_view_sql <- function(sql, url, manifest = list()) {
|
||||
sql <- gsub("\\{long_files\\}", .long_files_sql(url, manifest), sql, fixed = FALSE)
|
||||
gsub("\\{url\\}", url, sql, fixed = FALSE)
|
||||
sql <- gsub("{long_files}", .long_files_sql(url, manifest), sql, fixed = TRUE)
|
||||
gsub("{url}", url, sql, fixed = TRUE)
|
||||
}
|
||||
|
||||
#' Register DuckDB views from inst/sql/ SQL files
|
||||
|
||||
Reference in New Issue
Block a user