Changeset: 3d75c6741eec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3d75c6741eec
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_select.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
Branch: unlock
Log Message:

make sure claimed (but roled back) rows are not kept.


diffs (154 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -156,7 +156,7 @@ gdk_return BATjoin(BAT **r1p, BAT **r2p,
 gdk_return BATkey(BAT *b, bool onoff);
 bool BATkeyed(BAT *b);
 gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
bool nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
-BAT *BATmaskedcands(oid hseq, BAT *masked, bool selected);
+BAT *BATmaskedcands(oid hseq, BUN nr, BAT *masked, bool selected);
 void *BATmax(BAT *b, void *aggr);
 void *BATmax_skipnil(BAT *b, void *aggr, bit skipnil);
 BAT *BATmergecand(BAT *a, BAT *b);
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -32,6 +32,12 @@ BAT *
 virtualize(BAT *bn)
 {
        /* input must be a valid candidate list or NULL */
+       if(bn && ((bn->ttype != TYPE_void && bn->ttype != TYPE_oid) || 
!bn->tkey || !bn->tsorted)) {
+               fprintf(stderr, "#bn type %d nil %d key %d sorted %d\n",
+                               bn->ttype, is_oid_nil(bn->tseqbase),
+                               bn->tkey, bn->tsorted);
+               fflush(stderr);
+       }
        assert(bn == NULL ||
               (((bn->ttype == TYPE_void && !is_oid_nil(bn->tseqbase)) ||
                 bn->ttype == TYPE_oid) &&
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
@@ -771,6 +771,7 @@ dup_dbat(storage *obat, storage *bat, in
        bat->cached_cnt = obat->cached_cnt;
        bat->cnt = obat->cnt + obat->ucnt;
        bat->ucnt = 0;
+       bat->icnt = 0;
        return dup_cs(&obat->cs, &bat->cs, TYPE_msk, is_new, temp);
 }
 
@@ -1070,13 +1071,16 @@ claim_tab(sql_trans *tr, sql_table *t, s
                }
 #endif
                s->cs.ucnt += cnt;
+               s->icnt += cnt;
        }
 
        assert(isNew(t) || isTempTable(t) || s->cs.cleared || BATcount(b) == 
slot);
        if (isNew(t) || isTempTable(t) || s->cs.cleared)
                deleted = FALSE;
-       else /* persistent central copy needs space marked deleted (such that 
other transactions don't see these rows) */
+       else { /* persistent central copy needs space marked deleted (such that 
other transactions don't see these rows) */
                deleted = TRUE;
+               ps->cnt += cnt;
+       }
        /* TODO first up to 32 boundary, then int writes */
        for(lng i=0; i<(lng)cnt; i++) {
                if (BUNappend(b, &deleted, true) != GDK_SUCCEED) {
@@ -1393,7 +1397,7 @@ create_del(sql_trans *tr, sql_table *t)
                assert(!bat->segs && !bat->end);
                bat->segs = new_segments(0);
                bat->end = 0;
-               bat->cnt = bat->ucnt = 0;
+               bat->cnt = bat->ucnt = bat->icnt = 0;
                bat->cached_cnt = 1;
 
                b = bat_new(TYPE_msk, t->sz, PERSISTENT);
@@ -1720,7 +1724,7 @@ clear_del(sql_trans *tr, sql_table *t)
                destroy_segments(s->segs);
        s->segs = new_segments(0);
        s->end = 0;
-       s->cnt = s->ucnt = 0;
+       s->cnt = s->ucnt = s->icnt = 0;
 }
 
 static BUN
@@ -1960,30 +1964,8 @@ tr_merge_delta( sql_trans *tr, sql_delta
 }
 
 static int
-cs_grow( column_storage *cs, BUN nr)
-{
-       if (cs->bid) {
-               BAT *cur = temp_descriptor(cs->bid);
-               if (!cur)
-                       return LOG_ERR;
-               if (BATcount(cur) < nr) {
-                       msk deleted = 0;
-                       /* todo faster inserts */
-                       for(BUN i = BATcount(cur); i<nr; i++) {
-                               if (BUNappend(cur, &deleted, true) != 
GDK_SUCCEED) {
-                                       bat_destroy(cur);
-                                       return LOG_ERR;
-                               }
-                       }
-               }
-       }
-       return LOG_OK;
-}
-
-static int
 tr_update_dbat( sql_trans *tr, storage *ts, storage *fs)
 {
-       int grow = 0;
        if (fs->cs.cleared) {
                destroy_segments(ts->segs);
                MT_lock_set(&segs_lock);
@@ -1993,12 +1975,12 @@ tr_update_dbat( sql_trans *tr, storage *
                assert(ts->segs->head);
                ts->cnt = 0;
                ts->ucnt = 0;
+               ts->icnt = 0;
        } else {
                assert(ts->segs == fs->segs);
                /* merge segments or cleanup ? */
                segment *segs = ts->segs->head, *seg = segs;
                for (; segs; segs = segs->next) {
-                       grow |= (segs->owner == tr);
                        if (segs->owner == tr || !segs->owner) {
                                /* merge range */
                                segs->owner = NULL;
@@ -2018,9 +2000,7 @@ tr_update_dbat( sql_trans *tr, storage *
                ts->end = ts->segs->end;
        }
        ts->cnt += fs->ucnt;
-       /* first check if bat needs too grow */
-       if ( 0 && (fs->ucnt || grow))
-               cs_grow(&ts->cs, ts->end);
+       ts->cnt -= fs->icnt;
        int ok = tr_update_cs( tr, &ts->cs, &fs->cs);
        if (ok == LOG_OK && ts->next) {
                ok = destroy_dbat(tr, ts->next);
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -45,6 +45,7 @@ typedef struct storage {
        bit cached_cnt;
        size_t cnt;
        size_t ucnt;    /* updates (ie deletes) in this transaction */
+       size_t icnt;    /* claimed in the transaction */
        BUN end;                /* end maybe less than the segments indicate */
        segments *segs; /* local used segements */
        struct storage *next;
diff --git 
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out 
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
--- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
+++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
@@ -1,7 +1,7 @@
 % .plan # table_name
 % rel # name
 % clob # type
-% 200 # length
+% 191 # length
 insert(
 | table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] COUNT 
 | union (
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to