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

Reply via email to