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