Changeset: bfb8aea0656e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bfb8aea0656e
Modified Files:
        sql/server/rel_optimizer.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_table.c
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check0.stable.out.int128
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check1.stable.out.int128
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check2.stable.out.int128
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check3.stable.out.int128
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check4.stable.out.int128
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/check5.stable.out.int128
        sql/test/leaks/Tests/drop3.stable.out
        sql/test/leaks/Tests/drop3.stable.out.int128
        sql/test/leaks/Tests/select1.stable.out
        sql/test/leaks/Tests/select1.stable.out.int128
        sql/test/leaks/Tests/select2.stable.out
        sql/test/leaks/Tests/select2.stable.out.int128
        sql/test/leaks/Tests/temp1.stable.out
        sql/test/leaks/Tests/temp1.stable.out.int128
        sql/test/leaks/Tests/temp2.stable.out
        sql/test/leaks/Tests/temp2.stable.out.int128
Branch: geo
Log Message:

Merge with default branch.


diffs (truncated from 566 to 300 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6516,6 +6516,34 @@ exp_range_overlap( mvc *sql, sql_exp *e,
                if (emax->d < cmin->data.val.dval || emin->d > 
cmax->data.val.dval)
                        return 0;
        }
+       if (t->type->localtype == TYPE_bte) {
+               atom *cmin = atom_general(sql->sa, t, min);
+               atom *cmax = atom_general(sql->sa, t, max);
+
+               if (emax->data.val.btval < cmin->data.val.btval || 
emin->data.val.btval > cmax->data.val.btval)
+                       return 0;
+       }
+       if (t->type->localtype == TYPE_sht) {
+               atom *cmin = atom_general(sql->sa, t, min);
+               atom *cmax = atom_general(sql->sa, t, max);
+
+               if (emax->data.val.shval < cmin->data.val.shval || 
emin->data.val.shval > cmax->data.val.shval)
+                       return 0;
+       }
+       if (t->type->localtype == TYPE_int) {
+               atom *cmin = atom_general(sql->sa, t, min);
+               atom *cmax = atom_general(sql->sa, t, max);
+
+               if (emax->data.val.ival < cmin->data.val.ival || 
emin->data.val.ival > cmax->data.val.ival)
+                       return 0;
+       }
+       if (t->type->localtype == TYPE_lng) {
+               atom *cmin = atom_general(sql->sa, t, min);
+               atom *cmax = atom_general(sql->sa, t, max);
+
+               if (emax->data.val.lval < cmin->data.val.lval || 
emin->data.val.lval > cmax->data.val.lval)
+                       return 0;
+       }
        return 1;
 }
 
