Changeset: 933363b389f7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=933363b389f7 Added Files: sql/test/BugTracker-2017/Tests/all_dates.csv.gz sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.sql sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.stable.err sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.stable.out sql/test/BugTracker-2017/Tests/heapextend.Bug-6134.sql.in Modified Files: gdk/gdk_cross.c gdk/gdk_select.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c sql/storage/bat/bat_table.c sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out sql/test/BugTracker-2017/Tests/All Branch: default Log Message:
Merge with Dec2016 branch. diffs (truncated from 2363 to 300 lines): diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c --- a/gdk/gdk_cross.c +++ b/gdk/gdk_cross.c @@ -9,49 +9,7 @@ #include "monetdb_config.h" #include "gdk.h" #include "gdk_private.h" - -static gdk_return -BATcross1(BAT **r1p, BAT **r2p, BAT *l, BAT *r) -{ - BAT *bn1, *bn2; - BUN i, j; - oid *restrict p1, *restrict p2; - - bn1 = COLnew(0, TYPE_oid, BATcount(l) * BATcount(r), TRANSIENT); - bn2 = COLnew(0, TYPE_oid, BATcount(l) * BATcount(r), TRANSIENT); - if (bn1 == NULL || bn2 == NULL) { - BBPreclaim(bn1); - BBPreclaim(bn2); - return GDK_FAIL; - } - p1 = (oid *) Tloc(bn1, 0); - p2 = (oid *) Tloc(bn2, 0); - for (i = 0; i < BATcount(l); i++) { - for (j = 0; j < BATcount(r); j++) { - *p1++ = i + l->hseqbase; - *p2++ = j + r->hseqbase; - } - } - BATsetcount(bn1, BATcount(l) * BATcount(r)); - BATsetcount(bn2, BATcount(l) * BATcount(r)); - bn1->tsorted = 1; - bn1->trevsorted = BATcount(l) <= 1; - bn1->tkey = BATcount(r) <= 1; - bn1->tdense = bn1->tkey != 0; - bn1->tnil = 0; - bn1->tnonil = 1; - bn2->tsorted = BATcount(l) <= 1; - bn2->trevsorted = BATcount(bn2) <= 1; - bn2->tkey = BATcount(l) <= 1; - bn2->tdense = bn2->tkey != 0; - bn2->tnil = 0; - bn2->tnonil = 1; - BATtseqbase(bn1, l->hseqbase); - BATtseqbase(bn2, r->hseqbase); - *r1p = bn1; - *r2p = bn2; - return GDK_SUCCEED; -} +#include "gdk_cand.h" /* Calculate a cross product between bats l and r with optional * candidate lists sl for l and sr for r. @@ -60,28 +18,75 @@ BATcross1(BAT **r1p, BAT **r2p, BAT *l, gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr) { - BAT *bn1, *bn2, *t; + BAT *bn1, *bn2; + BUN start1, start2; + BUN end1, end2; + BUN cnt1, cnt2; + const oid *restrict lcand, *restrict rcand; + const oid *lcandend, *rcandend; + oid seq; + oid *restrict p; + BUN i, j; - if (BATcross1(&bn1, &bn2, sl ? sl : l, sr ? sr : r) != GDK_SUCCEED) + CANDINIT(l, sl, start1, end1, cnt1, lcand, lcandend); + CANDINIT(r, sr, start2, end2, cnt2, rcand, rcandend); + if (lcand) + cnt1 = lcandend - lcand; + if (rcand) + cnt2 = rcandend - rcand; + + bn1 = COLnew(0, TYPE_oid, cnt1 * cnt2, TRANSIENT); + if (bn1 == NULL) return GDK_FAIL; - if (sl) { - t = BATproject(bn1, sl); - BBPunfix(bn1->batCacheid); - if (t == NULL) { - BBPunfix(bn2->batCacheid); - return GDK_FAIL; - } - bn1 = t; + BATsetcount(bn1, cnt1 * cnt2); + bn1->tsorted = 1; + bn1->trevsorted = cnt1 <= 1; + bn1->tkey = cnt2 <= 1; + bn1->tnil = 0; + bn1->tnonil = 1; + p = (oid *) Tloc(bn1, 0); + if (lcand) { + for (i = 0; i < cnt1; i++) + for (j = 0; j < cnt2; j++) + *p++ = lcand[i]; + bn1->tdense = 0; + } else { + seq = l->hseqbase + start1; + for (i = 0; i < cnt1; i++) + for (j = 0; j < cnt2; j++) + *p++ = i + seq; + bn1->tdense = bn1->tkey != 0; + if (bn1->tdense) + BATtseqbase(bn1, seq); } - if (sr) { - t = BATproject(bn2, sr); - BBPunfix(bn2->batCacheid); - if (t == NULL) { - BBPunfix(bn1->batCacheid); - return GDK_FAIL; - } - bn2 = t; + + bn2 = COLnew(0, TYPE_oid, cnt1 * cnt2, TRANSIENT); + if (bn2 == NULL) { + BBPreclaim(bn1); + return GDK_FAIL; } + BATsetcount(bn2, cnt1 * cnt2); + bn2->tsorted = cnt1 <= 1; + bn2->trevsorted = cnt2 <= 1; + bn2->tkey = cnt1 <= 1; + bn2->tnil = 0; + bn2->tnonil = 1; + p = (oid *) Tloc(bn2, 0); + if (rcand) { + for (i = 0; i < cnt1; i++) + for (j = 0; j < cnt2; j++) + *p++ = rcand[j]; + bn2->tdense = 0; + } else { + seq = r->hseqbase + start2; + for (i = 0; i < cnt1; i++) + for (j = 0; j < cnt2; j++) + *p++ = j + seq; + bn2->tdense = bn2->tkey != 0; + if (bn2->tdense) + BATtseqbase(bn2, seq); + } + *r1p = bn1; *r2p = bn2; return GDK_SUCCEED; diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -1257,6 +1257,20 @@ BATselect(BAT *b, BAT *s, const void *tl /* can we use the base type? */ t = ATOMbasetype(t); lnil = ATOMcmp(t, tl, nil) == 0; /* low value = nil? */ + + if (!lnil && th != NULL && (!li || !hi) && !anti && ATOMcmp(t, tl, th) == 0) { + /* upper and lower bound of range are equal and we + * want an interval that's open on at least one + * side */ + ALGODEBUG fprintf(stderr, "#BATselect(b=%s#" BUNFMT + ",s=%s%s,li=%d,hi=%d,anti=%d): empty interval\n", + BATgetId(b), BATcount(b), + s ? BATgetId(s) : "NULL", + s && BATtdense(s) ? "(dense)" : "", + li, hi, anti); + return newempty(); + } + lval = !lnil || th == NULL; /* low value used for comparison */ equi = th == NULL || (lval && ATOMcmp(t, tl, th) == 0); /* point select? */ if (equi) { diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -1279,7 +1279,7 @@ stmt_uselect(backend *be, stmt *op1, stm q = pushArgument(mb, q, r); q = pushArgument(mb, q, r); q = pushBit(mb, q, TRUE); - q = pushBit(mb, q, FALSE); + q = pushBit(mb, q, TRUE); q = pushBit(mb, q, FALSE); if (q == NULL) return NULL; diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c --- a/sql/storage/bat/bat_table.c +++ b/sql/storage/bat/bat_table.c @@ -261,7 +261,8 @@ rids_select( sql_trans *tr, sql_column * BAT *b = NULL, *r = NULL, *s = NULL; rids *rs = ZNEW(rids); const void *kvl = key_value_low, *kvh = key_value_high; - int hi = 0; + /* if pointers are equal, make it an inclusive select */ + int hi = key_value_low == key_value_high; s = delta_cands(tr, key->t); b = full_column(tr, key); diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -296,38 +296,38 @@ end user.s10_1; % clob # type % 142 # length function user.s20_1():void; - X_90:void := querylog.define("-- no query", "sequential_pipe", 12:int); - X_38 := bat.new(nil:str); - X_45 := bat.append(X_38, "sys.functions"); - X_55 := bat.append(X_45, "sys.functions"); + X_89:void := querylog.define("-- no query", "sequential_pipe", 12:int); + X_37 := bat.new(nil:str); + X_44 := bat.append(X_37, "sys.functions"); + X_54 := bat.append(X_44, "sys.functions"); + X_39 := bat.new(nil:str); + X_46 := bat.append(X_39, "name"); + X_55 := bat.append(X_46, "func"); X_40 := bat.new(nil:str); - X_47 := bat.append(X_40, "name"); - X_56 := bat.append(X_47, "func"); - X_41 := bat.new(nil:str); - X_49 := bat.append(X_41, "varchar"); - X_58 := bat.append(X_49, "varchar"); - X_42 := bat.new(nil:int); - X_51 := bat.append(X_42, 256:int); - X_59 := bat.append(X_51, 8196:int); - X_44 := bat.new(nil:int); - X_53 := bat.append(X_44, 0:int); - X_61 := bat.append(X_53, 0:int); + X_48 := bat.append(X_40, "varchar"); + X_57 := bat.append(X_48, "varchar"); + X_41 := bat.new(nil:int); + X_50 := bat.append(X_41, 256:int); + X_58 := bat.append(X_50, 8196:int); + X_43 := bat.new(nil:int); + X_52 := bat.append(X_43, 0:int); + X_60 := bat.append(X_52, 0:int); X_5 := sql.mvc(); C_6:bat[:oid] := sql.tid(X_5, "sys", "functions"); X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int); (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", "name", 2:int); X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int); X_18 := sql.projectdelta(C_6, X_9, C_14, X_15, X_12); - X_101:bat[:bit] := batalgebra.like(X_18, "%optimizers%":str); - C_32 := algebra.select(X_101, true, true, true, false, false); - X_35 := algebra.projection(C_32, X_18); + X_100:bat[:bit] := batalgebra.like(X_18, "%optimizers%":str); + C_32 := algebra.select(X_100, true, true, true, true, false); + X_34 := algebra.projection(C_32, X_18); X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int); (C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions", "func", 2:int); X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int); X_25 := sql.projectdelta(C_6, X_19, C_22, X_23, X_21); - X_36 := algebra.projection(C_32, X_25); + X_35 := algebra.projection(C_32, X_25); X_2:void := querylog.define("explain select name,func from functions where contains(name, \\'optimizers\\');", "sequential_pipe", 37:int); - sql.resultSet(X_55, X_56, X_58, X_59, X_61, X_35, X_36); + sql.resultSet(X_54, X_55, X_57, X_58, X_60, X_34, X_35); end user.s20_1; #inline actions= 0 time=12 usec #remap actions= 1 time=100 usec @@ -358,38 +358,38 @@ end user.s20_1; % clob # type % 146 # length function user.s22_1():void; - X_90:void := querylog.define("-- no query", "sequential_pipe", 12:int); - X_38 := bat.new(nil:str); - X_45 := bat.append(X_38, "sys.functions"); - X_55 := bat.append(X_45, "sys.functions"); + X_89:void := querylog.define("-- no query", "sequential_pipe", 12:int); + X_37 := bat.new(nil:str); + X_44 := bat.append(X_37, "sys.functions"); + X_54 := bat.append(X_44, "sys.functions"); + X_39 := bat.new(nil:str); + X_46 := bat.append(X_39, "name"); + X_55 := bat.append(X_46, "func"); X_40 := bat.new(nil:str); - X_47 := bat.append(X_40, "name"); - X_56 := bat.append(X_47, "func"); - X_41 := bat.new(nil:str); - X_49 := bat.append(X_41, "varchar"); - X_58 := bat.append(X_49, "varchar"); - X_42 := bat.new(nil:int); - X_51 := bat.append(X_42, 256:int); - X_59 := bat.append(X_51, 8196:int); - X_44 := bat.new(nil:int); - X_53 := bat.append(X_44, 0:int); - X_61 := bat.append(X_53, 0:int); + X_48 := bat.append(X_40, "varchar"); + X_57 := bat.append(X_48, "varchar"); + X_41 := bat.new(nil:int); + X_50 := bat.append(X_41, 256:int); + X_58 := bat.append(X_50, 8196:int); + X_43 := bat.new(nil:int); + X_52 := bat.append(X_43, 0:int); + X_60 := bat.append(X_52, 0:int); X_5 := sql.mvc(); C_6:bat[:oid] := sql.tid(X_5, "sys", "functions"); X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int); (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", "name", 2:int); X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int); X_18 := sql.projectdelta(C_6, X_9, C_14, X_15, X_12); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list