From 796cd33f94336fc87b536b830d062a98d646839e Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 06:40:30 +0000 Subject: [PATCH 01/10] Add missing `deprecate_warn()` to `src_sql()` --- R/src-sql.R | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/R/src-sql.R b/R/src-sql.R index fda913b98..b7739843f 100644 --- a/R/src-sql.R +++ b/R/src-sql.R @@ -12,6 +12,11 @@ #' @param con the connection object #' @param ... fields used by object src_sql <- function(subclass, con, ...) { + lifecycle::deprecate_warn( + when = "1.4.0", + what = "src_sql()", + always = TRUE + ) subclass <- paste0("src_", subclass) structure(list(con = con, ...), class = c(subclass, "src_sql", "src")) } From 3515723c8ce537d995ec0c1ece41d24e24c320d7 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 06:41:25 +0000 Subject: [PATCH 02/10] Minor cleanups --- R/db.R | 6 ++++-- R/verb-compute.R | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/R/db.R b/R/db.R index cf7512adf..36655dc23 100644 --- a/R/db.R +++ b/R/db.R @@ -58,12 +58,14 @@ sql_join_suffix.DBIConnection <- function(con, suffix, ...) { db_sql_render <- function(con, sql, ..., cte = FALSE, sql_options = NULL) { check_bool(cte) if (cte) { - lifecycle::deprecate_soft( + lifecycle::deprecate_soft( when = "2.4.0", what = "db_sql_render(cte)", with = I("db_sql_render(sql_options = sql_options(cte = TRUE))") ) - sql_options <- sql_options(cte = TRUE) + sql_options <- sql_options %||% sql_options(cte = TRUE) + out <- db_sql_render(con, sql, sql_options = sql_options) + return(out) } if (is.null(sql_options)) { diff --git a/R/verb-compute.R b/R/verb-compute.R index aad3dba7d..1303e82b8 100644 --- a/R/verb-compute.R +++ b/R/verb-compute.R @@ -45,7 +45,6 @@ compute.tbl_sql <- function(x, if (!temporary) { lifecycle::deprecate_warn( "2.3.3", - # what = I(cli::format_inline("Not providing a name when {.code temporary = FALSE}")) what = "compute(name = 'must be provided when `temporary = FALSE`')" ) } From eb49ede88035767325288bbffabcc83f414c3f26 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 08:04:27 +0000 Subject: [PATCH 03/10] Organise NEWS --- NEWS.md | 206 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 107 insertions(+), 99 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6d1bca0d1..c08a63e4e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,20 +1,39 @@ # dbplyr (development version) +* Joins + + * `*_join()` after `full_join()` works again (@mgirlich, #1178). + + * `*_join()` now allows using specifying the relationship argument. It must be + `NULL` or `"many-to-many"` (@bairdj, #1305). + + * Queries now qualify `*` with the table alias for better compatibility (@mgirlich, #1003). + + * Joins now work again for Pool and Oracle connections (@mgirlich, #1177, #1181). + + * `full_join()` can now handle column names that only differ in case (@ejneer, #1255). + + * The `na_matches` argument of `semi_join()` and `anti_join()` works again + (@mgirlich, #1211). + * `dbplyr_pivot_wider_spec()` is now exported. Unlike `pivot_wider()` this can be lazy. Note that this will be removed soon after `pivot_wider_spec()` becomes a generic (@mgirlich). -* Added translation for `str_detect()`, `str_starts()` and `str_ends()` with - fixed patterns (@mgirlich, #1009). - -* The `overwrite` argument of `db_copy_to()` now actually works. - -* `db_write_table()` and `db_save_query()` gain the `overwrite` argument. +* `show_query()` and `remote_query()` gain the argument `sql_options` that allows + to control how the SQL is generated. It can be created via `sql_options()` + which has the following arguments: + * `cte`: use common table expressions? + * `use_star`: use `SELECT *` or explicitly select every column? + * `qualify_all_columns`: qualify all columns in a join or only the ambiguous ones? + (@mgirlich, #1146). + +* The `cte` argument of `show_query()` and `remote_query()` is deprecated (@mgirlich, #1146). -* `distinct(.keep_all = TRUE)` now works for SQL Server (@mgirlich, #1053). +## Breaking changes -* `slice_min/max()` can now order by multiple variables like dplyr, e.g. use - `slice_min(lf, tibble(x, y))` (@mgirlich, #1167). +* `remote_name()` now returns a string with the name of the table. To get the + qualified identifier use the newly added `remote_table()` (@mgirlich, #1280). * The functions `simulate_vars()` and `simulate_vars_is_typed()` were removed as they weren't used anymore and tidyselect now offers `tidyselect_data_proxy()` @@ -22,133 +41,122 @@ * `translate_sql()` now requires the `con` argument (@mgirlich, #1311). -* A `semi/anti_join()` where `y` is filtered is now inlined when possible (@mgirlich, #884). - -* `*_join()` now allows using specifying the relationship argument. It must be `NULL` or `"many-to-many"` (@bairdj, #1305). +* `sql_query_append()`, `sql_query_insert()`, `sql_query_update()`, + `sql_query_upsert()`, and `sql_query_delete()` changed their arguments to + make them more consistent to the other `sql_query_*()` functions: + + * `x_name` was renamed to `table`. + * `y` was renamed to `from` and must now be a table identifier or SQL instead + of a lazy table. + * `sql_query_append()` and `sql_query_insert()` have gained the argument `cols`. -* The columns generated when using a window function in `filter()` are now named - `col01` etc. instead of `q01()` (@mgirlich, #1258). +* The first argument of `ntile()` has been renamed from `order_by` to `x` to + match the interface of `dplyr::ntile()` (@mgirlich, #1242). -* `slice_*()` now supports the data masking pronouns `.env` and `.data` (@mgirlich, #1294). +* Removed argument `src` of `tbl_lazy()` after it has been deprecated for years + (@mgirlich, #1208). -* `tbl()` now informs when the user probably forgot to wrap the table identifier - with `in_schema()` or `sql()` (@mgirlich, #1287). +* Using `compute(temporary = FALSE)` without providing a name is now + deprecated (@mgirlich, #1154). -* Added `db_supports_table_alias_with_as()` to customise whether a backend supports - specifying a table alias with `AS` or not (@mgirlich). +* The `vars` argument of `translate_sql()` has been removed after it threw an + error for the last 7 years (@mgirlich). -* The translation of `between()` now also works for MS SQL when used in `mutate()` - (@mgirlich, #1241). +## Improved SQL -* MariaDB: - * `rows_update()` and `rows_patch()` now give an informative error when the - unsupported `returning` is used (@mgirlich, #1279). - * `rows_upsert()` now gives an informative error that it isn't supported - (@mgirlich, #1279). - * `rows_*()` use the column types of `x` when auto copying (@mgirlich, #1327). +* A `semi/anti_join()` where `y` is filtered is now inlined when possible (@mgirlich, #884). -* Oracle: - * Fix translation of `rows_upsert()` (@mgirlich, @TBlackmore, #1286) - * `head(n)` is now translated to `WHERE ROWNUM <= n` to also support old - versions <= 11.2 (@JeremyPasco, #1292). +* A sequence of `union()` resp. `union_all()` now produces a flat query + instead of subqueries (@mgirlich, #1269). -* Teradata: - * `as.Date(x)` is now translate to `CAST(x AS DATE)` again unless `x` is a - string (@mgirlich, #1285). +## Minor improvements and bug fixes -* `remote_name()` now returns a string with the name of the table. To get the - qualified identifier use the newly added `remote_table()` (@mgirlich, #1280). +* The `overwrite` argument of `db_copy_to()` now actually works. -* Queries now qualify `*` with the table alias for better compatibility (@mgirlich, #1003). +* `db_write_table()` and `db_save_query()` gain the `overwrite` argument. -* Joins now work again for Pool and Oracle connections (@mgirlich, #1177, #1181). +* The dots in `db_copy_to()` are now passed to `db_write_table()` (@mgirlich, #1237). -* `show_query()` and `remote_query()` gain the argument `sql_options` that allows - to control how the SQL is generated. It can be created via `sql_options()` - which has the following arguments: - * `cte`: use common table expressions? - * `use_star`: use `SELECT *` or explicitly select every column? - * `qualify_all_columns`: qualify all columns in a join or only the ambiguous ones? - (@mgirlich, #1146). - -* The `cte` argument of `show_query()` and `remote_query()` is deprecated (@mgirlich, #1146). +* Added translation for `str_detect()`, `str_starts()` and `str_ends()` with + fixed patterns (@mgirlich, #1009). -* `any()` and `all()` now work for MS SQL (@ejneer, #1273). +* Added translation for `nzchar()` (@MichaelChirico, @mgirlich, #1094). -* Fixed negation of bit (boolean) fields in MS SQL (@ejneer, #1239) +* Added translation for `runif()` (@mgirlich, #1200). -* A sequence of `union()` resp. `union_all()` now produces a flat query - instead of subqueries (@mgirlich, #1269). +* `sql_random()` is now deprecated. It was used to power `slice_sample()` which + is now done via the translation for `runif()` (@mgirlich, #1200). + +* `nth()`, `first()`, and `last()` now support the `na_rm` argument (@mgirlich, #1193). -* Using `compute(temporary = FALSE)` without providing a name is now - deprecated (@mgirlich, #1154). +* The translation of `if_any()` and `if_all()` is now wrapped in parentheses. + This makes sure it can be combined via `&` with other conditions (@mgirlich, #1153). -* Added translation for `nzchar()` (@MichaelChirico, @mgirlich, #1094). +* `slice_min/max()` can now order by multiple variables like dplyr, e.g. use + `slice_min(lf, tibble(x, y))` (@mgirlich, #1167). -* MySQL/MariaDB: - * Fix translation of `as.numeric()`, `as.POSIXct()`, `as_datetime()`, and - `as.integer64()` (@avsdev-cw, #1189). +* `slice_*()` now supports the data masking pronouns `.env` and `.data` (@mgirlich, #1294). -* `full_join()` can now handle column names that only differ in case (@ejneer, #1255). +* Can now use `select()` again after using `arrange(desc(x))` (@ejneer, #1240). -* Subqueries now also get an alias for SQLite. This makes it consistent with - other backends and simplifies the implementation. +* The columns generated when using a window function in `filter()` are now named + `col01` etc. instead of `q01()` (@mgirlich, #1258). -* The translation of `if_any()` and `if_all()` is now wrapped in parentheses. - This makes sure it can be combined via `&` with other conditions (@mgirlich, #1153). +* `tbl()` now informs when the user probably forgot to wrap the table identifier + with `in_schema()` or `sql()` (@mgirlich, #1287). * `pivot_wider()` now matches tidyr `NA` column handling (@ejneer #1238). * Using a function with a namespace in `across()` now works, e.g. `across(x, dplyr::dense_rank)` (@mgirlich, #1231). -* The dots in `db_copy_to()` are now passed to `db_write_table()` (@mgirlich, #1237). - -* Can now use `select()` again after using `arrange(desc(x))` (@ejneer, #1240). - -* The first argument of `ntile()` has been renamed from `order_by` to `x` to - match the interface of `dplyr::ntile()` (@mgirlich, #1242). - -* Removed argument `src` of `tbl_lazy()` after it has been deprecated for years - (@mgirlich, #1208). - * `sql_join_suffix()` gains the argument `suffix` so that methods can check whether the suffix is valid for the backend (@mgirlich). -* `sql_query_append()`, `sql_query_insert()`, `sql_query_update()`, - `sql_query_upsert()`, and `sql_query_delete()` changed their arguments to - make them more consistent to the other `sql_query_*()` functions: - - * `x_name` was renamed to `table`. - * `y` was renamed to `from` and must now be a table identifier or SQL instead - of a lazy table. - * `sql_query_append()` and `sql_query_insert()` have gained the argument `cols`. - -* The `na_matches` argument of `semi_join()` and `anti_join()` works again - (@mgirlich, #1211). - -* The `vars` argument of `translate_sql()` has been removed after it threw an - error for the last 7 years (@mgirlich). - -* Added translation for `runif()` (@mgirlich, #1200). - -* `sql_random()` is now deprecated. It was used to power `slice_sample()` which - is now done via the translation for `runif()` (@mgirlich, #1200). +* Added `db_supports_table_alias_with_as()` to customise whether a backend supports + specifying a table alias with `AS` or not (@mgirlich). -* DuckDB now supports the `returning` argument of `rows_*()`. +## Backend specific improvements -* `nth()`, `first()`, and `last()` now support the `na_rm` argument (@mgirlich, #1193). +* Access + * Added translation for `!=` to `<>` (@erikvona, #1219). -* `distinct()` + `head()` now work for Teradata (@mgirlich, #685). +* DuckDB + * now supports the `returning` argument of `rows_*()`. -* `copy_inline()` now works for MariaDB (@mgirlich, #1188). +* MySQL/MariaDB: + * `rows_update()` and `rows_patch()` now give an informative error when the + unsupported `returning` is used (@mgirlich, #1279). + * `rows_upsert()` now gives an informative error that it isn't supported + (@mgirlich, #1279). + * `rows_*()` use the column types of `x` when auto copying (@mgirlich, #1327). + * Fix translation of `as.numeric()`, `as.POSIXct()`, `as_datetime()`, and + `as.integer64()` (@avsdev-cw, #1189). + * `copy_inline()` now works (@mgirlich, #1188). -* `*_join()` after `full_join()` works again (@mgirlich, #1178). +* Oracle: + * Fix translation of `rows_upsert()` (@mgirlich, @TBlackmore, #1286) + * `head(n)` is now translated to `WHERE ROWNUM <= n` to also support old + versions <= 11.2 (@JeremyPasco, #1292). -* The `rows_*()` functions now also work inside a transaction for Postgres - (@mgirlich, #1183). +* Postgres + * The `rows_*()` functions now also work inside a transaction (@mgirlich, #1183). -* Added translation for `!=` to `<>` for Microsoft Access (@erikvona, #1219). +* SQLite + * Subqueries now also get an alias. This makes it consistent with other + backends and simplifies the implementation. + +* SQL Server + * `distinct(.keep_all = TRUE)` now works (@mgirlich, #1053). + * The translation of `between()` now also works when used in `mutate()` + (@mgirlich, #1241). + * `any()` and `all()` now work (@ejneer, #1273). + * Fixed negation of bit (boolean) fields (@ejneer, #1239) + +* Teradata + * `distinct()` + `head()` now work (@mgirlich, #685). + * `as.Date(x)` is now translate to `CAST(x AS DATE)` again unless `x` is a + string (@mgirlich, #1285). # dbplyr 2.3.3 From 9246800dd6282b163dfcf5f6e4f348af8e2b0e2a Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 08:17:47 +0000 Subject: [PATCH 04/10] NEWS polish --- NEWS.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NEWS.md b/NEWS.md index c08a63e4e..a44e6c811 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,18 +4,18 @@ * `*_join()` after `full_join()` works again (@mgirlich, #1178). - * `*_join()` now allows using specifying the relationship argument. It must be + * `*_join()` now allows specifying the relationship argument. It must be `NULL` or `"many-to-many"` (@bairdj, #1305). * Queries now qualify `*` with the table alias for better compatibility (@mgirlich, #1003). - * Joins now work again for Pool and Oracle connections (@mgirlich, #1177, #1181). - * `full_join()` can now handle column names that only differ in case (@ejneer, #1255). * The `na_matches` argument of `semi_join()` and `anti_join()` works again (@mgirlich, #1211). + * Joins now work again for Pool and Oracle connections (@mgirlich, #1177, #1181). + * `dbplyr_pivot_wider_spec()` is now exported. Unlike `pivot_wider()` this can be lazy. Note that this will be removed soon after `pivot_wider_spec()` becomes a generic (@mgirlich). @@ -126,13 +126,13 @@ * MySQL/MariaDB: * `rows_update()` and `rows_patch()` now give an informative error when the - unsupported `returning` is used (@mgirlich, #1279). + unsupported `returning` argument is used (@mgirlich, #1279). * `rows_upsert()` now gives an informative error that it isn't supported (@mgirlich, #1279). - * `rows_*()` use the column types of `x` when auto copying (@mgirlich, #1327). + * `rows_*()` use the column types of `x` when auto copying `y` (@mgirlich, #1327). + * `copy_inline()` now works (@mgirlich, #1188). * Fix translation of `as.numeric()`, `as.POSIXct()`, `as_datetime()`, and `as.integer64()` (@avsdev-cw, #1189). - * `copy_inline()` now works (@mgirlich, #1188). * Oracle: * Fix translation of `rows_upsert()` (@mgirlich, @TBlackmore, #1286) From 17298179ff13847ad47137c8c2968f5455063202 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 08:18:32 +0000 Subject: [PATCH 05/10] Bump minimal R version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index bec53f8ab..181ff725d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,7 @@ License: MIT + file LICENSE URL: https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr BugReports: https://github.com/tidyverse/dbplyr/issues Depends: - R (>= 3.1) + R (>= 3.6) Imports: blob (>= 1.2.0), cli (>= 3.4.1), From 915918ec27f5b023c9d8b35fcb999892da416db7 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 08:24:07 +0000 Subject: [PATCH 06/10] Bump dependencies --- DESCRIPTION | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 181ff725d..e09e029b5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,23 +20,23 @@ Depends: R (>= 3.6) Imports: blob (>= 1.2.0), - cli (>= 3.4.1), - DBI (>= 1.0.0), - dplyr (>= 1.1.0), - glue (>= 1.2.0), + cli (>= 3.6.1), + DBI (>= 1.1.3), + dplyr (>= 1.1.2), + glue (>= 1.6.2), lifecycle (>= 1.0.3), magrittr, methods, - pillar (>= 1.5.0), + pillar (>= 1.9.0), purrr (>= 1.0.1), R6 (>= 2.2.2), - rlang (>= 1.1.0), - tibble (>= 1.4.2), + rlang (>= 1.1.1), + tibble (>= 3.2.1), tidyr (>= 1.3.0), tidyselect (>= 1.2.0), utils, - vctrs (>= 0.5.2), - withr + vctrs (>= 0.6.3), + withr (>= 2.5.0) Suggests: bit64, covr, @@ -44,12 +44,12 @@ Suggests: Lahman, nycflights13, odbc, - RMariaDB (>= 1.0.2), + RMariaDB (>= 1.2.2), rmarkdown, - RPostgres (>= 1.1.3), + RPostgres (>= 1.4.5), RPostgreSQL, - RSQLite (>= 2.2.15), - testthat (>= 3.0.2) + RSQLite (>= 2.3.1), + testthat (>= 3.1.10) VignetteBuilder: knitr Config/Needs/website: tidyverse/tidytemplate From d2dc6078a688dc3bdbc01dadae64082d9ab11a2f Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 08:25:12 +0000 Subject: [PATCH 07/10] README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26465fc43..bea5e4171 100755 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ details). Printing it just retrieves the first few rows: mtcars2 <- tbl(con, "mtcars") mtcars2 #> # Source: table [?? x 11] -#> # Database: sqlite 3.40.1 [:memory:] +#> # Database: sqlite 3.41.2 [:memory:] #> mpg cyl disp hp drat wt qsec vs am gear carb #> #> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 @@ -75,7 +75,7 @@ mtcars2 #> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 #> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 #> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 -#> # … with more rows +#> # ℹ more rows ``` All dplyr calls are evaluated lazily, generating SQL that is only sent From 29fcac7f6cc6345ed1d9f9e9d8ef40af28858dba Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Thu, 13 Jul 2023 09:24:05 +0000 Subject: [PATCH 08/10] Specify timezone in tests --- tests/testthat/test-backend-access.R | 2 +- tests/testthat/test-backend-mysql.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-backend-access.R b/tests/testthat/test-backend-access.R index 9a0a003f9..dbcf481b7 100644 --- a/tests/testthat/test-backend-access.R +++ b/tests/testthat/test-backend-access.R @@ -60,7 +60,7 @@ test_that("custom escaping works as expected", { expect_equal(escape(as.Date("2020-01-01"), con = con), sql("#2020-01-01#")) expect_equal(escape(as.Date(NA), con = con), sql("NULL")) - expect_equal(escape(as.POSIXct("2020-01-01"), con = con), sql("#2020-01-01 00:00:00#")) + expect_equal(escape(as.POSIXct("2020-01-01", tz = "UTC"), con = con), sql("#2020-01-01 00:00:00#")) expect_equal(escape(as.POSIXct(NA), con = con), sql("NULL")) }) diff --git a/tests/testthat/test-backend-mysql.R b/tests/testthat/test-backend-mysql.R index 757e73add..bddc53f0a 100644 --- a/tests/testthat/test-backend-mysql.R +++ b/tests/testthat/test-backend-mysql.R @@ -25,7 +25,7 @@ test_that("custom date escaping works as expected", { expect_equal(escape(as.Date("2020-01-01"), con = con), sql("'2020-01-01'")) expect_equal(escape(as.Date(NA), con = con), sql("NULL")) - expect_equal(escape(as.POSIXct("2020-01-01"), con = con), sql("'2020-01-01 00:00:00'")) + expect_equal(escape(as.POSIXct("2020-01-01", tz = "UTC"), con = con), sql("'2020-01-01 00:00:00'")) expect_equal(escape(as.POSIXct(NA), con = con), sql("NULL")) }) From cc71c87a5270b5194d9b0982dedf737aa8193f03 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Tue, 8 Aug 2023 12:48:41 +0000 Subject: [PATCH 09/10] Add `db_col_types.default()` --- R/db.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/R/db.R b/R/db.R index 8bbafbb7a..a5d2b4728 100644 --- a/R/db.R +++ b/R/db.R @@ -103,6 +103,12 @@ db_col_types.TestConnection <- function(con, table, call) { db_col_types.DBIConnection <- function(con, table, call) { NULL } +# add a default method so that packages that haven't implemented `db_col_types()` +# keep working, e.g. {Pool} +#' @export +db_col_types.default <- function(con, table, call) { + NULL +} #' Options for generating SQL #' From 03420cb0bcb9a810800aa088cbba16a16ec33dd2 Mon Sep 17 00:00:00 2001 From: Maximilian Girlich Date: Tue, 8 Aug 2023 12:50:21 +0000 Subject: [PATCH 10/10] Mention minor breaking change in `sql_not_supported()` --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 4a47dd00a..c6a30e8a5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -62,6 +62,8 @@ * The `vars` argument of `translate_sql()` has been removed after it threw an error for the last 7 years (@mgirlich). +* `sql_not_supported()` now expects a function name without parentheses. + ## Improved SQL * A `semi/anti_join()` where `y` is filtered is now inlined when possible (@mgirlich, #884).