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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list