Changeset: 88c408beec6c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88c408beec6c
Modified Files:
        sql/server/rel_select.c
        sql/test/BugTracker/Tests/ambiguous_join.SF-1580565.stable.err
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.err
        sql/test/subquery/Tests/subquery5.stable.err
        sql/test/subquery/Tests/subquery5.stable.out
Branch: Oct2020
Log Message:

Do a more precise job to detect ambiguous relation names in the from list


diffs (168 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
@@ -5748,22 +5748,22 @@ rel_joinquery_(sql_query *query, sql_rel
        }
 
        lateral = check_is_lateral(tab2);
-       t1 = table_ref(query, NULL, tab1, 0, NULL);
+       t1 = table_ref(query, NULL, tab1, 0, refs);
        if (rel && !t1 && sql->session->status != -ERR_AMBIGUOUS) {
                /* reset error */
                sql->session->status = 0;
                sql->errstr[0] = 0;
-               t1 = table_ref(query, NULL, tab1, 0, NULL);
+               t1 = table_ref(query, NULL, tab1, 0, refs);
        }
        if (t1) {
-               t2 = table_ref(query, NULL, tab2, 0, NULL);
+               t2 = table_ref(query, NULL, tab2, 0, refs);
                if (lateral && !t2 && sql->session->status != -ERR_AMBIGUOUS) {
                        /* reset error */
                        sql->session->status = 0;
                        sql->errstr[0] = 0;
 
                        query_push_outer(query, t1, sql_from);
-                       t2 = table_ref(query, NULL, tab2, 0, NULL);
+                       t2 = table_ref(query, NULL, tab2, 0, refs);
                        t1 = query_pop_outer(query);
                }
        }
@@ -5772,9 +5772,6 @@ rel_joinquery_(sql_query *query, sql_rel
        if (!t1 || !t2)
                return NULL;
 
-       if (!lateral && 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 JOIN expression", rel_name(t1));
-
        inner = rel = rel_crossproduct(sql->sa, t1, t2, op_join);
        inner->op = op;
        if (lateral)
@@ -5862,17 +5859,6 @@ rel_joinquery_(sql_query *query, sql_rel
        }
        if (!rel)
                return NULL;
-       if (!lateral) { /* if this relation is under a FROM clause, check for 
duplicate names */
-               const char *rname1 = rel_name(t1), *rname2 = rel_name(t2);
-               if (refs) {
-                       if (list_find(refs, (char *)rname1, (fcmp) &strcmp))
-                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: relation name \"%s\" specified more than once", rname1);
-                       if (list_find(refs, (char *)rname2, (fcmp) &strcmp))
-                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: relation name \"%s\" specified more than once", rname2);
-                       list_append(refs, (char *)rname1);
-                       list_append(refs, (char *)rname2);
-               }
-       }
        if (inner && is_outerjoin(inner->op))
                set_processed(inner);
        set_processed(rel);
@@ -5900,28 +5886,12 @@ rel_crossquery(sql_query *query, sql_rel
        mvc *sql = query->sql;
        dnode *n = q->data.lval->h;
        symbol *tab1 = n->data.sym, *tab2 = n->next->data.sym;
-       sql_rel *t1 = table_ref(query, rel, tab1, 0, NULL), *t2 = NULL;
-       const char *rname1, *rname2;
+       sql_rel *t1 = table_ref(query, rel, tab1, 0, refs), *t2 = NULL;
 
        if (t1)
-               t2 = table_ref(query, rel, tab2, 0, NULL);
+               t2 = table_ref(query, rel, tab2, 0, refs);
        if (!t1 || !t2)
                return NULL;
-
-       rname1 = rel_name(t1);
-       rname2 = rel_name(t2);
-       if (rname1 && rname2 && strcmp(rname1, rname2) == 0)
-               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' on both 
sides of the CROSS JOIN expression", rname1);
-
-       if (refs) {
-               if (list_find(refs, (char *)rname1, (fcmp) &strcmp))
-                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
relation name \"%s\" specified more than once", rname1);
-               if (list_find(refs, (char *)rname2, (fcmp) &strcmp))
-                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
relation name \"%s\" specified more than once", rname2);
-               list_append(refs, (char *)rname1);
-               list_append(refs, (char *)rname2);
-       }
-
        return rel_crossproduct(sql->sa, t1, t2, op_join);
 }
 
