Changeset: f4b6b219a993 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f4b6b219a993
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/mal/mal.c
        monetdb5/mal/mal.h
        monetdb5/mal/mal_embedded.c
        sql/server/rel_unnest.c
        testing/Mtest.py.in
        tools/monetdbe/monetdbe.c
        tools/mserver/mserver5.c
Branch: ppbench
Log Message:

merged with default


diffs (264 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1061,20 +1061,20 @@ const char lookupRef[];
 const char mainRef[];
 str mal2str(MalBlkPtr mb, int first, int last);
 int malAtomSize(int size, const char *name);
-str malBootstrap(char *modules[], bool embedded, const char *initpasswd);
+str malBootstrap(const char *const *modules, bool embedded, const char 
*initpasswd);
 str malEmbeddedBoot(int workerlimit, int memorylimit, int querytimeout, int 
sessionlimit, bool with_mapi_server);
 void malEmbeddedReset(void);
 _Noreturn void malEmbeddedStop(int status);
 str malExtraModulesBoot(Client c, str extraMalModules[], char *mal_scripts);
 str malInclude(Client c, const char *name, int listing);
-str malIncludeModules(Client c, char *modules[], int listing, bool embedded, 
const char *initpasswd);
+str malIncludeModules(Client c, const char *const *modules, int listing, bool 
embedded, const char *initpasswd);
 str malIncludeString(Client c, const char *name, str mal, int listing, MALfcn 
address);
 const char malRef[];
 void mal_atom_reset(void);
 ClientRec *mal_clients;
 MT_Lock mal_contextLock;
 _Noreturn void mal_exit(int status);
-int mal_init(char *modules[], bool embedded, const char *initpasswd, const 
char *caller_revision);
+int mal_init(const char *const *modules, bool embedded, const char 
*initpasswd, const char *caller_revision);
 void mal_instruction_reset(void);
 void mal_module(const char *name, mel_atom *atoms, mel_func *funcs);
 void mal_module2(const char *name, mel_atom *atoms, mel_func *funcs, mel_init 
initfunc, const char *code);
diff --git a/ctest/monetdb5/mal/test_malInclude.c 
b/ctest/monetdb5/mal/test_malInclude.c
--- a/ctest/monetdb5/mal/test_malInclude.c
+++ b/ctest/monetdb5/mal/test_malInclude.c
@@ -29,7 +29,7 @@ main(void)
                fprintf(stderr, "GDKinit() failed\n");
                return 1;
     }
-    char *modules[2];
+    const char *modules[2];
     modules[0] = "sql";
     modules[1] = 0;
     mal_init(modules, true, NULL, NULL);
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -53,7 +53,7 @@ mal_version(void)
  */
 
 int
