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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list