Changeset: 037be71f7ff1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=037be71f7ff1
Modified Files:
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_client.h
        monetdb5/mal/mal_interpreter.c
        monetdb5/modules/mal/mal_mapi.c
        sql/ChangeLog.Apr2019
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_semantic.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_scan.c
        sql/server/sql_scan.h
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/union_limitation.SF-921992.stable.out
        sql/test/BugTracker-2016/Tests/leftjoin.Bug-3981.stable.out
        
sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.stable.out
        sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out
Branch: default
Log Message:

Merge with Nov2019


diffs (truncated from 496 to 300 lines):

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
@@ -266,7 +266,7 @@ MCinitClientRecord(Client c, oid user, b
        c->protocol = PROTOCOL_9;
 
        c->filetrans = false;
-       c->query = NULL;
+       c->getquery = NULL;
 
        char name[16];
        snprintf(name, sizeof(name), "Client%d->s", (int) (c - mal_clients));
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -181,7 +181,7 @@ typedef struct CLIENT {
        size_t blocksize;
        protocol_version protocol;
        bool filetrans;                 /* whether the client can read files 
for us */
-       char *query;                    /* string, identify whatever we're 
working on */
+       const char *(*getquery)(struct CLIENT *);
 } *Client, ClientRec;
 
 mal_export bool    MCinit(void);
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -567,9 +567,11 @@ str runMALsequence(Client cntxt, MalBlkP
                                /* if still the same, replace lastprint with 
current
                                 * time and print the query */
                                if (ATOMIC_CAS(&cntxt->lastprint, &lp, t)) {
+                                       const char *q = cntxt->getquery ? 
cntxt->getquery(cntxt) : NULL;
                                        fprintf(stderr, "#%s: query already 
running "LLFMT"s: %.200s\n",
-                                               cntxt->mythread->name, (lng) 
(time(0) - cntxt->lastcmd),
-                                               cntxt->query);
+                                                       cntxt->mythread->name,
+                                                       (lng) (time(0) - 
cntxt->lastcmd),
+                                                       q ? q : "");
                                }
                        }
                }
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -126,6 +126,7 @@ static void generateChallenge(str buf, i
 struct challengedata {
        stream *in;
        stream *out;
+       char challenge[13];
 };
 
 static void
@@ -145,6 +146,7 @@ doChallenge(void *data)
 #ifdef _MSC_VER
        srand((unsigned int) GDKusec());
 #endif
+       memcpy(challenge, ((struct challengedata *) data)->challenge, 
sizeof(challenge));
        GDKfree(data);
        if (buf == NULL) {
                close_stream(fdin);
@@ -152,9 +154,6 @@ doChallenge(void *data)
                return;
        }
 
-       /* generate the challenge string */
-       generateChallenge(challenge, 8, 12);
-
        // send the challenge over the block stream
        mnstr_printf(fdout, "%s:mserver:9:%s:%s:%s:",
                        challenge,
@@ -503,6 +502,10 @@ SERVERlistenThread(SOCKET *Sock)
                char name[16];
                snprintf(name, sizeof(name), "client%d",
                                 (int) ATOMIC_INC(&threadno));
+
+               /* generate the challenge string */
+               generateChallenge(data->challenge, 8, 12);
+
                if ((tid = THRcreate(doChallenge, data, MT_THR_DETACHED, name)) 
== 0) {
                        mnstr_destroy(data->in);
                        mnstr_destroy(data->out);
@@ -1087,6 +1090,10 @@ SERVERclient(void *res, const Stream *In
        char name[16];
        snprintf(name, sizeof(name), "client%d",
                         (int) ATOMIC_INC(&threadno));
+
+       /* generate the challenge string */
+       generateChallenge(data->challenge, 8, 12);
+
        if ((tid = THRcreate(doChallenge, data, MT_THR_DETACHED, name)) == 0) {
                mnstr_destroy(data->in);
                mnstr_destroy(data->out);
diff --git a/sql/ChangeLog.Apr2019 b/sql/ChangeLog.Apr2019
--- a/sql/ChangeLog.Apr2019
+++ b/sql/ChangeLog.Apr2019
@@ -1,3 +1,7 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Wed Sep 25 2019 Sjoerd Mullender <sjo...@acm.org>
+- Strings are now limited to 1GB, double-quoted tokens are limited to 2kB.
+  These sizes are bytes of (UTF-8 encoded) input data.
+
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
@@ -1289,14 +1289,13 @@ rel_parse_value(backend *be, char *query
        m->sym = NULL;
        o.vars = m->vars;       /* may have been realloc'ed */
        o.sizevars = m->sizevars;
+       o.query = m->query;
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
-               char errstr[ERRSIZE];
-
-               strcpy(errstr, m->errstr);
+
+               memcpy(o.errstr, m->errstr, sizeof(o.errstr));
                *m = o;
                m->session->status = status;
-               strcpy(m->errstr, errstr);
        } else {
                *m = o;
        }
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
@@ -296,7 +296,7 @@ SQLrun(Client c, backend *be, mvc *m)
        }
        if (m->emode == m_execute && be->q->paramlen != m->argc)
                throw(SQL, "sql.prepare", SQLSTATE(42000) "EXEC called with 
wrong number of arguments: expected %d, got %d", be->q->paramlen, m->argc);
-       MT_thread_setworking(c->query);
+       MT_thread_setworking(m->query);
        // locate and inline the query template instruction
        mb = copyMalBlk(c->curprg->def);
        if (!mb) {
@@ -712,13 +712,9 @@ SQLengineIntern(Client c, backend *be)
        str msg = MAL_SUCCEED;
        char oldlang = be->language;
        mvc *m = be->mvc;
-       char *q;
 
        if (oldlang == 'X') {   /* return directly from X-commands */
                sqlcleanup(be->mvc, 0);
-               q = c->query;
-               c->query = NULL;
-               GDKfree(q);
                return MAL_SUCCEED;
        }
 
@@ -738,9 +734,6 @@ SQLengineIntern(Client c, backend *be)
                        goto cleanup_engine;
                }
                sqlcleanup(be->mvc, 0);
-               q = c->query;
-               c->query = NULL;
-               GDKfree(q);
                return MAL_SUCCEED;
        }
 
@@ -786,9 +779,6 @@ cleanup_engine:
        MSresetInstructions(c->curprg->def, 1);
        freeVariables(c, c->curprg->def, NULL, be->vtop);
        be->language = oldlang;
-       q = c->query;
-       c->query = NULL;
-       GDKfree(q);
        /*
         * Any error encountered during execution should block further 
processing
         * unless auto_commit has been set.
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
@@ -262,6 +262,20 @@ global_variables(mvc *sql, const char *u
        return failure;
 }
 
+static const char *
+SQLgetquery(Client c)
+{
+       if (c) {
+               backend *be = c->sqlcontext;
+               if (be) {
+                       mvc *m = be->mvc;
+                       if (m)
+                               return m->query;
+               }
+       }
+       return NULL;
+}
+
 static char*
 SQLprepareClient(Client c, int login)
 {
@@ -269,6 +283,7 @@ SQLprepareClient(Client c, int login)
        str schema;
        backend *be;
 
+       c->getquery = SQLgetquery;
        if (c->sqlcontext == 0) {
                m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
                if( m == NULL) {
@@ -1028,11 +1043,6 @@ SQLparser(Client c)
        int err = 0, opt = 0;
        char *q = NULL;
 
-       /* clean up old stuff */
-       q = c->query;
-       c->query = NULL;
-       GDKfree(q);             /* may be NULL */
-
        be = (backend *) c->sqlcontext;
        if (be == 0) {
                /* leave a message in the log */
@@ -1051,6 +1061,11 @@ SQLparser(Client c)
 #endif
        m = be->mvc;
        m->type = Q_PARSE;
+       /* clean up old stuff */
+       q = m->query;
+       m->query = NULL;
+       GDKfree(q);             /* may be NULL */
+
        if (be->language != 'X') {
                if ((msg = SQLtrans(m)) != MAL_SUCCEED) {
                        c->mode = FINISHCLIENT;
@@ -1176,7 +1191,7 @@ SQLparser(Client c)
         */
        be->q = NULL;
        q = query_cleaned(QUERY(m->scanner));
-       c->query = q;
+       m->query = q;
 
        if (q == NULL) {
                err = 1;
@@ -1328,8 +1343,8 @@ SQLparser(Client c)
 finalize:
        if (msg) {
                sqlcleanup(m, 0);
-               q = c->query;
-               c->query = NULL;
+               q = m->query;
+               m->query = NULL;
                GDKfree(q);
        }
        return msg;
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -90,14 +90,13 @@ rel_parse(mvc *m, sql_schema *s, char *q
        m->sym = NULL;
        o.vars = m->vars;       /* may have been realloc'ed */
        o.sizevars = m->sizevars;
+       o.query = m->query;
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
-               char errstr[ERRSIZE];
 
-               strcpy(errstr, m->errstr);
+               memcpy(o.errstr, m->errstr, sizeof(o.errstr));
                *m = o;
                m->session->status = status;
-               strcpy(m->errstr, errstr);
        } else {
                int label = m->label;
 
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -474,8 +474,10 @@ build up the hash (not copied in the tra
                if (mvc_debug)
                        fprintf(stderr, "#mvc_commit done\n");
                if (GDKverbose >= 1)
-                       fprintf(stderr, "#%s: commit done (no changes)\n",
-                               MT_thread_getname());
+                       fprintf(stderr, "#%s: commit done (no 
changes)%s%.200s\n",
+                               MT_thread_getname(),
+                               GDKverbose >= 2 && m->query ? ", query: " : "",
+                               GDKverbose >= 2 && m->query ? m->query : "");
                return msg;
        }
 
@@ -534,8 +536,10 @@ build up the hash (not copied in the tra
        if (mvc_debug)
                fprintf(stderr, "#mvc_commit done\n");
        if (GDKverbose >= 1)
-               fprintf(stderr, "#%s: commit done\n",
-                       MT_thread_getname());
+               fprintf(stderr, "#%s: commit done%s%.200s\n",
+                       MT_thread_getname(),
+                       GDKverbose >= 2 && m->query ? ", query: " : "",
+                       GDKverbose >= 2 && m->query ? m->query : "");
        return msg;
 }
 
@@ -599,9 +603,11 @@ mvc_rollback(mvc *m, int chain, const ch
        if (mvc_debug)
                fprintf(stderr, "#mvc_rollback %s done\n", (name) ? name : "");
        if (GDKverbose >= 1)
-               fprintf(stderr, "#%s: commit%s%s rolled back%s\n",
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to