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

fixed crash when using ordered indices


diffs (174 lines):

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
@@ -622,39 +622,47 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
                        sel1 = sel;
                        sel2 = sel;
                        for( n = l->h; n; n = n->next ) {
-                               s = exp_bin(sql, n->data, left, right, grp, 
ext, cnt, sel1); 
+                               stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
+
+                               s = exp_bin(sql, 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(sql->sa, sel1, s, f);
-                               }
-                               if (sel1 && sel1->nrcols && s->nrcols == 0) {
+                               } else if (sel1 && (sel1->nrcols == 0 || 
s->nrcols == 0)) {
                                        stmt *predicate = 
bin_first_column(sql->sa, left);
                                
                                        predicate = stmt_const(sql->sa, 
predicate, stmt_bool(sql->sa, 1));
-                                       s = stmt_uselect(sql->sa, predicate, s, 
cmp_equal, sel1);
+                                       if (s->nrcols == 0)
+                                               s = stmt_uselect(sql->sa, 
predicate, s, cmp_equal, sel1);
+                                       else
+                                               s = stmt_uselect(sql->sa, 
predicate, sel1, cmp_equal, s);
                                }
                                sel1 = s;
                        }
                        l = e->r;
                        for( n = l->h; n; n = n->next ) {
-                               s = exp_bin(sql, n->data, left, right, grp, 
ext, cnt, sel2); 
+                               stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
+
+                               s = exp_bin(sql, 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(sql->sa, sel2, s, f);
-                               }
-                               if (sel2 && sel2->nrcols && s->nrcols == 0) {
+                               } else if (sel2 && (sel2->nrcols == 0 || 
s->nrcols == 0)) {
                                        stmt *predicate = 
bin_first_column(sql->sa, left);
                                
                                        predicate = stmt_const(sql->sa, 
predicate, stmt_bool(sql->sa, 1));
-                                       s = stmt_uselect(sql->sa, predicate, s, 
cmp_equal, sel2);
+                                       if (s->nrcols == 0)
+                                               s = stmt_uselect(sql->sa, 
predicate, s, cmp_equal, sel2);
+                                       else
+                                               s = stmt_uselect(sql->sa, 
predicate, sel2, cmp_equal, s);
                                }
                                sel2 = s;
                        }
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1110,9 +1110,13 @@ rel_or(mvc *sql, sql_rel *l, sql_rel *r,
        set_processed(l);
        set_processed(r);
        rel = rel_setop(sql->sa, l, r, op_union);
+       if (!rel)
+               return NULL;
        rel->exps = rel_projections(sql, rel, NULL, 1, 1);
        set_processed(rel);
        rel = rel_distinct(rel);
+       if (!rel)
+               return NULL;
        if (exps_card(l->exps) <= CARD_AGGR &&
            exps_card(r->exps) <= CARD_AGGR)
        {
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
@@ -723,6 +723,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;
@@ -930,6 +932,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);
@@ -1011,7 +1015,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);
@@ -1064,7 +1068,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);
                i->data = timestamp_delta(oi->data, tr->stime);
@@ -1093,6 +1098,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;
        }
@@ -1726,10 +1733,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;
        }
@@ -1779,6 +1790,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);
@@ -1947,6 +1960,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
@@ -4545,7 +4545,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