Changeset: 6885e40f1c6d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6885e40f1c6d
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

make sure the storage_delete_bat handles negative candidates


diffs (48 lines):

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
@@ -1290,12 +1290,30 @@ storage_delete_bat(sql_trans *tr, sql_ta
 
        if (i->ttype == TYPE_msk || mask_cand(i))
                i = BATunmask(i);
-       /* assume order oid bat */
        if (BATcount(i)) {
                if (BATtdense(i)) {
                        size_t start = i->tseqbase;
                        size_t cnt = BATcount(i);
                        ok = delete_range(tr, s, start, cnt);
+               } else if (complex_cand(i)) {
+                       struct canditer ci;
+                       oid f = 0, l = 0, cur = 0;
+
+                       canditer_init(&ci, NULL, i);
+                       cur = f = canditer_next(&ci);
+                       if (!is_oid_nil(f)) {
+                               for(l = canditer_next(&ci); !is_oid_nil(l) && 
ok == LOG_OK; l = canditer_next(&ci)) {
+                                       if (cur+1 == l) {
+                                               cur++;
+                                               continue;
+                                       }
+                                       if (delete_range(tr, s, f, cur-f) == 
LOG_ERR)
+                                               ok = LOG_ERR;
+                                       f = cur = l;
+                               }
+                               if (ok == LOG_OK && delete_range(tr, s, f, 
cur-f) == LOG_ERR)
+                                       ok = LOG_ERR;
+                       }
                } else {
                        assert(BATtordered(i));
                        BUN icnt = BATcount(i);
@@ -1321,10 +1339,10 @@ storage_delete_bat(sql_trans *tr, sql_ta
                        }
                }
        }
+       if (i != oi)
+               bat_destroy(i);
        if (ok == LOG_ERR)
                return LOG_ERR;
-       if (i != oi)
-               bat_destroy(i);
        if ((!inTransaction(tr, t) && !in_transaction && isGlobal(t)) || 
(!isNew(t) && isLocalTemp(t)))
                trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del, 
isLocalTemp(t)?NULL:&log_update_del);
        return ok;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to