Changeset: 409d2e746ca2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/409d2e746ca2
Modified Files:
        tools/mserver/mserver5.c
Branch: nested
Log Message:

Merges default


diffs (truncated from 574 to 300 lines):

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -842,3 +842,4 @@ 11a26808ab1bc96546077899924e5c31d7f2553c
 ad290be8174693266b1e4eeab06af0266686af38 Mar2025_3
 ad290be8174693266b1e4eeab06af0266686af38 Mar2025_release
 53b71d71caccc81358785cb852a186500fc95b08 Mar2025_5
+77b1be95dc79fe61215a34b84ed67e7097323977 Mar2025_7
diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -1056,6 +1056,9 @@ rm "${RPM_BUILD_ROOT}"%{_unitdir}/monetd
 %endif
 
 %changelog
+* Mon Jun 30 2025 Sjoerd Mullender <[email protected]> - 11.53.7-20250630
+- Rebuilt.
+
 * Fri Jun 27 2025 Sjoerd Mullender <[email protected]> - 11.53.5-20250627
 - Rebuilt.
 - GH#7625: Missing entry in sys.table_types table for new LOCAL TEMPORARY
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -147,6 +147,17 @@ macro(monetdb_macro_variables)
   set(HAVE_RTREE ${RTREE_FOUND})
   set(HAVE_OPENSSL ${OPENSSL_FOUND})
 
