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