Changeset: 8f66f1611a5d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8f66f1611a5d
Modified Files:
        monetdb5/mal/mal_client.c
        sql/backends/monet5/rel_bin.c
        sql/server/rel_unnest.c
Branch: default
Log Message:

Merge with Mar2025 branch.


diffs (truncated from 780 to 300 lines):

diff --git a/clients/mapilib/mapi_querytype.h b/clients/mapilib/mapi_querytype.h
--- a/clients/mapilib/mapi_querytype.h
+++ b/clients/mapilib/mapi_querytype.h
@@ -13,7 +13,7 @@
 #ifndef _MAPI_QUERYTYPE_H_INCLUDED
 #define _MAPI_QUERYTYPE_H_INCLUDED 1
 
-/* this definition is a straight copy from sql/include/sql_query.h */
+/* this definition is also used by the SQL layer */
 typedef enum {
        Q_PARSE = 0,
        Q_TABLE = 1,
diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -292,7 +292,7 @@ msab_marchScenario(const char *lang)
        if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL)
                return(tmp);
 
-       if ((f = MT_fopen(pathbuf, "a+")) != NULL) {
+       if ((f = MT_fopen(pathbuf, "r")) != NULL) {
                if ((len = fread(buf, 1, 255, f)) > 0) {
                        char *p;
 
@@ -308,6 +308,9 @@ msab_marchScenario(const char *lang)
                                tmp = p;
                        }
                }
+               fclose(f);
+       }
+       if ((f = MT_fopen(pathbuf, "a")) != NULL) {
                /* append to the file */
                fprintf(f, "%s\n", lang);
                (void)fflush(f);
@@ -336,10 +339,10 @@ msab_retreatScenario(const char *lang)
        if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL)
                return(tmp);
 
