From 681a9c5890ca9963202f03dbba017e024c560fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Sat, 5 Aug 2023 12:25:14 +0200 Subject: [PATCH] Resist against renaming of columns --- R/relational-duckdb.R | 9 ++++++++- tests/testthat/test-relational-duckdb.R | 13 +++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/R/relational-duckdb.R b/R/relational-duckdb.R index 56f7470a..10cf1e1a 100644 --- a/R/relational-duckdb.R +++ b/R/relational-duckdb.R @@ -70,7 +70,14 @@ duckdb_rel_from_df <- function(df) { tryCatch( { # duckdb:::df_is_materialized() is broken and unneeded - return(duckdb:::rel_from_altrep_df(df)) + rel <- duckdb:::rel_from_altrep_df(df) + rel_names <- duckdb:::rapi_rel_names(rel) + if (!identical(rel_names, names(df))) { + # This can happen when column names change for an existing relational data frame + exprs <- nexprs_from_loc(rel_names, set_names(seq_along(df), names(df))) + rel <- rel_project.duckdb_relation(rel, exprs) + } + return(rel) }, error = function(e) {} ) diff --git a/tests/testthat/test-relational-duckdb.R b/tests/testthat/test-relational-duckdb.R index b53e30b4..a6076efa 100644 --- a/tests/testthat/test-relational-duckdb.R +++ b/tests/testthat/test-relational-duckdb.R @@ -22,12 +22,25 @@ test_that("duckdb_rel_from_df()", { expect_silent(duckdb_rel_from_df(df)) + # If this is no longer an eror, we need to make sure that subsetting + # forwards to the vector class expect_snapshot(error = TRUE, { data.frame(a = vctrs::new_vctr(1:3)) %>% duckdb_rel_from_df() }) }) +test_that("duckdb_rel_from_df() and changing column names", { + withr::local_envvar(DUCKPLYR_FORCE = TRUE) + + x <- + data.frame(a = 1) %>% + duckplyr_select(a) + + names(x) <- "b" + expect_equal(x %>% duckplyr_filter(b == 1), data.frame(b = 1)) +}) + test_that("rel_aggregate()", { expr_species <- relexpr_reference("species") expr_aggregate <- relexpr_function(alias = "mean_bill_length_mm", "avg", list(