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