blob: 4ee9fb494b6980af6e4ef7c1c3d0bfb010c20b13 [file] [log] [blame]
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 a table
create table t1(c11 int, c12 int);
0 rows inserted/updated/deleted
ij> -- insert data into tables
insert into t1 values(1,1);
1 row inserted/updated/deleted
ij> insert into t1 values(2,2);
1 row inserted/updated/deleted
ij> -- set autocommit off
autocommit off;
ij> -- first test - make sure that only cursors created with holdability true
-- have open resultsets after commit
-- declare 3 different kind of cursors one for each jdbc release so far
get with nohold cursor jdk1 as 'SELECT * FROM t1';
ij> get scroll insensitive with nohold cursor jdk2 as 'SELECT * FROM t1';
ij> get with hold cursor jdk4 as 'SELECT * FROM t1';
ij> -- do fetches from these cursors
next jdk1;
C11 |C12
-----------------------
1 |1
ij> next jdk2;
C11 |C12
-----------------------
1 |1
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> --commit
commit;
ij> -- now try the fetch on cursors again after commit
-- cursors jdk1 and jdk2 will give errors
next jdk1;
ERROR XCL16: ResultSet not open. Operation 'next' not permitted. Verify that autocommit is off.
ij> next jdk2;
ERROR XCL16: ResultSet not open. Operation 'next' not permitted. Verify that autocommit is off.
ij> next jdk4;
C11 |C12
-----------------------
2 |2
ij> -- end of resultset for jdk4, but try next again
next jdk4;
No current row
ij> close jdk4;
ij> next jdk4;
IJ ERROR: Unable to establish cursor JDK4@CONNECTION0
ij> -- clean up.
close jdk1;
ij> close jdk2;
ij> -- second test - make sure that all the cursors (including holdability true)
-- have their resultsets closed after rollback.
-- declare the cursors again, this time, try with rollback
get with nohold cursor jdk1 as 'SELECT * FROM t1';
ij> get scroll insensitive with nohold cursor jdk2 as 'SELECT * FROM t1';
ij> get with hold cursor jdk4 as 'SELECT * FROM t1';
ij> -- do fetches from these cursors
next jdk1;
C11 |C12
-----------------------
1 |1
ij> next jdk2;
C11 |C12
-----------------------
1 |1
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> --rollback
rollback;
ij> -- now try the fetch on cursors again after rollback
-- all the cursors will give errors
next jdk1;
ERROR XCL16: ResultSet not open. Operation 'next' not permitted. Verify that autocommit is off.
ij> next jdk2;
ERROR XCL16: ResultSet not open. Operation 'next' not permitted. Verify that autocommit is off.
ij> next jdk4;
ERROR XCL16: ResultSet not open. Operation 'next' not permitted. Verify that autocommit is off.
ij> -- clean up.
close jdk1;
ij> close jdk2;
ij> close jdk4;
ij> drop table t1;
0 rows inserted/updated/deleted
ij> -- recreate and populate the table for next test
create table t1(c11 int, c12 int);
0 rows inserted/updated/deleted
ij> insert into t1 values(1,1);
1 row inserted/updated/deleted
ij> insert into t1 values(2,2);
1 row inserted/updated/deleted
ij> -- fourth test - try to change the isolation level while there are
-- held cursors
get with nohold cursor jdk1 as 'SELECT * FROM t1';
ij> get with hold cursor jdk4 as 'SELECT * FROM t1';
ij> next jdk1;
C11 |C12
-----------------------
1 |1
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> -- changing isolation while cursor is open would fail;
-- but for client/server, with small data set, the server would already be
-- closed. See discussion re DERBY-3801.
-- close jdk4 and then should be able to change isolation
close jdk4;
ij> set isolation to serializable;
0 rows inserted/updated/deleted
ij> -- clean up.
close jdk1;
ij> -- fifth test - try isolation level change alongwith changing the isolation
-- level of just one statement
get with hold cursor jdk4 as 'SELECT * FROM t1';
ij> get with nohold cursor jdk1 as 'SELECT * FROM t1 WITH CS';
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> next jdk1;
C11 |C12
-----------------------
1 |1
ij> close jdk4;
ij> -- should be able to change the isolation now
set isolation READ UNCOMMITTED;
0 rows inserted/updated/deleted
ij> set isolation RS;
0 rows inserted/updated/deleted
ij> -- clean up.
close jdk1;
ij> -- sixth test - try positioned update with hold cursor
get with hold cursor jdk4 as 'SELECT * FROM t1 FOR UPDATE';
ij> -- following should give error because cursor is not positioned on any row
update t1 set c12=12 where current of jdk4;
ERROR 24000: Invalid cursor state - no current row.
ij> select * from t1;
C11 |C12
-----------------------
1 |1
2 |2
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> update t1 set c12=12 where current of jdk4;
1 row inserted/updated/deleted
ij> select * from t1;
C11 |C12
-----------------------
1 |12
2 |2
ij> commit;
ij> -- after commit, the next transaction should do a fetch again before doing
-- any positioned update
update t1 set c12=123 where current of jdk4;
ERROR 24000: Invalid cursor state - no current row.
ij> select * from t1;
C11 |C12
-----------------------
1 |12
2 |2
ij> next jdk4;
C11 |C12
-----------------------
2 |2
ij> update t1 set c12=23 where current of jdk4;
1 row inserted/updated/deleted
ij> select * from t1;
C11 |C12
-----------------------
1 |12
2 |23
ij> close jdk4;
ij> update t1 set c12=234 where current of jdk4;
ERROR 42X30: Cursor 'JDK4' not found. Verify that autocommit is off.
ij> select * from t1;
C11 |C12
-----------------------
1 |12
2 |23
ij> -- seventh test - try positioned delete with hold cursor
get with hold cursor jdk4 as 'SELECT * FROM t1 FOR UPDATE';
ij> -- following should give error because cursor is not positioned on any row
delete from t1 where current of jdk4;
ERROR 24000: Invalid cursor state - no current row.
ij> select * from t1;
C11 |C12
-----------------------
1 |12
2 |23
ij> next jdk4;
C11 |C12
-----------------------
1 |12
ij> delete from t1 where current of jdk4;
1 row inserted/updated/deleted
ij> select * from t1;
C11 |C12
-----------------------
2 |23
ij> commit;
ij> -- after commit, the next transaction should do a fetch again before doing
-- any positioned delete
delete from t1 where current of jdk4;
ERROR 24000: Invalid cursor state - no current row.
ij> select * from t1;
C11 |C12
-----------------------
2 |23
ij> next jdk4;
C11 |C12
-----------------------
2 |23
ij> delete from t1 where current of jdk4;
1 row inserted/updated/deleted
ij> select * from t1;
C11 |C12
-----------------------
ij> close jdk4;
ij> delete from t1 where current of jdk4;
ERROR 42X30: Cursor 'JDK4' not found. Verify that autocommit is off.
ij> select * from t1;
C11 |C12
-----------------------
ij> -- populate the table for next test
insert into t1 values(1,1);
1 row inserted/updated/deleted
ij> insert into t1 values(2,2);
1 row inserted/updated/deleted
ij> -- eighth test - scrollable cursors
get scroll insensitive with hold cursor jdk4 as 'SELECT * FROM t1';
ij> commit;
ij> previous jdk4;
No current row
ij> after last jdk4;
No current row
ij> before first jdk4;
No current row
ij> first jdk4;
C11 |C12
-----------------------
1 |1
ij> last jdk4;
C11 |C12
-----------------------
2 |2
ij> next jdk4;
No current row
ij> previous jdk4;
C11 |C12
-----------------------
2 |2
ij> next jdk4;
No current row
ij> close jdk4;
ij> first jdk4;
IJ ERROR: Unable to establish cursor JDK4@CONNECTION0
ij> -- ninth test - close the updateable holdable cursor after commit
-- we get npe
get with hold cursor jdk4 as 'SELECT * FROM T1 FOR UPDATE';
ij> next jdk4;
C11 |C12
-----------------------
1 |1
ij> commit;
ij> close jdk4;
ij> -- tenth test - bug 4515 - have a more useful message
-- update where current of fails in autocommit=true, held open cursor
autocommit on;
ij> get with hold cursor scrollCursor as 'select * from t1 for update of c12';
ij> next scrollCursor;
C11 |C12
-----------------------
1 |1
ij> -- commented out for DERBY-4778
-- update t1 set c12=c12+1 where current of scrollCursor;
-- clean up.
close scrollCursor;
ij> drop table t1;
0 rows inserted/updated/deleted
ij>