Changeset: 1ca5b1cbe393 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1ca5b1cbe393 Added Files: sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.py sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.err sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.out Modified Files: sql/server/rel_dump.c sql/test/BugTracker-2021/Tests/All Branch: Oct2020 Log Message:
Added test and fix for bug #7165, ie skip double quote delimiter while parsing an identifier diffs (187 lines): 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 @@ -807,12 +807,14 @@ read_prop(mvc *sql, sql_exp *exp, char * (*pos)++; if (r[*pos] != '.') return sql_error(sql, -1, SQLSTATE(42000) "JOINIDX: missing '.'\n"); + (*pos)++; tname = r+*pos + 1; skipIdent(r,pos); convertIdent(tname); (*pos)++; if (r[*pos] != '.') return sql_error(sql, -1, SQLSTATE(42000) "JOINIDX: missing '.'\n"); + (*pos)++; iname = r+*pos + 1; skipIdent(r,pos); convertIdent(iname); diff --git a/sql/test/BugTracker-2021/Tests/All b/sql/test/BugTracker-2021/Tests/All --- a/sql/test/BugTracker-2021/Tests/All +++ b/sql/test/BugTracker-2021/Tests/All @@ -20,3 +20,4 @@ rollup-distinct-count.Bug-7146 sum-union.Bug-7147 distinct-union.Bug-7148 HAVE_LIBPY3?python-aggregates-empty.Bug-7158 +remote-join-idxs.Bug-7165 diff --git a/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.py b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.py new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.py @@ -0,0 +1,122 @@ +import sys, os, socket, tempfile, 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')) + os.mkdir(os.path.join(farm_dir, 'node3')) + + 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: + + 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: + + node3_port = freeport() + with process.server(mapiport=node3_port, dbname='node3', + dbfarm=os.path.join(farm_dir, 'node3'), + stdin=process.PIPE, stdout=process.PIPE, + stderr=process.PIPE) as node3_proc: + + node1_conn = pymonetdb.connect(database='node1', port=node1_port, autocommit=True) + node1_cur = node1_conn.cursor() + node2_conn = pymonetdb.connect(database='node2', port=node2_port, autocommit=True) + node2_cur = node2_conn.cursor() + node3_conn = pymonetdb.connect(database='node3', port=node3_port, autocommit=True) + node3_cur = node3_conn.cursor() + + # Setup local s1 table + node1_cur.execute("CREATE TABLE s1 (s_pk INT, i INT)") + node1_cur.execute("ALTER TABLE s1 ADD CONSTRAINT s1_pk PRIMARY KEY (s_pk)") + node1_cur.execute("INSERT INTO s1 VALUES (0, 23), (1, 42)") + # Setup local t1 table + node1_cur.execute("CREATE TABLE t1 (t_pk INT, t_fk INT, s VARCHAR(10))") + node1_cur.execute("ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (t_pk)") + node1_cur.execute("INSERT INTO t1 VALUES (0, 0, 'abc'), (1, 2, 'efg')") + + # Setup local s2 table + node2_cur.execute("CREATE TABLE s2 (s_pk INT, i INT)") + node2_cur.execute("ALTER TABLE s2 ADD CONSTRAINT s2_pk PRIMARY KEY (s_pk)") + node2_cur.execute("INSERT INTO s2 VALUES (2, 100), (3, 77)") + # Setup local t2 table + node2_cur.execute("CREATE TABLE t2 (t_pk INT, t_fk INT, s VARCHAR(10))") + node2_cur.execute("ALTER TABLE t2 ADD CONSTRAINT t2_pk PRIMARY KEY (t_pk)") + node2_cur.execute("INSERT INTO t2 VALUES (2, 3, 'hij'), (3, 1, 'klm')") + + # Setup remote s2 table + node1_cur.execute("CREATE REMOTE TABLE s2 (s_pk INT, i INT) on 'mapi:monetdb://localhost:{}/node2'".format(node2_port)) + node1_cur.execute("ALTER TABLE s2 ADD CONSTRAINT s2_pk PRIMARY KEY (s_pk)") + # Setup merge s table + node1_cur.execute("CREATE MERGE TABLE s_combined (s_pk INT, i INT)") + node1_cur.execute("ALTER TABLE s_combined ADD CONSTRAINT sc_pk PRIMARY KEY (s_pk)") + node1_cur.execute("ALTER TABLE s_combined ADD TABLE s1") + node1_cur.execute("ALTER TABLE s_combined ADD TABLE s2") + # Setup local t1 table foreign key + node1_cur.execute("ALTER TABLE t1 ADD CONSTRAINT t1_fk FOREIGN KEY (t_fk) references s_combined") + + # Setup remote s1 table + node2_cur.execute("CREATE REMOTE TABLE s1 (s_pk INT, i INT) on 'mapi:monetdb://localhost:{}/node1'".format(node1_port)) + node2_cur.execute("ALTER TABLE s1 ADD CONSTRAINT s1_pk PRIMARY KEY (s_pk)") + # Setup merge s table + node2_cur.execute("CREATE MERGE TABLE s_combined (s_pk INT, i INT)") + node2_cur.execute("ALTER TABLE s_combined ADD CONSTRAINT sc_pk PRIMARY KEY (s_pk)") + node2_cur.execute("ALTER TABLE s_combined ADD TABLE s2") + node2_cur.execute("ALTER TABLE s_combined ADD TABLE s1") + # Setup local t2 table foreign key + node2_cur.execute("ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (t_fk) references s_combined") + + # Add all remote tables for s (make sure they match their counterparts) + node3_cur.execute("CREATE REMOTE TABLE s1 (s_pk INT, i INT) on 'mapi:monetdb://localhost:{}/node1'".format(node1_port)) + node3_cur.execute("ALTER TABLE s1 ADD CONSTRAINT s1_pk PRIMARY KEY (s_pk)") + node3_cur.execute("CREATE REMOTE TABLE s2 (s_pk INT, i INT) on 'mapi:monetdb://localhost:{}/node2'".format(node2_port)) + node3_cur.execute("ALTER TABLE s2 ADD CONSTRAINT s2_pk PRIMARY KEY (s_pk)") + # Setup the comb s table + node3_cur.execute("CREATE MERGE TABLE s_combined (s_pk INT, i INT)") + node3_cur.execute("ALTER TABLE s_combined ADD CONSTRAINT sc_pk PRIMARY KEY (s_pk)") + node3_cur.execute("ALTER TABLE s_combined ADD TABLE s1") + node3_cur.execute("ALTER TABLE s_combined ADD TABLE s2") + # Add all remote tables for t (make sure they match their counterparts) + node3_cur.execute("CREATE REMOTE TABLE t1 (t_pk INT, t_fk INT, s VARCHAR(10)) on 'mapi:monetdb://localhost:{}/node1'".format(node1_port)) + node3_cur.execute("ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (t_pk)") + node3_cur.execute("ALTER TABLE t1 ADD CONSTRAINT t1_fk FOREIGN KEY (t_fk) references s_combined") + node3_cur.execute("CREATE REMOTE TABLE t2 (t_pk INT, t_fk INT, s VARCHAR(10)) on 'mapi:monetdb://localhost:{}/node2'".format(node2_port)) + node3_cur.execute("ALTER TABLE t2 ADD CONSTRAINT t2_pk PRIMARY KEY (t_pk)") + node3_cur.execute("ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (t_fk) references s_combined") + # Setup the comb table for t + node3_cur.execute("CREATE MERGE TABLE t_combined (t_pk INT, t_fk INT, s VARCHAR(10))") + node3_cur.execute("ALTER TABLE t_combined ADD CONSTRAINT tc_pk PRIMARY KEY (t_pk)") + node3_cur.execute("ALTER TABLE t_combined ADD CONSTRAINT tc_fk FOREIGN KEY (t_fk) references s_combined") + node3_cur.execute("ALTER TABLE t_combined ADD TABLE t1") + node3_cur.execute("ALTER TABLE t_combined ADD TABLE t2") + + node3_cur.execute("SELECT s_pk FROM s_combined, t_combined WHERE s_pk = t_fk ORDER BY s_pk") + if node3_cur.fetchall() != [(0,), (0,), (3,), (3,)]: + sys.stderr.write("[(0,), (0,), (3,), (3,)] expected") + + # cleanup: shutdown the monetdb servers + out, err = node1_proc.communicate() + sys.stderr.write(err) + out, err = node2_proc.communicate() + sys.stderr.write(err) + out, err = node3_proc.communicate() + sys.stderr.write(err) diff --git a/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.err b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.err @@ -0,0 +1,12 @@ +stderr of test 'remote-join-idxs.Bug-7165` in directory 'sql/test/BugTracker-2021` itself: + + +# 09:47:36 > +# 09:47:36 > "/usr/bin/python3.9" "remote-join-idxs.Bug-7165.py" "remote-join-idxs.Bug-7165" +# 09:47:36 > + + +# 09:47:39 > +# 09:47:39 > "Done." +# 09:47:39 > + diff --git a/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.out b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/remote-join-idxs.Bug-7165.stable.out @@ -0,0 +1,12 @@ +stdout of test 'remote-join-idxs.Bug-7165` in directory 'sql/test/BugTracker-2021` itself: + + +# 09:47:36 > +# 09:47:36 > "/usr/bin/python3.9" "remote-join-idxs.Bug-7165.py" "remote-join-idxs.Bug-7165" +# 09:47:36 > + + +# 09:47:39 > +# 09:47:39 > "Done." +# 09:47:39 > + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list