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

Reply via email to