Changeset: 66579176a253 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=66579176a253
Added Files:
sql/test/BugTracker-2019/Tests/select-char.Bug-6761.stable.err
sql/test/BugTracker-2019/Tests/select-char.Bug-6761.stable.out
Modified Files:
common/stream/stream.c
configure.ag
monetdb5/modules/mal/mal_mapi.c
sql/backends/monet5/rel_bin.c
sql/rel.txt
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/test/BugTracker-2019/Tests/All
sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql
sql/test/BugTracker-2019/Tests/select-char.Bug-6761.sql
sql/test/subquery/Tests/any.sql
sql/test/subquery/Tests/any.stable.err
sql/test/subquery/Tests/any.stable.out
sql/test/subquery/Tests/subquery2.sql
tools/merovingian/daemon/client.c
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/discoveryrunner.c
tools/merovingian/daemon/merovingian.c
tools/merovingian/daemon/multiplex-funnel.c
Branch: default
Log Message:
Merge with Nov2019 branch.
diffs (truncated from 1165 to 300 lines):
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -73,6 +73,9 @@
# include <netinet/tcp.h>
# include <netdb.h>
#endif
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
#ifdef NATIVE_WIN32
#include <io.h>
@@ -2489,9 +2492,21 @@ socket_read(stream *restrict s, void *re
#endif
for (;;) {
if (s->timeout) {
+ int ret;
+#ifdef HAVE_POLL
+ struct pollfd pfd;
+
+ pfd = (struct pollfd) {.fd = s->stream_data.s,
+ .events = POLLIN};
+
+ ret = poll(&pfd, 1, (int) s->timeout);
+ if (ret == -1 || (pfd.revents & POLLERR)) {
+ s->errnr = MNSTR_READ_ERROR;
+ return -1;
+ }
+#else
struct timeval tv;
fd_set fds;
- int ret;
errno = 0;
#ifdef _MSC_VER
@@ -2512,6 +2527,7 @@ socket_read(stream *restrict s, void *re
s->errnr = MNSTR_READ_ERROR;
return -1;
}
+#endif
if (ret == 0) {
if (s->timeout_func == NULL ||
s->timeout_func()) {
s->errnr = MNSTR_TIMEOUT;
@@ -2520,7 +2536,11 @@ socket_read(stream *restrict s, void *re
continue;
}
assert(ret == 1);
+#ifdef HAVE_POLL
+ assert(pfd.revents & (POLLIN|POLLHUP));
+#else
assert(FD_ISSET(s->stream_data.s, &fds));
+#endif
}
#ifdef _MSC_VER
nr = recv(s->stream_data.s, buf, (int) size, 0);
@@ -2617,9 +2637,20 @@ static int
socket_isalive(stream *s)
{
SOCKET fd = s->stream_data.s;
- char buffer[32];
+#ifdef HAVE_POLL
+ struct pollfd pfd;
+ int ret;
+ pfd = (struct pollfd){.fd = fd};
+ if ((ret = poll(&pfd, 1, 0)) == 0)
+ return 1;
+ if (ret < 0 || pfd.revents & (POLLERR | POLLHUP))
+ return 0;
+ assert(0); /* unexpected revents value */
+ return 0;
+#else
fd_set fds;
struct timeval t;
+ char buffer[32];
t.tv_sec = 0;
t.tv_usec = 0;
@@ -2633,6 +2664,7 @@ socket_isalive(stream *s)
#endif
&fds, NULL, NULL, &t) <= 0 ||
recv(fd, buffer, sizeof(buffer), MSG_PEEK | MSG_DONTWAIT) != 0;
+#endif
}
static stream *
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2258,6 +2258,7 @@ AC_CHECK_HEADERS([ \
mach-o/dyld.h \
netdb.h \
netinet/in.h \
+ poll.h \
procfs.h \
pwd.h \
strings.h \
@@ -2489,6 +2490,7 @@ AC_CHECK_FUNCS([\
nl_langinfo \
_NSGetExecutablePath \
pipe2 \
+ poll \
popen \
posix_fadvise \
posix_fallocate \
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
@@ -58,6 +58,9 @@
# include <netdb.h>
# include <netinet/in.h>
#endif
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
#ifdef HAVE_SYS_UIO_H
# include <sys/uio.h>
#endif
@@ -275,8 +278,13 @@ SERVERlistenThread(SOCKET *Sock)
{
char *msg = 0;
int retval;
+#ifdef HAVE_POLL
+ struct pollfd pfd[2];
+ nfds_t npfd;
+#else
struct timeval tv;
fd_set fds;
+#endif
SOCKET sock = INVALID_SOCKET;
SOCKET usock = INVALID_SOCKET;
SOCKET msgsock = INVALID_SOCKET;
@@ -291,6 +299,17 @@ SERVERlistenThread(SOCKET *Sock)
(void) ATOMIC_INC(&nlistener);
do {
+#ifdef HAVE_POLL
+ npfd = 0;
+ if (sock != INVALID_SOCKET)
+ pfd[npfd++] = (struct pollfd) {.fd = sock, .events =
POLLIN};
+#ifdef HAVE_SYS_UN_H
+ if (usock != INVALID_SOCKET)
+ pfd[npfd++] = (struct pollfd) {.fd = usock, .events =
POLLIN};
+#endif
+ /* Wait up to 0.025 seconds (0.001 if testing) */
+ retval = poll(pfd, npfd, GDKdebug & FORCEMITOMASK ? 10 : 25);
+#else
FD_ZERO(&fds);
if (sock != INVALID_SOCKET)
FD_SET(sock, &fds);
@@ -298,7 +317,7 @@ SERVERlistenThread(SOCKET *Sock)
if (usock != INVALID_SOCKET)
FD_SET(usock, &fds);
#endif
- /* Wait up to 0.025 seconds (0.01 if testing) */
+ /* Wait up to 0.025 seconds (0.001 if testing) */
tv.tv_sec = 0;
tv.tv_usec = GDKdebug & FORCEMITOMASK ? 10000 : 25000;
@@ -309,6 +328,7 @@ SERVERlistenThread(SOCKET *Sock)
msgsock = usock;
#endif
retval = select((int)msgsock + 1, &fds, NULL, NULL, &tv);
+#endif
if (ATOMIC_GET(&serverexiting) || GDKexiting())
break;
if (retval == 0) {
@@ -328,7 +348,13 @@ SERVERlistenThread(SOCKET *Sock)
}
continue;
}
- if (sock != INVALID_SOCKET && FD_ISSET(sock, &fds)) {
+ if (sock != INVALID_SOCKET &&
+#ifdef HAVE_POLL
+ (npfd > 0 && pfd[0].fd == sock && pfd[0].revents &
POLLIN)
+#else
+ FD_ISSET(sock, &fds)
+#endif
+ ) {
if ((msgsock = accept4(sock, (SOCKPTR)0, (socklen_t
*)0, SOCK_CLOEXEC)) == INVALID_SOCKET) {
if (
#ifdef _MSC_VER
@@ -346,7 +372,14 @@ SERVERlistenThread(SOCKET *Sock)
(void) fcntl(msgsock, F_SETFD, FD_CLOEXEC);
#endif
#ifdef HAVE_SYS_UN_H
- } else if (usock != INVALID_SOCKET && FD_ISSET(usock, &fds)) {
+ } else if (usock != INVALID_SOCKET &&
+#ifdef HAVE_POLL
+ ((npfd > 0 && pfd[0].fd == usock &&
pfd[0].revents & POLLIN) ||
+ (npfd > 1 && pfd[1].fd == usock &&
pfd[1].revents & POLLIN))
+#else
+ FD_ISSET(usock, &fds)
+#endif
+ ) {
struct msghdr msgh;
struct iovec iov;
char buf[1];
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
@@ -565,6 +565,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
} break;
case e_convert: {
/* if input is type any NULL or column of nulls, change type */
+ sql_exp *ll = (sql_exp *) e->l;
list *tps = e->r;
sql_subtype *from = tps->h->data;
sql_subtype *to = tps->h->next->data;
@@ -573,11 +574,16 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (from->type->localtype == 0) {
l = stmt_atom(be, atom_general(sql->sa, to, NULL));
} else {
- l = exp_bin(be, e->l, left, right, grp, ext, cnt, sel);
+ l = exp_bin(be, ll, left, right, grp, ext, cnt, sel);
}
- if (!l)
+ if (!l)
return NULL;
- s = stmt_convert(be, l, from, to, sel);
+ /* if attempting to convert between strings, no conversion is
needed */
+ if (ll->type == e_column && EC_VARCHAR(from->type->eclass) &&
EC_VARCHAR(to->type->eclass)) {
+ s = l;
+ } else {
+ s = stmt_convert(be, l, from, to, sel);
+ }
} break;
case e_func: {
node *en;
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -30,27 +30,27 @@ DDL (card 0!, top of the tree always)
-> r used in ddl_list and ddl_exception
SELECT (card MULTI or same ...?)
- -> exps selection expressions (ie all e_cmp)
+ -> exps selection expressions (ie all e_cmp or e_atom of type
bit)
-> l is relation
LEFT|RIGHT|FULL
JOIN (card MULTI)
- -> exps join expressions (ie all e_cmp)
+ -> exps join expressions (ie all e_cmp or e_atom of type bit)
-> l is left relation
- -> r is rigth relation
+ -> r is right relation
-> flag LEFT (keep left order, only used during code generation)
SEMI/ANTI
(card MULTI)
- -> exps join expressions (ie all e_cmp)
+ -> exps join expressions (ie all e_cmp or e_atom of type bit)
-> l is left relation
- -> r is rigth relation
+ -> r is right relation
UNION|EXCEPT|INTERSECT
(card ATOM, AGGR or MULTI (same card as lower relation))
-> exps is list of projection expressions
-> l is left relation
- -> r is rigth relation
+ -> r is right relation
PROJECT (card ATOM, AGGR or MULTI (same card as lower relation))
-> exps is list of projection expressions
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -7955,7 +7955,7 @@ rel_reduce_casts(int *changes, mvc *sql,
}
}
if (anti) set_anti(e);
- n->data = e;
+ n->data = e;
}
}
return rel;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2318,6 +2318,10 @@ rel_logical_value_exp(sql_query *query,
sql_rel *l = *rel;
sql_exp *rls = ls;
+ assert(is_project(r->op));
+ if (list_length(r->exps) != 1)
+ return sql_error(sql, 02,
SQLSTATE(42000) "SELECT: subquery must return only one column\n");
+
if (!l) {
l = *rel = rel_project(sql->sa, NULL,
new_exp_list(sql->sa));
ls = rel_project_add_exp(sql, l, ls);
@@ -2415,7 +2419,7 @@ rel_logical_value_exp(sql_query *query,
*rel = orel->l;
}
- le = rel_value_exp(query, &sq, lo, f, ek);
+ le = rel_value_exp(query, &sq, lo, f, ek);
if (!le && sql->session->status != -ERR_AMBIGUOUS) { /*
correlated */
sql_subaggr *ea = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list