Changeset: 21ed2577a52f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/21ed2577a52f
Modified Files:
sql/test/BugTracker-2025/Tests/7714-crash-in-window-with-subquery.test
Branch: less_explain_info
Log Message:
Merge with default branch
diffs (truncated from 953 to 300 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -2559,7 +2559,7 @@ doFile(Mapi mid, stream *fp, bool useins
"
''''||replace(rp.minimum, '''', '''''')||'''' as minimum,"
"
''''||replace(rp.maximum, '''', '''''')||'''' as maximum,"
" rp.with_nulls,"
- "
'('||group_concat(''''||replace(vp.value, '''', '''''')||'''', ',' order by
vp.value)||')' as values,"
+ "
'('||group_concat(''''||replace(vp.value, '''', '''''')||'''', ','%s)||')' as
\"values\","
" count(vp.value) <>
count(*) as has_nulls"
" from sys.schemas as
s1,"
" sys._tables as t1
left outer join sys.table_partitions as tp on t1.id = tp.table_id left outer
join sys._columns as c1 on tp.column_id = c1.id,"
@@ -2574,10 +2574,25 @@ doFile(Mapi mid, stream *fp, bool useins
" d.id = t2.id"
" group by s1.name,
t1.name, s2.name, t2.name, c1.name, tp.expression, tp.type, rp.minimum,
rp.maximum, rp.with_nulls"
" order by s1.name,
t1.name, s2.name, t2.name";
+ const char *ordering = "";
char *squery = NULL;
size_t squerylen = 0;
char *tquery = NULL;
size_t tquerylen = 0;
+ hdl = mapi_query(mid, "select
value from sys.env() where name = 'monet_version'");
+ CHECK_RESULT(mid, hdl, buf, fp);
+ if (fetch_row(hdl) > 0) {
+ const char *version =
mapi_fetch_field(hdl, 0);
+ int major, minor, patch;
+ if (version &&
+ sscanf(version,
"%d.%d.%d",
+
&major, &minor, &patch) == 3 &&
+ major == 11 &&
+ minor >= 53)
+ ordering = "
order by vp.value";
+ }
+ mapi_close_handle(hdl);
+ hdl = NULL;
if (sname) {
sname = sescape(sname);
squerylen =
strlen(sname) + 21;
@@ -2604,9 +2619,9 @@ doFile(Mapi mid, stream *fp, bool useins
free(tname);
tname = NULL;
}
- size_t qlen = sizeof(mquery) +
squerylen + tquerylen;
+ size_t qlen = sizeof(mquery) +
strlen(ordering) + squerylen + tquerylen;
char *query = malloc(qlen);
- snprintf(query, qlen, mquery,
squery ? squery : "", tquery ? tquery : "");
+ snprintf(query, qlen, mquery,
ordering, squery ? squery : "", tquery ? tquery : "");
free(squery);
free(tquery);
hdl = mapi_query(mid, query);
diff --git
a/sql/backends/monet5/generator/Tests/execute-privilege-for-public.test
b/sql/backends/monet5/generator/Tests/execute-privilege-for-public.test
--- a/sql/backends/monet5/generator/Tests/execute-privilege-for-public.test
+++ b/sql/backends/monet5/generator/Tests/execute-privilege-for-public.test
@@ -184,6 +184,7 @@ SELECT * from generate_series(cast('2024
2024-02-28
2024-05-28
2024-08-28
+2024-11-28
@connection(id=c2, username=test, password=test)
query T nosort
diff --git a/sql/backends/monet5/generator/generator.c
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -250,7 +250,7 @@ VLTgenerator_table_(BAT **result, Client
throw(MAL, "generator.table", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
v = (date *) Tloc(bn, 0);
BUN c;
- for (c = 0; c < n && f < l; c++) {
+ for (c = 0; f < l; c++) {
*v++ = f;
f = date_add_month(f, s);
if (is_date_nil(f)) {
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
@@ -1152,13 +1152,17 @@ exp2bin_coalesce(backend *be, sql_exp *f
sql_subfunc *and = sql_bind_func(be->mvc, "sys", "and", bt, bt, F_FUNC,
true, true);
sql_subfunc *not = sql_bind_func(be->mvc, "sys", "not", bt, NULL,
F_FUNC, true, true);
+ list *exps = fe->l;
+ if (list_length(exps) == 1) {
+ sql_exp *e = exps->h->data;
+ return exp_bin(be, e, left, right, NULL, NULL, NULL, isel,
depth+1, 0, 1);
+ }
if (single_value) {
/* var_x = nil; */
nme = number2name(name, sizeof(name), ++be->mvc->label);
(void)stmt_var(be, NULL, nme, exp_subtype(fe), 1, 2);
}
- list *exps = fe->l;
for (node *en = exps->h; en; en = en->next) {
sql_exp *e = en->data;
@@ -1705,6 +1709,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (!f->func->s &&
!strcmp(f->func->base.name, "window_bound")
&& exps->h->next &&
list_length(f->func->ops) == 6 && en == exps->h->next && left->nrcols)
es = stmt_const(be,
bin_find_smallest_column(be, left), es);
+ if (!f->func->s &&
(!strcmp(f->func->base.name, "first_value") || !strcmp(f->func->base.name,
"last_value"))
+ && (!en->next ||
!en->next->next) && list_length(f->func->ops) == 1 && left->nrcols)
+ es = stmt_const(be,
bin_find_smallest_column(be, left), es);
}
if (es->nrcols > nrcols)
nrcols = es->nrcols;
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -37,6 +37,7 @@
#define sql_merge (1 << 17) //ORed
#define sql_no_subquery (1 << 18) //ORed
#define sql_qualify (1 << 19) //ORed
+#define sql_check (1 << 20) //ORed
#define is_sql_from(X) ((X & sql_from) == sql_from)
#define is_sql_where(X) ((X & sql_where) == sql_where)
@@ -58,6 +59,7 @@
#define is_sql_merge(X) ((X & sql_merge) == sql_merge)
#define is_sql_no_subquery(X) ((X & sql_no_subquery) == sql_no_subquery)
#define is_sql_qualify(X) ((X & sql_qualify) == sql_qualify)
+#define is_sql_check(X) ((X & sql_check) == sql_check)
#define is_anyequal_func(sf) (strcmp((sf)->func->base.name, "sql_anyequal") ==
0 || strcmp((sf)->func->base.name, "sql_not_anyequal") == 0)
#define is_anyequal(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0)
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
@@ -413,7 +413,7 @@ create_check_plan(sql_query *query, symb
sql_rel *rel = rel_basetable(sql, t, t->base.name);
if (!stack_push_frame(sql, NULL))
return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- sql_exp *e = rel_logical_value_exp(query, &rel,
s->data.lval->h->data.sym, sql_sel | sql_no_subquery, ek);
+ sql_exp *e = rel_logical_value_exp(query, &rel,
s->data.lval->h->data.sym, sql_sel | sql_no_subquery | sql_check, ek);
stack_pop_frame(sql);
if (!e || !rel || !is_basetable(rel->op))
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
@@ -373,6 +373,8 @@ rel_with_query(sql_query *query, symbol
nrel = rel_setop_n_ary(sql->sa,
append(append(sa_list(sql->sa), base_rel), nrel), op_munion);
set_recursive(nrel);
}
+ if (!nrel)
+ return NULL;
if (recursive_distinct)
set_distinct(nrel);
rel_setop_n_ary_set_exps(sql, nrel,
rel_projections(sql, nrel, NULL, 0, 1), false);
@@ -4872,11 +4874,12 @@ rel_rankop(sql_query *query, sql_rel **r
rank = true;
supports_frames = (!rank || is_value);
- if (is_sql_update_set(f) || is_sql_psm(f) || is_sql_values(f) ||
is_sql_join(f) || is_sql_where(f) || is_sql_groupby(f) || is_sql_having(f) ||
is_psm_call(f) || is_sql_from(f)) {
+ if (is_sql_update_set(f) || is_sql_psm(f) || is_sql_values(f) ||
is_sql_join(f) || is_sql_where(f) || is_sql_groupby(f) || is_sql_having(f) ||
is_psm_call(f) || is_sql_from(f) || is_sql_check(f)) {
char *uaname = SA_NEW_ARRAY(sql->ta, char, strlen(aname) + 1);
const char *clause = is_sql_update_set(f)||is_sql_psm(f)?"in
SET, WHILE, IF, ELSE, CASE, WHEN, RETURN, ANALYZE clauses (use
subquery)":is_sql_values(f)?"on an unique value":
is_sql_join(f)?"in
JOIN conditions":is_sql_where(f)?"in WHERE clause":is_sql_groupby(f)?"in GROUP
BY clause":
- is_psm_call(f)?"in
CALL":is_sql_from(f)?"in functions in FROM":"in HAVING clause";
+ is_psm_call(f)?"in
CALL":is_sql_from(f)?"in functions in FROM":
+ is_sql_check(f)?"in
check constraints":"in HAVING clause";
return sql_error(sql, 02, SQLSTATE(42000) "%s: window function
'%s' not allowed %s", toUpperCopy(uaname, aname), aname, clause);
} else if (is_sql_aggr(f)) {
char *uaname = SA_NEW_ARRAY(sql->ta, char, strlen(aname) + 1);
@@ -5466,9 +5469,11 @@ rel_table_exp(sql_query *query, sql_rel
tname = column_e->data.lval->h->data.sval;
} else if (column_e->token == SQL_COLUMN &&
column_e->data.lval->h->type == type_symbol) {
symbol *sym = column_e->data.lval->h->data.sym;
- if (sym->token == SQL_COLUMN)
+ if (sym->token == SQL_COLUMN) {
tname = sym->data.lval->h->data.sval;
- else
+ if (dlist_length(sym->data.lval) > 1 &&
sym->data.lval->t->data.sval)
+ return NULL;
+ } else
return NULL;
} else {
return NULL;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -7859,6 +7859,8 @@ sql_trans_convert_partitions(sql_trans *
void
store_printinfo(sqlstore *store)
{
+ printf("SQL store object id: %"PRIu64"\n",
+ (uint64_t) ATOMIC_GET(&store->obj_id));
if (!MT_lock_trytime(&store->commit, 1000)) {
printf("WAL is currently locked, so no WAL information\n");
return;
diff --git
a/sql/test/BugTracker-2025/Tests/7714-crash-in-window-with-subquery.test
b/sql/test/BugTracker-2025/Tests/7714-crash-in-window-with-subquery.test
--- a/sql/test/BugTracker-2025/Tests/7714-crash-in-window-with-subquery.test
+++ b/sql/test/BugTracker-2025/Tests/7714-crash-in-window-with-subquery.test
@@ -1,6 +1,6 @@
-statement error 42000!SELECT: no such window function 'dense_rank'(any)
+statement error 42000!DENSE_RANK: window function 'dense_rank' not allowed in
check constraints
CREATE TABLE v0 ( v1 INT , v2 VARCHAR ( 37 ) NOT NULL CHECK ( CAST (
DENSE_RANK ( v1 ) OVER ( PARTITION BY ( CASE WHEN v2 > 8 THEN 'x' ELSE 'x' END
) ORDER BY v2 ) AS INTEGER ) ) )
-statement ok
+statement error 42000!COUNT: window function 'count' not allowed in check
constraints
CREATE TABLE v1 ( v1 INT , v2 VARCHAR ( 37 ) NOT NULL CHECK ( CAST ( count (
v1 ) OVER ( PARTITION BY ( CASE WHEN v2 > 8 THEN 'x' ELSE 'x' END ) ORDER BY v2
) AS INTEGER ) ) )
diff --git a/sql/test/BugTracker-2025/Tests/7717-check-with-window.test
b/sql/test/BugTracker-2025/Tests/7717-check-with-window.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7717-check-with-window.test
@@ -0,0 +1,2 @@
+statement error 42000!STDDEV_SAMP: window function 'stddev_samp' not allowed
in check constraints
+CREATE TABLE v0 ( v1 INT , v2 VARCHAR ( 77 ) NOT NULL CHECK ( CAST (
STDDEV_SAMP ( v1 / -1 ) OVER ( ORDER BY 15933342.000000 DESC ) AS INTEGER )))
diff --git a/sql/test/BugTracker-2025/Tests/7718-crash.test
b/sql/test/BugTracker-2025/Tests/7718-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7718-crash.test
@@ -0,0 +1,9 @@
+statement ok
+CREATE TABLE v0 ( v1 INT PRIMARY KEY, v2 FLOAT)
+
+statement ok rowcount 5
+INSERT INTO v0 VALUES (-1, 24), (51 , 43), (16 , 48901402.000000), (255,
64438998.000000), (17, 20304169.000000)
+
+query R
+SELECT v2 FROM v0 WHERE v2 IN ( SELECT v1 )
+----
diff --git a/sql/test/BugTracker-2025/Tests/7719-crash-in-complex-query.test
b/sql/test/BugTracker-2025/Tests/7719-crash-in-complex-query.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7719-crash-in-complex-query.test
@@ -0,0 +1,17 @@
+statement ok
+CREATE TABLE v0 (v1 INT , v2 VARCHAR(71))
+
+query IITT
+SELECT v1, v1, v2, LAST_VALUE(v2) OVER (PARTITION BY v1 RANGE BETWEEN CURRENT
ROW AND UNBOUNDED FOLLOWING) FROM v0
+----
+
+statement ok rowcount 1
+insert into v0 values(1,1)
+
+query IITT
+SELECT v1, v1, v2, LAST_VALUE(v2) OVER (PARTITION BY v1 RANGE BETWEEN CURRENT
ROW AND UNBOUNDED FOLLOWING) FROM v0
+----
+1
+1
+1
+NULL
diff --git a/sql/test/BugTracker-2025/Tests/7720-coalesce.test
b/sql/test/BugTracker-2025/Tests/7720-coalesce.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7720-coalesce.test
@@ -0,0 +1,10 @@
+query I
+SELECT COALESCE ( 75 )
+----
+75
+
+# bug 7721
+query I
+SELECT ( coalesce ( ( SELECT 1 ) ) )
+----
+1
diff --git
a/sql/test/BugTracker-2025/Tests/7722-recusive-cte-with-error-crash.test
b/sql/test/BugTracker-2025/Tests/7722-recusive-cte-with-error-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7722-recusive-cte-with-error-crash.test
@@ -0,0 +1,2 @@
+statement error
+SELECT ( WITH RECURSIVE x AS ( SELECT 1 UNION SELECT str_to_date ( 'int' ,
'X2014-10-25 UTC' ) ) SELECT ( 3 ) )
diff --git a/sql/test/BugTracker-2025/Tests/7730-generate-series-month-int.test
b/sql/test/BugTracker-2025/Tests/7730-generate-series-month-int.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7730-generate-series-month-int.test
@@ -0,0 +1,11 @@
+query T
+SELECT * FROM generate_series( '2025-03-01', '2025-04-25', INTERVAL '1' MONTH);
+----
+2025-03-01
+2025-04-01
+
+query T
+SELECT * FROM generate_series( '2025-03-01', '2025-04-26', INTERVAL '1' MONTH);
+----
+2025-03-01
+2025-04-01
diff --git a/sql/test/BugTracker-2025/Tests/7732-table-exp-issue.test
b/sql/test/BugTracker-2025/Tests/7732-table-exp-issue.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7732-table-exp-issue.test
@@ -0,0 +1,5 @@
+statement ok
+create table test (id integer primary key, value string)
+
+statement error 42S22!SELECT: no such column
'test.some_column_that_does_not_exist'
+select id, test."some_column_that_does_not_exist" from test order by id
diff --git a/sql/test/BugTracker-2025/Tests/All
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -61,3 +61,10 @@ 7713-crash-groupby-cse
7714-crash-in-window-with-subquery
7715-anti-like
7716-antijoin-not-exists-null
+7717-check-with-window
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]