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

Reply via email to