Changeset: 99210299e6fb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99210299e6fb Modified Files: monetdb5/modules/kernel/algebra.c sql/backends/monet5/sql.c sql/storage/bat/bat_storage.c sql/storage/store.c Branch: unlock Log Message:
handle more msk cases and small fixes diffs (218 lines): diff --git a/monetdb5/modules/kernel/algebra.c b/monetdb5/modules/kernel/algebra.c --- a/monetdb5/modules/kernel/algebra.c +++ b/monetdb5/modules/kernel/algebra.c @@ -960,6 +960,9 @@ ALGcountCND_nil(lng *result, const bat * BBPunfix(b->batCacheid); throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } + if (b->ttype == TYPE_msk) { + BATsum(result, TYPE_lng, b, s, *ignore_nils, false, false); + } else if (*ignore_nils) { *result = (lng) BATcount_no_nil(b, s); } else { 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 @@ -2251,62 +2251,51 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt 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) { - BBPunfix(tids->batCacheid); - if (d) - BBPunfix(d->batCacheid); - if (del_ids) - BBPreclaim(del_ids); - throw(SQL,"sql.tid", SQLSTATE(45002) "Can not bind delete column"); - } - - if (store_funcs.count_del(tr, t, 2) > 0) { - BAT *nd = COLcopy(d, d->ttype, true, TRANSIENT); + BBPunfix(d->batCacheid); + if (bn && store_funcs.count_del(tr, t, 2) > 0) { BAT *ui = store_funcs.bind_del(tr, t, RD_UPD_ID); BAT *uv = store_funcs.bind_del(tr, t, RD_UPD_VAL); - - BBPunfix(d->batCacheid); - if (!nd || !ui || !uv || BATreplace(nd, ui, uv, true) != GDK_SUCCEED) { - if (nd) BBPunfix(nd->batCacheid); - if (ui) BBPunfix(ui->batCacheid); - if (uv) BBPunfix(uv->batCacheid); - BBPreclaim(del_ids); + oid h = sb+nr; + + h--; + BAT *p = BATselect(ui, NULL, &sb, &h, true, true, false); + BAT *nui = NULL, *nuv = NULL; + + if (p) { + nui = BATproject(p, ui); + nuv = BATproject(p, uv); + BBPunfix(p->batCacheid); + } + if (ui) BBPunfix(ui->batCacheid); + if (uv) BBPunfix(uv->batCacheid); + + if (!nui || !nuv || BATreplace(bn, nui, nuv, true) != GDK_SUCCEED) { + if (bn) BBPunfix(bn->batCacheid); + if (nui) BBPunfix(nui->batCacheid); + if (nuv) BBPunfix(nuv->batCacheid); throw(MAL, "sql.tids", SQLSTATE(45003) "TIDdeletes failed"); } - BBPunfix(ui->batCacheid); - BBPunfix(uv->batCacheid); - d = nd; + BBPunfix(nui->batCacheid); + BBPunfix(nuv->batCacheid); } - for(BUN p = sb; p < sb+nr; p++) { - if (mskGetVal(d,p)) { - oid id = p; - if (BUNappend(del_ids, &id, false) != GDK_SUCCEED) { - BBPreclaim(del_ids); - BBPunfix(d->batCacheid); - BBPunfix(tids->batCacheid); - throw(MAL, "sql.tids", SQLSTATE(45003) "TIDdeletes failed"); - } - } - } - BBPunfix(d->batCacheid); - gdk_return ret = BATnegcands(tids, del_ids); - BBPunfix(del_ids->batCacheid); - if (ret != GDK_SUCCEED) - throw(MAL, "sql.tids", SQLSTATE(45003) "TIDdeletes failed"); -#endif + d = NULL; + /* true == deleted, need not deleted */ + if (bn && BATcount(bn)) + d = BATcalcnot(bn, NULL); + else if (bn) + d = bn; + if(d == NULL) + throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL); + if (bn && bn != d) + BBPunfix(bn->batCacheid); + BAThseqbase(d, sb); + *res = d->batCacheid; } 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; + /* 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); 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 @@ -573,7 +573,7 @@ update_idx(sql_trans *tr, sql_idx * i, v static int delta_append_bat( sql_delta *bat, size_t offset, BAT *i, sql_table *t ) { - BAT *b; + BAT *b, *oi = i; (void)t; if (!BATcount(i)) @@ -582,9 +582,14 @@ delta_append_bat( sql_delta *bat, size_t if (b == NULL) return LOG_ERR; - if (BATcount(b) >= offset+BATcount(i)){ - BAT *ui = BATdense(0, offset, BATcount(i)); - if (BATreplace(b, ui, i, true) != GDK_SUCCEED) { + if (i && i->ttype == TYPE_msk) { + oi = msk2oid(i, -1); + } + if (BATcount(b) >= offset+BATcount(oi)){ + BAT *ui = BATdense(0, offset, BATcount(oi)); + if (BATreplace(b, ui, oi, true) != GDK_SUCCEED) { + if (oi != i) + bat_destroy(oi); bat_destroy(b); bat_destroy(ui); return LOG_ERR; @@ -594,29 +599,37 @@ delta_append_bat( sql_delta *bat, size_t //assert (isNew(t) || isTempTable(t) || bat->cs.cleared); if (BATcount(b) < offset) { /* add space */ const void *tv = ATOMnilptr(b->ttype); - lng i, d = offset - BATcount(b); - for(i=0;i<d;i++) { + lng d = offset - BATcount(b); + for(lng j=0;j<d;j++) { if (BUNappend(b, tv, true) != GDK_SUCCEED) { + if (oi != i) + bat_destroy(oi); bat_destroy(b); return LOG_ERR; } } } - if (isVIEW(i) && b->batCacheid == VIEWtparent(i)) { - BAT *ic = COLcopy(i, i->ttype, true, TRANSIENT); + if (isVIEW(oi) && b->batCacheid == VIEWtparent(oi)) { + BAT *ic = COLcopy(oi, oi->ttype, true, TRANSIENT); if (ic == NULL || BATappend(b, ic, NULL, true) != GDK_SUCCEED) { - if(ic) - bat_destroy(ic); - bat_destroy(b); - return LOG_ERR; - } - bat_destroy(ic); - } else if (BATappend(b, i, NULL, true) != GDK_SUCCEED) { + if (oi != i) + bat_destroy(oi); + if(ic) + bat_destroy(ic); + bat_destroy(b); + return LOG_ERR; + } + bat_destroy(ic); + } else if (BATappend(b, oi, NULL, true) != GDK_SUCCEED) { + if (oi != i) + bat_destroy(oi); bat_destroy(b); return LOG_ERR; } } + if (oi != i) + bat_destroy(oi); bat_destroy(b); return LOG_OK; } @@ -821,6 +834,7 @@ delta_delete_bat( storage *bat, BAT *i, BAT *t = BATconstant(i->hseqbase, TYPE_msk, &T, BATcount(i), TRANSIENT); int ok = LOG_OK; + assert(i->ttype != TYPE_msk); if (t) { ok = cs_update_bat( &bat->cs, i, t, is_new); } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -1191,8 +1191,7 @@ sql_trans_update_schema(sql_trans *tr, o TRC_DEBUG(SQL_STORE, "Update schema: %s %d\n", s->base.name, s->base.id); v = table_funcs.column_find_value(tr, find_sql_column(ss, "name"), rid); - //base_init(tr->sa, &s->base, sid, 0, v); _DELETE(v); - s->base.name = (v)?sa_strdup(tr->sa, v):NULL; + base_init(tr->sa, &s->base, sid, 0, v); _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(ss, "authorization"), rid); s->auth_id = *(sqlid *)v; _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(ss, "system"), rid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list