Changeset: ffe112fbd31a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffe112fbd31a Added Files: sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.stable.err sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.stable.out Removed Files: sql/test/BugTracker-2015/Tests/inf-nan-handling.Bug-3696.sql~ Modified Files: clients/R/MonetDB.R/DESCRIPTION clients/R/MonetDB.R/NEWS clients/R/MonetDB.R/R/dbi.R clients/R/Tests/dbi.R gdk/gdk_atoms.c sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit sql/server/rel_optimizer.c sql/test/BugTracker-2015/Tests/All Branch: default Log Message:
Merge with default diffs (truncated from 661 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,5 +1,5 @@ Package: MonetDB.R -Version: 0.9.7 +Version: 0.9.8 Title: Connect MonetDB to R Authors@R: c(person("Hannes Muehleisen", role = c("aut", "cre"),email = "han...@cwi.nl"), person("Thomas Lumley", role = "ctb"), 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,3 +1,8 @@ +0.9.8 +- 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 + 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 @@ -432,31 +432,29 @@ setMethod("dbSendUpdateAsync", signature ### MonetDBResult setClass("MonetDBResult", representation("DBIResult", env="environment")) +.CT_INT <- 0L .CT_NUM <- 1L .CT_CHR <- 2L .CT_CHRR <- 3L .CT_BOOL <- 4L .CT_RAW <- 5L +# type mapping matrix +monetTypes <- rep(c("integer", "numeric", "character", "character", "logical", "raw"), c(6, 5, 4, 6, 1, 1)) +names(monetTypes) <- c(c("WRD", "TINYINT", "SMALLINT", "INT", "MONTH_INTERVAL"), # month_interval is the diff between date cols, int + c("BIGINT", "HUGEINT", "REAL", "DOUBLE", "DECIMAL", "SEC_INTERVAL"), # sec_interval is the difference between timestamps, float + c("CHAR", "VARCHAR", "CLOB", "STR"), + c("INTERVAL", "DATE", "TIME", "TIMETZ", "TIMESTAMP", "TIMESTAMPTZ"), + c("BOOLEAN"), + c("BLOB")) + monetdbRtype <- function(dbType) { dbType <- toupper(dbType) - - if (dbType %in% c("TINYINT", "SMALLINT", "INT", "BIGINT", "HUGEINT", "REAL", "DOUBLE", "DECIMAL", "WRD")) { - return("numeric") + rtype <- monetTypes[dbType] + if (is.na(rtype)) { + stop("Unknown DB type ", dbType) } - if (dbType %in% c("CHAR", "VARCHAR", "CLOB", "STR")) { - return("character") - } - if (dbType %in% c("INTERVAL", "DATE", "TIME", "TIMESTAMP")) { - return("date") - } - if (dbType == "BOOLEAN") { - return("logical") - } - if (dbType == "BLOB") { - return("raw") - } - stop("Unknown DB type ", dbType) + rtype } setMethod("fetch", signature(res="MonetDBResult", n="numeric"), def=function(res, n, ...) { @@ -491,6 +489,10 @@ setMethod("dbFetch", signature(res="Mone for (i in seq.int(info$cols)) { rtype <- monetdbRtype(info$types[i]) + if (rtype=="integer") { + df[[i]] <- integer() + ct[i] <- .CT_INT + } if (rtype=="numeric") { df[[i]] <- numeric() ct[i] <- .CT_NUM @@ -499,10 +501,6 @@ setMethod("dbFetch", signature(res="Mone df[[i]] <- character() ct[i] <- .CT_CHR } - if (rtype=="date") { - df[[i]] <- character() - ct[i] <- .CT_CHRR - } if (rtype=="logical") { df[[i]] <- logical() ct[i] <- .CT_BOOL @@ -537,6 +535,8 @@ setMethod("dbFetch", signature(res="Mone # convert values column by column for (j in seq.int(info$cols)) { col <- ct[[j]] + if (col == .CT_INT) + df[[j]] <- as.integer(parts[[j]]) if (col == .CT_NUM) df[[j]] <- as.numeric(parts[[j]]) if (col == .CT_CHRR) { @@ -597,17 +597,10 @@ setMethod("dbIsValid", signature(dbObj=" return(invisible(TRUE)) }) -monetTypes <- rep(c("numeric", "character", "character", "logical", "raw"), c(9, 3, 4, 1, 1)) -names(monetTypes) <- c(c("TINYINT", "SMALLINT", "INT", "BIGINT", "HUGEINT", "REAL", "DOUBLE", "DECIMAL", "WRD"), - c("CHAR", "VARCHAR", "CLOB"), - c("INTERVAL", "DATE", "TIME", "TIMESTAMP"), - "BOOLEAN", - "BLOB") - - setMethod("dbColumnInfo", "MonetDBResult", def = function(res, ...) { return(data.frame(field.name=res@env$info$names, field.type=res@env$info$types, - data.type=monetTypes[res@env$info$types])) + data.type=monetTypes[res@env$info$types], r.data.type=monetTypes[res@env$info$types], + monetdb.data.type=res@env$info$types)) }, valueClass = "data.frame") diff --git a/clients/R/Tests/dbi.R b/clients/R/Tests/dbi.R --- a/clients/R/Tests/dbi.R +++ b/clients/R/Tests/dbi.R @@ -41,7 +41,7 @@ dbSendUpdate(con,"CREATE TABLE monetdbte stopifnot(identical(dbExistsTable(con,tname),TRUE)) dbSendUpdate(con,"INSERT INTO monetdbtest VALUES ('one',1,'1111')") dbSendUpdate(con,"INSERT INTO monetdbtest VALUES ('two',2,'22222222')") -stopifnot(identical(dbGetQuery(con,"SELECT count(*) FROM monetdbtest")[[1]],2)) +stopifnot(identical(dbGetQuery(con,"SELECT count(*) FROM monetdbtest")[[1]],2L)) stopifnot(identical(dbReadTable(con,tname)[[3]],list(charToRaw("1111"),charToRaw("22222222")))) dbRemoveTable(con,tname) stopifnot(identical(dbExistsTable(con,tname),FALSE)) @@ -170,6 +170,9 @@ dbSendUpdate(conn, "INSERT INTO monetdbt stopifnot(identical("Роман Mühleisen", dbGetQuery(conn,"SELECT a FROM monetdbtest")$a[[1]])) dbRollback(conn) +# this returns a column with esoteric type MONTH_INTERVAL +stopifnot(identical(1L, as.integer(dbGetQuery(con, "select cast('2015-03-02' as date) - cast('2015-03-01' as date)")[[1]][[1]]))) + stopifnot(dbIsValid(conn)) #thrice to catch null pointer errors stopifnot(identical(dbDisconnect(con),TRUE)) @@ -177,6 +180,8 @@ stopifnot(!dbIsValid(conn)) stopifnot(identical(dbDisconnect(con),TRUE)) stopifnot(identical(dbDisconnect(con),TRUE)) + + #test merovingian control code #cannot really do this in Mtest, sorry #stopifnot(dbname %in% monetdbd.liststatus("monetdb")$dbname) diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -23,7 +23,13 @@ #include "monetdb_config.h" #include "gdk.h" #include "gdk_private.h" -#include <math.h> /* for INFINITY and NAN */ +#include <math.h> /* for isfinite macro */ +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> /* for Solaris */ +#ifndef isfinite +#define isfinite(f) finite(f) +#endif +#endif static int bteCmp(const bte *l, const bte *r) diff --git a/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit b/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit --- a/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit +++ b/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit @@ -21,183 +21,9 @@ stdout of test '05-explain` in directory Ready. -# 15:45:52 > -# 15:45:52 > "/usr/bin/python2" "05-explain.SQL.py" "05-explain" -# 15:45:52 > - -#set optimizer = 'sequential_pipe'; -#explain select -# n_name, -# sum(l_extendedprice * (1 - l_discount)) as revenue -#from -# customer, -# orders, -# lineitem, -# supplier, -# nation, -# region -#where -# c_custkey = o_custkey -# and l_orderkey = o_orderkey -# and l_suppkey = s_suppkey -# and c_nationkey = s_nationkey -# and s_nationkey = n_nationkey -# and n_regionkey = r_regionkey -# and r_name = 'ASIA' -# and o_orderdate >= date '1994-01-01' -# and o_orderdate < date '1994-01-01' + interval '1' year -#group by -# n_name -#order by -# revenue desc; -% .explain # table_name -% mal # name -% clob # type -% 571 # length -function user.s2_1{autoCommit=true}(A0:bte,A1:str,A2:date,A3:date,A4:int):void; - X_7 := sql.mvc(); - X_11:bat[:oid,:date] := sql.bind(X_7,"sys","orders","o_orderdate",0); - X_8:bat[:oid,:oid] := sql.tid(X_7,"sys","orders"); - X_19 := mtime.addmonths(A3,A4); - X_236 := algebra.subselect(X_11,X_8,A2,X_19,true,false,false); - (X_14,r1_14) := sql.bind(X_7,"sys","orders","o_orderdate",2); - X_237 := algebra.subselect(r1_14,A2,X_19,true,false,false); - X_17:bat[:oid,:date] := sql.bind(X_7,"sys","orders","o_orderdate",1); - X_238 := algebra.subselect(X_17,X_8,A2,X_19,true,false,false); - X_20 := sql.subdelta(X_236,X_8,X_14,X_237,X_238); - X_22:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",0); - (X_24,r1_29) := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",2); - X_26:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",1); - X_27 := sql.projectdelta(X_20,X_22,X_24,r1_29,X_26); - X_28:bat[:oid,:oid] := sql.tid(X_7,"sys","customer"); - (X_30,r1_37) := algebra.join(X_27,X_28); - X_32 := X_20; - X_33 := algebra.leftfetchjoin(X_30,X_32); - X_34:bat[:oid,:oid] := sql.tid(X_7,"sys","lineitem"); - X_37:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",0); - (X_40,r1_47) := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",2); - X_43:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",1); - X_45 := sql.projectdelta(X_34,X_37,X_40,r1_47,X_43); - (X_46,r1_54) := algebra.join(X_33,X_45); - X_48:bat[:oid,:int] := sql.bind(X_7,"sys","lineitem","l_suppkey",0); - (X_50,r1_58) := sql.bind(X_7,"sys","lineitem","l_suppkey",2); - X_52:bat[:oid,:int] := sql.bind(X_7,"sys","lineitem","l_suppkey",1); - X_53 := sql.projectdelta(X_34,X_48,X_50,r1_58,X_52); - X_54 := algebra.leftfetchjoin(r1_54,X_53); - X_55:bat[:oid,:wrd] := batmkey.hash(X_54); - X_57:bat[:oid,:int] := sql.bind(X_7,"sys","customer","c_nationkey",0); - (X_60,r1_72) := sql.bind(X_7,"sys","customer","c_nationkey",2); - X_62:bat[:oid,:int] := sql.bind(X_7,"sys","customer","c_nationkey",1); - X_64 := sql.projectdelta(X_28,X_57,X_60,r1_72,X_62); - X_65:bat[:oid,:int] := algebra.leftfetchjoinPath(X_46,r1_37,X_64); - X_66:bat[:oid,:wrd] := mkey.bulk_rotate_xor_hash(X_55,22,X_65); - X_67:bat[:oid,:oid] := sql.tid(X_7,"sys","supplier"); - X_69:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_suppkey",0); - (X_72,r1_86) := sql.bind(X_7,"sys","supplier","s_suppkey",2); - X_75:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_suppkey",1); - X_77 := sql.projectdelta(X_67,X_69,X_72,r1_86,X_75); - X_78:bat[:oid,:wrd] := batmkey.hash(X_77); - X_79:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_nationkey",0); - (X_81,r1_97) := sql.bind(X_7,"sys","supplier","s_nationkey",2); - X_83:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_nationkey",1); - X_84 := sql.projectdelta(X_67,X_79,X_81,r1_97,X_83); - X_85:bat[:oid,:wrd] := mkey.bulk_rotate_xor_hash(X_78,22,X_84); - (X_86,r1_103) := algebra.join(X_66,X_85); - X_88 := algebra.leftfetchjoin(X_86,X_54); - X_89 := algebra.leftfetchjoin(r1_103,X_77); - X_90:bat[:oid,:bit] := batcalc.==(X_88,X_89); - X_92 := algebra.subselect(X_90,true,true,true,true,false); - X_94 := algebra.leftfetchjoin(X_92,X_86); - X_95 := algebra.leftfetchjoin(X_94,X_65); - X_96 := algebra.leftfetchjoin(X_92,r1_103); - X_97 := algebra.leftfetchjoin(X_96,X_84); - X_98:bat[:oid,:bit] := batcalc.==(X_95,X_97); - X_99 := algebra.subselect(X_98,true,true,true,true,false); - X_100:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",0); - (X_105,r1_127) := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",2); - X_108:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",1); - X_110 := sql.projectdelta(X_67,X_100,X_105,r1_127,X_108); - X_111:bat[:oid,:oid] := algebra.leftfetchjoinPath(X_99,X_96,X_110); - X_112:bat[:oid,:oid] := sql.tid(X_7,"sys","nation"); - (X_114,r1_137) := algebra.join(X_111,X_112); - X_116:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",0); - (X_118,r1_141) := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",2); - X_120:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",1); - X_121 := sql.projectdelta(X_112,X_116,X_118,r1_141,X_120); - X_122 := algebra.leftfetchjoin(r1_137,X_121); - X_125:bat[:oid,:str] := sql.bind(X_7,"sys","region","r_name",0); - X_123:bat[:oid,:oid] := sql.tid(X_7,"sys","region"); - X_239 := algebra.subselect(X_125,X_123,A1,A1,true,true,false); - (X_127,r1_151) := sql.bind(X_7,"sys","region","r_name",2); - X_240 := algebra.subselect(r1_151,A1,A1,true,true,false); - X_129:bat[:oid,:str] := sql.bind(X_7,"sys","region","r_name",1); - X_241 := algebra.subselect(X_129,X_123,A1,A1,true,true,false); - X_130 := sql.subdelta(X_239,X_123,X_127,X_240,X_241); - X_133 := X_130; - (X_134,r1_161) := algebra.join(X_122,X_133); - X_242 := algebra.leftfetchjoin(X_134,X_114); - X_136 := algebra.leftfetchjoin(X_99,X_94); - X_137:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_extendedprice",0); - (X_142,r1_169) := sql.bind(X_7,"sys","lineitem","l_extendedprice",2); - X_145:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_extendedprice",1); - X_147 := sql.projectdelta(X_34,X_137,X_142,r1_169,X_145); - X_148:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_242,X_136,r1_54,X_147); - X_149 := calc.lng(A0,15,2); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list