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]

Reply via email to