Changeset: bd15c5848d40 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bd15c5848d40 Modified Files: sql/server/rel_dump.c sql/server/rel_select.c sql/server/rel_unnest.c sql/test/subquery/Tests/subquery6.sql Branch: default Log Message:
Merged with oscar 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 @@ -924,10 +924,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); @@ -1028,12 +1040,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); @@ -1042,6 +1058,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) { @@ -1072,7 +1095,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 @@ -1428,20 +1428,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))) @@ -1450,7 +1446,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