@@ -6554,8 +6582,7 @@ rel_merge_table_rewrite(int *changes, mv
                                        sql_exp *e = n->data;   
                                        atom *lval = NULL, *hval = NULL;
 
-                                       /* only ranges */
-                                       if (e->type == e_cmp && e->f) {
+                                       if (e->type == e_cmp && (e->flag == 
cmp_equal || e->f )) {
                                                sql_exp *l = e->r;
                                                sql_exp *h = e->f;
                                                sql_exp *c = e->l;
@@ -6563,7 +6590,9 @@ rel_merge_table_rewrite(int *changes, mv
                                                c = rel_find_exp(rel, c);
                                                if (l->type == e_atom && !l->l)
                                                        lval = 
sql->args[l->flag];
-                                               if (h->type == e_atom && !h->l)
+                                               if (!h)
+                                                       hval = lval;
+                                               else if (h && h->type == e_atom 
&& !h->l)
                                                        hval = 
sql->args[h->flag];
                                                if (c && lval && hval) {
                                                        append(cols, c);
@@ -6578,12 +6607,16 @@ rel_merge_table_rewrite(int *changes, mv
                        if (t->tables.set) {
                                list *tables = sa_list(sql->sa);
                                node *nt;
-
+                               int *pos = NULL, nr = list_length(rel->exps), 
first = 1;
+
+                               /* rename (mostly the idxs) */
+                               pos = SA_NEW_ARRAY(sql->sa, int, nr);
+                               memset(pos, 0, sizeof(int)*nr);
                                for (nt = t->tables.set->h; nt; nt = nt->next) {
                                        sql_table *pt = nt->data;
                                        sql_rel *prel = rel_basetable(sql, pt, 
tname);
                                        node *n, *m;
-                                       int skip = 0;
+                                       int skip = 0, j;
 
                                        /* do not include empty partitions */
                                        if ((nrel || nt->next) && 
@@ -6594,18 +6627,22 @@ rel_merge_table_rewrite(int *changes, mv
                                        MT_lock_set(&prel->exps->ht_lock, 
"rel_merge_table_rewrite");
                                        prel->exps->ht = NULL;
                                        MT_lock_unset(&prel->exps->ht_lock, 
"rel_merge_table_rewrite");
-                                       /* rename (mostly the idxs) */
-                                       for (n = rel->exps->h, m = 
prel->exps->h; n && m && !skip; n = n->next, m = m->next ) {
+                                       for (n = rel->exps->h, m = 
prel->exps->h, j=0; n && m && !skip; n = n->next, m = m->next, j++) {
                                                sql_exp *e = n->data;
                                                sql_exp *ne = m->data;
                                                int i;
 
-                                               if (pt && isTable(pt) && 
pt->access == TABLE_READONLY && sel && (nrel || nt->next) && 
(i=find_col_exp(cols, e)) != -1) {
-                                                       /* check if incase of 
an expression if the part falls within the bounds else skip this (keep at least 
on part-table) */
+                                               if (pt && isTable(pt) && 
pt->access == TABLE_READONLY && sel && (nrel || nt->next) && 
+                                                       ((first && 
(i=find_col_exp(cols, e)) != -1) ||
+                                                       (!first && pos[j] > 
0))) {
+                                                       /* check if the part 
falls within the bounds of the select expression else skip this (keep at least 
on part-table) */
                                                        void *min, *max;
                                                        sql_column *col = NULL;
                                                        sql_rel *bt = NULL;
 
+                                                       if (first)
+                                                               pos[j] = i + 1;
+                                                       i = pos[j] - 1;
                                                        col = 
name_find_column(prel, e->l, e->r, -2, &bt);
                                                        assert(col);
                                                        if 
(sql_trans_ranges(sql->session->tr, col, &min, &max)) {
@@ -6619,9 +6656,12 @@ rel_merge_table_rewrite(int *changes, mv
                                                assert(e->type == e_column);
                                                exp_setname(sql->sa, ne, e->l, 
e->r);
                                        }
+                                       first = 0;
                                        if (!skip) {
                                                append(tables, prel);
                                                nrel = prel;
+                                       } else {
+                                               sql->caching = 0;
                                        }
                                }
                                while (list_length(tables) > 1) {
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
@@ -620,6 +620,18 @@ append_col(sql_trans *tr, sql_column *c,
                delta_append_bat(bat, i);
        else
                delta_append_val(bat, i);
+       if (!c->t->data || !c->t->base.allocated) {
+               sql_table *ot = tr_find_table(tr->parent, c->t);
+               sql_dbat *bat = c->t->data = ZNEW(sql_dbat), *obat = 
timestamp_dbat(ot->data, tr->stime);
+               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(c->t)); 
+               c->t->base.allocated = 1;
+       }
+       if (c->t && c->t->data && ((sql_dbat*)c->t->data)->cached) {
+               sql_dbat *bat = c->t->data;
+
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
 }
 
 static void
@@ -645,6 +657,18 @@ append_idx(sql_trans *tr, sql_idx * i, v
                delta_append_bat(bat, ib);
        else
                delta_append_val(bat, ib);
+       if (!i->t->data || !i->t->base.allocated) {
+               sql_table *ot = tr_find_table(tr->parent, i->t);
+               sql_dbat *bat = i->t->data = ZNEW(sql_dbat), *obat = 
timestamp_dbat(ot->data, tr->stime);
+               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(i->t)); 
+               i->t->base.allocated = 1;
+       }
+       if (i->t && i->t->data && ((sql_dbat*)i->t->data)->cached) {
+               sql_dbat *bat = i->t->data;
+
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
 }
 
 static void
@@ -1379,6 +1403,10 @@ clear_delta(sql_trans *tr, sql_delta *ba
        BAT *b;
        BUN sz = 0;
 
+       if (bat->cached) {
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
        if (bat->ibid) {
                b = temp_descriptor(bat->ibid);
                sz += BATcount(b);
@@ -1523,6 +1551,11 @@ clear_dbat(sql_trans *tr, sql_dbat *bat)
        BUN sz = 0;
 
        (void)tr;
+
+       if (bat->cached) {
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
        if (bat->dbid) {
                BAT *b = temp_descriptor(bat->dbid);
 
@@ -1565,7 +1598,7 @@ gtr_update_delta( sql_trans *tr, sql_del
 
        (void)tr;
        assert(store_nr_active==0);
-
+       
        cur = temp_descriptor(cbat->bid);
        ins = temp_descriptor(cbat->ibid);
        /* any inserts */
@@ -1925,6 +1958,10 @@ update_table(sql_trans *tr, sql_table *f
                        b->next = tt->data;
                        tt->data = b;
 
+                       if (b->cached) {
+                               bat_destroy(b->cached);
+                               b->cached = NULL;
+                       }
                        while (b && b->wtime >= oldest->stime)
                                b = b->next;
                        if (b && b->wtime < oldest->stime) {
@@ -1949,6 +1986,10 @@ update_table(sql_trans *tr, sql_table *f
                                cc->data = NULL;
                                b->next = oc->data;
                                oc->data = b;
+                               if (b->cached) {
+                                       bat_destroy(b->cached);
+                                       b->cached = NULL;
+                               }
                                while (b && b->wtime >= oldest->stime) 
                                        b = b->next;
                                if (b && b->wtime < oldest->stime) {
@@ -1998,6 +2039,10 @@ update_table(sql_trans *tr, sql_table *f
                                ci->data = NULL;
                                b->next = oi->data;
                                oi->data = b;
+                               if (b->cached) {
+                                       bat_destroy(b->cached);
+                                       b->cached = NULL;
+                               }
                                while (b && b->wtime >= oldest->stime) 
                                        b = b->next;
                                if (b && b->wtime < oldest->stime) {
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -53,10 +53,10 @@ delta_cands(sql_trans *tr, sql_table *t)
                t->data = timestamp_dbat(ot->data, tr->stime);
        }
        d = t->data;
-       if (d->cached && !tr->parent) 
+       if (d->cached /*&& !tr->parent*/) 
                return temp_descriptor(d->cached->batCacheid);
        tids = _delta_cands(tr, t);
-       if (!d->cached && !tr->parent) /* only cache during catalog loading */
+       if (!d->cached /*&& !tr->parent*/) /* only cache during catalog loading 
*/
                d->cached = temp_descriptor(tids->batCacheid);
        return tids;
 }
@@ -72,6 +72,7 @@ delta_full_bat_( sql_trans *tr, sql_colu
        BAT *r, *b, *ui, *uv, *i = temp_descriptor(bat->ibid);
        int needcopy = 1;
 
+(void)tr;
        r = i; 
        if (temp) 
                return r;
@@ -101,7 +102,7 @@ delta_full_bat_( sql_trans *tr, sql_colu
        bat_destroy(ui); 
        bat_destroy(uv); 
        (void)c;
-       if (!bat->cached && !tr->parent) 
+       if (!bat->cached /*&& !tr->parent*/) 
                bat->cached = temp_descriptor(b->batCacheid);
        return b;
 }
@@ -109,7 +110,7 @@ delta_full_bat_( sql_trans *tr, sql_colu
 static BAT *
 delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
 {
-       if (bat->cached && !tr->parent) 
+       if (bat->cached /*&& !tr->parent*/) 
                return temp_descriptor(bat->cached->batCacheid);
        return delta_full_bat_( tr, c, bat, temp);
 }
diff --git a/sql/test/leaks/Tests/check0.stable.out 
b/sql/test/leaks/Tests/check0.stable.out
--- a/sql/test/leaks/Tests/check0.stable.out
+++ b/sql/test/leaks/Tests/check0.stable.out
@@ -79,7 +79,7 @@ Ready.
 % L1,  L2 # name
 % char,        wrd # type
 % 9,   3 # length
-[ "transient", 433     ]
+[ "transient", 435     ]
 #select 'persistent', count(*) from bbp() as bbp where kind like 'pers%';
 % .L1, .L2 # table_name
 % L1,  L2 # name
diff --git a/sql/test/leaks/Tests/check0.stable.out.int128 
b/sql/test/leaks/Tests/check0.stable.out.int128
--- a/sql/test/leaks/Tests/check0.stable.out.int128
+++ b/sql/test/leaks/Tests/check0.stable.out.int128
@@ -79,7 +79,7 @@ Ready.
 % L1,  L2 # name
 % char,        wrd # type
 % 9,   3 # length
-[ "transient", 435     ]
+[ "transient", 437     ]
 #select 'persistent', count(*) from bbp() as bbp where kind like 'pers%';
 % .L1, .L2 # table_name
 % L1,  L2 # name
diff --git a/sql/test/leaks/Tests/check1.stable.out 
b/sql/test/leaks/Tests/check1.stable.out
--- a/sql/test/leaks/Tests/check1.stable.out
+++ b/sql/test/leaks/Tests/check1.stable.out
@@ -279,7 +279,7 @@ Ready.
 % L1,  L2 # name
 % char,        wrd # type
 % 9,   3 # length
-[ "transient", 189     ]
+[ "transient", 191     ]
 #select 'persistent', count(*) from bbp() as bbp where kind like 'pers%';
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to