Changeset: ce904debefe6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ce904debefe6
Modified Files:
        sql/storage/store.c
Branch: default
Log Message:

Merge with Jul2021 branch.


diffs (truncated from 596 to 300 lines):

diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -1288,7 +1288,8 @@ static str
 JSONplaintext(char **r, size_t *l, size_t *ilen, JSON *jt, int idx, str sep, 
size_t sep_len)
 {
        int i;
-       unsigned int j, u;
+       size_t j, next_len, next_concat_len;
+       unsigned int u;
        str msg = MAL_SUCCEED;
 
        switch (jt->elm[idx].kind) {
@@ -1309,17 +1310,23 @@ JSONplaintext(char **r, size_t *l, size_
                break;
        case JSON_STRING:
                // Make sure there is enough space for the value plus the 
separator plus the NULL byte
-               if (*l < jt->elm[idx].valuelen - 2 + sep_len + 1) {
-                       char *p = *r - *ilen + *l, *nr;
-                       *ilen *= 2;
+               next_len = jt->elm[idx].valuelen;
+               next_concat_len = next_len - 2 + sep_len + 1;
+               if (*l < next_concat_len) {
+                       size_t prev_ilen = *ilen, prev_l = *l;
+                       char *p = *r - (prev_ilen - prev_l), *nr;
+
+                       *ilen = (prev_ilen * 2) + next_concat_len; /* make sure 
sep_len + 1 is always included */
                        if (!(nr = GDKrealloc(p, *ilen))) {
                                *r = p;
                                throw(MAL,"JSONplaintext", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        }
-                       *r = nr + *l;
-                       *l = *ilen - *l;
+                       *r = nr + (prev_ilen - prev_l);
+                       *l = *ilen - prev_ilen + prev_l;
                }
-               for (j = 1; j < jt->elm[idx].valuelen - 1; j++) {
+               assert(next_len >= 2);
+               next_len--;
+               for (j = 1; j < next_len; j++) {
                        if (jt->elm[idx].value[j] == '\\') {
                                switch (jt->elm[idx].value[++j]) {
                                case '"':
@@ -1395,20 +1402,23 @@ JSONplaintext(char **r, size_t *l, size_
                *r += sep_len;
                break;
        default:
-               if (*l < jt->elm[idx].valuelen + sep_len + 1) {
-                       size_t offset = *ilen - *l;
-                       char *p = *r - offset, *nr;
-                       *ilen *= 2;
+               next_len = jt->elm[idx].valuelen;
+               next_concat_len = next_len + sep_len + 1;
+               if (*l < next_concat_len) {
+                       size_t prev_ilen = *ilen, prev_l = *l;
+                       char *p = *r - (prev_ilen - prev_l), *nr;
+
+                       *ilen = (prev_ilen * 2) + next_concat_len; /* make sure 
sep_len + 1 is always included */
                        if (!(nr = GDKrealloc(p, *ilen))) {
                                *r = p;
                                throw(MAL,"JSONplaintext", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        }
-                       *r = nr + offset;
-                       *l = *ilen - offset;
+                       *r = nr + (prev_ilen - prev_l);
+                       *l = *ilen - prev_ilen + prev_l;
                }
-               memcpy(*r, jt->elm[idx].value, jt->elm[idx].valuelen);
-               *l -= jt->elm[idx].valuelen;
-               *r += jt->elm[idx].valuelen;
+               memcpy(*r, jt->elm[idx].value, next_len);
+               *l -= next_len;
+               *r += next_len;
                memcpy(*r, sep, sep_len);
                *l -= sep_len;
                *r += sep_len;
diff --git a/monetdb5/modules/mal/bbp.c b/monetdb5/modules/mal/bbp.c
--- a/monetdb5/modules/mal/bbp.c
+++ b/monetdb5/modules/mal/bbp.c
@@ -419,7 +419,7 @@ CMDbbp(bat *ID, bat *NS, bat *TT, bat *C
        }
        for (i = 1; i < sz; i++) {
                if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) {
-                       bn = BATdescriptor(i);
+                       bn = BBP_desc(i);
                        if (bn) {
                                lng l = BATcount(bn);
                                int heat_ = 0, len;
@@ -432,26 +432,23 @@ CMDbbp(bat *ID, bat *NS, bat *TT, bat *C
                                        mode = "transient";
                                len = snprintf(buf, FILENAME_MAX, "%s", 
BBP_physical(i));
                                if (len == -1 || len >= FILENAME_MAX) {
-                                       BBPunfix(bn->batCacheid);
                                        msg = createException(MAL, 
"catalog.bbp", SQLSTATE(HY013) "Could not bpp filename path is too large");
                                        goto bailout;
                                }
                                if (BUNappend(id, &i, false) != GDK_SUCCEED ||
                                        BUNappend(ns, BBP_logical(i), false) != 
GDK_SUCCEED ||
-                                       BUNappend(tt, 
BATatoms[BATttype(bn)].name, false) != GDK_SUCCEED ||
+                                       BUNappend(tt, BATatoms[bn->ttype].name, 
false) != GDK_SUCCEED ||
                                        BUNappend(cnt, &l, false) != 
GDK_SUCCEED ||
                                        BUNappend(refcnt, &refs, false) != 
GDK_SUCCEED ||
                                        BUNappend(lrefcnt, &lrefs, false) != 
GDK_SUCCEED ||
                                        BUNappend(location, buf, false) != 
GDK_SUCCEED ||
                                        BUNappend(heat, &heat_, false) != 
GDK_SUCCEED ||
-                                       BUNappend(dirty, bn ? BATdirty(bn) ? 
"dirty" : DELTAdirty(bn) ? "diffs" : "clean" : (BBP_status(i) & BBPSWAPPED) ? 
"diffs" : "clean", false) != GDK_SUCCEED ||
+                                       BUNappend(dirty, BBP_cache(i) ? 
BATdirty(bn) ? "dirty" : DELTAdirty(bn) ? "diffs" : "clean" : (BBP_status(i) & 
BBPSWAPPED) ? "diffs" : "clean", false) != GDK_SUCCEED ||
                                        BUNappend(status, loc, false) != 
GDK_SUCCEED ||
                                        BUNappend(kind, mode, false) != 
GDK_SUCCEED) {
-                                       BBPunfix(bn->batCacheid);
                                        msg = createException(MAL, 
"catalog.bbp", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                        goto bailout;
                                }
-                               BBPunfix(bn->batCacheid);
                        }
                }
        }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -156,6 +156,7 @@ idx_destroy(sqlstore *store, sql_idx * i
 
        if (ATOMIC_PTR_GET(&i->data))
                store->storage_api.destroy_idx(store, i);
+       ATOMIC_PTR_DESTROY(&i->data);
        _DELETE(i->base.name);
        _DELETE(i);
 }
@@ -187,6 +188,7 @@ column_destroy(sqlstore *store, sql_colu
                return;
        if (ATOMIC_PTR_GET(&c->data))
                store->storage_api.destroy_col(store, c);
+       ATOMIC_PTR_DESTROY(&c->data);
        _DELETE(c->min);
        _DELETE(c->max);
        _DELETE(c->def);
@@ -209,6 +211,7 @@ table_destroy(sqlstore *store, sql_table
                return;
        if (isTable(t))
                store->storage_api.destroy_del(store, t);
+       ATOMIC_PTR_DESTROY(&t->data);
        /* cleanup its parts */
        list_destroy2(t->members, store);
        ol_destroy(t->idxs, store);
@@ -445,6 +448,7 @@ load_idx(sql_trans *tr, sql_table *t, re
        ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
        ni->t = t;
        ni->key = NULL;
+       ATOMIC_PTR_INIT(&ni->data, NULL);
 
        if (isTable(ni->t) && idx_has_column(ni->type))
                store->storage_api.create_idx(tr, ni);
@@ -550,6 +554,7 @@ load_column(sql_trans *tr, sql_table *t,
        st = (char*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "storage"));
        if (!strNil(st))
                c->storage_type = SA_STRDUP(tr->sa, st);
+       ATOMIC_PTR_INIT(&c->data, NULL);
        c->t = t;
        if (isTable(c->t))
                store->storage_api.create_col(tr, c);
@@ -707,10 +712,12 @@ load_table(sql_trans *tr, sql_schema *s,
        t->triggers = ol_new(tr->sa, (destroy_fptr) &trigger_destroy, store);
        if (isMergeTable(t) || isReplicaTable(t))
                t->members = list_new(tr->sa, (fdestroy) &part_destroy);
+       ATOMIC_PTR_INIT(&t->data, NULL);
 
        if (isTable(t)) {
                if (store->storage_api.create_del(tr, t) != LOG_OK) {
                        TRC_DEBUG(SQL_STORE, "Load table '%s' is missing 
'deletes'", t->base.name);
+                       ATOMIC_PTR_DESTROY(&t->data);
                        return NULL;
                }
        }
@@ -751,8 +758,10 @@ load_table(sql_trans *tr, sql_schema *s,
                if (ntid != t->base.id)
                        break;
                sql_column* next = load_column(tr, t, rt_cols);
-               if (next == NULL)
+               if (next == NULL) {
+                       table_destroy(store, t);
                        return NULL;
+               }
                if (ol_add(t->columns, &next->base)) {
                        table_destroy(store, t);
                        return NULL;
@@ -804,6 +813,7 @@ load_table(sql_trans *tr, sql_schema *s,
                if (!k || ol_add(t->triggers, &k->base) ||
                    os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
                        table_destroy(store, t);
+                       return NULL;
                }
        }
        return t;
@@ -1459,6 +1469,7 @@ bootstrap_create_column(sql_trans *tr, s
        if (ol_add(t->columns, &col->base))
                return NULL;
 
+       ATOMIC_PTR_INIT(&col->data, NULL);
        if (isTable(col->t))
                store->storage_api.create_col(tr, col);
        return col;
@@ -1491,6 +1502,7 @@ create_sql_table_with_id(sql_allocator *
        t->s = NULL;
        t->properties = properties;
        memset(&t->part, 0, sizeof(t->part));
+       ATOMIC_PTR_INIT(&t->data, NULL);
        return t;
 }
 
@@ -1639,6 +1651,7 @@ bootstrap_create_table(sql_trans *tr, sq
                return NULL;
        }
        if (os_add(s->tables, tr, name, &t->base)) {
+               table_destroy(store, t);
                return NULL;
        }
        return t;
@@ -2821,11 +2834,14 @@ column_dup(sql_trans *tr, sql_column *oc
        c->storage_type = NULL;
        if (oc->storage_type)
                c->storage_type = SA_STRDUP(sa, oc->storage_type);
+       ATOMIC_PTR_INIT(&c->data, NULL);
 
        if (isTable(c->t)) {
                if (isTempTable(c->t)) {
-                       if ((res = store->storage_api.create_col(tr, c)))
+                       if ((res = store->storage_api.create_col(tr, c))) {
+                               ATOMIC_PTR_DESTROY(&c->data);
                                return res;
+                       }
                } else {
                        ATOMIC_PTR_SET(&c->data, 
store->storage_api.col_dup(oc));
                }
@@ -2916,11 +2932,14 @@ idx_dup(sql_trans *tr, sql_idx * i, sql_
        ni->t = t;
        ni->type = i->type;
        ni->key = NULL;
+       ATOMIC_PTR_INIT(&ni->data, NULL);
 
        if (isTable(i->t)) {
                if (isTempTable(i->t)) {
-                       if ((res = store->storage_api.create_idx(tr, ni)))
+                       if ((res = store->storage_api.create_idx(tr, ni))) {
+                               ATOMIC_PTR_DESTROY(&ni->data);
                                return res;
+                       }
                } else {
                        ATOMIC_PTR_SET(&ni->data, 
store->storage_api.idx_dup(i));
                }
@@ -2932,6 +2951,7 @@ idx_dup(sql_trans *tr, sql_idx * i, sql_
                list_append(ni->columns, kc_dup(tr, okc, t));
        }
        if (isGlobal(t) && (res = os_add(t->s->idxs, tr, ni->base.name, 
dup_base(&ni->base)))) {
+               ATOMIC_PTR_DESTROY(&ni->data);
                return res;
        }
        *ires = ni;
@@ -3039,6 +3059,7 @@ table_dup(sql_trans *tr, sql_table *ot, 
        t->pkey = NULL;
        t->s = s;
        t->sz = ot->sz;
+       ATOMIC_PTR_INIT(&t->data, NULL);
 
        if (isGlobal(t) && (res = os_add(t->s->tables, tr, t->base.name, 
&t->base)))
                goto cleanup;
@@ -3103,6 +3124,7 @@ table_dup(sql_trans *tr, sql_table *ot, 
 
 cleanup:
        if (res) {
+               ATOMIC_PTR_DESTROY(&t->data);
                t = NULL;
        }
        *tres = t;
@@ -3216,6 +3238,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        ni->t = t;
        ni->type = i->type;
        ni->key = NULL;
+       ATOMIC_PTR_INIT(&ni->data, NULL);
 
        if (i->type == hash_idx && list_length(i->columns) == 1)
                unique = 1;
@@ -3243,11 +3266,15 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
 
        if (isDeclaredTable(i->t))
                if (!isDeclaredTable(t) && isTable(ni->t) && 
idx_has_column(ni->type))
-                       if ((res = store->storage_api.create_idx(tr, ni)))
+                       if ((res = store->storage_api.create_idx(tr, ni))) {
+                               ATOMIC_PTR_DESTROY(&ni->data);
                                return res;
+                       }
        if (!isDeclaredTable(t))
-               if ((res = store->table_api.table_insert(tr, sysidx, 
&ni->base.id, &t->base.id, &ni->type, &ni->base.name)))
+               if ((res = store->table_api.table_insert(tr, sysidx, 
&ni->base.id, &t->base.id, &ni->type, &ni->base.name))) {
+                       ATOMIC_PTR_DESTROY(&ni->data);
                        return res;
+               }
 
        if (ires)
                *ires = ni;
@@ -3341,10 +3368,13 @@ sql_trans_copy_column( sql_trans *tr, sq
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to