Changeset: 24cd36725996 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/24cd36725996
Modified Files:
sql/backends/monet5/dict.c
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
Branch: dict
Log Message:
also handle value inserts into the dicts
diffs (truncated from 354 to 300 lines):
diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c
--- a/sql/backends/monet5/dict.c
+++ b/sql/backends/monet5/dict.c
@@ -960,3 +960,105 @@ DICTprepare4append(BAT **noffsets, BAT *
*noffsets = n;
return 0;
}
+
+static sht *
+DICTenlarge_vals(bte *offsets, BUN cnt, BUN sz)
+{
+ sht *n = GDKmalloc(sizeof(sht) * sz);
+
+ if (!n)
+ return NULL;
+ unsigned char *o = (unsigned char*)offsets;
+ unsigned short *no = (unsigned short*)n;
+ for(BUN i = 0; i<cnt; i++) {
+ no[i] = o[i];
+ }
+ return n;
+}
+
+int
+DICTprepare4append_vals(void **noffsets, void *vals, BUN cnt, BAT *dict)
+{
+ int tt = BATcount(dict)>=256?TYPE_sht:TYPE_bte;
+ BUN sz = cnt, nf = 0;
+ void *n = GDKmalloc((tt==TYPE_bte?sizeof(bte):sizeof(sht)) * sz);
+
+ if (!n || BAThash(dict) != GDK_SUCCEED) {
+ GDKfree(n);
+ return -1;
+ }
+
+ int varsized = ATOMvarsized(dict->ttype);
+ int wd = (varsized?sizeof(char*):dict->twidth);
+ char *vp = vals;
+ BATiter ui = bat_iterator_nolock(dict);
+ if (tt == TYPE_bte) {
+ bte *op = (bte*)n;
+ for(BUN i = 0; i<sz; i++, vp += wd) {
+ BUN up = 0;
+ int f = 0;
+ void *val = (void*)vp;
+ if (varsized)
+ val = *(void**)vp;
+ HASHloop(ui, ui.b->thash, up, val) {
+ op[i] = (bte)up;
+ f = 1;
+ }
+ if (!f) {
+ if (BATcount(dict) >= 255) {
+ sht *nn = DICTenlarge_vals(n, i, sz);
+ GDKfree(n);
+ if (!nn)
+ return -1;
+ n = nn;
+ nf = i;
+ tt = TYPE_sht;
+ break;
+ } else {
+ if (BUNappend(dict, val, true) !=
GDK_SUCCEED ||
+ (!dict->thash && BAThash(dict) !=
GDK_SUCCEED)) {
+ assert(0);
+ GDKfree(n);
+ return -1;
+ }
+ /* reinitialize */
+ ui = bat_iterator_nolock(dict);
+ op[i] = BATcount(dict)-1;
+ }
+ }
+ }
+ }
+ if (tt == TYPE_sht) {
+ sht *op = (sht*)n;
+ for(BUN i = nf; i<sz; i++) {
+ BUN up = 0;
+ int f = 0;
+ void *val = (void*)vp;
+ if (varsized)
+ val = *(void**)vp;
+ HASHloop(ui, ui.b->thash, up, val) {
+ op[i] = (sht)up;
+ f = 1;
+ }
+ if (!f) {
+ if (BATcount(dict) >= (64*1024)-1) {
+ assert(0);
+ GDKfree(n);
+ return -2;
+ } else {
+ if (BUNappend(dict, val, true) !=
GDK_SUCCEED ||
+ (!dict->thash && BAThash(dict) !=
GDK_SUCCEED)) {
+ assert(0);
+ GDKfree(n);
+ return -1;
+ }
+ /* reinitialize */
+ ui = bat_iterator_nolock(dict);
+ op[i] = BATcount(dict)-1;
+ }
+ }
+ }
+ }
+ *noffsets = n;
+ return 0;
+}
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
@@ -1634,57 +1634,59 @@ update_idx(sql_trans *tr, sql_idx * i, v
static BAT *
dict_append_bat(sql_delta *bat, BAT *i)
{
- BAT *newoffsets = NULL;
- BAT *u = temp_descriptor(bat->cs.ebid);
-
- if (!u)
- return NULL;
- BUN max_cnt = (BATcount(u) < 256)?256:64*1024;
- if (DICTprepare4append(&newoffsets, i, u) < 0) {
- assert(0);
- } else {
- /* returns new offset bat (ie to be appended), possibly
with larger type ! */
- if (BATcount(u) >= max_cnt) {
- if (max_cnt == 64*1024) { /* decompress */
- BAT *b = temp_descriptor(bat->cs.bid);
- BAT *n = b?DICTdecompress_(b , u):NULL;
- bat_destroy(b);
- if (!n) {
- bat_destroy(u);
- bat_destroy(n);
- return NULL;
- }
- /* TODO change storage type */
- if (bat->cs.bid)
- temp_destroy(bat->cs.bid);
- bat->cs.bid = temp_create(n);
+ BAT *newoffsets = NULL;
+ BAT *u = temp_descriptor(bat->cs.ebid);
+
+ if (!u)
+ return NULL;
+ BUN max_cnt = (BATcount(u) < 256)?256:64*1024;
+ if (DICTprepare4append(&newoffsets, i, u) < 0) {
+ assert(0);
+ } else {
+ /* returns new offset bat (ie to be appended), possibly with
larger type ! */
+ if (BATcount(u) >= max_cnt) {
+ if (max_cnt == 64*1024) { /* decompress */
+ BAT *b = temp_descriptor(bat->cs.bid);
+ BAT *n = b?DICTdecompress_(b , u):NULL;
+ bat_destroy(b);
+ assert(newoffsets == NULL);
+ if (!n) {
+ bat_destroy(u);
bat_destroy(n);
- if (bat->cs.ebid)
- temp_destroy(bat->cs.ebid);
- bat->cs.ebid = 0;
- bat->cs.st = ST_DEFAULT;
- bat->cs.cleared = true;
- } else {
- BAT *b = temp_descriptor(bat->cs.bid);
- BAT *n = b?DICTenlarge(b, BATcount(b),
BATcount(b) + BATcount(i)):NULL;
- bat_destroy(b);
- if (!n) {
- bat_destroy(u);
- bat_destroy(n);
- return NULL;
- }
- if (bat->cs.bid)
- temp_destroy(bat->cs.bid);
- bat->cs.bid = temp_create(n);
- bat->cs.cleared = true;
- i = newoffsets;
+ return NULL;
}
- } else { /* append */
+ /* TODO change storage type */
+ if (bat->cs.bid)
+ temp_destroy(bat->cs.bid);
+ bat->cs.bid = temp_create(n);
+ bat_destroy(n);
+ if (bat->cs.ebid)
+ temp_destroy(bat->cs.ebid);
+ bat->cs.ebid = 0;
+ bat->cs.st = ST_DEFAULT;
+ bat->cs.cleared = true;
+ } else {
+ BAT *b = temp_descriptor(bat->cs.bid);
+ BAT *n = b?DICTenlarge(b, BATcount(b),
BATcount(b) + BATcount(i)):NULL;
+ bat_destroy(b);
+ if (!n) {
+ bat_destroy(newoffsets);
+ bat_destroy(u);
+ bat_destroy(n);
+ return NULL;
+ }
+ if (bat->cs.bid)
+ temp_destroy(bat->cs.bid);
+ bat->cs.bid = temp_create(n);
+ bat->cs.cleared = true;
i = newoffsets;
}
+ } else { /* append */
+ i = newoffsets;
}
- bat_destroy(u);
- return i;
+ }
+ bat_destroy(u);
+ return i;
}
static int
@@ -1735,12 +1737,84 @@ delta_append_bat(sql_trans *tr, sql_delt
return (err)?LOG_ERR:LOG_OK;
}
+static void *
+dict_append_val(sql_delta *bat, void *i, BUN cnt)
+{
+ void *newoffsets = NULL;
+ BAT *u = temp_descriptor(bat->cs.ebid);
+
+ if (!u)
+ return NULL;
+ BUN max_cnt = (BATcount(u) < 256)?256:64*1024;
+ if (DICTprepare4append_vals(&newoffsets, i, cnt, u) < 0) {
+ assert(0);
+ } else {
+ /* returns new offset bat (ie to be appended), possibly with
larger type ! */
+ if (BATcount(u) >= max_cnt) {
+ if (max_cnt == 64*1024) { /* decompress */
+ BAT *b = temp_descriptor(bat->cs.bid);
+ BAT *n = b?DICTdecompress_(b , u):NULL;
+ bat_destroy(b);
+ assert(newoffsets == NULL);
+ if (!n) {
+ bat_destroy(u);
+ bat_destroy(n);
+ return NULL;
+ }
+ /* TODO change storage type */
+ if (bat->cs.bid)
+ temp_destroy(bat->cs.bid);
+ bat->cs.bid = temp_create(n);
+ bat_destroy(n);
+ if (bat->cs.ebid)
+ temp_destroy(bat->cs.ebid);
+ bat->cs.ebid = 0;
+ bat->cs.st = ST_DEFAULT;
+ bat->cs.cleared = true;
+ } else {
+ BAT *b = temp_descriptor(bat->cs.bid);
+ BAT *n = b?DICTenlarge(b, BATcount(b),
BATcount(b) + cnt):NULL;
+ bat_destroy(b);
+ if (!n) {
+ GDKfree(newoffsets);
+ bat_destroy(u);
+ bat_destroy(n);
+ return NULL;
+ }
+ if (bat->cs.bid)
+ temp_destroy(bat->cs.bid);
+ bat->cs.bid = temp_create(n);
+ bat->cs.cleared = true;
+ i = newoffsets;
+ }
+ } else { /* append */
+ i = newoffsets;
+ }
+ }
+ bat_destroy(u);
+ return i;
+}
+
static int
delta_append_val(sql_trans *tr, sql_delta *bat, sqlid id, BUN offset, void *i,
BUN cnt)
{
+ void *oi = i;
+ BAT *b;
lock_column(tr->store, id);
- BAT *b = temp_descriptor(bat->cs.bid);
+
+ if (bat->cs.st == ST_DICT) {
+ /* possibly a new array is returned */
+ i = dict_append_val(bat, i, cnt);
+ if (!i) {
+ unlock_column(tr->store, id);
+ return LOG_ERR;
+ }
+ }
+
+ b = temp_descriptor(bat->cs.bid);
if (b == NULL) {
+ if (i != oi)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list