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

Reply via email to