blob: e53cb57154fd020001c50c7d544019af71d110a6 [file] [log] [blame]
--
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements. See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- test inner joins
-- (NO NATURAL JOIN)
autocommit off;
-- create some tables
create table t1(c1 int);
create table t2(c1 int);
create table t3(c1 int);
create table insert_test(c1 int, c2 int, c3 int);
-- populate the tables
insert into t1 values 1, 2, 3, 4;
insert into t2 values 1, 3, 5, 6;
insert into t3 values 2, 3, 5, 7;
-- negative tests
-- no join clause
select * from t1 join t2;
select * from t1 inner join t2;
-- empty column list
select * from t1 join t2 using ();
-- non-boolean join clause
select * from t1 join t2 on 1;
-- duplicate exposed names, DB2 extension
-- DB2 UDB: PASS
-- DB2 CS: FAIL
select * from t1 join t1 on 1=1;
-- duplicate exposed names
select * from t1 join t1 on c1 = 1;
select * from t1 join t1 on (c1);
-- join clause only allowed to contain column references from tables being
-- joined. DB2 doesn't allow references to correlated columns
select * from t1, t2 join t3 on t1.c1 = t2.c1;
-- should match db2's behavior by raising an error
select * from t2 b inner join t3 c on a.c1 = b.c1 and b.c1 = c.c1;
select * from t3 b where exists (select * from t1 a inner join t2 on b.c1 = t2.c1);
select * from t3 where exists (select * from t1 inner join t2 on t3.c1 = t2.c1);
-- positive tests
select a.c1 from t1 a join t2 b on a.c1 = b.c1;
select a.x from t1 a (x) join t2 b (x) on a.x = b.x;
-- ANSI "extension" - duplicate exposed names allowed when no column references
-- this may go away if we can figure out how to detect this error and
-- get bored enough to prioritize the fix
get cursor c as 'select 1 from t1 join t1 on 1=1';
next c;
close c;
-- parameters and join clause
prepare asdf as 'select * from t1 join t2 on ?=1 and t1.c1 = t2.c1';
execute asdf using 'values 1';
remove asdf;
prepare asdf as 'select * from t1 join t2 on t1.c1 = t2.c1 and t1.c1 = ?';
execute asdf using 'values 1';
remove asdf;
-- additional predicates outside of the join clause
select * from t1 join t2 on t1.c1 = t2.c1 where t1.c1 = 1;
select * from t1 join t2 on t1.c1 = 1 where t2.c1 = t1.c1;
-- subquery in join clause
select * from t1 a join t2 b
on a.c1 = b.c1 and a.c1 = (select c1 from t1 where a.c1 = t1.c1);
select * from t1 a join t2 b
on a.c1 = b.c1 and a.c1 in (select c1 from t1 where a.c1 = t1.c1);
-- correlated columns
select * from t1 a
where exists (select * from t1 inner join t2 on a.c1 = t2.c1);
-- nested joins
select * from t1 join t2 on t1.c1 = t2.c1 inner join t3 on t1.c1 = t3.c1;
-- parens
select * from (t1 join t2 on t1.c1 = t2.c1) inner join t3 on t1.c1 = t3.c1;
select * from t1 join (t2 inner join t3 on t2.c1 = t3.c1) on t1.c1 = t2.c1;
-- [inner] joins
select * from t1 a left outer join t2 b on a.c1 = b.c1 inner join t3 c on b.c1 = c.c1;
select * from (t1 a left outer join t2 b on a.c1 = b.c1) inner join t3 c on b.c1 = c.c1;
select * from t1 a join t2 b on a.c1 = b.c1 inner join t3 c on c.c1 = a.c1 where c.c1 > 2 and a.c1 > 2;
select * from (t1 a join t2 b on a.c1 = b.c1) inner join t3 c on c.c1 = a.c1 where c.c1 > 2 and a.c1 > 2;
select * from t1 a join (t2 b inner join t3 c on c.c1 = b.c1) on a.c1 = b.c1 where c.c1 > 2 and b.c1 > 2;
-- test insert/update/delete
insert into insert_test
select * from t1 a join t2 b on a.c1 = b.c1 inner join t3 c on a.c1 <> c.c1;
select * from insert_test;
update insert_test
set c1 = (select 9 from t1 a join t1 b on a.c1 = b.c1 where a.c1 = 1)
where c1 = 1;
select * from insert_test;
delete from insert_test
where c1 = (select 9 from t1 a join t1 b on a.c1 = b.c1 where a.c1 = 1);
select * from insert_test;
-- multicolumn join
select * from insert_test a join insert_test b
on a.c1 = b.c1 and a.c2 = b.c2 and a.c3 = b.c3;
-- continue with insert tests
delete from insert_test;
insert into insert_test
select * from (select * from t1 a join t2 b on a.c1 = b.c1 inner join t3 c on a.c1 <> c.c1) d (c1, c2, c3);
select * from insert_test;
delete from insert_test;
-- reset autocomiit
autocommit on;
-- drop the tables
drop table t1;
drop table t2;
drop table t3;
drop table insert_test;