blob: 922ab7502221d73ac759c0950a77b201e13c1eb1 [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.
--
--
-- this test is for basic delete functionality
--
-- create the table
create table t1 (c1 int);
create table t2 (c1 int);
-- negative tests
-- table name required for positioned delete and for searched delete
delete;
-- populate the table
insert into t1 values (1);
insert into t2 select * from t1;
-- delete all the rows (only 1)
select * from t1;
delete from t1;
select * from t1;
-- repopulate the table
insert into t1 values(2);
insert into t1 values(3);
-- delete all the rows (multiple rows)
select * from t1;
delete from t1;
select * from t1;
-- test atomicity of multi row deletes
create table atom_test (c1 smallint);
insert into atom_test values 1, 30000,0, 2;
-- overflow
delete from atom_test where c1 + c1 > 0;
select * from atom_test;
-- divide by 0
delete from atom_test where c1 / c1 = 1;
select * from atom_test;
-- target table in source, should be done in deferred mode
-- repopulate the tables
insert into t1 values(1);
insert into t1 values(2);
insert into t2 select * from t1;
autocommit off;
select * from t1;
delete from t1 where c1 <=
(select t1.c1
from t1, t2
where t1.c1 = t2.c1
and t1.c1 = 2);
select * from t1;
rollback;
delete from t1 where c1 >=
(select
(select c1
from t1
where c1 = 1)
from t2
where c1 = 2);
select * from t1;
rollback;
delete from t1 where c1 >=
(select
(select c1
from t1 a
where c1 = 1)
from t2
where c1 = 2);
select * from t1;
rollback;
-- delete 0 rows - degenerate case for deferred delete
delete from t1 where c1 =
(select 1
from t2
where 1 =
(select c1
from t1
where c1 = 2)
);
select * from t1;
rollback;
-- delete 1 row
delete from t1
where c1 =
(select c1
from t1
where c1 = 2)
and c1 = 2;
select * from t1;
rollback;
delete from t1 where c1 <=
(select c1
from
(select c1
from t1) a
where c1 = 2);
select * from t1;
rollback;
delete from t1 where c1 <=
(select c1
from t2
where c1 = 37
union
select c1
from t1
where c1 = 2);
select * from t1;
rollback;
delete from t1 where c1 <=
(select c1
from t2
where c1 = 37
union
select c1
from
(select c1
from t1) a
where c1 = 2);
select * from t1;
rollback;
autocommit on;
-- drop the table
drop table t1;
drop table t2;
drop table atom_test;
--
-- here we test extra state lying around in the
-- deleteResultSet on a prepared statement that
-- is executed multiple times. if we don't
-- get a nasty error then we are ok
--
create table x (x int, y int);
create index ix on x(x);
insert into x values (1,1),(2,2),(3,3);
autocommit off;
prepare p as 'delete from x where x = ? and y = ?';
execute p using 'values (1,1)';
execute p using 'values (2,2)';
commit;
-- clean up
autocommit on;
drop table x;
--------------------------------------------
--
-- Test delete piece of the fix for bug171.
--
--------------------------------------------
create table bug171_employee( empl_id int, bonus int );
create table bug171_bonuses( empl_id int, bonus int );
insert into bug171_employee( empl_id, bonus ) values ( 1, 0 ), ( 2, 0 ), ( 3, 0 );
insert into bug171_bonuses( empl_id, bonus )
values
( 1, 100 ), ( 1, 100 ), ( 1, 100 ),
( 2, 200 ), ( 2, 200 ), ( 2, 200 ),
( 3, 300 ), ( 3, 300 ), ( 3, 300 );
select * from bug171_employee;
select * from bug171_bonuses;
--
-- The problem query. could not use correlation names in delete.
--
delete from bug171_employee e
where e.empl_id > 2 and e.bonus <
(
select sum( b.bonus ) from bug171_bonuses b
where b.empl_id = e.empl_id
);
select * from bug171_employee;
-- positioned delete with correlation names
autocommit off;
get cursor bug171_c2 as
'select * from bug171_employee where empl_id = 2 for update';
next bug171_c2;
delete from bug171_employee e where current of bug171_c2;
close bug171_c2;
select * from bug171_employee;
autocommit on;
--
-- Cleanup
--
drop table bug171_employee;
drop table bug171_bonuses;
--
-- Test case for DERBY-4585
--
create table d4585_t1 (id int primary key, a int);
create table d4585_t2 (id int primary key, b int,
constraint fk_t2 foreign key (b) references d4585_t1);
create table d4585_t3 (id int primary key, c int);
create table d4585_t4 (d int references d4585_t2);
insert into d4585_t1 values (16,51),(30,12),(39,24),(48,1),(53,46),(61,9);
insert into d4585_t2 values
(2,16),(3,61),(4,16),(6,30),(7,16),(10,48),(13,30),(15,48),(17,61),
(18,30),(21,48),(22,53),(23,61),(25,48),(26,30),(27,48),(29,16),(31,39),
(33,30),(35,61),(37,30),(40,53),(42,53),(45,16),(49,30),(54,53),(57,53),
(58,61),(60,30),(63,61),(64,30);
insert into d4585_t3 values
(1,50),(5,50),(8,50),(9,50),(11,36),(12,50),(14,50),(19,50),(20,50),
(24,36),(28,50),(32,50),(34,50),(38,50),(41,50),(43,50),(46,36),(47,36),
(51,36),(52,50),(55,36),(56,44),(59,36),(62,36);
insert into d4585_t4 values (7), (33), (57);
-- The query below resulted in a NullPointerException if a certain query plan
-- was chosen. Use an optimizer override to force that plan.
delete from d4585_t4 where d in
(select id from d4585_t2 --derby-properties constraint=fk_t2
where b in (select t1.id
from d4585_t1 t1, d4585_t3 t3
where t1.a=t3.id and t3.c=36));
-- Verify that the correct rows were deleted.
select * from d4585_t4;
-- Clean up
drop table d4585_t4;
drop table d4585_t3;
drop table d4585_t2;
drop table d4585_t1;