diff --git a/R/Connect.R b/R/Connect.R index 783aece6..051379b5 100644 --- a/R/Connect.R +++ b/R/Connect.R @@ -778,7 +778,7 @@ connectUsingJdbcDriver <- function(jdbcDriver, abort(paste0("Unable to connect JDBC to ", url, " (", rJava::.jcall(x, "S", "getMessage"), ")")) } } - ensureDatabaseConnectorConnectionClassExists() + ensureDatabaseConnectorConnectionClassExists(dbms) class <- getClassDef("DatabaseConnectorJdbcConnection", where = class_cache, inherits = FALSE) if (is.null(class) || methods::isVirtualClass(class)) { setClass("DatabaseConnectorJdbcConnection", @@ -798,16 +798,30 @@ connectUsingJdbcDriver <- function(jdbcDriver, return(connection) } -ensureDatabaseConnectorConnectionClassExists <- function() { - class <- getClassDef("Microsoft SQL Server", where = class_cache, inherits = FALSE) +ensureDatabaseConnectorConnectionClassExists <- function(dbms) { + checkIfDbmsIsSupported(dbms) + dbmsClass <- switch(dbms, + "oracle" = "Oracle", + "postgresql" = "PqConnection", + "redshift" = "RedshiftConnection", + "sql server" = "Microsoft SQL Server", + "bigquery" = "BigQueryConnection", + "sqlite" = "SQLiteConnection", + "sqlite extended" = "SQLiteConnection", + "spark" = "Spark SQL", + "snowflake" = "Snowflake", + "synapse" = "Microsoft SQL Server", + "duckdb" = "duckdb_connection", + "blah") + + class <- getClassDef(dbmsClass, where = class_cache, inherits = FALSE) if (is.null(class) || methods::isVirtualClass(class)) { - setClass("Microsoft SQL Server", - where = class_cache) + setClass(dbmsClass, where = class_cache) } class <- getClassDef("DatabaseConnectorConnection", where = class_cache, inherits = FALSE) if (is.null(class) || methods::isVirtualClass(class)) { setClass("DatabaseConnectorConnection", - contains = c("Microsoft SQL Server", "DBIConnection"), + contains = c(dbmsClass, "DBIConnection"), slots = list( identifierQuote = "character", stringQuote = "character", @@ -822,7 +836,7 @@ connectUsingDbi <- function(dbiConnectionDetails) { dbms <- dbiConnectionDetails$dbms dbiConnectionDetails$dbms <- NULL dbiConnection <- do.call(DBI::dbConnect, dbiConnectionDetails) - ensureDatabaseConnectorConnectionClassExists() + ensureDatabaseConnectorConnectionClassExists(dbms) class <- getClassDef("DatabaseConnectorDbiConnection", where = class_cache, inherits = FALSE) if (is.null(class) || methods::isVirtualClass(class)) { setClass("DatabaseConnectorDbiConnection", @@ -956,7 +970,10 @@ dbms <- function(connection) { "RedshiftConnection" = "redshift", "BigQueryConnection" = "bigquery", "SQLiteConnection" = "sqlite", - "duckdb_connection" = "duckdb" + "duckdb_connection" = "duckdb", + "Spark Sql" = "spark", + "Snowflake" = "snowflake", + "Oracle" = "oracle" # add mappings from various DBI connection classes to SqlRender dbms here ) } diff --git a/R/DBI.R b/R/DBI.R index 669b8a0a..6cb13635 100644 --- a/R/DBI.R +++ b/R/DBI.R @@ -208,7 +208,7 @@ setClass("DatabaseConnectorDbiResult", setMethod( "dbSendQuery", signature("DatabaseConnectorJdbcConnection", "character"), - function(conn, statement, translate = TRUE, ...) { + function(conn, statement, translate = FALSE, ...) { if (rJava::is.jnull(conn@jConnection)) { abort("Connection is closed") } @@ -258,7 +258,7 @@ setMethod( setMethod( "dbSendQuery", signature("DatabaseConnectorDbiConnection", "character"), - function(conn, statement, translate = TRUE, ...) { + function(conn, statement, translate = FALSE, ...) { if (translate) { statement <- translateStatement( sql = statement, @@ -426,7 +426,7 @@ setMethod("dbGetRowsAffected", "DatabaseConnectorDbiResult", function(res, ...) setMethod( "dbGetQuery", signature("DatabaseConnectorConnection", "character"), - function(conn, statement, translate = TRUE, ...) { + function(conn, statement, translate = FALSE, ...) { if (translate) { statement <- translateStatement( sql = statement, @@ -447,7 +447,7 @@ setMethod( setMethod( "dbSendStatement", signature("DatabaseConnectorConnection", "character"), - function(conn, statement, translate = TRUE, ...) { + function(conn, statement, translate = FALSE, ...) { if (translate) { statement <- translateStatement( sql = statement, @@ -472,7 +472,7 @@ setMethod( setMethod( "dbExecute", signature("DatabaseConnectorConnection", "character"), - function(conn, statement, translate = TRUE, ...) { + function(conn, statement, translate = FALSE, ...) { if (isDbplyrSql(statement) && dbms(conn) %in% c("oracle", "bigquery", "spark", "hive") && grepl("^UPDATE STATISTICS", statement)) { # These platforms don't support this, so SqlRender translates to an empty string, which causes errors down the line. return(0) @@ -544,7 +544,9 @@ setMethod( #' @export setMethod( "dbWriteTable", - "DatabaseConnectorConnection", + c(conn = "DatabaseConnectorConnection", + name = "character", + value = "data.frame"), function(conn, name, value, databaseSchema = NULL, overwrite = FALSE, append = FALSE, temporary = FALSE, oracleTempSchema = NULL, tempEmulationSchema = getOption("sqlRenderTempEmulationSchema"), ...) { if (!is.null(oracleTempSchema) && oracleTempSchema != "") { diff --git a/man/dbExecute-DatabaseConnectorConnection-character-method.Rd b/man/dbExecute-DatabaseConnectorConnection-character-method.Rd index b84f2b09..bf4e66fd 100644 --- a/man/dbExecute-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbExecute-DatabaseConnectorConnection-character-method.Rd @@ -4,7 +4,7 @@ \alias{dbExecute,DatabaseConnectorConnection,character-method} \title{Execute an update statement, query number of rows affected, and then close result set} \usage{ -\S4method{dbExecute}{DatabaseConnectorConnection,character}(conn, statement, translate = TRUE, ...) +\S4method{dbExecute}{DatabaseConnectorConnection,character}(conn, statement, translate = FALSE, ...) } \arguments{ \item{conn}{A \linkS4class{DBIConnection} object, as returned by diff --git a/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd b/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd index c4856336..680d1dc8 100644 --- a/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd @@ -4,7 +4,7 @@ \alias{dbGetQuery,DatabaseConnectorConnection,character-method} \title{Send query, retrieve results and then clear result set} \usage{ -\S4method{dbGetQuery}{DatabaseConnectorConnection,character}(conn, statement, translate = TRUE, ...) +\S4method{dbGetQuery}{DatabaseConnectorConnection,character}(conn, statement, translate = FALSE, ...) } \arguments{ \item{conn}{A \linkS4class{DBIConnection} object, as returned by diff --git a/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd b/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd index 147b9a1e..7ba2260b 100644 --- a/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd +++ b/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd @@ -4,7 +4,7 @@ \alias{dbSendQuery,DatabaseConnectorDbiConnection,character-method} \title{Execute a query on a given database connection} \usage{ -\S4method{dbSendQuery}{DatabaseConnectorDbiConnection,character}(conn, statement, translate = TRUE, ...) +\S4method{dbSendQuery}{DatabaseConnectorDbiConnection,character}(conn, statement, translate = FALSE, ...) } \arguments{ \item{conn}{A \linkS4class{DBIConnection} object, as returned by diff --git a/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd b/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd index 03e2951f..c7d040b6 100644 --- a/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd +++ b/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd @@ -4,7 +4,7 @@ \alias{dbSendQuery,DatabaseConnectorJdbcConnection,character-method} \title{Execute a query on a given database connection} \usage{ -\S4method{dbSendQuery}{DatabaseConnectorJdbcConnection,character}(conn, statement, translate = TRUE, ...) +\S4method{dbSendQuery}{DatabaseConnectorJdbcConnection,character}(conn, statement, translate = FALSE, ...) } \arguments{ \item{conn}{A \linkS4class{DBIConnection} object, as returned by diff --git a/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd b/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd index 6f1b9e61..a40812ae 100644 --- a/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd @@ -4,7 +4,7 @@ \alias{dbSendStatement,DatabaseConnectorConnection,character-method} \title{Execute a data manipulation statement on a given database connection} \usage{ -\S4method{dbSendStatement}{DatabaseConnectorConnection,character}(conn, statement, translate = TRUE, ...) +\S4method{dbSendStatement}{DatabaseConnectorConnection,character}(conn, statement, translate = FALSE, ...) } \arguments{ \item{conn}{A \linkS4class{DBIConnection} object, as returned by diff --git a/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd b/man/dbWriteTable-DatabaseConnectorConnection-character-data.frame-method.Rd similarity index 93% rename from man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd rename to man/dbWriteTable-DatabaseConnectorConnection-character-data.frame-method.Rd index a5874645..5fed935c 100644 --- a/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd +++ b/man/dbWriteTable-DatabaseConnectorConnection-character-data.frame-method.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/DBI.R -\name{dbWriteTable,DatabaseConnectorConnection,ANY-method} -\alias{dbWriteTable,DatabaseConnectorConnection,ANY-method} +\name{dbWriteTable,DatabaseConnectorConnection,character,data.frame-method} +\alias{dbWriteTable,DatabaseConnectorConnection,character,data.frame-method} \title{Copy data frames to database tables} \usage{ -\S4method{dbWriteTable}{DatabaseConnectorConnection,ANY}( +\S4method{dbWriteTable}{DatabaseConnectorConnection,character,data.frame}( conn, name, value, diff --git a/tests/testthat/testthat-problems.rds b/tests/testthat/testthat-problems.rds index 4ff38fdc..3b9e32b0 100644 Binary files a/tests/testthat/testthat-problems.rds and b/tests/testthat/testthat-problems.rds differ