Changeset: 3218f3a5aa4a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3218f3a5aa4a
Modified Files:
        sql/backends/monet5/sql_statement.c
Branch: pushcands
Log Message:

Merged with default


diffs (truncated from 1255 to 300 lines):

diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -173,7 +173,7 @@ project_oid(BAT *restrict bn, BAT *restr
        const oid *restrict r2t = NULL;
        struct canditer r1ci = {0}, r2ci = {0};
 
-       if ((!lci || lci->tpe == cand_dense) && !BATtdense(r1) && !r2) {
+       if ((!lci || lci->tpe == cand_dense) && r1->ttype && !BATtdense(r1) && 
!r2) {
                if (sizeof(oid) == sizeof(lng))
                        return project1_lng(bn, l, r1);
                else
@@ -808,7 +808,7 @@ BATprojectchain(BAT **bats)
        } *ba;
        BAT **tobedeleted = NULL;
        int ndelete = 0;
-       int n;
+       int n, i;
        BAT *b = NULL, *bn = NULL;
        bool allnil = false;
        bool issorted = true;
@@ -849,7 +849,7 @@ BATprojectchain(BAT **bats)
        }
 
        ndelete = 0;
-       for (n = 0; bats[n]; n++) {
+       for (n = 0, i = 0; bats[n]; n++) {
                b = bats[n];
                if (b->ttype == TYPE_msk || mask_cand(b)) {
                        if ((b = BATunmask(b)) == NULL) {
@@ -857,7 +857,9 @@ BATprojectchain(BAT **bats)
                        }
                        tobedeleted[ndelete++] = b;
                }
-               ba[n] = (struct ba) {
+               if (bats[n+1] && BATtdense(b) && b->hseqbase == b->tseqbase && 
b->tseqbase == bats[n+1]->hseqbase && BATcount(b) == BATcount(bats[n+1]))
+                       continue; /* skip dense bat */
+               ba[i] = (struct ba) {
                        .b = b,
                        .hlo = b->hseqbase,
                        .hhi = b->hseqbase + b->batCount,
@@ -870,8 +872,23 @@ BATprojectchain(BAT **bats)
                        nonil &= b->tnonil;
                if (b->tnonil && b->tkey && b->tsorted &&
                    ATOMtype(b->ttype) == TYPE_oid) {
-                       canditer_init(&ba[n].ci, NULL, b);
+                       canditer_init(&ba[i].ci, NULL, b);
                }
+               i++;
+       }
+       n = i;
+       if (i<=2) {
+               if (i == 1) {
+                       bn = ba[0].b;
+                       BBPfix(bn->batCacheid);
+               } else {
+                       bn = BATproject(ba[0].b, ba[1].b);
+               }
+               while (ndelete-- > 0)
+                       BBPunfix(tobedeleted[ndelete]->batCacheid);
+               GDKfree(tobedeleted);
+               GDKfree(ba);
+               return bn;
        }
        /* b is last BAT in bats array */
        tpe = ATOMtype(b->ttype);
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/monetdb5/optimizer/opt_emptybind.c 
b/monetdb5/optimizer/opt_emptybind.c
--- a/monetdb5/optimizer/opt_emptybind.c
+++ b/monetdb5/optimizer/opt_emptybind.c
@@ -159,6 +159,9 @@ OPTemptybindImplementation(Client cntxt,
                        setFunctionId(p,bindidxRef);
                        p->typechk= TYPE_UNKNOWN;
                        empty[getArg(p,0)] = i;
+                       if( p->retc == 2){
+                               empty[getArg(p,1)] = i;
+                       }
                        // replace the call into a empty bat creation unless 
the table was updated already in the same query
                        sch = getVarConstant(mb,getArg(p,2  + 
(p->retc==2))).val.sval;
                        tbl = getVarConstant(mb,getArg(p,3  + 
(p->retc==2))).val.sval;
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -32,6 +32,14 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
        return store->storage_api.count_col(tr, c, access);
 }
 
+static lng
+SQLgetIdxSize(sql_trans *tr, sql_idx *i, int access)
+{
+       sqlstore *store = tr->store;
+       return store->storage_api.count_idx(tr, i, access);
+}
+
+
 /*
  * The maximal space occupied by a query is calculated
  * under the assumption that the complete database should fit in memory.
@@ -95,8 +103,7 @@ SQLgetSpace(mvc *m, MalBlkPtr mb, int pr
                                sql_idx *i = mvc_bind_idx(m, s, idxname);
 
                                if (i && (!isRemote(i->t) && 
!isMergeTable(i->t))) {
-                                       sql_column *c = 
ol_first_node(i->t->columns)->data;
-                                       size = SQLgetColumnSize(tr, c, access);
+                                       size = SQLgetIdxSize(tr, i, access);
 
                                        if( !prepare && size == 0 && ! 
i->t->system){
                                                setFunctionId(p, 
emptybindidxRef);
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
@@ -703,6 +703,8 @@ stmt_idxbat(backend *be, sql_idx *i, int
        s->flag = access;
        s->nr = getDestVar(q);
        s->q = q;
+       s->tname = i->t->base.name;
+       s->cname = i->base.name;
        return s;
 }
 
@@ -1598,7 +1600,7 @@ select2_join2(backend *be, stmt *op1, st
        if (op1->nr < 0 || (sel && sel->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/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2675,8 +2675,19 @@ rel_logical_exp(sql_query *query, sql_re
        }
        case SQL_ATOM: {
                /* TRUE or FALSE */
+               sql_rel *or = rel;
                AtomNode *an = (AtomNode *) sc;
                sql_exp *e = exp_atom(sql->sa, atom_dup(sql->sa, an->a));
+
+               if (e) {
+                       sql_subtype bt;
+
+                       sql_find_subtype(&bt, "boolean", 0, 0);
+                       e = exp_check_type(sql, &bt, rel, e, type_equal);
+               }
+               if (!e || or != rel)
+                       return NULL;
+               e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1), 
cmp_equal);
                return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL, 
f);
        }
        case SQL_IDENT:
