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