Changeset: 8339385d201d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8339385d201d
Modified Files:
        gdk/gdk_calc.c
        sql/server/rel_dump.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2020/Tests/All
        sql/test/BugTracker-2020/Tests/tpch-cube.Bug-6938.stable.out
        sql/test/SQLancer/Tests/All
Branch: oscar
Log Message:

Merged with Jun2020


diffs (truncated from 860 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -319,11 +319,6 @@ BATcalcnot(BAT *b, BAT *s, BAT *r)
        bn->tnonil = nils == 0;
        bn->tkey = b->tkey && nils <= 1;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -449,11 +444,6 @@ BATcalcnegate(BAT *b, BAT *s, BAT *r)
        bn->tnonil = nils == 0;
        bn->tkey = b->tkey && nils <= 1;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -589,11 +579,6 @@ BATcalcabsolute(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -728,11 +713,6 @@ BATcalciszero(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -871,11 +851,6 @@ BATcalcsign(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -3809,15 +3784,6 @@ BATcalcincrdecr(BAT *b, BAT *s, BAT *r, 
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-       if (nils == 0 && !b->tnonil) {
-               b->tnonil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  func, ALGOBATPAR(b), ALGOOPTBATPAR(s),
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -929,10 +929,22 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (!(rexps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0)))
                                return NULL;
                        if (filter) {
-                               sql_subfunc *func = sql_find_func(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL);
-                               if (!func)
+                               sql_subfunc *func = NULL;
+                               list *tl = sa_list(sql->sa);
+
+                               for (node *n = lexps->h; n; n = n->next){
+                                       sql_exp *e = n->data;
+
+                                       list_append(tl, exp_subtype(e));
+                               }
+                               for (node *n = rexps->h; n; n = n->next){
+                                       sql_exp *e = n->data;
+       
+                                       list_append(tl, exp_subtype(e));
+                               }
+
+                               if (!(func = sql_bind_func_(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, tl, F_FILT)))
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Filter: missing function '%s'\n", fname);
-
                                return exp_filter(sql->sa, lexps, rexps, func, 
anti);
                        }
                        return exp_or(sql->sa, lexps, rexps, anti);
@@ -1033,12 +1045,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (tname && !s)
                        return sql_error(sql, -1, SQLSTATE(42000) "Schema %s 
not found\n", tname);
                if (grp) {
-                       if (exps && exps->h)
-                               a = sql_bind_func(sql->sa, s, cname, 
exp_subtype(exps->h->data), NULL, F_AGGR);
-                       else
+                       if (exps && exps->h) {
+                               list *ops = sa_list(sql->sa);
+                               for( n = exps->h; n; n = n->next)
+                                       append(ops, exp_subtype(n->data));
+                               a = sql_bind_func_(sql->sa, s, cname, ops, 
F_AGGR);
+                       } else {
                                a = sql_bind_func(sql->sa, s, cname, 
sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */
+                       }
                        if (!a)
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate %s%s%s not found\n", tname ? tname : "", tname ? "." : "", cname);
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate '%s%s%s %d' not found\n", tname ? tname : "", tname ? "." : "", 
cname, list_length(exps));
                        exp = exp_aggr( sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
                        if (zero_if_empty)
                                set_zero_if_empty(exp);
@@ -1047,6 +1063,13 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        for( n = exps->h; n; n = n->next)
                                append(ops, exp_subtype(n->data));
                        f = sql_bind_func_(sql->sa, s, cname, ops, F_FUNC);
+                       if (!f)
+                               f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
+                       if (!f && list_length(ops) > 1) {
+                               list_remove_node(ops, ops->t);
+                               list_remove_node(ops, ops->t); /* some window 
functions require don't include the bounds on their definition, ugh */
+                               f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
+                       }
 
                        /* fix scale of mul function, other type casts are 
explicit */
                        if (f && f->func->fix_scale == SCALE_MUL && 
list_length(exps) == 2) {
@@ -1077,7 +1100,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (f)
                                exp = exp_op( sql->sa, exps, f);
                        else
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Function: missing '%s.%s %d'\n", tname, cname, list_length(ops));
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Function '%s%s%s %d' not found\n", tname ? tname : "", tname ? "." : "", 
cname, list_length(ops));
                }
        }
 
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
@@ -1448,20 +1448,16 @@ rel_filter(mvc *sql, sql_rel *rel, list 
        sql_exp *L = l->h->data, *R = r->h->data, *e = NULL;
        sql_subfunc *f = NULL;
        sql_schema *s = cur_schema(sql);
-       list *tl, *exps;
-
-       exps = sa_list(sql->sa);
-       tl = sa_list(sql->sa);
+       list *tl = sa_list(sql->sa);
+
        for (n = l->h; n; n = n->next){
                sql_exp *e = n->data;
 
-               list_append(exps, e);
                list_append(tl, exp_subtype(e));
        }
        for (n = r->h; n; n = n->next){
                sql_exp *e = n->data;
 
-               list_append(exps, e);
                list_append(tl, exp_subtype(e));
        }
        if (sname && !(s = mvc_bind_schema(sql, sname)))
@@ -1470,7 +1466,7 @@ rel_filter(mvc *sql, sql_rel *rel, list 
        f = sql_bind_func_(sql->sa, s, filter_op, tl, F_FILT);
 
        if (!f)
-               f = find_func(sql, s, filter_op, list_length(exps), F_FILT, 
NULL);
+               f = find_func(sql, s, filter_op, list_length(tl), F_FILT, NULL);
        if (f) {
                node *n,*m = f->func->ops->h;
                list *nexps = sa_list(sql->sa);
diff --git a/sql/test/BugTracker-2020/Tests/All 
b/sql/test/BugTracker-2020/Tests/All
--- a/sql/test/BugTracker-2020/Tests/All
+++ b/sql/test/BugTracker-2020/Tests/All
@@ -14,3 +14,5 @@ ilike-matches.Bug-6864
 select-and.Bug-6878
 copy-decimal-with-space.Bug-6917
 isauuid.Bug-6934
+tpch-cube.Bug-6938
+HAVE_PYMONETDB?remote-table-like.Bug-6641
diff --git a/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.py 
b/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.py
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.py
@@ -0,0 +1,72 @@
+import os
+import socket
+import sys
+import tempfile
+import threading
+
+import pymonetdb
+
+try:
+    from MonetDBtesting import process
+except ImportError:
+    import process
+
+
+# Find a free network port
+def freeport():
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sock.bind(('', 0))
+    port = sock.getsockname()[1]
+    sock.close()
+    return port
+
+
+with tempfile.TemporaryDirectory() as farm_dir:
+    os.mkdir(os.path.join(farm_dir, 'node1'))
+    os.mkdir(os.path.join(farm_dir, 'node2'))
+
+    node1_port = freeport()
+    with process.server(mapiport=node1_port, dbname='node1',
+                        dbfarm=os.path.join(farm_dir, 'node1'),
+                        stdin=process.PIPE, stdout=process.PIPE,
+                        stderr=process.PIPE) as node1_proc:
+        node1_conn = pymonetdb.connect(database='node1', port=node1_port, 
autocommit=True)
+        node1_cur = node1_conn.cursor()
+
+        node1_cur.execute("create table remote_data (id int, name 
varchar(2048))")
+        node1_cur.execute("insert into remote_data values (1, 'Name 1')")
+        node1_cur.execute("select * from remote_data")
+        print(node1_cur.fetchall())
+        node1_cur.execute("select * from remote_data where name like 'N%'")
+        print(node1_cur.fetchall())
+
+        node2_port = freeport()
+        with process.server(mapiport=node2_port, dbname='node2',
+                            dbfarm=os.path.join(farm_dir, 'node2'),
+                            stdin=process.PIPE, stdout=process.PIPE,
+                            stderr=process.PIPE) as node2_proc:
+            node2_conn = pymonetdb.connect(database='node2', port=node2_port, 
autocommit=True)
+            node2_cur = node2_conn.cursor()
+
+            node2_cur.execute("create remote table remote_data (id int, name 
varchar(2048)) on 
'mapi:monetdb://localhost:{}/node1/sys/remote_data'".format(node1_port))
+            node2_cur.execute("select * from remote_data")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select * from remote_data where name like 'N%'")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select rank() over () from remote_data where 
name like 'N%'")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select name like 'N%' from remote_data")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select corr(1,1) from remote_data")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select corr(1,1) over () from remote_data")
+            print(node2_cur.fetchall())
+            node2_cur.execute("select count(*) over (), max(name) over (), 
min(name) over (partition by name order by name rows between 3 preceding and 2 
preceding) from remote_data")
+            print(node2_cur.fetchall())
+
+            # cleanup: shutdown the monetdb servers and remove tempdir
+            out, err = node1_proc.communicate()
+            sys.stderr.write(err)
+
+            out, err = node2_proc.communicate()
+            sys.stderr.write(err)
diff --git 
a/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.stable.err 
b/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/remote-table-like.Bug-6641.stable.err
@@ -0,0 +1,38 @@
+stderr of test 'remote-table-like.Bug-6641` in directory 
'sql/test/BugTracker-2020` itself:
+
+
+# 10:29:34 >  
+# 10:29:34 >  "/usr/bin/python3" "remote-table-like.Bug-6641.py" 
"remote-table-like.Bug-6641"
+# 10:29:34 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_ipv6 = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# builtin opt  raw_strings = false
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 37609
+# cmdline opt  mapi_usock = /var/tmp/mtest-86984/.s.monetdb.37609
+# cmdline opt  gdk_dbpath = /tmp/tmph7n3d2d_/node1/node1
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  mapi_port = 50000
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to