Skip to content

Commit 4af611a

Browse files
committed
Squashed commit of the following:
commit db5d405 Author: Kirill Müller <[email protected]> Date: Sun Jan 26 06:54:20 2025 +0100 Sync commit 7bd1872 Author: Kirill Müller <[email protected]> Date: Fri Jan 24 21:23:24 2025 +0100 Remove dplyr compat code commit 8d6a573 Author: Kirill Müller <[email protected]> Date: Wed Jan 22 16:55:00 2025 +0100 fix: Avoid forwarding `is.na()` to `is.nan()` to support non-numeric data
1 parent dd63873 commit 4af611a

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed

R/relational-duckdb.R

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,14 @@ check_df_for_rel <- function(df, call = caller_env()) {
180180
if (!identical(df_attrib, roundtrip_attrib)) {
181181
cli::cli_abort("Attributes are lost during conversion. Affected column: {.var {names(df)[[i]]}}.", call = call)
182182
}
183+
# Always check roundtrip for timestamp columns
184+
# duckdb uses microsecond precision only, this is in some cases
185+
# less than R does
186+
if (inherits(df[[i]], "POSIXct")) {
187+
if (!identical(df[[i]], roundtrip[[i]])) {
188+
cli::cli_abort("Imperfect roundtrip. Affected column: {.var {names(df)[[i]]}}.", call = call)
189+
}
190+
}
183191
}
184192
}
185193

tests/testthat/test-rel_api.R

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9715,6 +9715,87 @@ test_that("relational mutate(d = NA_real_, e = is.na(d)) order-preserving", {
97159715
DBI::dbDisconnect(con, shutdown = TRUE)
97169716
})
97179717

