blob: fe78ff628dfdcfec7e4a6c260dfd2c93cee945c2 [file] [log] [blame]
ij(CONNECTION1)> --
-- 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.
--
-- Very basic single user testing of row locking, verify that the right locks
-- are obtained for simple operations. This test only looks at table and
-- row logical locks, it does not verify physical latches or lock ordering.
-- The basic methodology is:
-- start transaction
-- simple operation
-- print lock table which should match the master
-- end transation
--
run resource '/org/apache/derbyTesting/functionTests/tests/store/createTestProcedures.subsql';
ij(CONNECTION1)> --
-- 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.
--
CREATE FUNCTION PADSTRING (DATA VARCHAR(32000), LENGTH INTEGER) RETURNS VARCHAR(32000) EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Formatters.padString' LANGUAGE JAVA PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij(CONNECTION1)> CREATE PROCEDURE WAIT_FOR_POST_COMMIT() DYNAMIC RESULT SETS 0 LANGUAGE JAVA EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.T_Access.waitForPostCommitToFinish' PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij(CONNECTION1)> run resource '/org/apache/derbyTesting/functionTests/tests/store/LockTableQuery.subsql';
ij(CONNECTION1)> --
-- 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.
--
create view lock_table as
select
cast(username as char(8)) as username,
cast(t.type as char(15)) as trantype,
cast(l.type as char(8)) as type,
cast(lockcount as char(3)) as cnt,
mode,
cast(tablename as char(12)) as tabname,
cast(lockname as char(10)) as lockname,
state,
status
from
syscs_diag.lock_table l right outer join syscs_diag.transaction_table t
on l.xid = t.xid where l.tableType <> 'S' and t.type='UserTransaction';
0 rows inserted/updated/deleted
ij(CONNECTION1)> --on l.xid = t.xid where l.tableType <> 'S' or l.tableType is null
-- order by
-- tabname, type desc, mode, cnt, lockname
-- lock table with system catalog locks included.
create view full_lock_table as
select
cast(username as char(8)) as username,
cast(t.type as char(8)) as trantype,
cast(l.type as char(8)) as type,
cast(lockcount as char(3)) as cnt,
mode,
cast(tablename as char(12)) as tabname,
cast(lockname as char(10)) as lockname,
state,
status
from
syscs_diag.lock_table l right outer join syscs_diag.transaction_table t
on l.xid = t.xid where l.tableType <> 'S' ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- lock table with no join.
-- DERBY-6183, removing CAST's to avoid background locks causing
-- data trunction warnings.
create view lock_table2 as
select
xid,
type,
lockcount as cnt,
mode,
tablename as tabname,
lockname,
state
from
syscs_diag.lock_table
where tableType <> 'S' ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- transaction table with no join.
create view tran_table as
select
*
from
syscs_diag.transaction_table;
0 rows inserted/updated/deleted
ij(CONNECTION1)> autocommit off;
ij(CONNECTION1)> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize', '4096');
0 rows inserted/updated/deleted
ij(CONNECTION1)> create table a (a int, b int, c varchar(1900)) ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> set isolation read committed;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from empty heap table
--------------------------------------------------------------------------------
select a, b from a;
A |B
-----------------------
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from one row heap table
--------------------------------------------------------------------------------
insert into a values (1, -1, PADSTRING('one',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(1,7) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a, b from a;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from two row heap table - this will release one row lock as it
-- moves to the next one.
--------------------------------------------------------------------------------
insert into a values (2, -2, PADSTRING('two',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a,b from a;
A |B
-----------------------
1 |-1
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from three row heap table (multiple pages) - this will release
-- one row lock as it moves to the next one.
--------------------------------------------------------------------------------
insert into a values (3, -3, PADSTRING('two',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into a values (4, -4, PADSTRING('two',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into a values (5, -5, PADSTRING('two',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |3 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(2,6) |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(2,7) |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(3,6) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> delete from a where a.a = 3;
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |2 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(2,6) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a,b from a;
A |B
-----------------------
1 |-1
2 |-2
4 |-4
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full read cursor scan over all the rows in the heap, no group fetch.
--------------------------------------------------------------------------------
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','1');
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- RESOLVE: missing row locks
-- WORKAROUND: creating an index and dropping it
-- to force the query 'select a, b from a' to be recompiled
create index ix1 on a(a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> drop index ix1;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault', '16');
0 rows inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(1,7) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(1,8) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(2,7) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(3,6) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16');
0 rows inserted/updated/deleted
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full cursor scan over all the rows in the heap, with 2 row group fetch.
--------------------------------------------------------------------------------
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','2');
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- RESOLVE: missing row locks
-- WORKAROUND: creating an index and dropping it
-- to force the query 'select a, b from a' to be recompiled
create index ix1 on a(a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> drop index ix1;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16');
0 rows inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full cursor scan over all the rows in the heap, with default group fetch
--------------------------------------------------------------------------------
get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full cursor for update scan over all the rows in the heap,
-- with default group fetch. Group fetch should be disabled.
--------------------------------------------------------------------------------
get cursor scan_cursor as
'select a, b from a for update';
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |U |A |(1,7) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |U |A |(1,8) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |U |A |(2,7) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |U |A |(3,6) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full read cursor scan on a join over all the rows in the btree,
-- 2 row group fetch.
--------------------------------------------------------------------------------
drop table a;
0 rows inserted/updated/deleted
ij(CONNECTION1)> create table a (a int, b int, c varchar(1900), d int, e varchar(2000)) ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> create index a_idx on a (a, b, c) ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> create table b (a int, b int, c varchar(1900)) ;
0 rows inserted/updated/deleted
ij(CONNECTION1)> insert into b values (1, -1, PADSTRING('one',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into b values (2, -2, PADSTRING('two',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into b values (3, -3, PADSTRING('three',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into b values (4, -4, PADSTRING('four',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into b values (5, -5, PADSTRING('five',1900));
1 row inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from empty index
--------------------------------------------------------------------------------
select a, b from a;
A |B
-----------------------
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from one row index'd table
--------------------------------------------------------------------------------
insert into a values (5, -5, PADSTRING('five',1900), 5, PADSTRING('negative five',2000));
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |2 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(1,7) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a, b from a;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from two row indexed heap table - this will release one row
-- lock as it moves to the next one.
--------------------------------------------------------------------------------
insert into a values (4, -4, PADSTRING('four',1900), 4, PADSTRING('negative four',2000));
1 row inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a,b from a;
A |B
-----------------------
4 |-4
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test select from three row indexed heap table (multiple pages) - this will
-- release one row lock as it moves to the next one.
--------------------------------------------------------------------------------
insert into a values (3, -3, PADSTRING('three',1900), 3, PADSTRING('negative three',2000));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into a values (2, -2, PADSTRING('two',1900), 2, PADSTRING('negative two',2000));
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into a values (1, -1, PADSTRING('one',1900), 1, PADSTRING('negtive one',2000));
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |6 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(3,6) |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(4,6) |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |X |A |(5,6) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> delete from a where a.a = 3;
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |2 |IX |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |2 |X |A |(3,6) |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select a,b from a;
A |B
-----------------------
1 |-1
2 |-2
4 |-4
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full read cursor scan over all the rows in the indexed heap,
-- no group fetch. This should be a covered index scan (make sure rows come
-- back in order sorted by index).
--------------------------------------------------------------------------------
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','1');
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- RESOLVE: missing row locks
-- WORKAROUND: creating an index and dropping it
-- to force the query 'select a, b from a' to be recompiled
create index ix1 on a(a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> drop index ix1;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16');
0 rows inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(5,6) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(4,6) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(2,6) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
APP |UserTransaction|ROW |1 |S |A |(1,7) |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full cursor scan over all the rows in the index , 2 row group fetch.
--------------------------------------------------------------------------------
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','2');
0 rows inserted/updated/deleted
ij(CONNECTION1)> -- RESOLVE: missing row locks
-- WORKAROUND: creating an index and dropping it
-- to force the query 'select a, b from a' to be recompiled
create index ix1 on a(a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> drop index ix1;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16');
0 rows inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test full cursor scan over all the rows in the index, with default group
-- fetch
--------------------------------------------------------------------------------
-- RESOLVE: missing row locks
-- WORKAROUND: creating an index and dropping it
-- to force the query 'select a, b from a' to be recompiled
create index ix1 on a(a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> drop index ix1;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> get cursor scan_cursor as
'select a, b from a';
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
1 |-1
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
2 |-2
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
4 |-4
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
A |B
-----------------------
5 |-5
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> next scan_cursor;
No current row
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> close scan_cursor;
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
ij(CONNECTION1)> commit;
ij(CONNECTION1)> --------------------------------------------------------------------------------
-- Test getting index lock on a drop index - track 1634
--------------------------------------------------------------------------------
drop table a;
0 rows inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> create table a (a int);
0 rows inserted/updated/deleted
ij(CONNECTION1)> create index a2 on a (a);
0 rows inserted/updated/deleted
ij(CONNECTION1)> insert into a values (1);
1 row inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> drop index a2;
0 rows inserted/updated/deleted
ij(CONNECTION1)> select * from lock_table order by tabname, type desc, mode, cnt, lockname;
USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS
----------------------------------------------------------------------------------
APP |UserTransaction|TABLE |1 |X |*** TRANSIEN|Tablelock |GRANT|ACTIVE
WARNING 01004: Data truncation
APP |UserTransaction|TABLE |3 |X |A |Tablelock |GRANT|ACTIVE
ij(CONNECTION1)> commit;
ij(CONNECTION1)> drop table a;
0 rows inserted/updated/deleted
ij(CONNECTION1)>