Skip to content

Commit 0d00a30

Browse files
authored
Merge pull request OHDSI#321 from james-cockayne/feature/duckdb_configuration
Feature/Duckdb configuration
2 parents ff23e17 + c113f64 commit 0d00a30

3 files changed

Lines changed: 94 additions & 1 deletion

File tree

R/Connect.R

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,10 +842,24 @@ connectUsingDbi <- function(dbiConnectionDetails) {
842842
connectDuckdb <- function(connectionDetails) {
843843
inform("Connecting using DuckDB driver")
844844
ensure_installed("duckdb")
845+
846+
# Extract config from extraSettings if provided
847+
duckdbConfig <- NULL
848+
if (!is.null(connectionDetails$extraSettings) && !is.null(connectionDetails$extraSettings$config)) {
849+
duckdbConfig <- connectionDetails$extraSettings$config
850+
}
851+
852+
# Create DuckDB driver with config if provided
853+
drv <- if (is.null(duckdbConfig)) {
854+
duckdb::duckdb()
855+
} else {
856+
duckdb::duckdb(config = duckdbConfig)
857+
}
858+
845859
connection <- connectUsingDbi(
846860
createDbiConnectionDetails(
847861
dbms = connectionDetails$dbms,
848-
drv = duckdb::duckdb(),
862+
drv = drv,
849863
dbdir = connectionDetails$server(),
850864
bigint = "integer64"
851865
)

man-roxygen/DefaultConnectionDetails.R

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@
107107
#'
108108
#' - `server`. The path to the SQLIte file.
109109
#'
110+
#' DuckDB:
111+
#'
112+
#' - `server`. The path to the DuckDB file.
113+
#' - `extraSettings`. Additional settings for DuckDB. For DuckDB specifically, if
114+
#' `extraSettings$config` is provided, it will be passed to the
115+
#' `duckdb::duckdb()` constructor. For example:
116+
#' `extraSettings = list(config = list(memory_limit = "8GB", preserve_insertion_order = "false"))`
117+
#'
110118
#' Spark / Databricks:
111119
#'
112120
#' Currently both JDBC and ODBC connections are supported for Spark. Set the

test_duckdb_config.R

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Test script for DuckDB config functionality
2+
library(DatabaseConnector)
3+
library(duckdb)
4+
5+
# Create a temporary DuckDB file
6+
temp_db_file <- tempfile(fileext = ".duckdb")
7+
8+
# Test 1: Connection without config (existing behavior)
9+
cat("Test 1: Connection without config\n")
10+
connectionDetails1 <- createConnectionDetails(
11+
dbms = "duckdb",
12+
server = temp_db_file
13+
)
14+
15+
tryCatch({
16+
connection1 <- connect(connectionDetails1)
17+
cat("✓ Connection without config successful\n")
18+
disconnect(connection1)
19+
}, error = function(e) {
20+
cat("✗ Connection without config failed:", e$message, "\n")
21+
})
22+
23+
# Test 2: Connection with config (new functionality)
24+
cat("\nTest 2: Connection with config\n")
25+
connectionDetails2 <- createConnectionDetails(
26+
dbms = "duckdb",
27+
server = temp_db_file,
28+
extraSettings = list(
29+
config = list(
30+
memory_limit = "8GB",
31+
preserve_insertion_order = "false"
32+
)
33+
)
34+
)
35+
36+
tryCatch({
37+
connection2 <- connect(connectionDetails2)
38+
cat("✓ Connection with config successful\n")
39+
40+
# Verify that the config was applied by checking memory_limit setting
41+
result <- querySql(connection2, "SELECT current_setting('memory_limit') as memory_limit")
42+
cat("Memory limit setting:", result$MEMORY_LIMIT, "\n")
43+
44+
disconnect(connection2)
45+
}, error = function(e) {
46+
cat("✗ Connection with config failed:", e$message, "\n")
47+
})
48+
49+
# Test 3: Connection with invalid config (error handling)
50+
cat("\nTest 3: Connection with invalid config\n")
51+
connectionDetails3 <- createConnectionDetails(
52+
dbms = "duckdb",
53+
server = temp_db_file,
54+
extraSettings = list(
55+
config = list(
56+
invalid_setting = "invalid_value"
57+
)
58+
)
59+
)
60+
61+
tryCatch({
62+
connection3 <- connect(connectionDetails3)
63+
cat("✗ Connection with invalid config should have failed\n")
64+
disconnect(connection3)
65+
}, error = function(e) {
66+
cat("✓ Connection with invalid config correctly failed:", e$message, "\n")
67+
})
68+
69+
# Cleanup
70+
unlink(temp_db_file)
71+
cat("\nTest completed\n")

0 commit comments

Comments
 (0)