blob: fa7cae32ff6838fa5d5e1a06e565d0929bf1f974 [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.
--
--------------------------------------------------------------------------------
-- Test multi user lock interaction of ddl.
--------------------------------------------------------------------------------
autocommit off;
ij(CONNECTION1)> connect 'wombat' as create1;
ij(CREATE1)> connect 'wombat' as create2;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0: create1:serializable, create2:serializable
--------------------------------------------------------------------------------
-- set up
set connection create1;
ij(CREATE1)> autocommit off;
ij(CREATE1)> drop table create1;
ERROR 42Y55: 'DROP TABLE' cannot be performed on 'CREATE1' because it does not exist.
ij(CREATE1)> drop table data;
ERROR 42Y55: 'DROP TABLE' cannot be performed on 'DATA' because it does not exist.
ij(CREATE1)> create table data (keycol int, data char(250));
0 rows inserted/updated/deleted
ij(CREATE1)> create unique index d1 on data (keycol);
0 rows inserted/updated/deleted
ij(CREATE1)> insert into data values (0, '0');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (10, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (20, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (30, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (40, '400');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (50, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (60, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (70, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (80, '400');
1 row inserted/updated/deleted
ij(CREATE1)> set isolation RR;
0 rows inserted/updated/deleted
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> autocommit off;
ij(CREATE2)> drop table create2;
ERROR 42Y55: 'DROP TABLE' cannot be performed on 'CREATE2' because it does not exist.
ij(CREATE2)> set current isolation = serializable;
0 rows inserted/updated/deleted
ij(CREATE2)> commit;
ij(CREATE2)> run resource '/org/apache/derbyTesting/functionTests/tests/store/cisco.subsql';
ij(CREATE2)> --
-- 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 0.1: ddl interaction
--------------------------------------------------------------------------------
-- create 1st table. Drop the table, which will get regular X locks on the
-- rows in the system catalogs (which are different than insert locks).
set connection create1;
ij(CREATE1)> create table create1 (a int);
0 rows inserted/updated/deleted
ij(CREATE1)> drop table create1;
0 rows inserted/updated/deleted
ij(CREATE1)> -- create 2nd table
-- The following should not block now that ddl work is done under
-- repeatable read no matter what the user isolation level.
set connection create2;
ij(CREATE2)> create table create2 (a int);
0 rows inserted/updated/deleted
ij(CREATE2)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.2: normal user data, previous key must block on serializable read,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
10 |100 &
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (5, '50');
ERROR 40XL1: A lock could not be obtained within the time requested
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
10 |100 &
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 5;
0 rows inserted/updated/deleted
WARNING 02000: No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.3: normal user data, previous key must block on serializable delete,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> delete from data where keycol <= 10;
2 rows inserted/updated/deleted
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (6, '60');
ERROR 40XL1: A lock could not be obtained within the time requested
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 6;
0 rows inserted/updated/deleted
WARNING 02000: No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 1: create1:serializable, create2:repeatable read
--------------------------------------------------------------------------------
-- set up
set connection create1;
ij(CREATE1)> autocommit off;
ij(CREATE1)> drop table create1;
ERROR 42Y55: 'DROP TABLE' cannot be performed on 'CREATE1' because it does not exist.
ij(CREATE1)> drop table data;
0 rows inserted/updated/deleted
ij(CREATE1)> create table data (keycol int, data char(250));
0 rows inserted/updated/deleted
ij(CREATE1)> create unique index d1 on data (keycol);
0 rows inserted/updated/deleted
ij(CREATE1)> insert into data values (0, '0');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (10, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (20, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (30, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (40, '400');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (50, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (60, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (70, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (80, '400');
1 row inserted/updated/deleted
ij(CREATE1)> set isolation to repeatable READ;
0 rows inserted/updated/deleted
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> autocommit off;
ij(CREATE2)> drop table create2;
0 rows inserted/updated/deleted
ij(CREATE2)> set isolation RS;
0 rows inserted/updated/deleted
ij(CREATE2)> commit;
ij(CREATE2)> run resource '/org/apache/derbyTesting/functionTests/tests/store/cisco.subsql';
ij(CREATE2)> --
-- 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 0.1: ddl interaction
--------------------------------------------------------------------------------
-- create 1st table. Drop the table, which will get regular X locks on the
-- rows in the system catalogs (which are different than insert locks).
set connection create1;
ij(CREATE1)> create table create1 (a int);
0 rows inserted/updated/deleted
ij(CREATE1)> drop table create1;
0 rows inserted/updated/deleted
ij(CREATE1)> -- create 2nd table
-- The following should not block now that ddl work is done under
-- repeatable read no matter what the user isolation level.
set connection create2;
ij(CREATE2)> create table create2 (a int);
0 rows inserted/updated/deleted
ij(CREATE2)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.2: normal user data, previous key must block on serializable read,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
10 |100 &
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (5, '50');
ERROR 40XL1: A lock could not be obtained within the time requested
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
10 |100 &
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 5;
0 rows inserted/updated/deleted
WARNING 02000: No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.3: normal user data, previous key must block on serializable delete,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> delete from data where keycol <= 10;
2 rows inserted/updated/deleted
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (6, '60');
ERROR 40XL1: A lock could not be obtained within the time requested
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 6;
0 rows inserted/updated/deleted
WARNING 02000: No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 1: create1:repeatable read, create2:serializable
--------------------------------------------------------------------------------
-- set up
set connection create1;
ij(CREATE1)> autocommit off;
ij(CREATE1)> drop table create1;
ERROR 42Y55: 'DROP TABLE' cannot be performed on 'CREATE1' because it does not exist.
ij(CREATE1)> drop table data;
0 rows inserted/updated/deleted
ij(CREATE1)> create table data (keycol int, data char(250));
0 rows inserted/updated/deleted
ij(CREATE1)> create unique index d1 on data (keycol);
0 rows inserted/updated/deleted
ij(CREATE1)> insert into data values (0, '0');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (10, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (20, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (30, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (40, '400');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (50, '100');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (60, '200');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (70, '300');
1 row inserted/updated/deleted
ij(CREATE1)> insert into data values (80, '400');
1 row inserted/updated/deleted
ij(CREATE1)> set isolation to rs;
0 rows inserted/updated/deleted
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> autocommit off;
ij(CREATE2)> drop table create2;
0 rows inserted/updated/deleted
ij(CREATE2)> set isolation serializable;
0 rows inserted/updated/deleted
ij(CREATE2)> commit;
ij(CREATE2)> run resource '/org/apache/derbyTesting/functionTests/tests/store/cisco.subsql';
ij(CREATE2)> --
-- 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 0.1: ddl interaction
--------------------------------------------------------------------------------
-- create 1st table. Drop the table, which will get regular X locks on the
-- rows in the system catalogs (which are different than insert locks).
set connection create1;
ij(CREATE1)> create table create1 (a int);
0 rows inserted/updated/deleted
ij(CREATE1)> drop table create1;
0 rows inserted/updated/deleted
ij(CREATE1)> -- create 2nd table
-- The following should not block now that ddl work is done under
-- repeatable read no matter what the user isolation level.
set connection create2;
ij(CREATE2)> create table create2 (a int);
0 rows inserted/updated/deleted
ij(CREATE2)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.2: normal user data, previous key must block on serializable read,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
10 |100 &
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (5, '50');
1 row inserted/updated/deleted
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
0 |0 &
5 |50 &
10 |100 &
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 5;
1 row inserted/updated/deleted
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- Test 0.3: normal user data, previous key must block on serializable delete,
-- if create1 session isolation is serializable, otherwise it will
-- not block.
--------------------------------------------------------------------------------
-- get lock on range of keys 0->10, iso level determines if phantoms allowed.
set connection create1;
ij(CREATE1)> delete from data where keycol <= 10;
2 rows inserted/updated/deleted
ij(CREATE1)> -- the following must block if create1 isolation level disallows phantoms
set connection create2;
ij(CREATE2)> insert into data values (6, '60');
1 row inserted/updated/deleted
ij(CREATE2)> commit;
ij(CREATE2)> -- now do the select again from session one to see if a phantom showed up.
set connection create1;
ij(CREATE1)> select * from data where keycol <= 10;
KEYCOL |DATA
--------------------------------------------------------------------------------------------------------------------------------------------
6 |60 &
ij(CREATE1)> set connection create1;
ij(CREATE1)> commit;
ij(CREATE1)> delete from data where keycol = 6;
1 row inserted/updated/deleted
ij(CREATE1)> commit;
ij(CREATE1)> set connection create2;
ij(CREATE2)> commit;
ij(CREATE2)> --------------------------------------------------------------------------------
-- cleanup
--------------------------------------------------------------------------------
set connection create1;
ij(CREATE1)> disconnect;
ij> set connection create2;
ij(CREATE2)> disconnect;
ij> exit;