Changeset: ef2fa8aaf506 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef2fa8aaf506
Modified Files:
clients/R/MonetDB.R/NEWS
clients/R/MonetDB.R/R/dbi.R
clients/R/MonetDB.R/R/mapi.R
Branch: pyapi
Log Message:
R Connector: Fix for empty result set and fix for prompt-only responses
diffs (80 lines):
diff --git a/clients/R/MonetDB.R/NEWS b/clients/R/MonetDB.R/NEWS
--- a/clients/R/MonetDB.R/NEWS
+++ b/clients/R/MonetDB.R/NEWS
@@ -5,6 +5,8 @@ 0.9.8
- dbWriteTable now quotes table/column names if necessary, and outputs
warnings if it did
- New mdbapply function to automatically create and run embedded R functions
in MonetDB
- Fixes for dplyr backend
+- Fix for case when query only returns a prompt (CALL ..., Thanks, Roman)
+- Fix for empty result set on dbGetQuery(), no longer returning NULL (Thanks,
Fabian)
0.9.7
- Fixed crash on Windows (Sorry, everyone)
diff --git a/clients/R/MonetDB.R/R/dbi.R b/clients/R/MonetDB.R/R/dbi.R
--- a/clients/R/MonetDB.R/R/dbi.R
+++ b/clients/R/MonetDB.R/R/dbi.R
@@ -220,8 +220,7 @@ setMethod("dbReadTable", "MonetDBConnect
# This one does all the work in this class
setMethod("dbSendQuery", signature(conn="MonetDBConnection",
statement="character"),
- def=function(conn, statement, ..., list=NULL, async=FALSE) {
-
+ def=function(conn, statement, ..., list=NULL, async=FALSE) {
if(!is.null(list) || length(list(...))){
if (length(list(...))) statement <- .bindParameters(statement, list(...))
if (!is.null(list)) statement <- .bindParameters(statement, list)
@@ -245,11 +244,11 @@ setMethod("dbSendQuery", signature(conn=
env$data <- resp$tuples
resp$tuples <- NULL # clean up
env$info <- resp
- env$delivered <- 0
+ env$delivered <- -1
env$query <- statement
env$open <- TRUE
}
- if (resp$type == Q_UPDATE || resp$type == Q_CREATE || resp$type ==
MSG_ASYNC_REPLY) {
+ if (resp$type == Q_UPDATE || resp$type == Q_CREATE || resp$type ==
MSG_ASYNC_REPLY || resp$type == MSG_PROMPT) {
env$success = TRUE
env$conn <- conn
env$query <- statement
@@ -483,6 +482,9 @@ setMethod("dbFetch", signature(res="Mone
# okay, so we arrive here with the tuples from the first result in
res@env$data as a list
info <- res@env$info
+ if (res@env$delivered < 0) {
+ res@env$delivered <- 0
+ }
stopifnot(res@env$delivered <= info$rows, info$index <= info$rows)
remaining <- info$rows - res@env$delivered
@@ -523,7 +525,7 @@ setMethod("dbFetch", signature(res="Mone
# we have delivered everything, return empty df (spec is not clear on this
one...)
if (n < 1) {
- return(data.frame(df))
+ return(data.frame(df, stringsAsFactors=F))
}
# if our tuple cache in res@env$data does not contain n rows, we fetch from
server until it does
@@ -576,7 +578,6 @@ setMethod("dbFetch", signature(res="Mone
class(df) <- "data.frame"
# if (getOption("monetdb.profile", T)) .profiler_clear()
-
df
})
diff --git a/clients/R/MonetDB.R/R/mapi.R b/clients/R/MonetDB.R/R/mapi.R
--- a/clients/R/MonetDB.R/R/mapi.R
+++ b/clients/R/MonetDB.R/R/mapi.R
@@ -159,7 +159,9 @@ REPLY_SIZE <- 100 # Apparently, -1 me
# determines and partially parses the answer from the server in response to a
query
.mapiParseResponse <- function(response) {
- #lines <- .Call("mapiSplitLines", response, PACKAGE="MonetDB.R")
+ if (response == MSG_PROMPT) { # prompt
+ return(list(type = MSG_PROMPT))
+ }
lines <- strsplit(response, "\n", fixed=TRUE, useBytes=TRUE)[[1]]
if (length(lines) < 1) {
stop("Invalid response from server. Try re-connecting.")
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list