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