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