Changeset: 6b4e76ced517 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b4e76ced517
Modified Files:
        sql/server/rel_select.c
        sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql
        sql/test/subquery/Tests/subquery5.sql
        sql/test/subquery/Tests/subquery5.stable.err
Branch: Jun2020
Log Message:

Small bugfix, disallow relations with the same name on the FROM clause. It 
leads into ambiguous cases


diffs (93 lines):

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
@@ -5628,10 +5628,11 @@ rel_query(sql_query *query, sql_rel *rel
 
        if (sn->from) {         /* keep variable list with tables and names */
                dlist *fl = sn->from->data.lval;
-               dnode *n = NULL;
                sql_rel *fnd = NULL;
-
-               for (n = fl->h; n ; n = n->next) {
+               list *names = new_exp_list(sql->sa);
+
+               for (dnode *n = fl->h; n ; n = n->next) {
+                       char *nrame = NULL;
                        int lateral = check_is_lateral(n->data.sym);
 
                        /* just used current expression */
@@ -5647,6 +5648,14 @@ rel_query(sql_query *query, sql_rel *rel
                        }
                        if (!fnd)
                                break;
+                       if ((nrame = (char*) rel_name(fnd))) {
+                               if (list_find(names, nrame, (fcmp) &strcmp)) {
+                                       if (res)
+                                               rel_destroy(res);
+                                       return sql_error(sql, 01, 
SQLSTATE(42000) "SELECT: relation name \"%s\" specified more than once", nrame);
+                               } else
+                                       list_append(names, nrame);
+                       }
                        if (res) {
                                res = rel_crossproduct(sql->sa, res, fnd, 
op_join);
                                if (lateral)
@@ -5918,6 +5927,9 @@ rel_crossquery(sql_query *query, sql_rel
        if (!t1 || !t2)
                return NULL;
 
+       if (rel_name(t1) && rel_name(t2) && strcmp(rel_name(t1), rel_name(t2)) 
== 0)
+               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' on both 
sides of the CROSS JOIN expression", rel_name(t1));
+
        return rel_crossproduct(sql->sa, t1, t2, op_join);
 }
 
diff --git a/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql 
b/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql
--- a/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql
+++ b/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql
@@ -57,7 +57,7 @@ CREATE VIEW output_1427727864562__386719
 
 CREATE VIEW output_1427727864562_7461402036329501989 AS SELECT a2 AS a1, a4 AS 
a2, prob AS prob FROM output_1427727864562__3867191803197065991;
 
-CREATE VIEW output_1427727864562_664384226664078002 AS SELECT 
output_1427727864562_7461402036329501989.a1 AS a1, 
output_1427727864562_7461402036329501989.a2 AS a2, 
output_1427727864562_7461402036329501989.a1 AS a3, 
output_1427727864562_7461402036329501989.a2 AS a4, 
output_1427727864562_7461402036329501989.prob * 
output_1427727864562_7461402036329501989.prob AS prob FROM 
output_1427727864562_7461402036329501989,output_1427727864562_7461402036329501989
 WHERE output_1427727864562_7461402036329501989.a2 = 
output_1427727864562_7461402036329501989.a2;
+CREATE VIEW output_1427727864562_664384226664078002 AS SELECT 
output_1427727864562_7461402036329501989.a1 AS a1, 
output_1427727864562_7461402036329501989.a2 AS a2, 
output_1427727864562_7461402036329501989.a1 AS a3, 
output_1427727864562_7461402036329501989.a2 AS a4, 
output_1427727864562_7461402036329501989.prob * 
output_1427727864562_7461402036329501989.prob AS prob FROM 
output_1427727864562_7461402036329501989,output_1427727864562_7461402036329501989
 myalias WHERE output_1427727864562_7461402036329501989.a2 = 
output_1427727864562_7461402036329501989.a2;
 
 CREATE VIEW output_1427727864562_8055303038742365054 AS SELECT a1 AS a1, a3 AS 
a2, sum(prob) AS prob FROM output_1427727864562_664384226664078002 GROUP BY a1, 
a3;
 
diff --git a/sql/test/subquery/Tests/subquery5.sql 
b/sql/test/subquery/Tests/subquery5.sql
--- a/sql/test/subquery/Tests/subquery5.sql
+++ b/sql/test/subquery/Tests/subquery5.sql
@@ -139,6 +139,12 @@ SELECT (VALUES(col1, col2)) FROM another
 
 SELECT (VALUES(col1), (col2)) FROM another_t; --error, more than one row 
returned by a subquery used as an expression
 
+SELECT integers.i FROM (VALUES(4),(5),(6),(8)) AS integers(i), integers; 
--error table integers specified more than once
+
+SELECT integers.i FROM integers, (VALUES(4)) AS myt(i), (SELECT 1) AS 
integers(i); --error table integers specified more than once
+
+SELECT 1 FROM integers CROSS JOIN integers; --error table integers specified 
more than once
+
 SELECT * FROM integers i1 LEFT OUTER JOIN integers i2 ON i2.i = ANY(SELECT 
SUM(i2.i + i3.i) FROM integers i3) = NOT EXISTS(SELECT MIN(i1.i) OVER ());
        -- 1 3
        -- 1 2
diff --git a/sql/test/subquery/Tests/subquery5.stable.err 
b/sql/test/subquery/Tests/subquery5.stable.err
--- a/sql/test/subquery/Tests/subquery5.stable.err
+++ b/sql/test/subquery/Tests/subquery5.stable.err
@@ -118,6 +118,18 @@ MAPI  = (monetdb) /var/tmp/mtest-577635/
 QUERY = SELECT (VALUES(col1), (col2)) FROM another_t; --error, more than one 
row returned by a subquery used as an expression
 ERROR = !Cardinality violation, scalar value expected
 CODE  = 21000
+MAPI  = (monetdb) /var/tmp/mtest-146231/.s.monetdb.30793
+QUERY = SELECT integers.i FROM (VALUES(4),(5),(6),(8)) AS integers(i), 
integers; --error table integers specified more than once
+ERROR = !SELECT: relation name "integers" specified more than once
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-146231/.s.monetdb.30793
+QUERY = SELECT integers.i FROM integers, (VALUES(4)) AS myt(i), (SELECT 1) AS 
integers(i); --error table integers specified more than once
+ERROR = !SELECT: relation name "integers" specified more than once
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-146231/.s.monetdb.30793
+QUERY = SELECT 1 FROM integers CROSS JOIN integers; --error table integers 
specified more than once
+ERROR = !SELECT: 'integers' on both sides of the CROSS JOIN expression
+CODE  = 42000
 
 # 08:41:39 >  
 # 08:41:39 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to