-mal_init(char *modules[], bool embedded, const char *initpasswd,
+mal_init(const char *const *modules, bool embedded, const char *initpasswd,
                 const char *caller_revision)
 {
 /* Any error encountered here terminates the process
diff --git a/monetdb5/mal/mal.h b/monetdb5/mal/mal.h
--- a/monetdb5/mal/mal.h
+++ b/monetdb5/mal/mal.h
@@ -68,8 +68,8 @@ mal_export char monet_cwd[FILENAME_MAX];
 
 mal_export MT_Lock mal_contextLock;
 
-mal_export int mal_init(char *modules[], bool embedded, const char *initpasswd,
-                                               const char *caller_revision);
+mal_export int mal_init(const char *const *modules, bool embedded,
+                                               const char *initpasswd, const 
char *caller_revision);
 mal_export _Noreturn void mal_exit(int status);
 mal_export void mal_reset(void);
 mal_export const char *mal_version(void);
diff --git a/monetdb5/mal/mal_embedded.c b/monetdb5/mal/mal_embedded.c
--- a/monetdb5/mal/mal_embedded.c
+++ b/monetdb5/mal/mal_embedded.c
@@ -119,7 +119,7 @@ malEmbeddedBoot(int workerlimit, int mem
                MT_thread_set_qry_ctx(qc_old);
                return msg;
        }
-       static /*const*/ char *modules[8] = { "embedded", "sql", "generator", 
"udf", "csv", "parquet", "monetdb_loader" };
+       static const char *modules[7] = { "embedded", "sql", "generator", 
"udf", "csv", "parquet", "monetdb_loader" };
        if ((msg = malIncludeModules(c, modules, 0, !with_mapi_server, NULL)) 
!= MAL_SUCCEED) {
                MCcloseClient(c);
                MT_thread_set_qry_ctx(qc_old);
diff --git a/monetdb5/mal/mal_prelude.c b/monetdb5/mal/mal_prelude.c
--- a/monetdb5/mal/mal_prelude.c
+++ b/monetdb5/mal/mal_prelude.c
@@ -434,8 +434,8 @@ malPrelude(Client c, int listing, int *s
 }
 
 str
-malIncludeModules(Client c, char *modules[], int listing, bool no_mapi_server,
-                                 const char *initpasswd)
+malIncludeModules(Client c, const char *const *modules, int listing,
+                                 bool no_mapi_server, const char *initpasswd)
 {
        str msg;
        int sql = -1, mapi = -1;
diff --git a/monetdb5/mal/mal_prelude.h b/monetdb5/mal/mal_prelude.h
--- a/monetdb5/mal/mal_prelude.h
+++ b/monetdb5/mal/mal_prelude.h
@@ -24,7 +24,8 @@ mal_export void mal_module2(const char *
                                                        mel_func * funcs, 
mel_init initfunc,
                                                        const char *code);
 
-mal_export str malIncludeModules(Client c, char *modules[], int listing,
-                                                                bool embedded, 
const char *initpasswd);
+mal_export str malIncludeModules(Client c, const char *const *modules,
+                                                                int listing, 
bool embedded,
+                                                                const char 
*initpasswd);
 
 #endif /*  _MAL_PRELUDE_H */
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
@@ -31,7 +31,7 @@
  * The startup script is run as user Admin.
  */
 str
-malBootstrap(char *modules[], bool embedded, const char *initpasswd)
+malBootstrap(const char *const *modules, bool embedded, const char *initpasswd)
 {
        Client c;
 
diff --git a/monetdb5/mal/mal_session.h b/monetdb5/mal/mal_session.h
--- a/monetdb5/mal/mal_session.h
+++ b/monetdb5/mal/mal_session.h
@@ -14,7 +14,7 @@
 #include "mal_client.h"
 #include "mal_resolve.h"
 
-mal_export str malBootstrap(char *modules[], bool embedded,
+mal_export str malBootstrap(const char *const *modules, bool embedded,
                                                        const char *initpasswd);
 mal_export str MSinitClientPrg(Client cntxt, const char *mod, const char *nme);
 
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -3798,9 +3798,17 @@ unnest(visitor *v, sql_rel *parent, sql_
                sql_rel *d = rel_project(v->sql->sa, rel_dup(info->info->d), 
rel_projections(v->sql, info->info->d, NULL, 1, 1));
                add_outers_repr(v, d, info, true);
                list *exps = list_merge(rel_projections(v->sql, d, NULL, 0, 1), 
rel_projections(v->sql, rel, NULL, 0, 1), NULL);
-               rel = rel_inplace_project(v->sql->sa, rel, NULL, exps);
-               rel->nr_outers = list_length(info->info->outer_refs);
-               rel->l = rel_crossproduct(v->sql->sa, d, rel->l,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+               if (!rel_in_rel(info->info->d, rel)) {
+                       rel = rel_inplace_project(v->sql->sa, rel, NULL, exps);
+                       rel->nr_outers = list_length(info->info->outer_refs);
+                       rel->l = rel_crossproduct(v->sql->sa, d, rel->l,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+               } else {
+                       sql_rel *nrel = rel_crossproduct(v->sql->sa, d, rel,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+                       nrel = rel_project(v->sql->sa, nrel, exps);
+                       nrel->nr_outers = list_length(info->info->outer_refs);
+                       rel_update_subrel(parent, rel, nrel);
+                       rel = nrel;
+               }
                return;
        }
 
diff --git a/sql/server/sql_qc.c b/sql/server/sql_qc.c
--- a/sql/server/sql_qc.c
+++ b/sql/server/sql_qc.c
@@ -32,7 +32,7 @@ qc_create(allocator *sa, int clientid, i
 static void
 cq_delete(int clientid, cq *q)
 {
-       if (q->name)
+       if (q->name && q->f && q->f->instantiated)
                backend_freecode(NULL, clientid, q->name);
        /* q, params and name are allocated using sa, ie need to be delete last 
*/
        if (q->sa)
@@ -42,7 +42,7 @@ cq_delete(int clientid, cq *q)
 static void
 cq_restart(int clientid, cq *q)
 {
-       if (q->f->imp)
+       if (q->f && q->f->imp && q->f->instantiated)
                backend_freecode(NULL, clientid, q->f->imp);
        q->f->instantiated = false;
 }
diff --git a/sql/test/BugTracker-2026/Tests/7959-double-function-destroy.test 
b/sql/test/BugTracker-2026/Tests/7959-double-function-destroy.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7959-double-function-destroy.test
@@ -0,0 +1,18 @@
+statement ok
+PREPARE SELECT 1
+
+statement error
+SELECT * FROM non_existent_table
+
+query I
+SELECT 1
+----
+1
+
+statement error
+SELECT * FROM another_non_existent_table;
+
+query I
+SELECT 1
+----
+1
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -144,3 +144,4 @@ KNOWNFAIL?7954-exp_visitor-crash
 KNOWNFAIL?7955-rel_setop_get_statistics-crash
 KNOWNFAIL?7956-rel_remove_const_aggr-crash
 KNOWNFAIL?7957-tail_type-crash
+7959-double-function-destroy
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -2896,7 +2896,7 @@ class ServerClass:
                 if os.path.exists(self.pollfile):
                     break
                 # wait at most 30 seconds for the server to start
-                if time.time() > starttime + 30:
+                if self.timeout and time.time() > starttime + 30:
                     if procdebug:
                         print('timeout starting server')
                     if os.name == 'nt':
@@ -2930,7 +2930,7 @@ class ServerClass:
                 curtime = time.time()
                 if curtime >= endtime:
                     break
-                line = proc.stdout.readline(timeout=endtime - curtime)
+                line = proc.stdout.readline(timeout=endtime - curtime if 
self.timeout else None)
                 if not line:
                     break
                 self.outfile.write(line)
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -994,8 +994,8 @@ monetdbe_load_extension(monetdbe_databas
        if ((mdbe->msg = validate_database_handle(mdbe, 
"embedded.monetdbe_dump_database")) != MAL_SUCCEED) {
                return mdbe->msg;
        }
-       char *modules[2];
-       modules[0] = (char*)file;
+       const char *modules[2];
+       modules[0] = file;
        modules[1] = NULL;
        char *msg = loadLibrary(file, -1);
        if (msg)
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -368,7 +368,7 @@ main(int argc, char **av)
        };
 
 #define MAX_MODULES 32
-       char *modules[MAX_MODULES + 1];
+       const char *modules[MAX_MODULES + 1];
        int mods = 0;
 
        modules[mods++] = "sql";
diff --git a/tools/mserver/shutdowntest.c b/tools/mserver/shutdowntest.c
--- a/tools/mserver/shutdowntest.c
+++ b/tools/mserver/shutdowntest.c
@@ -254,7 +254,7 @@ static str monetdb_initialize(void) {
                assert(MT_thread_getallocator() != NULL);
        }
 
-       char *modules[2];
+       const char *modules[2];
        modules[0] = "sql";
        modules[1] = 0;
        if (mal_init(modules, true, NULL, NULL) != 0) { // mal_init() does not 
return meaningful codes on failure
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to