diff --git a/sql/test/BugTracker/Tests/ambiguous_join.SF-1580565.stable.err 
b/sql/test/BugTracker/Tests/ambiguous_join.SF-1580565.stable.err
--- a/sql/test/BugTracker/Tests/ambiguous_join.SF-1580565.stable.err
+++ b/sql/test/BugTracker/Tests/ambiguous_join.SF-1580565.stable.err
@@ -12,11 +12,11 @@ stderr of test 'ambiguous_join.SF-158056
 
 MAPI  = (monetdb) /var/tmp/mtest-27483/.s.monetdb.35395
 QUERY = select * from B left join B on B.id = B.id;
-ERROR = !SELECT: 'b' on both sides of the JOIN expression
+ERROR = !SELECT: relation name "b" specified more than once
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from A, B left join B on B.id = A.id;
-ERROR = !SELECT: 'b' on both sides of the JOIN expression
+ERROR = !SELECT: relation name "b" specified more than once
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from A, B left join B as b2 on B.id = A.id;
diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql 
b/sql/test/miscellaneous/Tests/simple_selects.sql
--- a/sql/test/miscellaneous/Tests/simple_selects.sql
+++ b/sql/test/miscellaneous/Tests/simple_selects.sql
@@ -238,6 +238,15 @@ select ifthenelse(false, 'abc', 'abcd'),
        -- abcd 12.30
 
 start transaction;
+create table t1("kk" int);
+create table t2("kk" int);
+create table t3("tkey" int);
+
+SELECT 1 FROM (((t1 t10 INNER JOIN t2 t20 ON t10."kk" = t20."kk") INNER JOIN 
t2 t20 ON t10."kk" = t20."kk")
+INNER JOIN t3 t31 ON t20."kk" = t31."tkey"); --error, multiple references to 
relation t20
+rollback;
+
+start transaction;
 create or replace function ups() returns int begin if null > 1 then return 1; 
else return 2; end if; end;
 select ups();
        -- 2
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err 
b/sql/test/miscellaneous/Tests/simple_selects.stable.err
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.err
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err
@@ -274,7 +274,12 @@ MAPI  = (monetdb) /var/tmp/mtest-921778/
 QUERY = select x as z, y as z from (select 1, 2) as x(x,y) order by z;
 ERROR = !SELECT: identifier 'z' ambiguous
 CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-331513/.s.monetdb.32675
+MAPI  = (monetdb) /var/tmp/mtest-536652/.s.monetdb.37826
+QUERY = SELECT 1 FROM (((t1 t10 INNER JOIN t2 t20 ON t10."kk" = t20."kk") 
INNER JOIN t2 t20 ON t10."kk" = t20."kk")
+        INNER JOIN t3 t31 ON t20."kk" = t31."tkey"); --error, multiple 
references to relation t20
+ERROR = !SELECT: relation name "t20" specified more than once
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-536652/.s.monetdb.37826
 QUERY = create or replace function ups() returns int begin if 1 > 1 then 
return 1; end if; end; --error, return missing
 ERROR = !CREATE FUNCTION: missing return statement
 CODE  = 42000
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
@@ -127,7 +127,7 @@ ERROR = !SELECT: relation name "integers
 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
+ERROR = !SELECT: relation name "integers" specified more than once
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-108024/.s.monetdb.38590
 QUERY = SELECT (SELECT 1 FROM integers i2 INNER JOIN integers i3 ON i1.i = 1) 
= (SELECT 1 FROM integers i2 INNER JOIN integers i3 ON MIN(i1.i) = 1) FROM 
integers i1;
diff --git a/sql/test/subquery/Tests/subquery5.stable.out 
b/sql/test/subquery/Tests/subquery5.stable.out
--- a/sql/test/subquery/Tests/subquery5.stable.out
+++ b/sql/test/subquery/Tests/subquery5.stable.out
@@ -208,8 +208,8 @@ stdout of test 'subquery5` in directory 
 [ NULL,        3       ]
 [ NULL,        NULL    ]
 #SELECT 1 FROM integers i1 RIGHT OUTER JOIN integers i2 ON NOT EXISTS(SELECT 
1);
-% .%5 # table_name
-% %5 # name
+% .%3 # table_name
+% %3 # name
 % tinyint # type
 % 1 # length
 [ 1    ]
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to