diff --git a/NEWS.md b/NEWS.md index 2a982e6fe..e8de2050b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # dbplyr (development version) +* SQLite gets correct translation for `median()` (#357). + * `copy_lahman()` and `copy_nycflights13()` (and hence `nycflights13_sqlite()`) and friends now return DBI connections rather than the now deprecated `src_dbi()` (#440). diff --git a/R/backend-sqlite.R b/R/backend-sqlite.R index 0810e5dd7..2205645e8 100644 --- a/R/backend-sqlite.R +++ b/R/backend-sqlite.R @@ -35,15 +35,16 @@ sql_translate_env.SQLiteConnection <- function(con) { paste0 = sql_paste_infix("", "||", function(x) sql_expr(cast(!!x %as% text))), # https://www.sqlite.org/lang_corefunc.html#maxoreunc pmin = sql_prefix("MIN"), - pmax = sql_prefix("MAX"), - + pmax = sql_prefix("MAX") ), sql_translator(.parent = base_agg, - sd = sql_aggregate("STDEV", "sd") + sd = sql_aggregate("STDEV", "sd"), + median = sql_prefix("MEDIAN"), ), if (sqlite_version() >= "3.25") { sql_translator(.parent = base_win, - sd = win_aggregate("STDEV") + sd = win_aggregate("STDEV"), + median = win_absent("median") ) } else { base_no_win diff --git a/tests/testthat/test-backend-sqlite.R b/tests/testthat/test-backend-sqlite.R index 9d11e9e6d..8e7e9a073 100644 --- a/tests/testthat/test-backend-sqlite.R +++ b/tests/testthat/test-backend-sqlite.R @@ -25,6 +25,12 @@ test_that("sqlite mimics two argument log", { expect_equal(translate_sql(log(x, 10)), sql('LOG(`x`) / LOG(10.0)')) }) +test_that("custom aggregates translated", { + local_con(simulate_sqlite()) + + expect_equal(translate_sql(median(x), window = FALSE), sql('MEDIAN(`x`)')) + expect_equal(translate_sql(sd(x, na.rm = TRUE), window = FALSE), sql('STDEV(`x`)')) +}) # live database ----------------------------------------------------------- test_that("as.numeric()/as.double() get custom translation", {