Changeset: 71bc04d82c35 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/71bc04d82c35
Modified Files:
        clients/mapiclient/mclient.c
        sql/backends/monet5/generator/generator.c
        sql/server/rel_select.c
        sql/storage/store.c
        sql/test/BugTracker-2025/Tests/All
        testing/Mtest.py.in
        tools/mserver/mserver5.c
Branch: default
Log Message:

Merge with Mar2025 branch.


diffs (truncated from 784 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/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5466,9 +5466,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/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,5 @@ 7713-crash-groupby-cse
 7714-crash-in-window-with-subquery
 7715-anti-like
 7716-antijoin-not-exists-null
+7730-generate-series-month-int
+7732-table-exp-issue
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -10,21 +10,6 @@
 # Copyright August 2008 - 2023 MonetDB B.V.;
 # Copyright 1997 - July 2008 CWI.
 
-#TODO:
-#=====
-# - check all TODO's below
-# - tidy -up HTML-generation by "keeping in mind" during testing,
-#   which OUT/ERR differ or not and which tests were skipped.
-#   dump HTML-stuff only at end
-#   print an ascii summary at end, too
-# - if no diffs, but warnings, say so at end
-# - produce, keep & reference LOG
-# - add a "grep-like" function and replace "inlined" grep
-#   contains(<file>,<string>)
-# - do multi-level prompting?
-# - normalize all path's used
-# - Python 3? (or do a full rewrite?)
-
 import os
 import sys
 import shutil
@@ -33,6 +18,7 @@ import re
 import secrets
 import time
 import socket
+import string                   # for whitespace
 import struct
 import signal
 import fnmatch
@@ -40,7 +26,7 @@ import http
 import http.server
 import glob
 import datetime
-import pymonetdb # check for pymonetdb early: it is essential for our work
+import pymonetdb  # check for pymonetdb early: it is essential for our work
 import concurrent.futures
 
 MonetDB_VERSION = '@MONETDB_VERSION@'.split('.')
@@ -77,6 +63,7 @@ fbre = re.compile(r' (?P<bats>\d+) free 
 ubre = re.compile(r' (?P<bats>\d+) in use')
 tbre = re.compile(r'^(?P<bats>\d+) bats total')
 
+
 # default is no color (these three functions may get redefined)
 def prred(str):
     print(str, end='')
@@ -195,7 +182,7 @@ else:
     if ttywidth > 0 and os.name == 'nt':
         ttywidth -= 1           # don't go to the edge
 
-import string                   # for whitespace
+
 def splitcommand(cmd):
     '''Like string.split, except take quotes into account.'''
     q = None
@@ -221,6 +208,7 @@ def splitcommand(cmd):
         del command[0]
     return command
 
+
 def remove(file):
     try:
         os.remove(file)
@@ -238,7 +226,8 @@ def remove(file):
     except:
         Warn(f'could not remove {file}')
 
-def isexecutable(TST, ext = '.sh') :
+
+def isexecutable(TST, ext = '.sh'):
     if   os.name == 'nt':
         for ext in '.exe', '.com', '.bat', '.cmd':
             if TST.lower().endswith(ext):
@@ -251,15 +240,14 @@ def isexecutable(TST, ext = '.sh') :
            ( os.path.isfile(TST+'.src') and os.access(TST+'.src',os.X_OK) ):
             return (True, ext)
     return (False, '')
-### isexecutable(TST, ext = '.sh') #
-
-def CheckExec(cmd) :
+
+
+def CheckExec(cmd):
     for p in os.environ['PATH'].split(os.pathsep):
         x = isexecutable(os.path.join(p,cmd),'')
         if x[0]:
             return os.path.join(p, cmd + x[1])
     return ''
-### CheckExec(cmd) #
 
 import argparse
 
@@ -334,6 +322,7 @@ CONDITIONALS = {
     'HAVE_PYTHON_LZ4'      : False, # import lz4
 }
 
+
 # a bunch of classes to help with generating (X)HTML files
 class _Encode:
     # mix-in class for encoding text and attribute values so that they
@@ -357,6 +346,7 @@ class _Encode:
             data = data.replace(c, tr)
         return data
 
+
 class Element(_Encode):
     # class to represent an (X)HTML element with its attributes and
     # children
@@ -452,6 +442,7 @@ class Element(_Encode):
     def inschild(self, index, child):
         self.children.insert(index, child)
 
+
 class Text(_Encode):
     # class to represent text in (X)HTML
     def __init__(self, text = '', raw = False):
@@ -468,6 +459,7 @@ class Text(_Encode):
         if newline and not self.raw:
             f.write('\n')
 
+
 class Comment:
     # class to represent an (X)HTML comment (not currently used)
     def __init__(self, text):
@@ -479,6 +471,7 @@ class Comment:
     def write(self, f, newline = False):
         f.write(str(self))
 
+
 REV = ''                # revision (output of hg id), default unknown
 
 black = 'black'                         # #000000
@@ -504,17 +497,18 @@ stylesheet = Element('style', None, Text
 
 TIMES = []
 
-def ErrMsg(TEXT) :
+
+def ErrMsg(TEXT):
     print(end='', flush=True)
     print('\n%s:  ERROR:  %s\n' % (THISFILE, TEXT), file=sys.stderr, 
flush=True)
-### ErrMsg(TEXT) #
-
-def ErrXit(TEXT) :
+
+
+def ErrXit(TEXT):
     ErrMsg(TEXT)
     sys.exit(1)
-### ErrXit(TEXT) #
-
-def Warn(TEXT) :
+
+
+def Warn(TEXT):
     try:
         print(end='', flush=True)
     except IOError:
@@ -523,34 +517,37 @@ def Warn(TEXT) :
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to