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 <[email protected]>
+- 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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list