Skip to content

Commit

Permalink
correct sign of difftime for various DBMS' (#1532)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Simon P. Couch <simonpatrickcouch@gmail.com>
  • Loading branch information
edward-burn and simonpcouch committed Sep 9, 2024
1 parent c3aa406 commit 1ff6363
Show file tree
Hide file tree
Showing 9 changed files with 15 additions and 12 deletions.
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# dbplyr (development version)

* Translations of `difftime()` for Postgres, SQL server, Redshift, and Snowflake
previously returned the wrong sign and are now correct (@edward-burn, #1532).

* `across(everything())` doesn't select grouping columns created via `.by` in
`summarise()` (@mgirlich, #1493).

Expand Down
2 changes: 1 addition & 1 deletion R/backend-mssql.R
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ simulate_mssql <- function(version = "15.0") {
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
}

sql_expr(DATEDIFF(DAY, !!time1, !!time2))
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
}
)

Expand Down
2 changes: 1 addition & 1 deletion R/backend-postgres.R
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ sql_translation.PqConnection <- function(con) {
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
}

sql_expr((CAST(!!time2 %AS% DATE) - CAST(!!time1 %AS% DATE)))
sql_expr((CAST(!!time1 %AS% DATE) - CAST(!!time2 %AS% DATE)))
},
),
sql_translator(.parent = base_agg,
Expand Down
2 changes: 1 addition & 1 deletion R/backend-redshift.R
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ sql_translation.RedshiftConnection <- function(con) {
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
}

sql_expr(DATEDIFF(DAY, !!time1, !!time2))
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
}
),
sql_translator(.parent = postgres$aggregate,
Expand Down
2 changes: 1 addition & 1 deletion R/backend-snowflake.R
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ sql_translation.Snowflake <- function(con) {
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
}

sql_expr(DATEDIFF(DAY, !!time1, !!time2))
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
},
# LEAST / GREATEST on Snowflake will not respect na.rm = TRUE by default (similar to Oracle/Access)
# https://docs.snowflake.com/en/sql-reference/functions/least
Expand Down
4 changes: 2 additions & 2 deletions tests/testthat/test-backend-mssql.R
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ test_that("custom clock functions translated correctly", {

test_that("difftime is translated correctly", {
local_con(simulate_mssql())
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))

expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))
Expand Down
4 changes: 2 additions & 2 deletions tests/testthat/test-backend-postgres.R
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ test_that("custom clock functions translated correctly", {

test_that("difftime is translated correctly", {
local_con(simulate_postgres())
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("(CAST(`end_date` AS DATE) - CAST(`start_date` AS DATE))"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("(CAST(`end_date` AS DATE) - CAST(`start_date` AS DATE))"))
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("(CAST(`start_date` AS DATE) - CAST(`end_date` AS DATE))"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("(CAST(`start_date` AS DATE) - CAST(`end_date` AS DATE))"))

expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))
Expand Down
4 changes: 2 additions & 2 deletions tests/testthat/test-backend-redshift.R
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ test_that("custom clock functions translated correctly", {

test_that("difftime is translated correctly", {
local_con(simulate_redshift())
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))

expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))
Expand Down
4 changes: 2 additions & 2 deletions tests/testthat/test-backend-snowflake.R
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ test_that("custom clock functions translated correctly", {

test_that("difftime is translated correctly", {
local_con(simulate_snowflake())
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))

expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))
Expand Down

0 comments on commit 1ff6363

Please sign in to comment.