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.
--
-- by default, holdability of ResultSet objects created using this Connection object is true. Following will set it to false for this connection.
NoHoldForConnection;
ij> -- make sure that we cannot do a commit/rollback
-- on a nested connection when we are in the middle
-- of something that has to be atomic (e.g. DML).
-- commit/rollback on a nested connection is only
-- permitted when we are doing something simple
-- like CALL myMethod() or VALUES myMethod()
CREATE PROCEDURE doConnCommit() 
       DYNAMIC RESULT SETS 0 LANGUAGE JAVA 
       EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Triggers.doConnCommit' 
	   CONTAINS SQL
       PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij> CREATE PROCEDURE doConnRollback() 
       DYNAMIC RESULT SETS 0 LANGUAGE JAVA 
       EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Triggers.doConnRollback' 
	   CONTAINS SQL
       PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij> CREATE PROCEDURE doConnStmt(IN TEXT CHAR(50)) 
       DYNAMIC RESULT SETS 0 LANGUAGE JAVA 
       EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Triggers.doConnStmtNoRS' 
	   CONTAINS SQL
       PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij> CREATE FUNCTION doConnCommitInt() 
       RETURNS INT EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Triggers.doConnCommitInt' 
       LANGUAGE JAVA PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij> CREATE FUNCTION doConnStmtInt(TEXT CHAR(50)) 
       RETURNS INT EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Triggers.doConnStmtIntNoRS' 
       LANGUAGE JAVA PARAMETER STYLE JAVA;
0 rows inserted/updated/deleted
ij> create table x (x int);
0 rows inserted/updated/deleted
ij> insert into x values 1,2,3,4;
4 rows inserted/updated/deleted
ij> autocommit off;
ij> -- all the following calls should succeed 
call doConnCommit();
0 rows inserted/updated/deleted
ij> call doConnRollback();
0 rows inserted/updated/deleted
ij> -- No longer supported as language statements.
-- call doConnStmt('commit');
-- call doConnStmt('rollback');
call doConnStmt('call doConnCommit()');
0 rows inserted/updated/deleted
ij> call doConnStmt('call doConnRollback()');
0 rows inserted/updated/deleted
ij> -- call doConnStmt('call doConnStmt(''call doConnStmt(''''commit'''')'')');
values doConnCommitInt();
1          
-----------
ERROR XCL16: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is off.
ij> -- values doConnStmtInt('commit');
-- values doConnStmtInt('rollback');
-- values doConnStmtInt('call doConnStmt(''call doConnStmt(''''commit'''')'')');
values doConnStmtInt('values doConnCommitInt()');
1          
-----------
1          
ij> -- fail
insert into x select x+doConnCommitInt() from x;
ERROR 38000: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.
ERROR X0Y66: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.
ij> delete from x where x in (select x+doConnCommitInt() from x);
ERROR 38000: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.
ERROR X0Y66: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.
ij> delete from x where x = doConnCommitInt();
ERROR 38000: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.
ERROR X0Y66: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.
ij> update x set x = doConnCommitInt();
ERROR 38000: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.
ERROR X0Y66: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.
ij> -- insert into x values doConnStmtInt('call doConnStmt(''call doConnStmt(''''commit'''')'')');
-- select doConnStmtInt('call doConnStmt(''call doConnStmt(''''rollback'''')'')') from x;
select doConnStmtInt('call doConnStmt(''call doConnCommit()'')') from x;
1          
-----------
ERROR 38000: The exception 'java.sql.SQLException: The exception 'java.sql.SQLException: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.' was thrown while evaluating an expression.' was thrown while evaluating an expression.
ERROR 38000: The exception 'java.sql.SQLException: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.' was thrown while evaluating an expression.
ERROR 38000: The exception 'java.sql.SQLException: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.' was thrown while evaluating an expression.
ERROR X0Y66: Cannot issue commit in a nested connection when there is a pending operation in the parent connection.
ij> -- isolation level always fails in a nested connection
call doConnStmt('set isolation serializable');
0 rows inserted/updated/deleted
ij> -- clean up
drop table x;
0 rows inserted/updated/deleted
ij> drop procedure doConnCommit;
0 rows inserted/updated/deleted
ij> drop procedure doConnRollback;
0 rows inserted/updated/deleted
ij> drop function doConnCommitInt;
0 rows inserted/updated/deleted
ij> drop procedure doConnStmt;
0 rows inserted/updated/deleted
ij> drop function doConnStmtInt;
0 rows inserted/updated/deleted
ij> 
