Changeset: e820748f2614 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e820748f2614
Modified Files:
        gdk/gdk_logger.c
        sql/backends/monet5/sql.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_unnest.c
        sql/server/sql_mvc.c
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: default
Log Message:

Merge with Dec2023 branch.


diffs (truncated from 879 to 300 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1303,8 +1303,9 @@ log_read_transaction(logger *lg, uint32_
                 * return GDK_FAIL */
                switch (l.flag) {
                case LOG_START:
-                       if (l.id > lg->tid)     /* TODO: check that this can 
only happen during initialisation */
-                               lg->tid = l.id;
+                       assert(!lg->flushing || l.id <= lg->tid);
+                       if (!lg->flushing && l.id > lg->tid)
+                               lg->tid = l.id; /* should only happen during 
initialization */
                        if ((tr = tr_create(tr, l.id)) == NULL) {
                                TRC_CRITICAL(GDK, "memory allocation failed\n");
                                err = LOG_ERR;
@@ -1751,9 +1752,11 @@ cleanup_and_swap(logger *lg, int *r, con
        strconcat_len(bak, sizeof(bak), lg->fn, "_catalog_lid", NULL);
        if (BBPrename(lg->catalog_lid, bak) < 0)
                GDKclrerr();
+       rotation_lock(lg);
        for (logged_range *p = lg->pending; p; p = p->next) {
                p->cnt -= cleanup;
        }
+       rotation_unlock(lg);
        return rcnt;
 }
 
@@ -2549,9 +2552,11 @@ log_next_logfile(logger *lg, ulng ts)
        int m = (ATOMIC_GET(&GDKdebug) & FORCEMITOMASK) ? 1000 : 100;
        if (!lg->pending || !lg->pending->next)
                return NULL;
+       rotation_lock(lg);
        if (ATOMIC_GET(&lg->pending->refcount) == 0 && lg->pending != 
lg->current && lg->pending != lg->flush_ranges &&
            (ulng) ATOMIC_GET(&lg->pending->last_ts) == (ulng) 
ATOMIC_GET(&lg->pending->flushed_ts) &&
            (ulng) ATOMIC_GET(&lg->pending->flushed_ts) <= ts) {
+               rotation_unlock(lg);
                logged_range *p = lg->pending;
                for (int i = 1;
                     i < m && ATOMIC_GET(&p->refcount) == 0 && p->next && 
p->next != lg->current &&
@@ -2560,6 +2565,7 @@ log_next_logfile(logger *lg, ulng ts)
                        p = p->next;
                return p;
        }
+       rotation_unlock(lg);
        return NULL;
 }
 
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -339,7 +339,7 @@ create_table_or_view(mvc *sql, char *sna
                        break;
        }
        osa = sql->sa;
-       sql->sa = sql->ta;
+       sql_allocator *nsa = sql->sa = sa_create(NULL);
        /* first check default values */
        for (n = ol_first_node(t->columns); n; n = n->next) {
                sql_column *c = n->data;
@@ -349,13 +349,14 @@ create_table_or_view(mvc *sql, char *sna
                        const char *next_value_for = "next value for 
\"sys\".\"seq_";
                        sql_rel *r = NULL;
 
-                       sql->sa = sql->ta;
+                       sa_reset(nsa);
+                       sql->sa = nsa;
                        r = rel_parse(sql, s, sa_message(sql->ta, "select %s;", 
c->def), m_deps);
                        if (!r || !is_project(r->op) || !r->exps || 
list_length(r->exps) != 1 ||
                                exp_check_type(sql, &c->type, r, 
r->exps->h->data, type_equal) == NULL) {
                                if (r)
                                        rel_destroy(r);
-                               sa_reset(sql->ta);
+                               sa_destroy(nsa);
                                sql->sa = osa;
                                if (strlen(sql->errstr) > 6 && sql->errstr[5] 
== '!')
                                        throw(SQL, "sql.catalog", "%s", 
sql->errstr);
@@ -367,12 +368,11 @@ create_table_or_view(mvc *sql, char *sna
                        if (strncmp(c->def, next_value_for, 
strlen(next_value_for)) != 0) {
                                list *blist = rel_dependencies(sql, r);
                                if (mvc_create_dependencies(sql, blist, 
nt->base.id, FUNC_DEPENDENCY)) {
-                                       rel_destroy(r);
-                                       sa_reset(sql->sa);
+                                       sa_destroy(nsa);
+                                       sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                }
                        }
-                       rel_destroy(r);
                        sa_reset(sql->sa);
                }
        }
@@ -382,12 +382,12 @@ create_table_or_view(mvc *sql, char *sna
 
                switch (mvc_copy_column(sql, nt, c, &copied)) {
                        case -1:
-                               sa_reset(sql->ta);
+                               sa_destroy(nsa);
                                sql->sa = osa;
                                throw(SQL, "sql.catalog", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        case -2:
                        case -3:
-                               sa_reset(sql->ta);
+                               sa_destroy(nsa);
                                sql->sa = osa;
                                throw(SQL, "sql.catalog", SQLSTATE(42000) 
"CREATE TABLE: %s_%s_%s conflicts", s->base.name, t->base.name, c->base.name);
                        default:
@@ -402,17 +402,20 @@ create_table_or_view(mvc *sql, char *sna
                _DELETE(nt->part.pexp->exp);
                nt->part.pexp->exp = _STRDUP(t->part.pexp->exp);
                err = bootstrap_partition_expression(sql, nt, 1);
-               sa_reset(sql->ta);
                if (err) {
+                       sa_destroy(nsa);
                        sql->sa = osa;
                        return err;
                }
+               sa_reset(nsa);
        }
        check = sql_trans_set_partition_table(sql->session->tr, nt);
        if (check == -4) {
+               sa_destroy(nsa);
                sql->sa = osa;
                throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: %s_%s: 
the partition's expression is too long", s->base.name, t->base.name);
        } else if (check) {
+               sa_destroy(nsa);
                sql->sa = osa;
                throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: %s_%s: 
an internal error occurred", s->base.name, t->base.name);
        }
@@ -423,10 +426,12 @@ create_table_or_view(mvc *sql, char *sna
 
                        switch (mvc_copy_idx(sql, nt, i, NULL)) {
                                case -1:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                case -2:
                                case -3:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s index conflicts", s->base.name, 
t->base.name, i->base.name);
                                default:
@@ -440,22 +445,26 @@ create_table_or_view(mvc *sql, char *sna
                        char *err = NULL;
 
                        err = sql_partition_validate_key(sql, nt, k, "CREATE");
-                       sa_reset(sql->ta);
                        if (err) {
+                               sa_destroy(nsa);
                                sql->sa = osa;
                                return err;
                        }
+                       sa_reset(sql->sa);
                        switch (mvc_copy_key(sql, nt, k, NULL)) {
                                case -1:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                case -2:
                                case -3:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s constraint conflicts", s->base.name, 
t->base.name, k->base.name);
                                default:
                                        break;
                        }
+                       sa_reset(sql->sa);
                }
        }
        if (t->triggers) {
@@ -464,10 +473,12 @@ create_table_or_view(mvc *sql, char *sna
 
                        switch (mvc_copy_trigger(sql, nt, tr, NULL)) {
                                case -1:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                case -2:
                                case -3:
+                                       sa_destroy(nsa);
                                        sql->sa = osa;
                                        throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s trigger conflicts", s->base.name, 
t->base.name, nt->base.name);
                                default:
@@ -479,26 +490,28 @@ create_table_or_view(mvc *sql, char *sna
        if (nt->query && isView(nt)) {
                sql_rel *r = NULL;
 
+               sa_reset(nsa);
                r = rel_parse(sql, s, nt->query, m_deps);
                if (r)
                        r = sql_processrelation(sql, r, 0, 0, 0, 0);
                if (r) {
                        list *blist = rel_dependencies(sql, r);
                        if (mvc_create_dependencies(sql, blist, nt->base.id, 
VIEW_DEPENDENCY)) {
-                               sa_reset(sql->ta);
+                               sa_destroy(nsa);
                                sql->sa = osa;
                                throw(SQL, "sql.catalog", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        }
                }
-               sa_reset(sql->ta);
+               sql->sa = osa;
                if (!r) {
-                       sql->sa = osa;
+                       sa_destroy(nsa);
                        if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!')
                                throw(SQL, "sql.catalog", "%s", sql->errstr);
                        else
                                throw(SQL, "sql.catalog", SQLSTATE(42000) "%s", 
sql->errstr);
                }
        }
+       sa_destroy(nsa);
        sql->sa = osa;
        return MAL_SUCCEED;
 }
diff --git a/sql/common/sql_mem.c b/sql/common/sql_mem.c
--- a/sql/common/sql_mem.c
+++ b/sql/common/sql_mem.c
@@ -72,6 +72,7 @@ sa_free(sql_allocator *pa, void *blk)
        } else {
                freed_t *f = blk;
                f->n = pa->freelist;
+               f->sz = sz;
 
                pa->freelist = f;
        }
@@ -211,8 +212,11 @@ void *sa_zalloc( sql_allocator *sa, size
 
 void sa_destroy( sql_allocator *sa )
 {
-       if (sa->pa)
+       if (sa->pa) {
+               sa_reset(sa);
+               sa_free(sa->pa, sa->blks[0]);
                return;
+       }
 
        sa_destroy_freelist(sa->freelist);
        for (size_t i = 0; i<sa->nr; i++) {
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -239,9 +239,8 @@ rel_merge_projects_(visitor *v, sql_rel 
                if (project_unsafe(rel,0) || project_unsafe(prj,0) || 
exps_share_expensive_exp(rel->exps, prj->exps))
                        return rel;
 
-               /* here we need to fix aliases */
-               rel->exps = new_exp_list(v->sql->sa);
-
+               /* here we try to fix aliases */
+               list *nexps = NULL;
                /* for each exp check if we can rename it */
                for (n = exps->h; n && all; n = n->next) {
                        sql_exp *e = n->data, *ne = NULL;
@@ -253,19 +252,22 @@ rel_merge_projects_(visitor *v, sql_rel 
                        }
                        ne = exp_push_down_prj(v->sql, e, prj, prj->l);
                        /* check if the refered alias name isn't used twice */
-                       if (ne && ambigious_ref(rel->exps, ne)) {
+                       if (ne && ambigious_ref(nexps, ne)) {
                                all = 0;
                                break;
                        }
                        if (ne) {
                                if (exp_name(e))
                                        exp_prop_alias(v->sql->sa, ne, e);
-                               list_append(rel->exps, ne);
+                               if (!nexps)
+                                       nexps = new_exp_list(v->sql->sa);
+                               list_append(nexps, ne);
                        } else {
                                all = 0;
                        }
                }
                if (all) {
+                       rel->exps = nexps;
                        /* we can now remove the intermediate project */
                        /* push order by expressions */
                        if (!list_empty(rel->r)) {
@@ -454,22 +456,36 @@ rel_push_project_up_(visitor *v, sql_rel
                 * project () [ i.i L1, i.i L2 ] -> project() [ i.i L1, L1 L2 ] 
*/
                if (list_length(rel->exps) > 1) {
                        list *exps = rel->exps;
-                       rel->exps = sa_list(v->sql->sa);
                        node *n = exps->h;
-                       list_append(rel->exps, n->data);
-                       for(n = n->next; n; n = n->next) {
+                       bool needed = false;
+                       for(n = n->next; n && !needed; n = n->next) {
                                sql_exp *e = n->data;
                                if (e->type == e_column && !is_selfref(e)) {
-                                       node *m = list_find(rel->exps, e, 
(fcmp)&exp_match_exp_cmp);
-                                       if (m) {
-                                               sql_exp *ne = exp_ref(v->sql, 
m->data);
-                                               exp_setname(v->sql->sa, ne, 
exp_relname(e), exp_name(e));
-                                               exp_propagate(v->sql->sa, ne, 
e);
-                                               set_selfref(ne);
-                                               e = ne;
+                                       for(node *m = exps->h; m && m != n && 
!needed; m = m->next) {
+                                               sql_exp *h = m->data;
+                                               if (exp_match_exp(h,e))
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to