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]