Changeset: 2ed0d86878cc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2ed0d86878cc
Modified Files:
gdk/gdk_bat.c
gdk/gdk_bbp.c
Branch: default
Log Message:
Merge with Jul2021 branch.
diffs (truncated from 484 to 300 lines):
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -328,7 +328,6 @@ VIEWreset(BAT *b)
.parentid = b->batCacheid,
.farmid = BBPselectfarm(b->batRole, b->ttype, offheap),
};
- ATOMIC_INIT(&tail->refs, 1);
settailname(tail, nme, b->ttype, b->twidth);
if (b->ttype && HEAPalloc(tail, cnt, Tsize(b), Tsize(b)) !=
GDK_SUCCEED) {
GDKfree(tail);
@@ -348,7 +347,6 @@ VIEWreset(BAT *b)
.farmid = BBPselectfarm(b->batRole, b->ttype, varheap),
.parentid = b->batCacheid,
};
- ATOMIC_INIT(&th->refs, 1);
strconcat_len(th->filename, sizeof(th->filename),
nme, ".theap", NULL);
if (ATOMheap(b->ttype, th, cnt) != GDK_SUCCEED) {
@@ -358,7 +356,9 @@ VIEWreset(BAT *b)
BBPunfix(v->batCacheid);
return GDK_FAIL;
}
+ ATOMIC_INIT(&th->refs, 1);
}
+ ATOMIC_INIT(&tail->refs, 1);
BAT bak = *b; /* backup copy */
@@ -382,11 +382,9 @@ VIEWreset(BAT *b)
if (BATappend2(b, v, NULL, false, false) != GDK_SUCCEED) {
/* clean up the mess */
if (th) {
- HEAPfree(th, true);
- GDKfree(th);
+ HEAPdecref(th, true);
}
- HEAPfree(tail, true);
- GDKfree(tail);
+ HEAPdecref(tail, true);
*b = bak;
BBPunfix(v->batCacheid);
return GDK_FAIL;
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -115,7 +115,6 @@ BATcreatedesc(oid hseq, int tt, bool hea
if (heapnames) {
assert(bn->theap != NULL);
- ATOMIC_INIT(&bn->theap->refs, 1);
bn->theap->parentid = bn->batCacheid;
bn->theap->farmid = BBPselectfarm(role, bn->ttype, offheap);
@@ -135,6 +134,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
sizeof(bn->tvheap->filename),
nme, ".theap", NULL);
}
+ ATOMIC_INIT(&bn->theap->refs, 1);
} else {
assert(bn->theap == NULL);
}
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -537,6 +537,8 @@ vheapinit(BAT *b, const char *buf, bat b
"%n",
&free, &size, &storage, &n) < 3) {
TRC_CRITICAL(GDK, "invalid format for BBP.dir on line
%d", lineno);
+ GDKfree(b->theap);
+ b->tvheap = NULL;
return -1;
}
b->tvheap->free = (size_t) free;
@@ -2500,8 +2502,8 @@ incref(bat i, bool logical, bool lock)
if (b->theap != pb->theap) {
HEAPincref(pb->theap);
HEAPdecref(b->theap, false);
+ b->theap = pb->theap;
}
- b->theap = pb->theap;
}
/* done loading, release descriptor */
BBP_status_off(i, BBPLOADING);
diff --git a/gdk/gdk_cand.c b/gdk/gdk_cand.c
--- a/gdk/gdk_cand.c
+++ b/gdk/gdk_cand.c
@@ -1328,6 +1328,7 @@ BATnegcands(BUN nr, BAT *odels)
memcpy(r, Tloc(odels, lo), sizeof(oid) * (hi - lo));
}
bn->batDirtydesc = true;
+ assert(bn->tvheap == NULL);
bn->tvheap = dels;
BATsetcount(bn, bn->batCount - (hi - lo));
TRC_DEBUG(ALGO, "BATnegcands(cands=" ALGOBATFMT ","
@@ -1416,6 +1417,7 @@ BATmaskedcands(oid hseq, BUN nr, BAT *ma
}
if (cnt > 0) {
ATOMIC_INIT(&msks->refs, 1);
+ assert(bn->tvheap == NULL);
bn->tvheap = msks;
bn->tseqbase += (oid) c->firstbit;
} else {
@@ -1507,6 +1509,7 @@ BATunmask(BAT *b)
dels->free = sizeof(ccand_t) + n * sizeof(oid);
dels->dirty = true;
ATOMIC_INIT(&dels->refs, 1);
+ assert(bn->tvheap == NULL);
bn->tvheap = dels;
}
BATsetcount(bn, n=BATcount(b));
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -374,9 +374,9 @@ project_str(BAT *restrict l, struct cand
v = (var_t) r1->tvheap->free;
if (r1->tvheap == r2->tvheap) {
h1off = 0;
- BBPshare(bn->tvheap->parentid);
- HEAPfree(bn->tvheap, true);
- GDKfree(bn->tvheap);
+ BBPshare(r1->tvheap->parentid);
+ HEAPdecref(bn->tvheap, true);
+ HEAPincref(r1->tvheap);
bn->tvheap = r1->tvheap;
} else {
v = (v + GDK_VARALIGN - 1) & ~(GDK_VARALIGN - 1);
@@ -991,6 +991,7 @@ BATprojectchain(BAT **bats)
bn->tkey = false;
MT_lock_set(&b->theaplock);
BBPshare(b->tvheap->parentid);
+ assert(bn->tvheap == NULL);
bn->tvheap = b->tvheap;
HEAPincref(b->tvheap);
MT_lock_unset(&b->theaplock);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6119,12 +6119,10 @@ rel_groupby_distinct(visitor *v, sql_rel
list_append(exps, darg);
darg = exp_ref(v->sql, darg);
arg->h->data = darg;
- if (!exp_match_list(ngbe, gbe)) { /* if the grouping columns
match don't create an extra grouping */
- l = rel->l = rel_groupby(v->sql, rel->l, gbe);
- l->exps = exps;
- set_processed(l);
- rel->r = ngbe;
- }
+ l = rel->l = rel_groupby(v->sql, rel->l, gbe);
+ l->exps = exps;
+ set_processed(l);
+ rel->r = ngbe;
rel->exps = nexps;
set_nodistinct(distinct);
append(nexps, distinct);
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -818,11 +818,15 @@ rel_create_func(sql_query *query, dlist
int instantiate = (sql->emode == m_instantiate);
int deps = (sql->emode == m_deps);
int create = (!instantiate && !deps);
- bit vararg = FALSE;
+ bit vararg = FALSE, union_err = 0;
char *F = NULL, *fn = NULL, is_func;
- if (res && res->token == SQL_TABLE)
- type = F_UNION;
+ if (res && res->token == SQL_TABLE) {
+ if (type == F_FUNC)
+ type = F_UNION;
+ else
+ union_err = 1;
+ }
FUNC_TYPE_STR(type, F, fn)
@@ -832,7 +836,9 @@ rel_create_func(sql_query *query, dlist
if (create && store_readonly(sql->session->tr->store))
return sql_error(sql, 06, SQLSTATE(42000) "Schema statements
cannot be executed on a readonly database.");
- if (res && type == F_PROC)
+ if (union_err)
+ return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %ss
cannot return tables", F, fn);
+ else if (res && type == F_PROC)
return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s:
procedures cannot have return parameters", F);
else if (res && (type == F_FILT || type == F_LOADER))
return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %s
functions don't have to specify a return type", F, fn);
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
@@ -595,7 +595,9 @@ count_col(sql_trans *tr, sql_column *c,
return d->segs->t?d->segs->t->end:0;
if (access == 10) {
size_t cnt = segs_end(d->segs, tr, c->t);
+ lock_table(tr->store, c->t->base.id);
cnt -= count_deletes_in_range(d->segs->h, tr, 0, cnt);
+ unlock_table(tr->store, c->t->base.id);
return cnt;
}
return segs_end(d->segs, tr, c->t);
@@ -1589,9 +1591,9 @@ storage_delete_val(sql_trans *tr, sql_ta
}
static int
-delete_range(sql_trans *tr, sql_table *t, storage *s, size_t start, size_t cnt)
+seg_delete_range(sql_trans *tr, sql_table *t, storage *s, segment **Seg,
size_t start, size_t cnt)
{
- segment *seg = s->segs->h, *p = NULL;
+ segment *seg = *Seg, *p = NULL;
for (; seg; p = seg, seg = seg->next) {
if (seg->start <= start && seg->end > start) {
size_t lcnt = cnt;
@@ -1605,7 +1607,7 @@ delete_range(sql_trans *tr, sql_table *t
return LOG_CONFLICT;
if (deletes_conflict_updates( tr, t, start, lcnt))
return LOG_CONFLICT;
- seg = split_segment(s->segs, seg, p, tr, start, lcnt,
true);
+ *Seg = seg = split_segment(s->segs, seg, p, tr, start,
lcnt, true);
start += lcnt;
cnt -= lcnt;
}
@@ -1616,6 +1618,13 @@ delete_range(sql_trans *tr, sql_table *t
}
static int
+delete_range(sql_trans *tr, sql_table *t, storage *s, size_t start, size_t cnt)
+{
+ segment *seg = s->segs->h;
+ return seg_delete_range(tr, t, s, &seg, start, cnt);
+}
+
+static int
storage_delete_bat(sql_trans *tr, sql_table *t, storage *s, BAT *i)
{
int in_transaction = segments_in_transaction(tr, t);
@@ -1625,6 +1634,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
if (i->ttype == TYPE_msk || mask_cand(i))
i = BATunmask(i);
if (BATcount(i)) {
+ segment *seg = s->segs->h;
if (BATtdense(i)) {
size_t start = i->tseqbase;
size_t cnt = BATcount(i);
@@ -1641,11 +1651,11 @@ storage_delete_bat(sql_trans *tr, sql_ta
cur++;
continue;
}
- ok = delete_range(tr, t, s, f, cur-f);
+ ok = seg_delete_range(tr, t, s, &seg,
f, cur-f);
f = cur = l;
}
if (ok == LOG_OK)
- ok = delete_range(tr, t, s, f, cur-f);
+ ok = seg_delete_range(tr, t, s, &seg,
f, cur-f);
}
} else {
if (!BATtordered(i)) {
@@ -1665,7 +1675,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
lcnt++;
n++;
} else {
- ok = delete_range(tr, t, s, n-lcnt,
lcnt);
+ ok = seg_delete_range(tr, t, s, &seg,
n-lcnt, lcnt);
lcnt = 0;
}
if (!lcnt) {
@@ -1674,7 +1684,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
}
}
if (lcnt && ok == LOG_OK)
- ok = delete_range(tr, t, s, n-lcnt, lcnt);
+ ok = seg_delete_range(tr, t, s, &seg, n-lcnt,
lcnt);
}
}
if (i != oi)
@@ -2717,7 +2727,9 @@ clear_table(sql_trans *tr, sql_table *t)
BUN sz = count_col(tr, c, 0), clear_ok;
storage *d = tab_timestamp_storage(tr, t);
+ lock_table(tr->store, t->base.id);
sz -= count_deletes_in_range(d->segs->h, tr, 0, sz);
+ unlock_table(tr->store, t->base.id);
if ((clear_ok = clear_del(tr, t, in_transaction)) >= BUN_NONE - 1)
return clear_ok;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3425,13 +3425,13 @@ sql_trans_commit(sql_trans *tr)
int ok = LOG_OK;
sqlstore *store = tr->store;
- MT_lock_set(&store->commit);
- store_lock(store);
- ulng oldest = store_oldest(store);
- store_pending_changes(store, oldest);
- oldest = store_oldest_pending(store);
- store_unlock(store);
if (tr->changes) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list