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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list