-       if ((f = MT_fopen(pathbuf, "a+")) != NULL) {
+       if ((f = MT_fopen(pathbuf, "r")) != NULL) {
                if ((len = fread(buf, 1, 255, f)) > 0) {
                        char *p;
-                       char written = 0;
+                       bool written = false;
 
                        buf[len] = '\0';
                        tmp = buf;
@@ -348,14 +351,14 @@ msab_retreatScenario(const char *lang)
                                *p = '\0';
                                if (strcmp(tmp, lang) == 0) {
                                        memmove(tmp, p + 1, strlen(p + 1) + 1);
-                                       written = 1;
+                                       written = true;
                                } else {
                                        *p = '\n';
                                        tmp = p+1;
                                }
                        }
-                       if (written != 0) {
-                               rewind(f);
+                       fclose(f);
+                       if (written && (f = fopen(pathbuf, "w")) != NULL) {
                                len = strlen(buf) + 1;
                                if (fwrite(buf, 1, len, f) < len) {
                                        snprintf(buf, sizeof(buf), "failed to 
write: %s (%s)",
@@ -366,8 +369,11 @@ msab_retreatScenario(const char *lang)
                                fflush(f);
                                fclose(f);
                                return(NULL);
+                       } else if (written) {
+                               snprintf(buf, sizeof(buf), "failed to open 
file: %s (%s)",
+                                                strerror(errno), pathbuf);
+                               return strdup(buf);
                        }
-                       (void)fclose(f);
                        (void) MT_remove(pathbuf);
                        return(NULL);
                } else {
@@ -383,9 +389,7 @@ msab_retreatScenario(const char *lang)
                        return(NULL);
                }
        }
-       snprintf(buf, sizeof(buf), "failed to open file: %s (%s)",
-                        strerror(errno), pathbuf);
-       return(strdup(buf));
+       return(NULL);
 }
 
 #define CONNECTIONFILE ".conn"
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -256,7 +256,8 @@ MCinitClientRecord(Client c, oid user, b
        c->usermodule = c->curmodule = 0;
 
        c->father = NULL;
-       c->idle = c->login = c->lastcmd = time(0);
+       c->idle = 0;
+       c->login = c->lastcmd = time(0);
        c->session = GDKusec();
        strcpy_len(c->optimizer, "default_pipe", sizeof(c->optimizer));
        c->workerlimit = 0;
diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -267,9 +267,6 @@ runtimeProfileInit(Client cntxt, MalBlkP
                }
        }
        MT_lock_unset(&mal_delayLock);
-       MT_lock_set(&mal_contextLock);
-       cntxt->idle = 0;
-       MT_lock_unset(&mal_contextLock);
 }
 
 /*
@@ -306,9 +303,6 @@ runtimeProfileFinish(Client cntxt, MalBl
                                                        QRYqueue[i].finished, 
QRYqueue[i].query);
                        // assume that the user is now idle
                        MT_lock_unset(&mal_delayLock);
-                       MT_lock_set(&mal_contextLock);
-                       cntxt->idle = time(0);
-                       MT_lock_unset(&mal_contextLock);
                        found = true;
                        break;
                }
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -162,9 +162,6 @@ OPTmitosisImplementation(Client cntxt, M
         * Take into account the number of client connections,
         * because all user together are responsible for resource contentions
         */
-       MT_lock_set(&mal_contextLock);
-       cntxt->idle = 0;                        // this one is definitely not 
idle
-       MT_lock_unset(&mal_contextLock);
 
        /* improve memory usage estimation */
        if (nr_cols > 1 || nr_aggrs > 1 || nr_maps > 1)
diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c 
b/sql/backends/monet5/UDF/pyapi3/conversion3.c
--- a/sql/backends/monet5/UDF/pyapi3/conversion3.c
+++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c
@@ -136,19 +136,18 @@ PyMaskedArray_FromBAT(PyInput *inp, size
        bool bnonil = b->tnonil;
        MT_lock_unset(&b->theaplock);
        if (!bnonil) {
-               PyObject *mod = PyImport_ImportModule("numpy.ma");
-               PyObject *mafunc = PyObject_GetAttrString( mod, "masked_array");
                PyObject *nullmask = PyNullMask_FromBAT(b, t_start, t_end);
 
                if (!nullmask) {
                        Py_DECREF(vararray);
-                       Py_DECREF(mafunc);
-                       Py_DECREF(mod);
                        msg = createException(MAL, "pyapi3.eval", "Failed to 
create mask for some reason");
                        goto wrapup;
                } else if (nullmask == Py_None) {
                        Py_DECREF(nullmask);
                } else {
+                       PyObject *mod = PyImport_ImportModule("numpy.ma");
+                       PyObject *mafunc = PyObject_GetAttrString( mod, 
"masked_array");
+                       Py_DECREF(mod);
                        PyObject *maargs = PyTuple_New(2);
                        PyTuple_SetItem(maargs, 0, vararray);
                        PyTuple_SetItem(maargs, 1, nullmask);
@@ -157,16 +156,13 @@ PyMaskedArray_FromBAT(PyInput *inp, size
                        // array constructor
                        PyObject *mask = PyObject_CallObject(mafunc, maargs);
                        Py_DECREF(maargs);
+                       Py_DECREF(mafunc);
                        if (!mask) {
-                               Py_DECREF(mafunc);
-                               Py_DECREF(mod);
                                msg = createException(MAL, "pyapi3.eval", 
SQLSTATE(PY000) "Failed to create mask");
                                goto wrapup;
                        }
                        vararray = mask;
                }
-               Py_DECREF(mafunc);
-               Py_DECREF(mod);
        }
        return vararray;
 wrapup:
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
@@ -4748,6 +4748,8 @@ rel2bin_project(backend *be, sql_rel *re
                }
 
                limit = lpiv;
+               if (!limit) /* partition/order by cols fully overlap */
+                       limit = stmt_limit(be, pl->h->data, NULL, grp, 
stmt_atom_lng(be, 0), l, 0,0,0,0,1);
                if (limit && grp)
                        limit = stmt_project(be, stmt_selectnonil(be, limit, 
NULL), limit);
                stmt *s;
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -271,7 +271,6 @@ SQLrun(Client c, mvc *m)
                        if((msg = SQLsetTrace(c,mb)) == MAL_SUCCEED) {
                                setVariableScope(mb);
                                MT_lock_set(&mal_contextLock);
-                               c->idle = 0;
                                c->lastcmd = time(0);
                                MT_lock_unset(&mal_contextLock);
                                msg = runMAL(c, mb, 0, 0);
@@ -280,7 +279,6 @@ SQLrun(Client c, mvc *m)
                } else {
                        setVariableScope(mb);
                        MT_lock_set(&mal_contextLock);
-                       c->idle = 0;
                        c->lastcmd = time(0);
                        MT_lock_unset(&mal_contextLock);
                        msg = runMAL(c, mb, 0, 0);
@@ -289,7 +287,6 @@ SQLrun(Client c, mvc *m)
        }
        /* after the query has been finished we enter the idle state */
        MT_lock_set(&mal_contextLock);
-       c->idle = time(0);
        c->lastcmd = 0;
        MT_lock_unset(&mal_contextLock);
        MT_thread_setworking(NULL);
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -1100,6 +1100,7 @@ SQLreader(Client c, backend *be)
                MT_lock_unset(&mal_contextLock);
                return MAL_SUCCEED;
        }
+       c->idle = time(0);
        MT_lock_unset(&mal_contextLock);
        language = be->language;        /* 'S', 's' or 'X' */
        m = be->mvc;
@@ -1125,11 +1126,6 @@ SQLreader(Client c, backend *be)
                                break;
                        commit_done = true;
                }
-               if (m->session->tr && m->session->tr->active) {
-                       MT_lock_set(&mal_contextLock);
-                       c->idle = 0;
-                       MT_lock_unset(&mal_contextLock);
-               }
 
                if (go && in->pos >= in->len) {
                        ssize_t rd;
@@ -1151,12 +1147,6 @@ SQLreader(Client c, backend *be)
                                        if (msg)
                                                break;
                                        commit_done = true;
-                                       MT_lock_set(&mal_contextLock);
-                                       if (c->idle == 0 && (m->session->tr == 
NULL || !m->session->tr->active)) {
-                                               /* now the session is idle */
-                                               c->idle = time(0);
-                                       }
-                                       MT_lock_unset(&mal_contextLock);
                                }
 
                                if (go && ((!blocked && mnstr_write(c->fdout, 
c->prompt, c->promptlength, 1) != 1) || mnstr_flush(c->fdout, 
MNSTR_FLUSH_DATA))) {
@@ -1202,6 +1192,9 @@ SQLreader(Client c, backend *be)
                MT_lock_unset(&mal_contextLock);
                return msg;
        }
+       MT_lock_set(&mal_contextLock);
+       c->idle = 0;
+       MT_lock_unset(&mal_contextLock);
        return msg;
 }
 
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -698,6 +698,15 @@ monet5_schema_user_dependencies(ptr _tra
        return A;
 }
 
+static void
+SQLsetIdle(int clientid, time_t t)
+{
+       Client c = mal_clients + clientid;
+       MT_lock_set(&mal_contextLock);
+       c->idle = t;
+       MT_lock_unset(&mal_contextLock);
+}
+
 void
 monet5_user_init(backend_functions *be_funcs)
 {
@@ -710,6 +719,7 @@ monet5_user_init(backend_functions *be_f
        be_funcs->fauser = &monet5_alter_user;
        be_funcs->fruser = &monet5_rename_user;
        be_funcs->fschuserdep = &monet5_schema_user_dependencies;
+       be_funcs->setIdle = SQLsetIdle;
 }
 
 int
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -126,3 +126,10 @@ backend_find_role(ptr mvc, char *name, s
                return be_funcs.ffrole(mvc, name, role_id);
        return 0;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to