Changeset: ec21c0d4c501 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec21c0d4c501 Modified Files: sql/storage/bat/bat_table.c sql/storage/store.c sql/test/BugTracker-2009/Tests/primekeyconstraint.SF-2783425.stable.err Branch: Oct2014 Log Message:
remove use of BATselect from bat_table code diffs (truncated from 440 to 300 lines): 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 @@ -23,79 +23,95 @@ #include "bat_storage.h" static BAT * -delta_full_bat_( sql_column *c, sql_delta *bat, int temp, BAT *d, BAT *s) +delta_cands(sql_trans *tr, sql_table *t) +{ + sql_column *c = t->columns.set->h->data; + /* create void,void bat with length and oid's set */ + BAT *tids = BATnew(TYPE_void, TYPE_void, 0, TRANSIENT); + size_t nr = store_funcs.count_col(tr, c, 1); + + tids->H->seq = 0; + tids->T->seq = 0; + BATsetcount(tids, (BUN) nr); + tids->H->revsorted = 0; + tids->T->revsorted = 0; + + tids->T->key = 1; + tids->T->dense = 1; + tids->H->key = 1; + tids->H->dense = 1; + + if (store_funcs.count_del(tr, t)) { + BAT *d = store_funcs.bind_del(tr, t, RD_INS); + BAT *diff = BATkdiff(tids, BATmirror(d)); + + bat_destroy(tids); + tids = BATmirror(BATmark(diff, 0)); + bat_destroy(diff); + bat_destroy(d); + } + return tids; +} + +static BAT * +delta_full_bat_( sql_column *c, sql_delta *bat, int temp) { /* return full normalized column bat - - if (s) { - b := b.semijoin(s); - i := i.semijoin(s); - u := u.semijoin(s); - } - b := b.kunion(i); - b := b.kdiff(u); - b := b.kunion(u); - b := b.kdiff(reverse(d)); + * b := b.copy() + b := b.append(i); + b := b.replace(u); */ BAT *r, *b, *u, *i = temp_descriptor(bat->ibid); + int needcopy = 1; + r = i; - if (temp) { - if (s) { - r = BATsemijoin(i,s); - bat_destroy(i); - } + if (temp) return r; - } b = temp_descriptor(bat->bid); u = temp_descriptor(bat->ubid); - if (s) { - BAT *t; - - t = BATsemijoin(b,s); bat_destroy(b); b = t; - t = BATsemijoin(i,s); bat_destroy(i); i = t; - t = BATsemijoin(u,s); bat_destroy(u); u = t; - } if (!b) { b = i; } else { if (BATcount(i)) { - r = BATkunion(b,i); bat_destroy(b); b = r; + r = BATcopy(b, b->htype, b->ttype, 1, TRANSIENT); + bat_destroy(b); + b = r; + BATappend(b, i, TRUE); + needcopy = 0; } bat_destroy(i); } if (BATcount(u)) { - r = BATkdiff(b,u); bat_destroy(b); b = r; - assert(b->ttype == u->ttype); - r = BATkunion(b,u); bat_destroy(b); b = r; + if (needcopy) { + r = BATcopy(b, b->htype, b->ttype, 1, TRANSIENT); + bat_destroy(b); + b = r; + } + BATreplace(b, u, TRUE); } bat_destroy(u); - if (d && BATcount(d)) { - r = BATkdiff(b,BATmirror(d)); bat_destroy(b); b = r; - } (void)c; - if (!bat->cached && !s) + if (!bat->cached) bat->cached = temp_descriptor(b->batCacheid); return b; } static BAT * -delta_full_bat( sql_column *c, sql_delta *bat, int temp, BAT *d, BAT *s) +delta_full_bat( sql_column *c, sql_delta *bat, int temp) { - if (bat->cached && s) - return BATsemijoin(bat->cached, s); if (bat->cached) return temp_descriptor(bat->cached->batCacheid); - return delta_full_bat_( c, bat, temp, d, s); + return delta_full_bat_( c, bat, temp); } static BAT * -full_column(sql_trans *tr, sql_column *c, BAT *d, BAT *s ) +full_column(sql_trans *tr, sql_column *c) { if (!c->data) { sql_column *oc = tr_find_column(tr->parent, c); c->data = oc->data; } - return delta_full_bat(c, c->data, isTemp(c), d, s); + return delta_full_bat(c, c->data, isTemp(c)); } static oid column_find_row(sql_trans *tr, sql_column *c, void *value, ...); @@ -103,39 +119,31 @@ static oid column_find_row(sql_trans *tr, sql_column *c, void *value, ...) { va_list va; - BUN q; - BAT *b = NULL, *s = NULL, *r = NULL, *d = NULL; + BAT *b = NULL, *s = NULL, *r = NULL; oid rid = oid_nil; - sql_column *nc; - void *nv; - d = store_funcs.bind_del(tr, c->t, RDONLY); + s = delta_cands(tr, c->t); va_start(va, value); - while ((nc = va_arg(va, sql_column *)) != NULL) { - nv = va_arg(va, void *); + b = full_column(tr, c); + r = BATsubselect(b, s, value, NULL, 1, 0, 0); + bat_destroy(s); + s = r; + bat_destroy(b); + while ((c = va_arg(va, sql_column *)) != NULL) { + value = va_arg(va, void *); - b = full_column(tr, c, d, s); - if (s) - bat_destroy(s); - s = BATselect(b, value, value); + b = full_column(tr, c); + r = BATsubselect(b, s, value, NULL, 1, 0, 0); + bat_destroy(s); + s = r; bat_destroy(b); - c = nc; - value = nv; } va_end(va); - b = full_column(tr, c, d, s); - if (s) - bat_destroy(s); - if (d) - bat_destroy(d); - - r = BATmirror(b); - q = BUNfnd(r, value); - if (q != BUN_NONE) { - BATiter ri = bat_iterator(r); - rid = *(oid *) BUNtail(ri, q); + if (BATcount(s) == 1) { + BATiter ri = bat_iterator(s); + rid = *(oid *) BUNtail(ri, 0); } - bat_destroy(b); + bat_destroy(s); return rid; } @@ -143,14 +151,10 @@ static void * column_find_value(sql_trans *tr, sql_column *c, oid rid) { BUN q; - BAT *b, *d = NULL; + BAT *b; void *res = NULL; - d = store_funcs.bind_del(tr, c->t, RDONLY); - b = full_column(tr, c, d, NULL); - if (d) - bat_destroy(d); - + b = full_column(tr, c); q = BUNfnd(b, (ptr) &rid); if (q != BUN_NONE) { BATiter bi = bat_iterator(b); @@ -261,48 +265,42 @@ static rids * rids_select( sql_trans *tr, sql_column *key, void *key_value_low, void *key_value_high, ...) { va_list va; - BAT *b = NULL, *s = NULL, *d = NULL; - sql_column *nc; - void *nvl, *nvh; + BAT *b = NULL, *r = NULL, *s = NULL; rids *rs = ZNEW(rids); + void *kvl = key_value_low, *kvh = key_value_high; + int hi = 0; - d = store_funcs.bind_del(tr, key->t, RDONLY); + s = delta_cands(tr, key->t); + b = full_column(tr, key); + if (!kvl) + kvl = ATOMnilptr(b->ttype); + if (!kvh) + kvh = ATOMnilptr(b->ttype); + hi = (kvl == kvh); + r = BATsubselect(b, s, kvl, kvh, 1, hi, 0); + bat_destroy(s); + s = r; + bat_destroy(b); if (key_value_low || key_value_high) { va_start(va, key_value_high); - while ((nc = va_arg(va, sql_column *)) != NULL) { - nvl = va_arg(va, void *); - nvh = va_arg(va, void *); + while ((key = va_arg(va, sql_column *)) != NULL) { + kvl = va_arg(va, void *); + kvh = va_arg(va, void *); - b = full_column(tr, key, d, s); - if (s) - bat_destroy(s); - if (!key_value_low) - key_value_low = ATOMnilptr(b->ttype); - if (!key_value_high) - key_value_high = ATOMnilptr(b->ttype); - s = BATselect(b, key_value_low, key_value_high); + b = full_column(tr, key); + if (!kvl) + kvl = ATOMnilptr(b->ttype); + if (!kvh) + kvh = ATOMnilptr(b->ttype); + hi = (kvl == kvh); + r = BATsubselect(b, s, kvl, kvh, 1, hi, 0); + bat_destroy(s); + s = r; bat_destroy(b); - key = nc; - key_value_low = nvl; - key_value_high = nvh; } va_end(va); } - b = full_column(tr, key, d, s); - if (s) - bat_destroy(s); - if (d) - bat_destroy(d); - if (key_value_low || key_value_high) { - if (!key_value_low) - key_value_low = ATOMnilptr(b->ttype); - if (!key_value_high) - key_value_high = ATOMnilptr(b->ttype); - rs->data = BATselect(b, key_value_low, key_value_high); - bat_destroy(b); - } else { - rs->data = b; - } + rs->data = s; rs->cur = 0; return rs; } @@ -311,16 +309,17 @@ rids_select( sql_trans *tr, sql_column * static rids * rids_orderby(sql_trans *tr, rids *r, sql_column *orderby_col) { - BAT *b, *d = NULL; + BAT *b, *s, *o; - d = store_funcs.bind_del(tr, orderby_col->t, RDONLY); - b = full_column(tr, orderby_col, d, r->data); - if (d) - bat_destroy(d); + b = full_column(tr, orderby_col); + s = BATproject(r->data, b); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list