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]