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