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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list