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

Reply via email to