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