From b84be01cd28016569e259a712ec6f8c36087de3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Fri, 6 Oct 2023 17:18:47 +0200 Subject: [PATCH] Work around missing CAST(x AS INTEGER) in MySQL --- R/backend-mysql.R | 19 +++++++++++++++++-- tests/testthat/_snaps/backend-mysql.md | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/R/backend-mysql.R b/R/backend-mysql.R index 85f7bdea8..e1ddab659 100644 --- a/R/backend-mysql.R +++ b/R/backend-mysql.R @@ -133,9 +133,24 @@ sql_translation.MariaDBConnection <- function(con) { } #' @export -sql_translation.MySQL <- sql_translation.MariaDBConnection +sql_translation.MySQL <- function(con) { + maria <- unclass(sql_translation.MariaDBConnection()) + sql_variant( + sql_translator(.parent = maria$scalar, + # MySQL doesn't support casting to INTEGER or BIGINT. + as.integer = function(x) { + sql_expr(TRUNCATE(CAST(!!x %AS% DOUBLE), 0L)) + }, + as.integer64 = function(x) { + sql_expr(TRUNCATE(CAST(!!x %AS% DOUBLE), 0L)) + }, + ), + maria$aggregate, + maria$window + ) +} #' @export -sql_translation.MySQLConnection <- sql_translation.MariaDBConnection +sql_translation.MySQLConnection <- sql_translation.MySQL #' @export sql_table_analyze.MariaDBConnection <- function(con, table, ...) { diff --git a/tests/testthat/_snaps/backend-mysql.md b/tests/testthat/_snaps/backend-mysql.md index c0f110391..a389acf46 100644 --- a/tests/testthat/_snaps/backend-mysql.md +++ b/tests/testthat/_snaps/backend-mysql.md @@ -64,7 +64,7 @@ Code copy_inline(con_mysql, tibble(x = 1:2, y = letters[1:2])) %>% remote_query() Output - SELECT CAST(`x` AS INTEGER) AS `x`, CAST(`y` AS CHAR) AS `y` + SELECT TRUNCATE(CAST(`x` AS DOUBLE), 0) AS `x`, CAST(`y` AS CHAR) AS `y` FROM ( SELECT NULL AS `x`, NULL AS `y` WHERE (0 = 1)