Changeset: e4d905fbede4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e4d905fbede4
Modified Files:
        monetdb5/modules/kernel/algebra.c
        sql/backends/monet5/sql_statement.c
        sql/test/SQLancer/Tests/sqlancer13.test
Branch: default
Log Message:

For simple anti range selects, generate algebra.select instead of 
batcalc.between + algebra.select on true values


diffs (122 lines):

diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -284,7 +284,6 @@ static str
 ALGselect2nil(bat *result, const bat *bid, const bat *sid, const void *low, 
const void *high, const bit *li, const bit *hi, const bit *anti, const bit 
*unknown)
 {
        BAT *b, *s = NULL, *bn;
-       const void *nilptr;
        bit nanti = *anti, nli = *li, nhi = *hi;
 
        if (!*unknown)
@@ -305,17 +304,20 @@ ALGselect2nil(bat *result, const bat *bi
        derefStr(b, low);
        derefStr(b, high);
        /* here we don't need open ended parts with nil */
-       nilptr = ATOMnilptr(b->ttype);
-       if (nli == 1 && ATOMcmp(b->ttype, low, nilptr) == 0) {
-               low = high;
-               nli = 0;
+       if (!nanti) {
+               const void *nilptr = ATOMnilptr(b->ttype);
+               if (nli == 1 && ATOMcmp(b->ttype, low, nilptr) == 0) {
+                       low = high;
+                       nli = 0;
+               }
+               if (nhi == 1 && ATOMcmp(b->ttype, high, nilptr) == 0) {
+                       high = low;
+                       nhi = 0;
+               }
+               if (ATOMcmp(b->ttype, low, high) == 0 && ATOMcmp(b->ttype, 
high, nilptr) == 0) /* ugh sql nil != nil */
+                       nanti = 1;
        }
-       if (nhi == 1 && ATOMcmp(b->ttype, high, nilptr) == 0) {
-               high = low;
-               nhi = 0;
-       }
-       if (ATOMcmp(b->ttype, low, high) == 0 && ATOMcmp(b->ttype, high, 
nilptr) == 0) /* ugh sql nil != nil */
-               nanti = !nanti;
+
        bn = BATselect(b, s, low, high, nli, nhi, nanti);
        BBPunfix(b->batCacheid);
        if (s)
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
@@ -1638,7 +1638,6 @@ argumentZero(MalBlkPtr mb, int tpe)
 }
 */
 
-
 static InstrPtr
 select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
**Sub, int anti, int swapped, int type, int
                reduce)
@@ -1652,7 +1651,7 @@ select2_join2(backend *be, stmt *op1, st
        if (op1->nr < 0 || (sub && sub->nr < 0))
                return NULL;
        l = op1->nr;
-       if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || (cmp & CMP_BETWEEN 
&& anti) || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && (type == 
st_uselect2)) {
+       if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || op2->nrcols > 0 || 
op3->nrcols > 0 || !reduce) && (type == st_uselect2)) {
                int k;
                int nrcols = (op1->nrcols || op2->nrcols || op3->nrcols);
 
diff --git a/sql/test/SQLancer/Tests/sqlancer13.test 
b/sql/test/SQLancer/Tests/sqlancer13.test
--- a/sql/test/SQLancer/Tests/sqlancer13.test
+++ b/sql/test/SQLancer/Tests/sqlancer13.test
@@ -631,6 +631,21 @@ SELECT t0.c0 FROM t0 WHERE t0.c0 BETWEEN
 ----
 
 query I rowsort
+SELECT t0.c0 FROM t0 WHERE t0.c0 BETWEEN 3 AND 0
+----
+
+query I rowsort
+SELECT t0.c0 FROM t0 WHERE t0.c0 NOT BETWEEN 3 AND 0
+----
+-7
+0
+1
+2
+6
+7
+9
+
+query I rowsort
 SELECT t0.c0 FROM t0 WHERE t0.c0 NOT BETWEEN 0 AND 0
 ----
 -7
@@ -658,6 +673,34 @@ query I rowsort
 SELECT t0.c0 FROM t0 WHERE t0.c0 NOT BETWEEN NULL AND NULL
 ----
 
+statement ok
+set optimizer='sequential_pipe'
+
+query T python .explain.function_histogram
+EXPLAIN SELECT t0.c0 FROM t0 WHERE t0.c0 NOT BETWEEN 0 AND 2
+----
+user.main
+1
+querylog.define
+1
+sql.mvc
+1
+sql.tid
+1
+sql.bind
+1
+algebra.select
+1
+algebra.projection
+1
+bat.pack
+5
+sql.resultSet
+1
+
+statement ok
+set optimizer='default_pipe'
+
 query T rowsort
 SELECT t2.c2 FROM t0, t2 WHERE (- (t0.c0)) BETWEEN ASYMMETRIC 
(CAST(0.49579459740908504716827565061976201832294464111328125 AS TINYINT)) AND 
(CASE WHEN FALSE THEN t0.c0 END)
 ----
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to