Changeset: f960dda8762c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f960dda8762c
Modified Files:
        monetdb5/optimizer/opt_mitosis.c
        sql/backends/monet5/rel_bin.c
        sql/server/rel_rel.c
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: default
Log Message:

merged with Dec2016


diffs (176 lines):

diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -63,7 +63,14 @@ OPTmitosisImplementation(Client cntxt, M
                        getFunctionId(p) != submaxRef &&
                        getFunctionId(p) != subavgRef &&
                        getFunctionId(p) != subsumRef &&
-                       getFunctionId(p) != subprodRef)
+                       getFunctionId(p) != subprodRef &&
+
+                       getFunctionId(p) != countRef &&
+                       getFunctionId(p) != minRef &&
+                       getFunctionId(p) != maxRef &&
+                       getFunctionId(p) != avgRef &&
+                       getFunctionId(p) != sumRef &&
+                       getFunctionId(p) != prodRef)
                        return 0;
 
                if (p->argc > 2 && (getModuleId(p) == rapiRef || getModuleId(p) 
== pyapiRef) && 
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -578,39 +578,47 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        sel1 = sel;
                        sel2 = sel;
                        for( n = l->h; n; n = n->next ) {
-                               s = exp_bin(be, n->data, left, right, grp, ext, 
cnt, sel1); 
+                               stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
+
+                               s = exp_bin(be, n->data, left, right, grp, ext, 
cnt, sin); 
                                if (!s) 
                                        return s;
-                               if (sel1 && sel1->nrcols == 0 && s->nrcols == 
0) {
+                               if (!sin && sel1 && sel1->nrcols == 0 && 
s->nrcols == 0) {
                                        sql_subtype *bt = 
sql_bind_localtype("bit");
                                        sql_subfunc *f = sql_bind_func(sql->sa, 
sql->session->schema, "and", bt, bt, F_FUNC);
                                        assert(f);
                                        s = stmt_binop(be, sel1, s, f);
-                               }
-                               if (sel1 && sel1->nrcols && s->nrcols == 0) {
+                               } else if (sel1 && (sel1->nrcols == 0 || 
s->nrcols == 0)) {
                                        stmt *predicate = bin_first_column(be, 
left);
                                
                                        predicate = stmt_const(be, predicate, 
stmt_bool(be, 1));
-                                       s = stmt_uselect(be, predicate, s, 
cmp_equal, sel1, 0);
+                                       if (s->nrcols == 0)
+                                               s = stmt_uselect(be, predicate, 
s, cmp_equal, sel1, 0);
+                                       else
+                                               s = stmt_uselect(be, predicate, 
sel1, cmp_equal, s, 0);
                                }
                                sel1 = s;
                        }
                        l = e->r;
                        for( n = l->h; n; n = n->next ) {
-                               s = exp_bin(be, n->data, left, right, grp, ext, 
cnt, sel2); 
+                               stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
+
+                               s = exp_bin(be, n->data, left, right, grp, ext, 
cnt, sin); 
                                if (!s) 
                                        return s;
-                               if (sel2 && sel2->nrcols == 0 && s->nrcols == 
0) {
+                               if (!sin && sel2 && sel2->nrcols == 0 && 
s->nrcols == 0) {
                                        sql_subtype *bt = 
sql_bind_localtype("bit");
                                        sql_subfunc *f = sql_bind_func(sql->sa, 
sql->session->schema, "and", bt, bt, F_FUNC);
                                        assert(f);
                                        s = stmt_binop(be, sel2, s, f);
-                               }
-                               if (sel2 && sel2->nrcols && s->nrcols == 0) {
+                               } else if (sel2 && (sel2->nrcols == 0 || 
s->nrcols == 0)) {
                                        stmt *predicate = bin_first_column(be, 
left);
                                
                                        predicate = stmt_const(be, predicate, 
stmt_bool(be, 1));
-                                       s = stmt_uselect(be, predicate, s, 
cmp_equal, sel2, 0);
+                                       if (s->nrcols == 0)
+                                               s = stmt_uselect(be, predicate, 
s, cmp_equal, sel2, 0);
+                                       else
+                                               s = stmt_uselect(be, predicate, 
sel2, cmp_equal, s, 0);
                                }
                                sel2 = s;
                        }
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -691,6 +691,8 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i
 {
        int ok = LOG_OK;
 
+       if (!isTable(i->t) || !idx_has_column(i->type))
+               return ok;
        if (i->data) {
                int type = (oid_index(ni->type))?TYPE_oid:TYPE_lng;
                sql_delta *bat = ni->data = ZNEW(sql_delta), *obat = i->data;
@@ -898,6 +900,8 @@ delete_tab(sql_trans *tr, sql_table * t,
                        sql_idx *i = n->data;
                        sql_delta *bat;
 
+                       if (!isTable(i->t) || !idx_has_column(i->type)) 
+                               continue;
                        if (!i->data) {
                                sql_idx *oi = tr_find_idx(tr->parent, i);
                                i->data = timestamp_delta(oi->data, tr->stime);
@@ -979,7 +983,7 @@ count_idx(sql_trans *tr, sql_idx *i, int
 {
        sql_delta *b;
 
-       if (!isTable(i->t)) 
+       if (!isTable(i->t) || !idx_has_column(i->type)) 
                return 0;
        if (!i->data) {
                sql_idx *oi = tr_find_idx(tr->parent, i);
@@ -1032,7 +1036,8 @@ count_idx_upd(sql_trans *tr, sql_idx *i)
 {
        sql_delta *b;
 
-       assert (isTable(i->t)) ;
+       if (!isTable(i->t) || !idx_has_column(i->type)) 
+               return 0;
        if (!i->data) {
                sql_idx *oi = tr_find_idx(tr->parent, i);
                if (oi)
@@ -1062,6 +1067,8 @@ count_upd(sql_trans *tr, sql_table *t)
        for( n = t->idxs.set->h; n; n = n->next) {
                sql_idx *i = n->data;
 
+               if (!isTable(i->t) || !idx_has_column(i->type)) 
+                       continue;
                if (count_idx_upd(tr, i))
                        return 1;
        }
@@ -1699,10 +1706,14 @@ clear_col(sql_trans *tr, sql_column *c)
 static BUN
 clear_idx(sql_trans *tr, sql_idx *i)
 {
+       if (!isTable(i->t) || !idx_has_column(i->type))
+               return 0;
        if (!i->data || !i->base.allocated) {
                int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
                sql_idx *oi = tr_find_idx(tr->parent, i);
-               sql_delta *bat = i->data = ZNEW(sql_delta), *obat = 
timestamp_delta(oi->data, tr->stime);
+               sql_delta *bat = i->data = ZNEW(sql_delta), *obat;
+              
+               obat = timestamp_delta(oi->data, tr->stime);
                (void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag 
== TR_NEW); 
                i->base.allocated = 1;
        }
@@ -1767,6 +1778,8 @@ empty_idx(sql_idx *i)
        int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
        sql_delta *bat = i->data;
 
+       if (!isTable(i->t) || !idx_has_column(i->type))
+               return ;
        assert(i->data && i->base.allocated && bat->bid == 0);
        bat->bid = bat->ibid;
        bat->ibid = e_bat(type);
@@ -1949,6 +1962,8 @@ gtr_update_table(sql_trans *tr, sql_tabl
                        sql_idx *ci = n->data;
 
                        /* some indices have no bats */
+                       if (!isTable(ci->t) || !idx_has_column(ci->type)) 
+                               continue;
                        if (!ci->base.wtime || ci->base.wtime <= 
ci->base.allocated) 
                                continue;
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4538,7 +4538,8 @@ sql_trans_clear_table(sql_trans *tr, sql
                        sql_idx *ci = n->data;
 
                        ci->base.wtime = tr->wstime;
-                       (void)store_funcs.clear_idx(tr, ci);
+                       if (isTable(ci->t) && idx_has_column(ci->type))
+                               (void)store_funcs.clear_idx(tr, ci);
                }
        }
        return sz;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to