Changeset: a8e75efdcd76 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a8e75efdcd76
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_logger.c
        sql/backends/monet5/sql_rank.c
        sql/server/rel_select.c
        sql/server/rel_statistics.c
Branch: default
Log Message:

Merge with Dec2025 branch.


diffs (truncated from 417 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1511,10 +1511,12 @@ jsonupgradebat(BAT *b, json_storage_conv
        b->tvheap = vh2;
        vh2 = NULL;
 
+       allocator *ta = MT_thread_getallocator();
        for (BUN i = 0; i < b->batCount; i++) {
                var_t o = ((var_t *) h1.base)[i];
                const char *s = vh1.base + o;
                char *ns;
+               allocator_state ta_state = ma_open(ta);
                if (fixJSONStorage(&ns, &s) != GDK_SUCCEED) {
                        HEAPfree(&h1, false);
                        HEAPfree(&vh1, false);
@@ -1523,10 +1525,11 @@ jsonupgradebat(BAT *b, json_storage_conv
                        b->tvheap = ovh;
                        TRC_CRITICAL(GDK, "converting value "
                                     "in BAT %d failed\n", b->batCacheid);
+                       ma_close(&ta_state);
                        return GDK_FAIL;
                }
                var_t no = strPut(b, &o, ns);
-               GDKfree(ns);
+               ma_close(&ta_state);
                if (no == (var_t) -1) {
                        HEAPfree(&h1, false);
                        HEAPfree(&vh1, false);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2271,12 +2271,6 @@ log_load(const char *fn, logger *lg, cha
        bool readlogs = false;
        bool needsnew = false;  /* need to write new log file? */
 
-       /* refactor */
-       if (!LOG_DISABLED(lg)) {
-               if (log_filename(lg, bak, filename) != GDK_SUCCEED)
-                       goto error;
-       }
-
        lg->catalog_bid = NULL;
        lg->catalog_id = NULL;
        lg->catalog_cnt = NULL;
@@ -2291,6 +2285,8 @@ log_load(const char *fn, logger *lg, cha
                /* try to open logfile backup, or failing that, the file
                 * itself. we need to know whether this file exists when
                 * checking the database consistency later on */
+               if (log_filename(lg, bak, filename) != GDK_SUCCEED)
+                       goto error;
                if ((fp = MT_fopen(bak, "r")) != NULL) {
                        fclose(fp);
                        fp = NULL;
@@ -2524,13 +2520,16 @@ log_load(const char *fn, logger *lg, cha
        }
        ATOMIC_SET(&GDKdebug, dbg);
 
+       bool earlyexit = GDKgetenv_isyes("process-wal-and-exit");
        if (readlogs) {
                ulng log_id = lg->saved_id + 1;
-               bool earlyexit = GDKgetenv_isyes("process-wal-and-exit");
                if (log_readlogs(lg, filename) != GDK_SUCCEED) {
                        goto error;
                }
                if (!earlyexit) {
+                       /* in case or process-wal-and-exit, do NOT run
+                        * upgrade code, and therefore do NOT update WAL
+                        * version number */
                        if (lg->postfuncp && (*lg->postfuncp) (lg->funcdata, 
lg) != GDK_SUCCEED)
                                goto error;
                        if (needsnew) {
@@ -2557,21 +2556,17 @@ log_load(const char *fn, logger *lg, cha
                ATOMIC_SET(&GDKdebug, dbg);
                for (; log_id <= lg->saved_id; log_id++)
                        (void) log_cleanup(lg, log_id); /* ignore error of 
removing file */
-               if (earlyexit) {
-                       printf("# mserver5 exiting\n");
-                       exit(0);
-               }
-               if (needsnew &&
+               if (needsnew && !earlyexit &&
                    GDKunlink(0, lg->dir, LOGFILE, "bak") != GDK_SUCCEED) {
                        TRC_CRITICAL(GDK, "couldn't remove old log.bak file\n");
                        return GDK_FAIL;
                }
        } else {
                lg->id = lg->saved_id + 1;
-               if (GDKgetenv_isyes("process-wal-and-exit")) {
-                       printf("# mserver5 exiting\n");
-                       exit(0);
-               }
+       }
+       if (earlyexit) {
+               printf("# mserver5 exiting\n");
+               exit(0);
        }
 #ifdef GDKLIBRARY_JSON
        if (log_json_upgrade_finalize() == GDK_FAIL)
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4735,7 +4735,8 @@ rel2bin_project(backend *be, sql_rel *re
                        exp_label(sql->sa, exp, ++sql->label);
                if (exp_name(exp)) {
                        s = stmt_rename(be, exp, s);
-                       s->label = exp->alias.label;
+                       if (exp->alias.label)
+                               s->label = exp->alias.label;
                }
                if (!nrcols && s->nrcols && !list_empty(pl)) {
                        for (node *n = pl->h; n; n=n->next)
@@ -5569,13 +5570,16 @@ sql_insert_triggers(backend *be, sql_tab
        return res;
 }
 
-static void
+static int
 sql_insert_check(backend *be, sql_key *key, list *inserts)
 {
        mvc *sql = be->mvc;
        int pos = 0;
        sql_rel *rel = rel_basetable(sql, key->t, key->t->base.name);
        sql_exp *exp = exp_read(sql, rel, NULL, NULL, ma_strdup(sql->sa, 
key->check), &pos, 0);
+       if (!exp)
+               return -2;
+
        rel->exps = rel_base_projection(sql, rel, 0);
 
        /* create new sub stmt with needed inserts */
@@ -5595,6 +5599,7 @@ sql_insert_check(backend *be, sql_key *k
        s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
        char *msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: violated 
constraint '%s.%s' CHECK(%s)", key->t->s->base.name, key->base.name, 
exp->comment);
        (void)stmt_exception(be, s, msg, 00001);
+       return 0;
 }
 
 static sql_table *
@@ -5667,8 +5672,8 @@ rel2bin_insert(backend *be, sql_rel *rel
 
        for (n = ol_first_node(t->keys); n; n = n->next) {
                sql_key * key = n->data;
-               if (key->type == ckey)
-                       sql_insert_check(be, key, inserts->op4.lval);
+               if (key->type == ckey && sql_insert_check(be, key, 
inserts->op4.lval) < 0)
+                       return NULL;
        }
 
        if (!sql_insert_check_null(be, t, inserts->op4.lval))
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -986,11 +986,11 @@ SQLnth_value(Client cntxt, MalBlkPtr mb,
                } else {
                        nth = *getArgReference_lng(stk, pci, 2);
                }
-               if (!(s = BATdescriptor(*getArgReference_bat(stk, pci, 6)))) {
+               if (isaBatType(getArgType(mb, pci, 6)) && !(s = 
BATdescriptor(*getArgReference_bat(stk, pci, 6)))) {
                        msg = createException(SQL, "sql.nth_value", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
-               if (!(e = BATdescriptor(*getArgReference_bat(stk, pci, 7)))) {
+               if (isaBatType(getArgType(mb, pci, 7)) && !(e = 
BATdescriptor(*getArgReference_bat(stk, pci, 7)))) {
                        msg = createException(SQL, "sql.nth_value", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -278,6 +278,7 @@ typedef enum operator_type {
 #define reset_single(rel)      (rel)->single = 0
 #define set_recursive(rel)     (rel)->recursive = 1
 #define is_recursive(rel)      ((rel)->recursive)
+#define is_dynamic(rel)        ((rel)->dynamic)
 
 #define is_freevar(e)          ((e)->freevar)
 #define set_freevar(e,level)   (e)->freevar = level+1
@@ -309,7 +310,8 @@ typedef struct relation {
         outer:1,       /* used as outer (ungrouped) */
         grouped:1,     /* groupby processed all the group by exps */
         single:1,
-        recursive:1;   /* recursive unions */
+        recursive:1,   /* recursive unions */
+        dynamic:1;             /* dynamic content (ie the double used base 
side of the recursive union) */
        /*
         * Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so 
a relation is not modified twice
         * The list is kept at rel_optimizer_private.h Please update it 
accordingly
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -330,6 +330,8 @@ rel_bind_column( mvc *sql, sql_rel *rel,
                                        e = exps_refers(e, rel->r);
                                        if (ambiguous || multi)
                                                return sql_error(sql, 
ERR_AMBIGUOUS, SQLSTATE(42000) "SELECT: identifier '%s' ambiguous", cname);
+                                       if (e)
+                                               return exp_ref(sql, e);
                                        return e;
                                }
                        }
@@ -418,7 +420,7 @@ rel_bind_column2( mvc *sql, sql_rel *rel
                                                return sql_error(sql, 
ERR_AMBIGUOUS, SQLSTATE(42000) "SELECT: identifier '%s%s%s' ambiguous",
                                                                                
 tname ? tname : "", tname ? "." : "", cname);
                                        if (e)
-                                               return e;
+                                               return exp_ref(sql, e);
                                }
                        }
                }
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -709,6 +709,8 @@ column_options(sql_query *query, dlist *
 
                                        res = column_constraint_type(query, 
opt_name ? opt_name : default_name, sym, ss, t, cs, isDeclared, &used);
                                        ma_close(&ta_state);
+                                       if (res<0)
+                                               res = SQL_ERR;
                                }       break;
                                case SQL_DEFAULT: {
                                        symbol *sym = s->data.sym;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -356,6 +356,7 @@ rel_with_query(sql_query *query, symbol 
                                nrel = rel_setop_n_ary_check_types(sql, 
base_rel, nrel, ls, rs, op_munion);
                        } else {
                                base_rel->used |= statistics_gathered;
+                               base_rel->dynamic = true;
                                prop *p = base_rel->p = prop_create(sql->sa, 
PROP_COUNT, base_rel->p);
                                p->value.lval = 1000000; /* random ? */
 
@@ -1542,6 +1543,7 @@ rel_column_ref(sql_query *query, sql_rel
        dlist *l = NULL;
        sql_rel *inner = rel?*rel:NULL, *outer = NULL;
        int used_lower_after_processed = 0;
+       int outer_state = 0;
 
        assert((column_r->token == SQL_COLUMN || column_r->token == SQL_IDENT)
                   && column_r->type == type_list);
@@ -1575,24 +1577,26 @@ rel_column_ref(sql_query *query, sql_rel
                                        if (!(exp = rel_bind_column(sql, 
outer->l, name, f, 0)) &&
                                                sql->session->status == 
-ERR_AMBIGUOUS)
                                                return NULL;
-                                       else
+                                       else if(exp)
                                                used_lower_after_processed = 
is_processed(outer);
                                }
                                if (exp && is_simple_project(outer->op) && 
!rel_find_exp(outer, exp))
                                        exp = rel_project_add_exp(sql, outer, 
exp);
                                if (exp)
+                                       outer_state = 
query_fetch_outer_state(query, i);
+                               if (exp)
                                        break;
                        }
                        if (exp && exp->card != CARD_AGGR && 
is_groupby(outer->op) &&
-                               !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+                               !is_sql_aggr(outer_state) && !is_sql_aggr(f) && 
rel_find_exp(outer->l, exp))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000)
                                                                 "SELECT: 
cannot use non GROUP BY column '%s' in query"
                                                                 " results 
without an aggregate function", name);
-                       if (exp && outer && outer->card <= CARD_AGGR && 
exp->card > CARD_AGGR && !is_sql_aggr(f))
+                       if (exp && outer && outer->card <= CARD_AGGR && 
exp->card > CARD_AGGR && !is_sql_aggr(outer_state) && !is_sql_aggr(f))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000)
                                                                 "SELECT: 
cannot use non GROUP BY column '%s' in query"
                                                                 " results 
without an aggregate function", name);
-                       if (exp && outer && !is_sql_aggr(f) && 
!is_sql_aggr(query_fetch_outer_state(query, i))) {
+                       if (exp && outer && !is_sql_aggr(outer_state) && 
!is_sql_aggr(f) && !is_sql_aggr(query_fetch_outer_state(query, i))) {
                                if (used_lower_after_processed || 
query_outer_used_exp( query, i, exp, f)) {
                                        sql_exp *lu = 
used_lower_after_processed?exp:query_outer_last_used(query, i);
                                        if (exp_name(lu) && exp_relname(lu) && 
!has_label(lu))
@@ -1605,7 +1609,7 @@ rel_column_ref(sql_query *query, sql_rel
                        }
                        if (exp) {
                                int of = query_fetch_outer_state(query, i);
-                               if (is_groupby(outer->op) && !is_sql_aggr(f)) {
+                               if (0 && is_groupby(outer->op) && 
!is_sql_aggr(f)) {
                                        exp = rel_groupby_add_aggr(sql, outer, 
exp);
                                        exp->card = CARD_ATOM;
                                } else if (is_groupby(outer->op) && 
is_sql_aggr(f) && exps_any_match(outer->exps, exp))
@@ -1695,24 +1699,26 @@ rel_column_ref(sql_query *query, sql_rel
                                        if (!(exp = rel_bind_column3(sql, 
outer->l, sname, tname, cname, f)) &&
                                                sql->session->status == 
-ERR_AMBIGUOUS)
                                                return NULL;
-                                       else
+                                       else if(exp)
                                                used_lower_after_processed = 
is_processed(outer);
                                }
                                if (exp && is_simple_project(outer->op) && 
!rel_find_exp(outer, exp))
                                        exp = rel_project_add_exp(sql, outer, 
exp);
                                if (exp)
+                                       outer_state = 
query_fetch_outer_state(query, i);
+                               if (exp)
                                        break;
                        }
                        if (exp && exp->card != CARD_AGGR && 
is_groupby(outer->op) &&
-                               !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+                               !is_sql_aggr(outer_state) && !is_sql_aggr(f) && 
rel_find_exp(outer->l, exp))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000)
                                                                 "SELECT: 
cannot use non GROUP BY column '%s.%s' in"
                                                                 " query 
results without an aggregate function", tname, cname);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to