blob: f1c9261337d0eca6b13e508ac66459a7910fddef [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 partial row access for update and delete
--
maximumdisplaywidth 2000;
drop function getScanCols;
drop table basic;
drop table p;
CREATE FUNCTION getScanCols(value VARCHAR(32672))
RETURNS VARCHAR (32672) EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.StatParser.getScanCols'
LANGUAGE JAVA PARAMETER STYLE JAVA NO SQL;
create table p (ccharForBitData char(1) for bit data not null, cdec dec(6,2) not null, unindexed smallint, cchar char(10) not null,
constraint pk1 primary key (cchar, ccharForBitData), constraint pk2 unique (cdec));
insert into p values (x'00', 0.0, 11, '00');
insert into p values (x'11', 1.1, 22, '11');
insert into p values (x'22', 2.2, 33, '22');
insert into p values (x'33', 3.3, 44, '33');
create table basic (cint int, cchar char(10),
ctime time, cdec dec(6,2),
ccharForBitData char(1) for bit data, unindexed int);
create index b1 on basic (cchar, ccharForBitData, cint);
create index b2 on basic (ctime);
create index b3 on basic (ctime, cint);
create index b4 on basic (cint);
maximumdisplaywidth 200;
call SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);
-- the extra 33s are so we can ensure we'll use an index when looking for the others
insert into basic values (11, '11', TIME('11:11:11'), 1.1, x'11', 11);
insert into basic values (22, '22', TIME('22:22:22'), 2.2, x'22', 22);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
insert into basic values (33, '33', TIME('03:33:33'), 3.3, x'33', 33);
-- simple update of each column
update basic set cint = cint;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cchar = cchar;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ctime = ctime;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cdec = cdec;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ccharForBitData = ccharForBitData;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set unindexed = unindexed;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
-- confirm the table is ok
select ccharForBitData, ctime, cdec, cint, cchar from basic;
values (SYSCS_UTIL.SYSCS_CHECK_TABLE('APP', 'BASIC'));
update basic set cint = cint where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cchar = cchar where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ctime = ctime where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ctime = ctime where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cdec = cdec where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ccharForBitData = ccharForBitData where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
-- confirm the table is ok
select ccharForBitData, ctime, cdec, cint, cchar from basic;
values (SYSCS_UTIL.SYSCS_CHECK_TABLE('APP', 'BASIC'));
update basic set cint = cint where ccharForBitData = x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cchar = cchar where ccharForBitData = x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ctime = ctime where ccharForBitData = x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cdec = cdec where ccharForBitData = x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ccharForBitData = ccharForBitData where ccharForBitData = x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
-- confirm the table is ok
select ccharForBitData, ctime, cdec, cint, cchar from basic;
values (SYSCS_UTIL.SYSCS_CHECK_TABLE('APP', 'BASIC'));
autocommit off;
update basic set cdec = cint;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
-- confirm the table is ok
select ccharForBitData, ctime, cdec, cint, cchar from basic;
values (SYSCS_UTIL.SYSCS_CHECK_TABLE('APP', 'BASIC'));
rollback;
update basic set cchar = cchar where cdec = 3.3 and ctime = TIME('03:33:33');
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ctime = ctime, cchar = cchar, cint = cint, cdec = cdec, ccharForBitData = ccharForBitData;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
-- confirm the table is ok
select ccharForBitData, ctime, cdec, cint, cchar from basic;
values (SYSCS_UTIL.SYSCS_CHECK_TABLE('APP', 'BASIC'));
--------------------------------------------------------------------------
-- deletes
--------------------------------------------------------------------------
--
-- index scans
--
delete from basic where cchar = '22';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cint = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ctime = TIME('22:22:22');
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ccharForBitData = x'22';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cdec = 2.2;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
--
-- index row to base row
--
delete from basic where cchar = '22' and unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cint = 22 and unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ctime = TIME('22:22:22') and unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ccharForBitData = x'22' and unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cdec = 2.2 and unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
--
-- table scans
--
delete from basic where cchar > '00';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cint > 1;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ctime > TIME('00:00:01');
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where ccharForBitData > x'11';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cdec > 2;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where unindexed = 22;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
--
-- some checks on deferred deletes
--
delete from basic where unindexed = (select min(cint) from basic);
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cint = (select min(cint) from basic);
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cdec = (select min(cdec) from basic);
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cdec = 1.1 and cchar = (select min(cchar) from basic);
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
--
-- quickly confirm that we get all columns for updateable cursors
--
get cursor c as 'select cint from basic for update';
next c;
-----------------------------------------------------------------
-- now lets try some constraints
-----------------------------------------------------------------
--
-- check constraints
--
alter table basic add constraint ck check (unindexed > cdec);
commit;
update basic set unindexed = unindexed where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update basic set unindexed = unindexed;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update basic set cdec = cdec where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
delete from basic where cint = 11;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
-- one that isn't affected by contstraint
update basic set ctime = ctime;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
-- confirm it is working ok
update basic set unindexed = 0;
rollback;
--
-- foreign keys
--
alter table basic add constraint fk1 foreign key (cchar, ccharForBitData) references p;
commit;
update basic set cchar = cchar, ccharForBitData = ccharForBitData;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set cchar = cchar;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
update basic set ccharForBitData = ccharForBitData;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
--pk update
-- only this update should fail, does not satisfy fk1
update p set ccharForBitData = x'22', cchar = CAST(unindexed as CHAR(10));
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update p set cdec = cdec + 1.1;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update p set unindexed = 666, cchar = 'fail';
rollback;
-- only this update should fail, does not satisfy fk1
update p set ccharForBitData = x'66' where ccharForBitData = x'22';
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
alter table basic add constraint fk2 foreign key (cdec) references p(cdec);
commit;
update p set cdec = cdec + 1.1;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update basic set cdec = cdec, cint = cint, ccharForBitData = ccharForBitData, cchar = cchar;
values getScanCols(SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS());
rollback;
update basic set cdec = cdec+1.1, cint = cint, ccharForBitData = ccharForBitData, cchar = cchar;
rollback;
delete from p where cdec = 1.1;
rollback;
-- clean up
drop function getScanCols;
drop table basic;
drop table p;