9718+
test_that("relational mutate(d = NaN, e = is.na(d)) order-preserving", {
9719+
# Autogenerated
9720+
duckdb <- asNamespace("duckdb")
9721+
drv <- duckdb::duckdb()
9722+
con <- DBI::dbConnect(drv)
9723+
experimental <- FALSE
9724+
invisible(DBI::dbExecute(con, 'CREATE MACRO "is.na"(x) AS (x IS NULL)'))
9725+
df1 <- data.frame(a = seq(1, 6, by = 1), b = 2, g = c(1L, 2L, 2L, 3L, 3L, 3L))
9726+
9727+
"mutate"
9728+
rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental)
9729+
"mutate"
9730+
rel2 <- duckdb$rel_project(
9731+
rel1,
9732+
list(
9733+
{
9734+
tmp_expr <- duckdb$expr_reference("a")
9735+
duckdb$expr_set_alias(tmp_expr, "a")
9736+
tmp_expr
9737+
},
9738+
{
9739+
tmp_expr <- duckdb$expr_reference("b")
9740+
duckdb$expr_set_alias(tmp_expr, "b")
9741+
tmp_expr
9742+
},
9743+
{
9744+
tmp_expr <- duckdb$expr_reference("g")
9745+
duckdb$expr_set_alias(tmp_expr, "g")
9746+
tmp_expr
9747+
},
9748+
{
9749+
tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) {
9750+
duckdb$expr_constant(NaN, experimental = experimental)
9751+
} else {
9752+
duckdb$expr_constant(NaN)
9753+
}
9754+
duckdb$expr_set_alias(tmp_expr, "d")
9755+
tmp_expr
9756+
}
9757+
)
9758+
)
9759+
"mutate"
9760+
rel3 <- duckdb$rel_project(
9761+
rel2,
9762+
list(
9763+
{
9764+
tmp_expr <- duckdb$expr_reference("a")
9765+
duckdb$expr_set_alias(tmp_expr, "a")
9766+
tmp_expr
9767+
},
9768+
{
9769+
tmp_expr <- duckdb$expr_reference("b")
9770+
duckdb$expr_set_alias(tmp_expr, "b")
9771+
tmp_expr
9772+
},
9773+
{
9774+
tmp_expr <- duckdb$expr_reference("g")
9775+
duckdb$expr_set_alias(tmp_expr, "g")
9776+
tmp_expr
9777+
},
9778+
{
9779+
tmp_expr <- duckdb$expr_reference("d")
9780+
duckdb$expr_set_alias(tmp_expr, "d")
9781+
tmp_expr
9782+
},
9783+
{
9784+
tmp_expr <- duckdb$expr_function("is.na", list(duckdb$expr_reference("d")))
9785+
duckdb$expr_set_alias(tmp_expr, "e")
9786+
tmp_expr
9787+
}
9788+
)
9789+
)
9790+
rel3
9791+
out <- duckdb$rel_to_altrep(rel3)
9792+
expect_identical(
9793+
out,
9794+
data.frame(a = seq(1, 6, by = 1), b = 2, g = c(1L, 2L, 2L, 3L, 3L, 3L), d = NaN, e = TRUE)
9795+
)
9796+
DBI::dbDisconnect(con, shutdown = TRUE)
9797+
})
9798+
97189799
test_that("relational mutate(d = row_number()) order-preserving", {
97199800
# Autogenerated
97209801
duckdb <- asNamespace("duckdb")
@@ -14115,6 +14196,92 @@ test_that("relational mutate(d = NA_real_, e = is.na(d)) order-enforcing", {
1411514196
DBI::dbDisconnect(con, shutdown = TRUE)
1411614197
})
1411714198

14199+
test_that("relational mutate(d = NaN, e = is.na(d)) order-enforcing", {
14200+
# Autogenerated
14201+
duckdb <- asNamespace("duckdb")
14202+
drv <- duckdb::duckdb()
14203+
con <- DBI::dbConnect(drv)
14204+
experimental <- FALSE
14205+
invisible(DBI::dbExecute(con, 'CREATE MACRO "is.na"(x) AS (x IS NULL)'))
14206+
df1 <- data.frame(a = seq(1, 6, by = 1), b = 2, g = c(1L, 2L, 2L, 3L, 3L, 3L))
14207+
14208+
"mutate"
14209+
rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental)
14210+
"mutate"
14211+
rel2 <- duckdb$rel_project(
14212+
rel1,
14213+
list(
14214+
{
14215+
tmp_expr <- duckdb$expr_reference("a")
14216+
duckdb$expr_set_alias(tmp_expr, "a")
14217+
tmp_expr
14218+
},
14219+
{
14220+
tmp_expr <- duckdb$expr_reference("b")
14221+
duckdb$expr_set_alias(tmp_expr, "b")
14222+
tmp_expr
14223+
},
14224+
{
14225+
tmp_expr <- duckdb$expr_reference("g")
14226+
duckdb$expr_set_alias(tmp_expr, "g")
14227+
tmp_expr
14228+
},
14229+
{
14230+
tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) {
14231+
duckdb$expr_constant(NaN, experimental = experimental)
14232+
} else {
14233+
duckdb$expr_constant(NaN)
14234+
}
14235+
duckdb$expr_set_alias(tmp_expr, "d")
14236+
tmp_expr
14237+
}
14238+
)
14239+
)
14240+
"mutate"
14241+
rel3 <- duckdb$rel_project(
14242+
rel2,
14243+
list(
14244+
{
14245+
tmp_expr <- duckdb$expr_reference("a")
14246+
duckdb$expr_set_alias(tmp_expr, "a")
14247+
tmp_expr
14248+
},
14249+
{
14250+
tmp_expr <- duckdb$expr_reference("b")
14251+
duckdb$expr_set_alias(tmp_expr, "b")
14252+
tmp_expr
14253+
},
14254+
{
14255+
tmp_expr <- duckdb$expr_reference("g")
14256+
duckdb$expr_set_alias(tmp_expr, "g")
14257+
tmp_expr
14258+
},
14259+
{
14260+
tmp_expr <- duckdb$expr_reference("d")
14261+
duckdb$expr_set_alias(tmp_expr, "d")
14262+
tmp_expr
14263+
},
14264+
{
14265+
tmp_expr <- duckdb$expr_function("is.na", list(duckdb$expr_reference("d")))
14266+
duckdb$expr_set_alias(tmp_expr, "e")
14267+
tmp_expr
14268+
}
14269+
)
14270+
)
14271+
"arrange"
14272+
rel4 <- duckdb$rel_order(
14273+
rel3,
14274+
list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d"), duckdb$expr_reference("e"))
14275+
)
14276+
rel4
14277+
out <- duckdb$rel_to_altrep(rel4)
14278+
expect_identical(
14279+
out,
14280+
data.frame(a = seq(1, 6, by = 1), b = 2, g = c(1L, 2L, 2L, 3L, 3L, 3L), d = NaN, e = TRUE)
14281+
)
14282+
DBI::dbDisconnect(con, shutdown = TRUE)
14283+
})
14284+
1411814285
test_that("relational mutate(d = row_number()) order-enforcing", {
1411914286
# Autogenerated
1412014287
duckdb <- asNamespace("duckdb")

0 commit comments

Comments
 (0)