ij> -- -- 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 'createTestProcedures.subsql'; ij> -- -- 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> 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> run resource 'LockTableQuery.subsql'; ij> -- -- 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> --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> -- lock table with no join. create view lock_table2 as select cast(l.xid as char(8)) as xid, 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 from syscs_diag.lock_table l where l.tableType <> 'S' ; 0 rows inserted/updated/deleted ij> -- transaction table with no join. create view tran_table as select * from syscs_diag.transaction_table; 0 rows inserted/updated/deleted ij> autocommit off; ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize', '4096'); 0 rows inserted/updated/deleted ij> create table a (a int, b int, c varchar(1900)) ; 0 rows inserted/updated/deleted ij> commit; ij> set isolation read committed; 0 rows inserted/updated/deleted ij> commit; ij> -------------------------------------------------------------------------------- -- Test select from empty heap table -------------------------------------------------------------------------------- select a, b from a; A |B ----------------------- ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- Test select from one row heap table -------------------------------------------------------------------------------- insert into a values (1, -1, PADSTRING('one',1900)); 1 row inserted/updated/deleted ij> 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> commit; ij> select a, b from a; A |B ----------------------- 1 |-1 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> commit; ij> select a,b from a; A |B ----------------------- 1 |-1 2 |-2 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> insert into a values (4, -4, PADSTRING('two',1900)); 1 row inserted/updated/deleted ij> insert into a values (5, -5, PADSTRING('two',1900)); 1 row inserted/updated/deleted ij> 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> commit; ij> delete from a where a.a = 3; 1 row inserted/updated/deleted ij> 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> commit; ij> select a,b from a; A |B ----------------------- 1 |-1 2 |-2 4 |-4 5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> -- 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> drop index ix1; 0 rows inserted/updated/deleted ij> commit; ij> get cursor scan_cursor as 'select a, b from a'; ij> call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault', '16'); 0 rows inserted/updated/deleted ij> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16'); 0 rows inserted/updated/deleted ij> -------------------------------------------------------------------------------- -- 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> -- 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> drop index ix1; 0 rows inserted/updated/deleted ij> commit; ij> get cursor scan_cursor as 'select a, b from a'; ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16'); 0 rows inserted/updated/deleted ij> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> 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> commit; ij> -------------------------------------------------------------------------------- -- 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> create table a (a int, b int, c varchar(1900), d int, e varchar(2000)) ; 0 rows inserted/updated/deleted ij> create index a_idx on a (a, b, c) ; 0 rows inserted/updated/deleted ij> commit; ij> create table b (a int, b int, c varchar(1900)) ; 0 rows inserted/updated/deleted ij> insert into b values (1, -1, PADSTRING('one',1900)); 1 row inserted/updated/deleted ij> insert into b values (2, -2, PADSTRING('two',1900)); 1 row inserted/updated/deleted ij> insert into b values (3, -3, PADSTRING('three',1900)); 1 row inserted/updated/deleted ij> insert into b values (4, -4, PADSTRING('four',1900)); 1 row inserted/updated/deleted ij> insert into b values (5, -5, PADSTRING('five',1900)); 1 row inserted/updated/deleted ij> commit; ij> -------------------------------------------------------------------------------- -- Test select from empty index -------------------------------------------------------------------------------- select a, b from a; A |B ----------------------- ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> 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> commit; ij> select a, b from a; A |B ----------------------- 5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> commit; ij> select a,b from a; A |B ----------------------- 4 |-4 5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> insert into a values (2, -2, PADSTRING('two',1900), 2, PADSTRING('negative two',2000)); 1 row inserted/updated/deleted ij> insert into a values (1, -1, PADSTRING('one',1900), 1, PADSTRING('negtive one',2000)); 1 row inserted/updated/deleted ij> 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> commit; ij> delete from a where a.a = 3; 1 row inserted/updated/deleted ij> 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> commit; ij> select a,b from a; A |B ----------------------- 1 |-1 2 |-2 4 |-4 5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> -- 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> drop index ix1; 0 rows inserted/updated/deleted ij> commit; ij> get cursor scan_cursor as 'select a, b from a'; ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16'); 0 rows inserted/updated/deleted ij> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> -------------------------------------------------------------------------------- -- 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> -- 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> drop index ix1; 0 rows inserted/updated/deleted ij> commit; ij> get cursor scan_cursor as 'select a, b from a'; ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16'); 0 rows inserted/updated/deleted ij> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- 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> drop index ix1; 0 rows inserted/updated/deleted ij> commit; ij> get cursor scan_cursor as 'select a, b from a'; ij> 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> next scan_cursor; A |B ----------------------- 1 |-1 ij> 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> next scan_cursor; A |B ----------------------- 2 |-2 ij> 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> next scan_cursor; A |B ----------------------- 4 |-4 ij> 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> next scan_cursor; A |B ----------------------- 5 |-5 ij> 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> next scan_cursor; No current row ij> 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> close scan_cursor; ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname; USERNAME|TRANTYPE |TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------------- ij> commit; ij> -------------------------------------------------------------------------------- -- Test getting index lock on a drop index - track 1634 -------------------------------------------------------------------------------- drop table a; 0 rows inserted/updated/deleted ij> commit; ij> create table a (a int); 0 rows inserted/updated/deleted ij> create index a2 on a (a); 0 rows inserted/updated/deleted ij> insert into a values (1); 1 row inserted/updated/deleted ij> commit; ij> drop index a2; 0 rows inserted/updated/deleted ij> 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> commit; ij> drop table a; 0 rows inserted/updated/deleted ij>