Changeset: 838b37411a3e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=838b37411a3e Modified Files: sql/backends/monet5/sql.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_table.c sql/storage/bat/bat_utils.c sql/storage/bat/bat_utils.h Branch: unlock Log Message:
use msk bat directly in SQLtid diffs (210 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -2245,14 +2245,17 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt nr = cnt-sb; } - /* create void,void bat with length and oid's set */ - tids = BATdense(sb, sb, (BUN) nr); - if (tids == NULL) - throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL); - /* check if we have deletes, iff get bit msk */ if ((dcnt = store_funcs.count_del(tr, t, 0)) > 0 || store_funcs.count_del(tr, t, 2) > 0) { - BAT *d = store_funcs.bind_del(tr, t, RDONLY); + setVarType(mb, getArg(pci, 0), setCandType(newBatType(TYPE_msk))); + BAT *d = store_funcs.bind_del(tr, t, RDONLY), *bn; + + bn = BATslice(d, sb, sb+nr); + if(bn == NULL) + throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL); + BAThseqbase(bn, sb); + *res = bn->batCacheid; +#if 0 BAT *del_ids = COLnew(0, TYPE_oid, dcnt, TRANSIENT); if (d == NULL || del_ids == NULL) { @@ -2297,8 +2300,16 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt BBPunfix(del_ids->batCacheid); if (ret != GDK_SUCCEED) throw(MAL, "sql.tids", SQLSTATE(45003) "TIDdeletes failed"); - } - BBPkeepref(*res = tids->batCacheid); +#endif + } else { + /* create void,void bat with length and oid's set */ + tids = BATdense(sb, sb, (BUN) nr); + if (tids == NULL) + throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL); + *res = tids->batCacheid; + } + + BBPkeepref(*res); return msg; } 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 @@ -340,9 +340,16 @@ bind_del(sql_trans *tr, sql_table *t, in static int cs_update_bat( column_storage *cs, BAT *tids, BAT *updates, int is_new) { + int res = LOG_OK; + BAT *otids = tids; if (!BATcount(tids)) return LOG_OK; + if (tids && tids->ttype == TYPE_msk) { + otids = msk2oid(tids, BATcount(updates)); + if (!otids) + return LOG_ERR; + } /* handle cleared and updates on just inserted bits */ if (!is_new && !cs->cleared && cs->uibid && cs->uvbid) { BAT *ui, *uv; @@ -350,35 +357,35 @@ cs_update_bat( column_storage *cs, BAT * if (cs_real_update_bats(cs, &ui, &uv) == LOG_ERR) return LOG_ERR; - assert(BATcount(tids) == BATcount(updates)); - if (BATappend(ui, tids, NULL, true) != GDK_SUCCEED || + assert(BATcount(otids) == BATcount(updates)); + if (BATappend(ui, otids, NULL, true) != GDK_SUCCEED || BATappend(uv, updates, NULL, true) != GDK_SUCCEED) { + if (otids != tids) + bat_destroy(otids); bat_destroy(ui); bat_destroy(uv); return LOG_ERR; } - assert(BATcount(tids) == BATcount(updates)); + assert(BATcount(otids) == BATcount(updates)); assert(BATcount(ui) == BATcount(uv)); bat_destroy(ui); bat_destroy(uv); - cs->ucnt += BATcount(tids); + cs->ucnt += BATcount(otids); } else if (is_new || cs->cleared) { BAT *b = temp_descriptor(cs->bid); if (b == NULL) - return LOG_ERR; - if (BATcount(b)==0) { /* alter add column */ - if (BATappend(b, updates, NULL, true) != GDK_SUCCEED) { - bat_destroy(b); - return LOG_ERR; - } - } else if (BATreplace(b, tids, updates, true) != GDK_SUCCEED) { + res = LOG_ERR; + else if (BATcount(b)==0 && BATappend(b, updates, NULL, true) != GDK_SUCCEED) /* alter add column */ + res = LOG_ERR; + else if (BATreplace(b, otids, updates, true) != GDK_SUCCEED) + res = LOG_ERR; + if (b) bat_destroy(b); - return LOG_ERR; - } - bat_destroy(b); } - return LOG_OK; + if (otids != tids) + bat_destroy(otids); + return res; } static int 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 @@ -26,8 +26,6 @@ static BAT * BAT *d; if ((d = store_funcs.bind_del(tr, t, RDONLY)) != NULL) { - BAT *del_ids = COLnew(0, TYPE_oid, dcnt, TRANSIENT); - if (!d) return NULL; if (store_funcs.count_del(tr, t, 2) > 0) { @@ -40,23 +38,17 @@ static BAT * if (nd) BBPunfix(nd->batCacheid); if (ui) BBPunfix(ui->batCacheid); if (uv) BBPunfix(uv->batCacheid); - BBPreclaim(del_ids); return NULL; } BBPunfix(ui->batCacheid); BBPunfix(uv->batCacheid); d = nd; } - for(BUN p = 0; p < nr; p++) { - if (mskGetVal(d, p)) { - oid id = p; - if (BUNappend(del_ids, &id, false) != GDK_SUCCEED) { - BBPreclaim(del_ids); - bat_destroy(d); - bat_destroy(tids); - return NULL; - } - } + BAT *del_ids = msk2oid(d, dcnt); + if (!del_ids) { + bat_destroy(d); + bat_destroy(tids); + return NULL; } bat_destroy(d); gdk_return ret = BATnegcands(tids, del_ids); diff --git a/sql/storage/bat/bat_utils.c b/sql/storage/bat/bat_utils.c --- a/sql/storage/bat/bat_utils.c +++ b/sql/storage/bat/bat_utils.c @@ -272,3 +272,38 @@ tr_find_idx( sql_trans *tr, sql_idx *i) return i; return NULL; } + +static size_t +msk_count(BAT *b) +{ + size_t nr = 0; + BUN cnt = BATcount(b); + + for(BUN p = 0; p < cnt; p++) { + nr += (mskGetVal(b, p)); + } + return nr; +} + +BAT * +msk2oid(BAT *b, ssize_t dcnt) +{ + if (dcnt < 0) + dcnt = msk_count(b); + BUN nr = BATcount(b); + BAT *del_ids = COLnew(0, TYPE_oid, dcnt, TRANSIENT); + oid seqb = b->hseqbase != oid_nil?b->hseqbase:0; + for(BUN p = 0; p < nr; p++) { + if (mskGetVal(b, p)) { + oid id = p + seqb; + if (BUNappend(del_ids, &id, false) != GDK_SUCCEED) { + BBPreclaim(del_ids); + return NULL; + } + } + } + del_ids->tkey = 1; + del_ids->tsorted = 1; + return del_ids; +} + diff --git a/sql/storage/bat/bat_utils.h b/sql/storage/bat/bat_utils.h --- a/sql/storage/bat/bat_utils.h +++ b/sql/storage/bat/bat_utils.h @@ -48,5 +48,6 @@ extern sql_table * tr_find_base_table( s extern sql_column * tr_find_base_column( sql_trans *tr, sql_column *c); extern sql_idx * tr_find_base_idx( sql_trans *tr, sql_idx *i); +extern BAT *msk2oid(BAT *b, ssize_t cnt); #endif /* BAT_UTILS_H */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list