@@ -28,6 +28,7 @@ setClass(
2828 catalog = " character" ,
2929 schema = " character" ,
3030 staging_volume = " character" ,
31+ disposition = " character" ,
3132 max_active_connections = " numeric" ,
3233 fetch_timeout = " numeric"
3334 )
@@ -83,6 +84,9 @@ setMethod("show", "DatabricksDriver", function(object) {
8384# ' @param catalog Optional catalog name to use as default
8485# ' @param schema Optional schema name to use as default
8586# ' @param staging_volume Optional volume path for large dataset staging
87+ # ' @param disposition Query disposition mode to use by default for DBI query
88+ # ' results. Use `"EXTERNAL_LINKS"` for large results or `"INLINE"` for
89+ # ' smaller results that must avoid direct cloud-storage result downloads.
8690# ' @param max_active_connections Maximum number of concurrent download
8791# ' connections when fetching query results (default: 30)
8892# ' @param fetch_timeout Timeout in seconds for downloading each result chunk
@@ -102,12 +106,15 @@ setMethod(
102106 catalog = NULL ,
103107 schema = NULL ,
104108 staging_volume = NULL ,
109+ disposition = c(" EXTERNAL_LINKS" , " INLINE" ),
105110 max_active_connections = 30 ,
106111 fetch_timeout = 300 ,
107112 token = db_token(),
108113 host = db_host(),
109114 ...
110115 ) {
116+ disposition <- match.arg(disposition )
117+
111118 # Validate required parameters
112119 if (
113120 ! is.null(warehouse_id ) &&
@@ -168,6 +175,7 @@ setMethod(
168175 catalog = catalog %|| % " " ,
169176 schema = schema %|| % " " ,
170177 staging_volume = staging_volume %|| % " " ,
178+ disposition = disposition ,
171179 max_active_connections = max_active_connections ,
172180 fetch_timeout = fetch_timeout
173181 )
@@ -218,6 +226,7 @@ setMethod("show", "DatabricksConnection", function(object) {
218226 if (! is.null(object @ staging_volume ) && nzchar(object @ staging_volume )) {
219227 cat(" Staging Volume:" , object @ staging_volume , " \n " )
220228 }
229+ cat(" Disposition:" , object @ disposition , " \n " )
221230 cat(" Max Active Connections:" , object @ max_active_connections , " \n " )
222231 cat(" Fetch Timeout (s):" , object @ fetch_timeout , " \n " )
223232})
@@ -227,23 +236,26 @@ setMethod("show", "DatabricksConnection", function(object) {
227236# ' Send query to Databricks (asynchronous)
228237# ' @param conn A DatabricksConnection object
229238# ' @param statement SQL statement to execute
239+ # ' @param disposition Query disposition mode. Defaults to the connection's
240+ # ' `disposition` setting.
230241# ' @param ... Additional arguments (ignored)
231242# ' @returns A DatabricksResult object
232243# ' @export
233244setMethod(
234245 " dbSendQuery" ,
235246 signature = c(conn = " DatabricksConnection" , statement = " character" ),
236- function (conn , statement , ... ) {
247+ function (conn , statement , disposition = conn @ disposition , ... ) {
237248 db_assert_statement(statement )
249+ disposition <- match.arg(disposition , c(" EXTERNAL_LINKS" , " INLINE" ))
238250
239251 # Execute query asynchronously
240252 resp <- db_sql_exec_query(
241253 warehouse_id = conn @ warehouse_id ,
242254 statement = statement ,
243255 catalog = if (nzchar(conn @ catalog )) conn @ catalog else NULL ,
244256 schema = if (nzchar(conn @ schema )) conn @ schema else NULL ,
245- disposition = " EXTERNAL_LINKS " ,
246- format = " ARROW_STREAM" ,
257+ disposition = disposition ,
258+ format = if ( disposition == " INLINE " ) " JSON_ARRAY " else " ARROW_STREAM" ,
247259 wait_timeout = " 0s" , # Async execution
248260 host = conn @ host ,
249261 token = conn @ token
@@ -265,8 +277,8 @@ setMethod(
265277# '
266278# ' @param conn A DatabricksConnection object
267279# ' @param statement SQL statement to execute
268- # ' @param disposition Query disposition mode: "EXTERNAL_LINKS" (default) for large results,
269- # ' "INLINE" for small metadata queries (automatically chooses appropriate format)
280+ # ' @param disposition Query disposition mode. Defaults to the connection's
281+ # ' `disposition` setting.
270282# ' @param show_progress If `TRUE`, show progress updates during query execution (default: `TRUE`)
271283# ' @param ... Additional arguments passed to underlying query execution
272284# ' @returns A data.frame with query results
@@ -277,10 +289,12 @@ setMethod(
277289 function (
278290 conn ,
279291 statement ,
280- disposition = " EXTERNAL_LINKS " ,
292+ disposition = conn @ disposition ,
281293 show_progress = TRUE ,
282294 ...
283295 ) {
296+ disposition <- match.arg(disposition , c(" EXTERNAL_LINKS" , " INLINE" ))
297+
284298 # Detect schema discovery queries (LIMIT 0) and optimize them
285299 if (endsWith(trimws(statement ), " LIMIT 0" )) {
286300 # Force INLINE disposition and disable progress for schema queries
@@ -397,7 +411,11 @@ setMethod("dbFetch", "DatabricksResult", function(res, n = -1, ...) {
397411 }
398412
399413 # Check if we need to poll for completion and start executing step
400- initial_status <- db_sql_exec_status(statement_id = res @ statement_id )
414+ initial_status <- db_sql_exec_status(
415+ statement_id = res @ statement_id ,
416+ host = res @ connection @ host ,
417+ token = res @ connection @ token
418+ )
401419 if (initial_status $ status $ state %in% c(" RUNNING" , " PENDING" )) {
402420 cli :: cli_progress_step(" Executing query" )
403421 status <- db_sql_exec_poll_for_success(
@@ -415,6 +433,15 @@ setMethod("dbFetch", "DatabricksResult", function(res, n = -1, ...) {
415433 # Use total_row_count to detect empty result sets
416434 if (status $ manifest $ total_row_count == 0 ) {
417435 results <- db_sql_create_empty_result(status $ manifest )
436+ } else if (
437+ identical(status $ manifest $ format , " JSON_ARRAY" ) ||
438+ ! is.null(status $ result $ data_array )
439+ ) {
440+ results <- db_sql_process_inline(
441+ result_data = status $ result ,
442+ manifest = status $ manifest ,
443+ row_limit = if (n > 0 ) n else NULL
444+ )
418445 } else {
419446 # Use helper function to fetch results with progress
420447 results <- db_sql_fetch_results(
@@ -871,7 +898,8 @@ setMethod("dbGetInfo", "DatabricksConnection", function(dbObj, ...) {
871898 username = NA_character_ ,
872899 host = dbObj @ host ,
873900 port = NA_integer_ ,
874- warehouse_id = dbObj @ warehouse_id
901+ warehouse_id = dbObj @ warehouse_id ,
902+ disposition = dbObj @ disposition
875903 )
876904})
877905
0 commit comments