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

Reply via email to