Changeset: 8bcfb991548a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8bcfb991548a Modified Files: clients/Tests/MAL-signatures_all.stable.out clients/Tests/MAL-signatures_all.stable.out.int128 clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_logger.c gdk/gdk_logger.h monetdb5/modules/kernel/bat5.c monetdb5/modules/kernel/bat5.h monetdb5/modules/kernel/bat5.mal monetdb5/modules/kernel/logger.c monetdb5/modules/mal/Tests/inspect05.stable.out monetdb5/modules/mal/Tests/inspect05.stable.out.int128 sql/backends/monet5/sql.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h sql/storage/bat/bat_table.c sql/test/leaks/Tests/check1_bam.stable.out.int128 Branch: default Log Message:
Made some more code headless, ie BATreplace and logging of sql updates. diffs (truncated from 1158 to 300 lines): diff --git a/clients/Tests/MAL-signatures_all.stable.out b/clients/Tests/MAL-signatures_all.stable.out --- a/clients/Tests/MAL-signatures_all.stable.out +++ b/clients/Tests/MAL-signatures_all.stable.out @@ -31330,11 +31330,11 @@ command bat.reuse(b:bat[:oid,:any_1],del address BKCreuseBAT; comment Shuffle the values around to restore a dense representation of buns. -command bat.replace(b:bat[:oid,:any_1],src:bat[:oid,:any_1],force:bit):bat[:oid,:any_1] +command bat.replace(b:bat[:oid,:any_1],rid:bat[:oid,:oid],val:bat[:oid,:any_1],force:bit):bat[:oid,:any_1] address BKCbat_inplace_force; comment Perform replace for all BUNs of the second BAT into the first. -command bat.replace(b:bat[:oid,:any_1],src:bat[:oid,:any_1]):bat[:oid,:any_1] +command bat.replace(b:bat[:oid,:any_1],rid:bat[:oid,:oid],val:bat[:oid,:any_1]):bat[:oid,:any_1] address BKCbat_inplace; comment Perform replace for all BUNs of the second BAT into the first. diff --git a/clients/Tests/MAL-signatures_all.stable.out.int128 b/clients/Tests/MAL-signatures_all.stable.out.int128 --- a/clients/Tests/MAL-signatures_all.stable.out.int128 +++ b/clients/Tests/MAL-signatures_all.stable.out.int128 @@ -40375,11 +40375,11 @@ command bat.reuse(b:bat[:oid,:any_1],del address BKCreuseBAT; comment Shuffle the values around to restore a dense representation of buns. -command bat.replace(b:bat[:oid,:any_1],src:bat[:oid,:any_1],force:bit):bat[:oid,:any_1] +command bat.replace(b:bat[:oid,:any_1],rid:bat[:oid,:oid],val:bat[:oid,:any_1],force:bit):bat[:oid,:any_1] address BKCbat_inplace_force; comment Perform replace for all BUNs of the second BAT into the first. -command bat.replace(b:bat[:oid,:any_1],src:bat[:oid,:any_1]):bat[:oid,:any_1] +command bat.replace(b:bat[:oid,:any_1],rid:bat[:oid,:oid],val:bat[:oid,:any_1]):bat[:oid,:any_1] address BKCbat_inplace; comment Perform replace for all BUNs of the second BAT into the first. 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 @@ -169,7 +169,7 @@ gdk_return BATprintf(stream *f, BAT *b); gdk_return BATprod(void *res, int tp, BAT *b, BAT *s, int skip_nils, int abort_on_error, int nil_if_empty); BAT *BATproject(BAT *l, BAT *r); BAT *BATrangejoin(BAT *l, BAT *rl, BAT *rh, bit li, bit hi); -gdk_return BATreplace(BAT *b, BAT *n, bit force); +gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force); gdk_return BATrevert(BAT *b); void BATroles(BAT *b, const char *hnme, const char *tnme); BAT *BATsample(BAT *b, BUN n); @@ -417,7 +417,7 @@ int log_bat(logger *lg, BAT *b, const ch int log_bat_clear(logger *lg, const char *n); int log_bat_persists(logger *lg, BAT *b, const char *n); int log_bat_transient(logger *lg, const char *n); -int log_delta(logger *lg, BAT *b, const char *n); +int log_delta(logger *lg, BAT *uid, BAT *uval, const char *n); int log_sequence(logger *lg, int seq, lng id); int log_tend(logger *lg); int log_tstart(logger *lg); @@ -486,7 +486,7 @@ int strNil(const char *s); int strToStr(str *dst, int *len, const char *src); const char str_nil[2]; gdk_return void_inplace(BAT *b, oid id, const void *val, bit force); -BUN void_replace_bat(BAT *b, BAT *u, bit force); +BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force); int win_mkdir(const char *, const int mode); int win_rename(const char *, const char *); int win_rmdir(const char *); @@ -859,8 +859,8 @@ str BKCappend_val_force_wrap(bat *r, con str BKCappend_val_wrap(bat *r, const bat *bid, const void *u); str BKCappend_wrap(bat *r, const bat *bid, const bat *uid); str BKCattach(bat *ret, const int *tt, const char *const *heapfile); -str BKCbat_inplace(bat *r, const bat *bid, const bat *rid); -str BKCbat_inplace_force(bat *r, const bat *bid, const bat *rid, const bit *force); +str BKCbat_inplace(bat *r, const bat *bid, const bat *rid, const bat *uid); +str BKCbat_inplace_force(bat *r, const bat *bid, const bat *rid, const bat *uid, const bit *force); str BKCbun_inplace(bat *r, const bat *bid, const oid *id, const void *t); str BKCbun_inplace_force(bat *r, const bat *bid, const oid *id, const void *t, const bit *force); char *BKCdelete(bat *r, const bat *bid, const oid *h); @@ -2366,7 +2366,7 @@ int log_bat_clear_wrap(logger *L, str nm int log_bat_persists_wrap(logger *L, BAT *b, str nme); int log_bat_transient_wrap(logger *L, str nme); int log_bat_wrap(logger *L, BAT *b, str nme); -int log_delta_wrap(logger *L, BAT *b, str nme); +int log_delta_wrap(logger *L, BAT *uid, BAT *b, str nme); int log_tend_wrap(logger *L); int log_tstart_wrap(logger *L); int logger_add_bat_wrap(int *bid, logger *L, BAT *b, str nme); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1317,7 +1317,7 @@ gdk_export gdk_return BATdel(BAT *b, BAT gdk_export gdk_return BUNreplace(BAT *b, const void *left, const void *right, bit force); gdk_export gdk_return BUNinplace(BAT *b, BUN p, const void *left, const void *right, bit force); -gdk_export gdk_return BATreplace(BAT *b, BAT *n, bit force); +gdk_export gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force); gdk_export BUN BUNfnd(BAT *b, const void *right); @@ -2496,7 +2496,7 @@ gdk_export int GDKsyserror(_In_z_ _Print #include "gdk_utils.h" /* functions defined in gdk_bat.c */ -gdk_export BUN void_replace_bat(BAT *b, BAT *u, bit force); +gdk_export BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force); gdk_export gdk_return void_inplace(BAT *b, oid id, const void *val, bit force); gdk_export BAT *BATattach(int tt, const char *heapfile, int role); diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1675,15 +1675,16 @@ void_inplace(BAT *b, oid id, const void } BUN -void_replace_bat(BAT *b, BAT *u, bit force) +void_replace_bat(BAT *b, BAT *p, BAT *u, bit force) { BUN nr = 0; BUN r, s; - BATiter ui = bat_iterator(u); + BATiter uii = bat_iterator(p); + BATiter uvi = bat_iterator(u); BATloop(u, r, s) { - oid updid = *(oid *) BUNhead(ui, r); - const void *val = BUNtail(ui, r); + oid updid = *(oid *) BUNtail(uii, r); + const void *val = BUNtail(uvi, r); if (void_inplace(b, updid, val, force) == GDK_FAIL) return BUN_NONE; diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -911,14 +911,12 @@ BATdel(BAT *b, BAT *n, bit force) */ #define BUNreplace_force(a,b,c) BUNreplace(a,b,c,force) gdk_return -BATreplace(BAT *b, BAT *n, bit force) +BATreplace(BAT *b, BAT *p, BAT *n, bit force) { - if (b == NULL || n == NULL || BATcount(n) == 0) { + if (b == NULL || p == NULL || n == NULL || BATcount(n) == 0) { return GDK_SUCCEED; } - BATcompatible(b, n, GDK_FAIL, "BATreplace"); - updateloop(b, n, BUNreplace_force); - + void_replace_bat(b, p, n, force); return GDK_SUCCEED; } diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -313,7 +313,11 @@ log_read_updates(logger *lg, trans *tr, } } } + assert( (ht == TYPE_void && l->flag == LOG_INSERT) || + (ht == TYPE_void && l->flag == LOG_DELETE) || + ((ht == TYPE_oid || !ht) && l->flag == LOG_UPDATE) ); if (ht >= 0 && tt >= 0) { + BAT *uid = NULL; BAT *r; void *(*rt) (ptr, stream *, size_t) = BATatoms[tt].atomRead; void *tv = ATOMnil(tt); @@ -323,7 +327,13 @@ log_read_updates(logger *lg, trans *tr, rt = BATatoms[TYPE_int].atomRead; #endif assert(l->nr <= (lng) BUN_MAX); - r = BATnew(ht, tt, (BUN) l->nr, PERSISTENT); + if (l->flag == LOG_UPDATE) { + uid = BATnew(TYPE_void, ht, (BUN) l->nr, PERSISTENT); + r = BATnew(TYPE_void, tt, (BUN) l->nr, PERSISTENT); + } else { + assert(ht == TYPE_void); + r = BATnew(TYPE_void, tt, (BUN) l->nr, PERSISTENT); + } if (hseq) BATseqbase(r, 0); @@ -338,18 +348,37 @@ log_read_updates(logger *lg, trans *tr, res = LOG_ERR; break; } - if (l->flag == LOG_INSERT) { #if SIZEOF_OID == 8 - if (tt == TYPE_oid && lg->read32bitoid) { - int vi = * (int *) t; - if (vi == int_nil) - * (oid *) t = oid_nil; - else - * (oid *) t = vi; - } + if (tt == TYPE_oid && lg->read32bitoid) { + int vi = * (int *) t; + if (vi == int_nil) + * (oid *) t = oid_nil; + else + * (oid *) t = vi; + } #endif - BUNappend(r, t, TRUE); + BUNappend(r, t, TRUE); + if (t != tv) + GDKfree(t); + } + } else if (ht == TYPE_void && l->flag == LOG_DELETE) { + for (; l->nr > 0; l->nr--) { + void *t = rt(tv, lg->log, 1); + + if (!t) { + res = LOG_ERR; + break; } +#if SIZEOF_OID == 8 + if (tt == TYPE_oid && lg->read32bitoid) { + int vi = * (int *) t; + if (vi == int_nil) + * (oid *) t = oid_nil; + else + * (oid *) t = vi; + } +#endif + BUNappend(r, t, TRUE); if (t != tv) GDKfree(t); } @@ -388,9 +417,8 @@ log_read_updates(logger *lg, trans *tr, } } #endif - BUNins(r, h, t, TRUE); - if (h != hv) - GDKfree(h); + BUNappend(uid, h, TRUE); + BUNappend(r, t, TRUE); if (t != tv) GDKfree(t); } @@ -406,6 +434,7 @@ log_read_updates(logger *lg, trans *tr, tr->changes[tr->nr].tt = tt; tr->changes[tr->nr].name = GDKstrdup(name); tr->changes[tr->nr].b = r; + tr->changes[tr->nr].uid = uid; tr->nr++; } } else { @@ -447,32 +476,30 @@ la_bat_updates(logger *lg, logaction *la else if (la->type == LOG_DELETE) BATdel(b, la->b, TRUE); else if (la->type == LOG_UPDATE) { - BATiter bi = bat_iterator(la->b); + BATiter vi = bat_iterator(la->b); + BATiter ii = bat_iterator(la->uid); BUN p, q; BATloop(la->b, p, q) { - const void *h = BUNhead(bi, p); - const void *t = BUNtail(bi, p); + const void *h = BUNtail(ii, p); + const void *t = BUNtail(vi, p); + assert(b->htype == TYPE_void); if (BUNfnd(BATmirror(b), h) == BUN_NONE) { /* if value doesn't * exist, insert it if * b void headed, * maintain that by * inserting nils */ - if (b->htype == TYPE_void) { - if (b->batCount == 0 && *(const oid *) h != oid_nil) - b->hseqbase = *(const oid *) h; - if (b->hseqbase != oid_nil && *(const oid *) h != oid_nil) { - const void *tv = ATOMnilptr(b->ttype); + if (b->batCount == 0 && *(const oid *) h != oid_nil) + b->hseqbase = *(const oid *) h; + if (b->hseqbase != oid_nil && *(const oid *) h != oid_nil) { + const void *tv = ATOMnilptr(b->ttype); - while (b->hseqbase + b->batCount < *(const oid *) h) - BUNappend(b, tv, TRUE); - } - BUNappend(b, t, TRUE); - } else { - BUNins(b, h, t, TRUE); + while (b->hseqbase + b->batCount < *(const oid *) h) + BUNappend(b, tv, TRUE); } + BUNappend(b, t, TRUE); } else { BUNreplace(b, h, t, TRUE); } @@ -1779,37 +1806,39 @@ log_bat_transient(logger *lg, const char } int -log_delta(logger *lg, BAT *b, const char *name) +log_delta(logger *lg, BAT *uid, BAT *uval, const char *name) { int ok = GDK_SUCCEED; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list