@@ -2692,6 +2703,7 @@ rel_logical_exp(sql_query *query, sql_re
                }
                if (!e || or != rel)
                        return NULL;
+               e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1), 
cmp_equal);
                return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL, 
f);
        }
        case SQL_UNION:
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -3634,13 +3634,13 @@ rel_unnest_simplify(visitor *v, sql_rel 
        if (rel)
                rel = rewrite_simplify(v, rel);
        if (rel)
-               rel = rewrite_or_exp(v, rel);
-       if (rel)
                rel = rewrite_split_select_exps(v, rel); /* has to run before 
rewrite_complex */
        if (rel)
-               rel = rewrite_aggregates(v, rel);
+               rel = rewrite_outer2inner_union(v, rel); /* has to run before 
rewrite_or_exp */
        if (rel)
-               rel = rewrite_outer2inner_union(v, rel);
+               rel = rewrite_or_exp(v, rel);
+       if (rel)
+               rel = rewrite_aggregates(v, rel);
        if (rel)
                rel = rewrite_values(v, rel);
        return rel;
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
@@ -53,8 +53,6 @@ 2
 sql.bind
 2
 sql.bind_idxbat
-2
-sql.delta
 1
 algebra.projection
 6
@@ -93,8 +91,6 @@ 2
 sql.bind
 2
 sql.bind_idxbat
-2
-sql.delta
 1
 algebra.projection
 6
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
@@ -53,8 +53,6 @@ 2
 sql.bind
 2
 sql.bind_idxbat
-2
-sql.delta
 1
 algebra.projection
 6
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
@@ -53,8 +53,6 @@ 2
 sql.bind
 2
 sql.bind_idxbat
-2
-sql.delta
 1
 algebra.projection
 6
@@ -93,8 +91,6 @@ 3
 sql.bind
 2
 sql.bind_idxbat
-4
-sql.delta
 2
 algebra.projection
 11
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
@@ -53,8 +53,6 @@ 3
 sql.bind
 2
 sql.bind_idxbat
-4
-sql.delta
 2
 algebra.projection
 11
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
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to