Changeset: 808f4e17c496 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=808f4e17c496
Added Files:
clients/R/MonetDB.R/man/dbApply.Rd
clients/R/Tests/dbapply.reqtests
clients/R/Tests/dplyr-flights.R
clients/R/Tests/dplyr-flights.reqtest
clients/R/Tests/dplyr-flights.stable.err
clients/R/Tests/dplyr-flights.stable.out
sql/test/BugTracker-2015/Tests/epoch_now.Bug-3740.sql
sql/test/BugTracker-2015/Tests/epoch_now.Bug-3740.stable.err
sql/test/BugTracker-2015/Tests/epoch_now.Bug-3740.stable.out
sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.sql
sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err
sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.out
sql/test/BugTracker-2015/Tests/mergejoin_NULL.Bug-3747.sql
sql/test/BugTracker-2015/Tests/mergejoin_NULL.Bug-3747.stable.err
sql/test/BugTracker-2015/Tests/mergejoin_NULL.Bug-3747.stable.out
sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.sql
sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.stable.err
sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.stable.out
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-1.sql
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-1.stable.err
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-1.stable.out
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-2.sql
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-2.stable.err
sql/test/BugTracker-2015/Tests/savepoint.Bug-3738-2.stable.out
sql/test/json/Tests/jsonvalidity.Bug-3753.save
sql/test/json/Tests/jsonvalidity.Bug-3753.sql
sql/test/json/Tests/jsonvalidity.Bug-3753.stable.err
sql/test/json/Tests/jsonvalidity.Bug-3753.stable.out
sql/test/mergetables/Tests/mergemergeload.sql
sql/test/mergetables/Tests/mergemergeload.stable.err
sql/test/mergetables/Tests/mergemergeload.stable.out
Modified Files:
clients/R/MonetDB.R/DESCRIPTION
clients/R/MonetDB.R/NAMESPACE
clients/R/MonetDB.R/NEWS
clients/R/MonetDB.R/R/control.R
clients/R/MonetDB.R/R/dbapply.R
clients/R/MonetDB.R/R/dbi.R
clients/R/MonetDB.R/R/dplyr.R
clients/R/MonetDB.R/R/mapi.R
clients/R/Tests/All
clients/R/Tests/dbapply.R
clients/R/Tests/dbapply.stable.out
clients/R/Tests/dbi.R
clients/R/Tests/dbi.stable.err
clients/R/Tests/dbi.stable.out
clients/R/Tests/dplyr.reqtests
clients/R/Tests/install-dependencies.sh
clients/R/Tests/survey.reqtests
clients/Tests/SQL-dump.stable.out
clients/Tests/SQL-dump.stable.out.int128
clients/Tests/exports.stable.out
clients/nodejs/monetdb/mapiclient.js
clients/nodejs/monetdb/package.json
clients/odbc/driver/SQLTables.c
gdk/gdk_bbp.c
gdk/gdk_join.c
gdk/gdk_search.c
gdk/gdk_select.c
geom/monetdb5/geom.c
java/Makefile.ag
java/build.properties
java/build.xml
java/src/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
monetdb5/extras/rapi/Tests/rapi01.stable.err
monetdb5/extras/rapi/rapi.c
monetdb5/mal/mal.c
monetdb5/mal/mal_profiler.c
monetdb5/mal/mal_profiler.h
monetdb5/mal/mal_runtime.c
monetdb5/modules/atoms/Tests/json15.mal
monetdb5/modules/atoms/Tests/json15.stable.out
monetdb5/modules/atoms/json.c
monetdb5/modules/kernel/algebra.c
monetdb5/modules/mal/profiler.c
monetdb5/modules/mal/profiler.h
monetdb5/modules/mal/profiler.mal
monetdb5/optimizer/Tests/dataflow3.mal
monetdb5/optimizer/Tests/dataflow3.stable.out
monetdb5/optimizer/opt_commonTerms.c
monetdb5/optimizer/opt_constants.c
monetdb5/optimizer/opt_pipes.c
monetdb5/optimizer/opt_support.c
monetdb5/tests/gdkTests/Tests/selecttst.stable.out
sql/backends/monet5/Tests/rapi09.stable.err
sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
sql/backends/monet5/generator/generator.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_upgrades.c
sql/benchmarks/nobench/Tests/nobench.sql
sql/benchmarks/nobench/Tests/nobench.stable.out
sql/benchmarks/ssbm/Tests/01-explain.stable.out
sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/02-explain.stable.out
sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/03-explain.stable.out
sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/04-explain.stable.out
sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/05-explain.stable.out
sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/06-explain.stable.out
sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/07-explain.stable.out
sql/benchmarks/ssbm/Tests/07-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/08-explain.stable.out
sql/benchmarks/ssbm/Tests/08-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/09-explain.stable.out
sql/benchmarks/ssbm/Tests/09-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/10-explain.stable.out
sql/benchmarks/ssbm/Tests/10-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/11-explain.stable.out
sql/benchmarks/ssbm/Tests/11-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/12-explain.stable.out
sql/benchmarks/ssbm/Tests/12-explain.stable.out.int128
sql/benchmarks/ssbm/Tests/13-explain.stable.out
sql/benchmarks/ssbm/Tests/13-explain.stable.out.int128
sql/benchmarks/tpch/Tests/01-explain.stable.out.int128
sql/benchmarks/tpch/Tests/02-explain.stable.out
sql/benchmarks/tpch/Tests/03-explain.stable.out
sql/benchmarks/tpch/Tests/03-explain.stable.out.int128
sql/benchmarks/tpch/Tests/04-explain.stable.out
sql/benchmarks/tpch/Tests/05-explain.stable.out
sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/05-explain.stable.out.int128
sql/benchmarks/tpch/Tests/06-explain.stable.out.int128
sql/benchmarks/tpch/Tests/07-explain.stable.out
sql/benchmarks/tpch/Tests/07-explain.stable.out.int128
sql/benchmarks/tpch/Tests/08-explain.stable.out
sql/benchmarks/tpch/Tests/08-explain.stable.out.int128
sql/benchmarks/tpch/Tests/09-explain.stable.out.int128
sql/benchmarks/tpch/Tests/10-explain.stable.out
sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
sql/benchmarks/tpch/Tests/11-explain.stable.out
sql/benchmarks/tpch/Tests/11-explain.stable.out.int128
sql/benchmarks/tpch/Tests/12-explain.stable.out
sql/benchmarks/tpch/Tests/12-explain.stable.out.int128
sql/benchmarks/tpch/Tests/13-explain.stable.out
sql/benchmarks/tpch/Tests/13-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/14-explain.stable.out.int128
sql/benchmarks/tpch/Tests/15-explain.stable.out.int128
sql/benchmarks/tpch/Tests/16-explain.stable.out
sql/benchmarks/tpch/Tests/16-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/17-explain.stable.out
sql/benchmarks/tpch/Tests/17-explain.stable.out.int128
sql/benchmarks/tpch/Tests/18-explain.stable.out.int128
sql/benchmarks/tpch/Tests/19-explain.stable.out
sql/benchmarks/tpch/Tests/19-explain.stable.out.int128
sql/benchmarks/tpch/Tests/20-explain.stable.out
sql/benchmarks/tpch/Tests/20-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/20-explain.stable.out.int128
sql/benchmarks/tpch/Tests/21-explain.stable.out
sql/benchmarks/tpch/Tests/21-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/22-explain.stable.out
sql/benchmarks/tpch/Tests/22-explain.stable.out.32bit
sql/benchmarks/tpch/Tests/22-explain.stable.out.int128
sql/common/sql_string.c
sql/include/sql_catalog.h
sql/jdbc/tests/Tests/Test_Dobjects.stable.out
sql/scripts/17_temporal.sql
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/rel_updates.c
sql/server/sql_mvc.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/bat/bat_utils.c
sql/storage/store.c
sql/test/BugDay_2005-10-06_2.9.3/Tests/max_min_sum_null.SF-1123132.sql
sql/test/BugDay_2005-11-09_2.8/Tests/ORDER_BY_evaluation_error.SF-1023658.stable.out
sql/test/BugDay_2005-12-19_2.9.3/Tests/weird_reponse_on_limit.SF-1314643.stable.out
sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.stable.out
sql/test/BugTracker-2009/Tests/join_topn.SF-2654133.stable.out
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out.32bit
sql/test/BugTracker-2010/Tests/offset_limited_32bit.SF-2950579.stable.out
sql/test/BugTracker-2010/Tests/offset_limited_32bit.SF-2950579.stable.out.oid32
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
sql/test/BugTracker-2011/Tests/func_iter_vs_bulk.Bug-2826.stable.out
sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.sql
sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.stable.out
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
sql/test/BugTracker-2012/Tests/strange_escaping_in_csv.Bug-2133.stable.out
sql/test/BugTracker-2013/Tests/between.Bug-3259.stable.out.int128
sql/test/BugTracker-2013/Tests/swapped_likejoin.Bug-3375.stable.out
sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err
sql/test/BugTracker-2015/Tests/All
sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out.32bit
sql/test/BugTracker/Tests/like_exp.SF-1613949.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out.int128
sql/test/Dependencies/dependency_DBobjects.sql
sql/test/Tests/setoptimizer.stable.err
sql/test/Tests/setoptimizer.stable.out
sql/test/Tests/setoptimizer.stable.out.Windows
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
sql/test/bugs/Tests/groupby_having-bug-sf-947600.stable.err
sql/test/bugs/Tests/groupby_having-bug-sf-947600.stable.out
sql/test/bugs/Tests/select_orderby_alias-bug-sf-1024615.stable.out
sql/test/bugs/Tests/subselect_ambigious_columns-bug-sf-949071.stable.out
sql/test/bugs/groupby_having-bug-sf-947600.sql
sql/test/bugs/subselect_ambigious_columns-bug-sf-949071.sql
sql/test/json/Tests/All
sql/test/json/Tests/parsing.stable.err
sql/test/leaks/Tests/check1.stable.out.int128
sql/test/leaks/Tests/check2.stable.out.int128
sql/test/leaks/Tests/check3.stable.out.int128
sql/test/leaks/Tests/check4.stable.out.int128
sql/test/leaks/Tests/check5.stable.out.int128
sql/test/mapi/Tests/php_monetdb.stable.out
sql/test/mergetables/Tests/All
sql/test/mergetables/Tests/mergequery.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
tools/merovingian/client/monetdb.c
tools/merovingian/daemon/client.c
tools/merovingian/daemon/merovingian.h
Branch: leftmart
Log Message:
merge with default
diffs (truncated from 19831 to 300 lines):
diff --git a/clients/R/MonetDB.R/DESCRIPTION b/clients/R/MonetDB.R/DESCRIPTION
--- a/clients/R/MonetDB.R/DESCRIPTION
+++ b/clients/R/MonetDB.R/DESCRIPTION
@@ -1,12 +1,13 @@
Package: MonetDB.R
-Version: 0.9.8
+Version: 1.0.0
Title: Connect MonetDB to R
Authors@R: c(person("Hannes Muehleisen", role = c("aut", "cre"),email =
"[email protected]"),
person("Thomas Lumley", role = "ctb"),
person("Anthony Damico", role = "ctb"))
Author: Hannes Muehleisen [aut, cre], Thomas Lumley [ctb], Anthony Damico [ctb]
Maintainer: Hannes Muehleisen <[email protected]>
-Depends: DBI (>= 0.3.1), digest (>= 0.6.4), methods, R (>= 3.1.1), codetools
+Depends: DBI (>= 0.3.1)
+Imports: digest (>= 0.6.4), methods, codetools
Enhances: dplyr (>= 0.3.0)
Description: Allows to pull data from MonetDB into R. Includes a DBI
implementation and a dplyr backend.
License: MPL (== 1.1)
diff --git a/clients/R/MonetDB.R/NAMESPACE b/clients/R/MonetDB.R/NAMESPACE
--- a/clients/R/MonetDB.R/NAMESPACE
+++ b/clients/R/MonetDB.R/NAMESPACE
@@ -4,7 +4,7 @@ import(DBI,digest,methods,codetools)
export(MonetDB,MonetR,MonetDBR,MonetDB.R)
export(monet.read.csv,monetdb.read.csv)
# this one is not in the DBI
-exportMethods(dbSendUpdate,dbSendUpdateAsync,dbTransaction,dbApply)
+exportMethods(dbSendUpdate,dbSendUpdateAsync,dbTransaction,mdbapply)
# shorthands
export(mc,mq)
useDynLib(MonetDB.R)
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
@@ -1,11 +1,13 @@
-0.9.9
-- dbWriteTable now quotes table/column names if necessary, and outputs
warnings if it did
-- New dbApply function to automatically create embedded R functions in MonetDB
-
-0.9.8
+1.0.0
- Added support for esoteric data types such as MONTH_INTERVAL (Thanks, Roman)
- Cleaned up SQL to R type mapping (we had this twice)
- Now creating actual R integers if data fits
+- 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 (Thanks, Anthony)
+- 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)
+- Fix for dbConnect(), it ignored the url parameter somehow, which broke some
sqlsurvey (Thanks, Anthony)
0.9.7
- Fixed crash on Windows (Sorry, everyone)
diff --git a/clients/R/MonetDB.R/R/control.R b/clients/R/MonetDB.R/R/control.R
--- a/clients/R/MonetDB.R/R/control.R
+++ b/clients/R/MonetDB.R/R/control.R
@@ -5,7 +5,7 @@ monetdb.server.start <-
if( !file.exists( bat.file ) ) stop( paste( bat.file , "does not exist.
Run monetdb.server.setup() to create a batch file." ) )
# uugly, find path of pid file again by parsing shell script.
- sc <- read.table(bat.file,sep="\n",stringsAsFactors=F)
+ sc <- utils::read.table(bat.file,sep="\n",stringsAsFactors=F)
pidfile <- substring(sc[[2,1]],11)
# run script
diff --git a/clients/R/MonetDB.R/R/dbapply.R b/clients/R/MonetDB.R/R/dbapply.R
--- a/clients/R/MonetDB.R/R/dbapply.R
+++ b/clients/R/MonetDB.R/R/dbapply.R
@@ -1,30 +1,25 @@
-.encodeGlobals <- function(name) {
- vars <- findGlobals(name,merge=F)$variables
- if (length(vars) < 1) {
- return(NA)
+# TOOD: support running this on a select in addition to table?
+# TODO: support remote dbs, find out whether its local via canary file
+# TODO: don't actually construct the data frame but use attr/class trick to
save copying
+
+if (is.null(getGeneric("mdbapply"))) setGeneric("mdbapply", function(conn,
table, fun, ...)
+ standardGeneric("mdbapply"))
+
+setMethod("mdbapply", signature(conn="MonetDBConnection"), def=function(conn,
table, fun, ...) {
+ # make sure table exists
+ if (!dbExistsTable(conn, table)) {
+ stop("Table ", table, " does not exist.")
}
- if (getOption("monetdb.debug.query",FALSE))
- message("Variable(s) ",paste0(vars,collapse=", "))
- # TODO: optionally inline serialized context for remote dbs
- res <- tempfile()
- save(list=vars,file=res,envir=environment(name),compress=T)
- return(res)
-}
-
-if (is.null(getGeneric("dbApply"))) setGeneric("dbApply", function(conn, ...)
- standardGeneric("dbApply"))
-
-setMethod("dbApply", signature(conn="MonetDBConnection"), def=function(conn,
table, rettype, fun) {
# generate unique function name
- dbfunname <- "__r_dapply_autogen_"
- while (dbGetQuery(conn,paste0("select count(*) from functions where
name='",dbfunname,"'"))[[1]] > 0)
- dbfunname <- paste0(dbfunname,sample(letters,1))
+ dbfunname <- "mdbapply_autogen_"
+ while (dbGetQuery(conn, paste0("select count(*) from functions where
name='", dbfunname, "'"))[[1]] > 0)
+ dbfunname <- paste0(dbfunname, sample(letters, 1))
# test R integration with dummy function
dbBegin(conn)
- dbSendQuery(conn,paste0("CREATE FUNCTION ",dbfunname,"() RETURNS TABLE(d
INTEGER) LANGUAGE R {1L}"))
- res <- dbGetQuery(conn,paste0("SELECT * FROM ",dbfunname,"()"))[[1]]
+ dbSendQuery(conn,paste0("CREATE FUNCTION ", dbfunname, "() RETURNS TABLE(d
INTEGER) LANGUAGE R {1L}"))
+ res <- dbGetQuery(conn,paste0("SELECT * FROM ", dbfunname, "()"))[[1]]
dbRollback(conn)
# now generate the UDF
@@ -39,28 +34,46 @@ setMethod("dbApply", signature(conn="Mon
',unique(sapply(strsplit(grep("^package:", search(),
value=T),":"), function(x) x[[2]]))), function(pname) library(pname,
character.only=T, quietly=T)))\n')
}
# serialize global variables into ascii string, and add the code to scan it
again into the current env
- sfilename <- .encodeGlobals(fun)
- if (!is.na(sfilename)) {
- dbrcode <- paste0(dbrcode,'# load serialized global
variables\nload("',sfilename,'")\n')
+ vars <- codetools::findGlobals(fun, merge=F)$variables
+ mdbapply_dotdot <- list(...)
+ if (length(mdbapply_dotdot) > 0) {
+ vars <- c(vars,"mdbapply_dotdot")
+ assign("mdbapply_dotdot", mdbapply_dotdot, envir=environment(fun))
}
+ sfilename <- NA
+ if (length(vars) > 0) {
+ if (getOption("monetdb.debug.query",FALSE))
+ message("Variable(s) ",paste0(vars,collapse=", "))
+ sfilename <- tempfile()
+ save(list=vars,file=sfilename,envir=environment(fun), compress=T)
+ dbrcode <- paste0(dbrcode, '# load serialized global variable(s) ',
paste(vars, collapse=", "), '\nload("', sfilename, '")\n')
+ }
+
+ rfilename <- tempfile()
# get source of user function and append
- dbrcode <- paste0(dbrcode,"# user-supplied function\n.userfun <-
",paste0(deparse(fun),collapse="\n"),"\n# calling user
function\nreturn(.userfun(.dbdata))\n")
+ dbrcode <- paste0(dbrcode, "# user-supplied function\nmdbapply_userfun <- ",
paste0(deparse(fun), collapse="\n"),
+ "\n# calling user function\nsaveRDS(do.call(mdbapply_userfun,
if(exists('mdbapply_dotdot')){c(list(mdbapply_dbdata), mdbapply_dotdot)}
else{list(mdbapply_dbdata)}),file=\"", rfilename, "\")\nreturn(42L)\n")
- # find out things about the table, then wrap the r function
- res <- dbSendQuery(conn,paste0("SELECT * FROM ",table," LIMIT 1"))
- dbnames <- res@env$info$names
- dbtypes <- res@env$info$dbtypes
- dbfun <- paste0("CREATE FUNCTION ",dbfunname,"(",paste0(dbnames," ",
dbtypes, collapse=", "),
- ") \nRETURNS TABLE(retval ",rettype,") LANGUAGE R {\n#
rename arguments\n.dbdata <- data.frame(",
- paste0(dbnames, collapse=", "),")\n",dbrcode,"};\n")
+ # find out things about the table, then wrap the R function
+ query <- paste0("SELECT * FROM ", table, " AS t")
+ res <- monetdb_queryinfo(conn, query)
+ dbfun <- paste0("CREATE FUNCTION ", dbfunname,"(",
paste0(dbQuoteIdentifier(conn, res$names)," ", res$dbtypes, collapse=", "),
+ ") \nRETURNS TABLE(retval INTEGER) LANGUAGE R {\n# rename
arguments\nmdbapply_dbdata <- data.frame(",
+ paste0(res$names, collapse=", "),", stringsAsFactors=F)\n",
dbrcode, "};\n")
# call the function we just created
- dbsel <- paste0("SELECT * FROM ", dbfunname, "( (SELECT * FROM ", table, "
AS t) );\n")
- # ok, talk to DB (EZ)
+ dbsel <- paste0("SELECT * FROM ", dbfunname, "( (",query,") );\n")
+ # ok, talk to DB (easiest part of this)
+ res <- NA
dbBegin(conn)
- dbSendQuery(conn,dbfun)
- res <- dbGetQuery(conn,dbsel)
- dbRollback(conn)
- return(res[,1])
+ tryCatch({
+ dbSendQuery(conn, dbfun)
+ dbGetQuery(conn, dbsel)
+ res <- readRDS(rfilename)
+ }, finally={
+ dbRollback(conn)
+ file.remove(stats::na.omit(c(sfilename, rfilename)))
+ })
+ res
})
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
@@ -22,8 +22,8 @@ setMethod("dbUnloadDriver", "MonetDBDriv
setMethod("dbGetInfo", "MonetDBDriver", def=function(dbObj, ...)
list(name="MonetDBDriver",
- driver.version=packageVersion("MonetDB.R"),
- DBI.version=packageVersion("DBI"),
+ driver.version=utils::packageVersion("MonetDB.R"),
+ DBI.version=utils::packageVersion("DBI"),
client.version="NA",
max.connections=125) # R can only handle 128 connections, three of
which are pre-allocated
)
@@ -46,8 +46,8 @@ setMethod("dbConnect", "MonetDBDriver",
password="monetdb",
host="localhost", port=50000L, timeout=86400L, wait=FALSE, language="sql",
..., url="") {
- if (substring(dbname, 1, 10) == "monetdb://") {
- url <- dbname
+ if (substring(url, 1, 10) == "monetdb://") {
+ dbname <- url
}
timeout <- as.integer(timeout)
@@ -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
@@ -288,15 +287,15 @@ setMethod("dbSendQuery", signature(conn=
# quoting
quoteIfNeeded <- function(conn, x, ...) {
- chars <- !grepl("^[A-Za-z][A-Za-z0-9_]*$", x, perl=T) &&
!grepl("^\"[^\"]*\"$", x, perl=T)
+ chars <- !grepl("^[a-z][a-z0-9_]*$", x, perl=T) & !grepl("^\"[^\"]*\"$", x,
perl=T)
if (any(chars)) {
- message("Identifier(s) ", paste(x[chars], collapse=", "), " contain
reserved SQL characters and need to be quoted.")
+ message("Identifier(s) ", paste(x[chars], collapse=", "), " contain
uppercase or reserved SQL characters and need(s) to be quoted in queries.")
}
reserved <- toupper(x) %in% .SQL92Keywords
if (any(reserved)) {
- message("Identifier(s) ", paste(x[reserved], collapse=", "), " are
reserved SQL keywords and need to be quoted.")
+ message("Identifier(s) ", paste(x[reserved], collapse=", "), " are
reserved SQL keywords and need(s) to be quoted in queries.")
}
- qts <- reserved || chars
+ qts <- reserved | chars
x[qts] <- dbQuoteIdentifier(conn, x[qts])
x
}
@@ -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
})
@@ -624,7 +625,7 @@ monet.read.csv <- monetdb.read.csv <- fu
delim=",", newline="\\n",
quote="\"", create=TRUE, ...){
if (length(na.strings)>1) stop("na.strings must be of length 1")
- headers <- lapply(files, read.csv, sep=delim, na.strings=na.strings,
quote=quote, nrows=nrow.check,
+ headers <- lapply(files, utils::read.csv, sep=delim, na.strings=na.strings,
quote=quote, nrows=nrow.check,
...)
if (!missing(nrows)) {
diff --git a/clients/R/MonetDB.R/R/dplyr.R b/clients/R/MonetDB.R/R/dplyr.R
--- a/clients/R/MonetDB.R/R/dplyr.R
+++ b/clients/R/MonetDB.R/R/dplyr.R
@@ -14,7 +14,8 @@ src_translate_env.src_monetdb <- functio
sd = dplyr::sql_prefix("STDDEV_SAMP"),
var = dplyr::sql_prefix("VAR_SAMP"),
median = dplyr::sql_prefix("MEDIAN"),
- n_distinct = function(x) {build_sql(sql("count(distinct "),x,sql(")"))}
+ n_distinct = function(x) {dplyr::build_sql(dplyr::sql("count(distinct
"),
+ x, dplyr::sql(")"))}
)
)
}
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
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list