+  set(BUILD_TYPE ${CMAKE_BUILD_TYPE})
+  if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
+    set(EXTRA_C_FLAGS "${CMAKE_C_FLAGS_DEBUG}")
+  elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
+    set(EXTRA_C_FLAGS "${CMAKE_C_FLAGS_RELEASE}")
+  elseif (${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel")
+    set(EXTRA_C_FLAGS "${CMAKE_C_FLAGS_MINSIZEREL}")
+  else (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
+    set(EXTRA_C_FLAGS "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+  endif ()
+
   if(MALLOC_FOUND)
     if(${WITH_MALLOC} STREQUAL "jemalloc")
       set(WITH_JEMALLOC 1)
diff --git a/cmake/monetdb-functions.cmake b/cmake/monetdb-functions.cmake
--- a/cmake/monetdb-functions.cmake
+++ b/cmake/monetdb-functions.cmake
@@ -111,7 +111,16 @@ function(monetdb_cmake_summary)
   message(STATUS "Sphinx: ${SPHINX_FOUND}")
   message(STATUS "Semodule: ${SEMODULE_FOUND}")
   message(STATUS "Awk: ${AWK_FOUND}")
-  message(STATUS "flags: ${CMAKE_C_FLAGS}")
+  message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
+  if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
+    message(STATUS "Extra C flags: ${CMAKE_C_FLAGS_DEBUG}")
+  elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
+    message(STATUS "Extra C flags: ${CMAKE_C_FLAGS_RELEASE}")
+  elseif (${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel")
+    message(STATUS "Extra C flags: ${CMAKE_C_FLAGS_MINSIZEREL}")
+  else (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
+    message(STATUS "Extra C flags: ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+  endif ()
   message(STATUS "-----------------------------------------")
   message(STATUS "")
 endfunction()
diff --git a/cmake/monetdb-versions.cmake b/cmake/monetdb-versions.cmake
--- a/cmake/monetdb-versions.cmake
+++ b/cmake/monetdb-versions.cmake
@@ -44,7 +44,7 @@ set(MONETDB_VERSION "${MONETDB_VERSION_M
 # common/options and common/utils)
 set(GDK_VERSION_MAJOR "30")
 set(GDK_VERSION_MINOR "1")
-set(GDK_VERSION_PATCH "0")
+set(GDK_VERSION_PATCH "1")
 set(GDK_VERSION 
"${GDK_VERSION_MAJOR}.${GDK_VERSION_MINOR}.${GDK_VERSION_PATCH}")
 
 # version of the MAPI library (subdirectory clients/mapilib)
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+monetdb (11.53.7) unstable; urgency=low
+
+  * Rebuilt.
+
+ -- Sjoerd Mullender <[email protected]>  Mon, 30 Jun 2025 13:19:20 +0200
+
 monetdb (11.53.5) unstable; urgency=low
 
   * Rebuilt.
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -231,7 +231,14 @@ GDKfdlocate(int farmid, const char *nme,
        }
 
        if (strchr(mode, 'w')) {
-               flags |= O_WRONLY | O_CREAT | O_TRUNC;
+               flags |= O_WRONLY | O_CREAT;
+               /* HACK ALERT: text files also get truncated but binary
+                * files not!  This is because mmap extend depends on
+                * files not getting truncated, and a second hot
+                * snapshot needs to completely overwrite a pre-existing
+                * (from an earlier snapshot) BBP.dir file. */
+               if (strchr(mode, 'b') == NULL)
+                       flags |= O_TRUNC;
        } else if (!strchr(mode, '+')) {
                flags |= O_RDONLY;
        } else {
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -321,8 +321,8 @@ MSscheduleClient(str command, str peer, 
                        cleanUpScheduleClient(c, &command, &msg);
                        return;
                }
-               if (!GDKgetenv_isyes(mal_enableflag)
-                       && strncasecmp("sql", lang, 3) != 0
+               if (strncasecmp("sql", lang, 3) != 0
+                       && strncasecmp("msql", lang, 3) != 0
                        && strcmp(user, "monetdb") != 0) {
                        mnstr_printf(fout,
                                                 "!only the 'monetdb' user can 
use non-sql languages. "
diff --git a/monetdb_config.h.in b/monetdb_config.h.in
--- a/monetdb_config.h.in
+++ b/monetdb_config.h.in
@@ -194,6 +194,9 @@
 #cmakedefine HAVE_LIBPY3 1
 #cmakedefine HAVE_OPENSSL 1
 
+#cmakedefine BUILD_TYPE "@BUILD_TYPE@"
+#cmakedefine EXTRA_C_FLAGS "@EXTRA_C_FLAGS@"
+
 #cmakedefine WITH_JEMALLOC 1
 #cmakedefine WITH_MIMALLOC 1
 #cmakedefine WITH_TCMALLOC 1
diff --git 
a/sql/test/BugTracker-2025/Tests/7654_non_monetdb_user_remote_table_exec.test.in
 
b/sql/test/BugTracker-2025/Tests/7654_non_monetdb_user_remote_table_exec.test.in
new file mode 100644
--- /dev/null
+++ 
b/sql/test/BugTracker-2025/Tests/7654_non_monetdb_user_remote_table_exec.test.in
@@ -0,0 +1,21 @@
+@connection(id=c1, username=monetdb, password=monetdb)
+statement ok
+create user u1 with password 'u1' name 'u1'
+
+@connection(id=c1, username=monetdb, password=monetdb)
+statement ok
+create user u2 with password 'u2' name 'u2'
+
+@connection(id=c2, username=u1, password=u1)
+statement ok
+create table foo as select * from generate_series(0, 1000)
+
+@connection(id=c3, username=u2, password=u2)
+statement ok
+create remote table foo(value smallint) on 
'mapi:monetdb://localhost:$MAPIPORT/$TSTDB/u1/foo' with user 'u1' password 'u1'
+
+@connection(id=c3, username=u2, password=u2)
+query I
+select count(*) from foo
+----
+1000
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
@@ -15,3 +15,4 @@ 7636_antijoin_crash
 7644_antijoin_crash
 7645_not_likeselect
 7646_leftjoin_crash
+7654_non_monetdb_user_remote_table_exec
diff --git a/sql/test/Tests/selective_snapshot.py 
b/sql/test/Tests/selective_snapshot.py
new file mode 100644
--- /dev/null
+++ b/sql/test/Tests/selective_snapshot.py
@@ -0,0 +1,229 @@
+import tarfile
+from MonetDBtesting import process
+import pymonetdb
+import sys
+import shutil
+import os
+import contextlib
+import copy
+
+
+dbfarm = os.getenv('GDK_DBFARM')
+tstdb = os.getenv('TSTDB')
+mydb = tstdb + '_snapx'
+
+
+def log(message):
+    assert '\n' not in message
+    print(f'##      {message}', flush=True)
+
+
+def query_one(conn, sql, args=None):
+    with conn.cursor() as c:
+        c.execute(sql, args)
+        return c.fetchone()[0]
+
+
[email protected]
+def runserver():
+    """Run an mserver, optionally clean its database directory afterward
+
+    Returns a connection to the database
+    """
+
+    log('starting server')
+    # why the stdin=PIPE?
+    with process.server(dbname=mydb, mapiport=0, stdin=process.PIPE) as server:
+        port = server.dbport
+        log(f'port={port}')
+
+        def do_connect(): return pymonetdb.connect(
+            mydb, port=port, username='monetdb', password='monetdb')
+
+        with do_connect() as conn:
+            dbpath = query_one(
+                conn, "select value from sys.environment where name = 
'gdk_dbpath'")
+            conn.dbpath = dbpath   # add additional attributes
+            conn.another_connection = do_connect
+            yield conn
+    log(f'cleaning {dbpath}')
+    shutil.rmtree(dbpath)
+
+
+foo_cols = "i INT PRIMARY KEY, t TEXT"
+foo_data = [(1, 'one'), (2, 'two'), (3, 'three')]
+foo_update = "UPDATE foo SET t = t || '!'"
+foo_data2 = [(i, t + '!') for i, t in foo_data]
+
+bar_cols = "j INT, i INT REFERENCES foo(i)"
+bar_data = [(11, 1), (21, 1), (32, 2)]
+bar_update = "UPDATE bar SET j = j * 10"
+bar_data2 = [(j * 10, i) for j, i in bar_data]
+
+baz_cols = "x TEXT"
+baz_data = [('hello, world',)]
+
+
+def initialize_table(conn, name, cols, data, *, unlogged=False):
+    table = "UNLOGGED TABLE" if unlogged else "TABLE"
+    with conn.cursor() as c:
+        log(f'CREATE {table} {name}')
+        c.execute(f"CREATE {table} {name} ({cols})")
+        placeholders = ','.join(['%s'] * len(data[0]))
+        ins = f"INSERT INTO {name} VALUES ({placeholders})"
+        for row in data:
+            c.execute(ins, row)
+
+
+def verify_table(conn, name, data):
+    log(f'verifying {name} contains {data!r}')
+    with conn.cursor() as c:
+        expected = sorted(copy.deepcopy(data))
+        c.execute(f"SELECT * FROM {name}")
+        actual = sorted(c.fetchall())
+        if actual != expected:
+            raise Exception(
+                f'table {name}: expected {expected!r}, got {actual!r}')
+
+
+def make_snapshot(conn, filename, omit_unlogged, omit_tables):
+    log(f'snapshot {filename!r}: omit_unlogged={omit_unlogged} 
omit_tables={omit_tables!r}')
+    try:
+        os.remove(filename)
+    except FileNotFoundError:
+        pass
+    schema_id = query_one(
+        conn, "SELECT id FROM sys.schemas WHERE name = CURRENT_SCHEMA")
+    omit_ids = []
+    for name in omit_tables:
+        id = query_one(conn, "SELECT id FROM sys.tables WHERE name = %s AND 
schema_id = %s", [
+                       name, schema_id])
+        omit_ids.append(id)
+    with conn.cursor() as c:
+        joined_omit_ids = ','.join(str(id) for id in omit_ids)
+        c.execute("CALL sys.hot_snapshot(%s, true, %s, %s)",
+                  (filename, omit_unlogged, joined_omit_ids))
+
+
+def unpack_snapshot(filename):
+    log(f'unpacking snapshot {filename}')
+    with tarfile.open(filename) as tar:
+        try:
+            tar.extraction_filter
+        except AttributeError:
+            # pre 3.12 Python
+            tar.extractall(dbfarm)
+        else:
+            tar.extractall(dbfarm, filter='data')
+
+
+# Create the database and set up some test data.
+# Instantly create a full snapshot.
+# Verify that foreign key constraints are checked.
+with runserver() as conn:
+    initialize_table(conn, 'foo', foo_cols, foo_data)
+    initialize_table(conn, 'bar', bar_cols, bar_data)
+    initialize_table(conn, 'baz', baz_cols, baz_data, unlogged=True)
+    conn.commit()
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to