You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by km...@apache.org on 2007/03/22 21:50:48 UTC

svn commit: r521453 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests: master/ master/DerbyNetClient/ suites/ tests/lang/

Author: kmarsden
Date: Thu Mar 22 13:50:47 2007
New Revision: 521453

URL: http://svn.apache.org/viewvc?view=rev&rev=521453
Log:
DERBY-2422 convert lang/holdCursorJava.java to junit.
Contributed by Manjula Kutty


Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java   (with props)
Removed:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/holdCursorJava.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/holdCursorJava.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/holdCursorJava.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/holdCursorJava_app.properties
Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/embeddedUseprocess.exclude
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/j9derbynetmats.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdk14.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude Thu Mar 22 13:50:47 2007
@@ -6,7 +6,6 @@
 # excluding jdbcapi/rsgetXXXcolumnNames.java as it fails incorrectly, according to JDBC spec. Forwarding test case to JCC team.
 # excluding jdbcapi/checkDataSource30.java - Client behaves differently. Need to look into this
 # excluding jdbcapi/statementJdbc30.java - Client behaves differently. Need to look into this
-# excluding jdbcapi/holdCursorJava.java - JCC behaves differently with hold cursors.
 # excluding jdbcapi/dataSourceReference.java - client side only tests, tests all data sources
 #           regardless of framework
 # excluding largedata/LobLimits.java to run with the network server because currently lobs are materialized and this test tests for 2G lobs.
@@ -21,7 +20,6 @@
 jdbcapi/blobSetBinaryStream.java
 jdbcapi/checkDataSource30.java
 jdbcapi/statementJdbc30.java
-lang/holdCursorJava.java
 jdbcapi/dataSourceReference.java
 #no XA for JCC
 jdbcapi/savepointJdbc30_XA.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall Thu Mar 22 13:50:47 2007
@@ -37,7 +37,6 @@
 lang/grantRevokeDDL.sql
 lang/grantRevokeDDL2.sql
 lang/holdCursorIJ.sql
-lang/holdCursorJavaReflection.java
 lang/inbetween.sql
 lang/infostreams.sql
 lang/isolationLevels.sql

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall Thu Mar 22 13:50:47 2007
@@ -22,7 +22,6 @@
 lang/bug5054.java
 lang/forupdate.sql
 lang/holdCursorIJ.sql
-lang/holdCursorJavaReflection.java
 lang/procedure.java
 lang/simpleScroll.sql
 lang/supersimple.sql

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/embeddedUseprocess.exclude
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/embeddedUseprocess.exclude?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/embeddedUseprocess.exclude (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/embeddedUseprocess.exclude Thu Mar 22 13:50:47 2007
@@ -7,7 +7,6 @@
 #     and access denied (java.lang.RuntimePermission loadLibrary.db2jcct2). (????!)
 # jdbcapi/getCurConnJdbc20.sql ditto.
 # jdbcapi/checkDataSource30.java problem using reflection (class not found)
-# lang/holdCursorJava.java ditto.
 # lang/procedureJdbc30.java ditto.
 # jdbcapi/SURQueryMixTest.junit - fails with severe errors.
 # jdbcapi/SURTest.junit - fails with severe errors.
@@ -18,7 +17,6 @@
 jdbcapi/bestrowidentifier.sql
 jdbcapi/getCurConnJdbc20.sql
 jdbcapi/checkDataSource30.java
-lang/holdCursorJava.java
 lang/procedureJdbc30.java
 jdbcapi/SURQueryMixTest.junit
 jdbcapi/SURTest.junit

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/j9derbynetmats.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/j9derbynetmats.runall?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/j9derbynetmats.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/j9derbynetmats.runall Thu Mar 22 13:50:47 2007
@@ -16,7 +16,6 @@
 lang/bug5054.java
 lang/forupdate.sql
 lang/holdCursorIJ.sql
-lang/holdCursorJavaReflection.java
 lang/procedure.java
 lang/simpleScroll.sql
 lang/supersimple.sql

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdk14.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdk14.runall?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdk14.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdk14.runall Thu Mar 22 13:50:47 2007
@@ -1,4 +1,3 @@
-lang/holdCursorJava.java
 jdbcapi/checkDataSource30.java
 jdbcapi/parameterMetaDataJdbc30.java
 lang/procedureJdbc30.java

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java?view=auto&rev=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java Thu Mar 22 13:50:47 2007
@@ -0,0 +1,415 @@
+/* Derby - Class org.apache.derbyTesting.functionTests.tests.lang.HoldCursorTest
+ *
+ * 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 ecept 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.
+ */
+
+package org.apache.derbyTesting.functionTests.tests.lang;
+
+import java.sql.PreparedStatement;
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.DriverManager;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+
+/**
+ * Test hold cursor after commit
+ */
+public class HoldCursorTest extends BaseJDBCTestCase {
+	/**
+     * Public constructor required for running test as standalone JUnit.
+     */
+	public HoldCursorTest(String name) {
+		super(name);
+	}
+	/**
+     * Create a suite of tests.
+     */
+	
+	
+	  public static Test suite() {
+		  if ( !JDBC.vmSupportsJDBC3())
+	            return new TestSuite("empty HoldCursorTest - supported only from JDBC3.0 and above");
+	        else{
+        TestSuite suite = new TestSuite("HoldCursorTest");
+        suite.addTest(baseSuite("HoldCursorTest:embedded"));
+        suite.addTest(baseSuite("HoldCursorTest:client"));
+        return suite;
+	        }
+    }
+    private static Test baseSuite(String name) {
+
+        TestSuite suite = new TestSuite(name);
+
+        // Add tests that every JVM jdk1.4 or above should be able to run.
+        suite.addTestSuite(HoldCursorTest.class);
+        if (!JDBC.vmSupportsJSR169()) {
+             suite.addTest (new HoldCursorTest("StatementsInProcedureTest"));
+
+           }
+        return new CleanDatabaseTestSetup(suite); 
+    }
+    /**
+     * Set the fixture up with tables and insert rows .
+     */
+	protected void setUp() throws SQLException {
+		getConnection().setAutoCommit(false);
+		Statement stmt = createStatement();
+		final int stringLength = 400;
+	    stmt.executeUpdate("CREATE TABLE T1 (c11 int, c12 int, junk varchar(" +
+	                       stringLength + "))");
+	    PreparedStatement insertStmt = prepareStatement("INSERT INTO T1 VALUES(?,1,?)");
+	    // We need to ensure that there is more data in the table than the
+	    // client can fetch in one message (about 32K). Otherwise, the
+	    // cursor might be closed on the server and we are not testing the
+	    // same thing in embedded mode and client/server mode.
+	    final int rows = 40000 / stringLength;
+	    StringBuffer buff = new StringBuffer(stringLength);
+	    for (int i = 0; i < stringLength; i++) {
+	        buff.append(" ");
+	    }
+	    for (int i = 1; i <= rows; i++) {
+	        insertStmt.setInt(1, i);
+	        insertStmt.setString(2, buff.toString());
+	        insertStmt.executeUpdate();
+	    }
+	    insertStmt.close();
+	    stmt.executeUpdate( "CREATE TABLE T2 (c21 int, c22 int)" );
+	    stmt.executeUpdate("INSERT INTO T2 VALUES(1,1)");
+	    stmt.executeUpdate("INSERT INTO T2 VALUES(1,2)");
+	    stmt.executeUpdate("INSERT INTO T2 VALUES(1,3)");
+	    stmt.execute("create table testtable1 (id integer, vc varchar(100))");
+	    stmt.execute("insert into testtable1 values (11, 'testtable1-one'), (12, 'testtable1-two')");
+	    stmt.execute("create table testtable2 (id integer, vc varchar(100))");
+	    stmt.execute("insert into testtable2 values (21, 'testtable2-one'), (22, 'testtable2-two')");
+	    stmt.execute("create procedure MYPROC() language java parameter style java external name " +
+	    				"'org.apache.derbyTesting.functionTests.tests.lang.HoldCursorTest.testProc' result sets 2");
+	    stmt.executeUpdate("Create table bug4385 (i int not null primary key, c int generated always as identity)");
+	    stmt.close();
+	    commit();		
+	}
+	/**
+	 * Drop tables for clean up
+	 */
+	protected void tearDown() throws Exception {
+		Statement stmt = createStatement();
+		stmt.executeUpdate( "DROP PROCEDURE MYPROC" );
+	    stmt.executeUpdate( "DROP TABLE T1" );
+	    stmt.executeUpdate( "DROP TABLE T2" );
+	    stmt.executeUpdate( "DROP TABLE testtable1" );
+	    stmt.executeUpdate( "DROP TABLE testtable2" );
+	    stmt.executeUpdate( "DROP TABLE BUG4385" );
+	    stmt.close();
+	    stmt.close();
+		commit();
+		super.tearDown();
+	}
+	/**
+	 * test cursor holdability after commit on multi table query
+	 * @throws Exception
+	 */
+	 public void testHoldCursorOnMultiTableQuery() throws Exception
+	  {
+	    ResultSet	rs;
+	    Statement s = createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT );
+
+	    //open a cursor with multiple rows resultset
+	    rs = s.executeQuery("select t1.c11, t2.c22 from t1, t2 where t1.c11=t2.c21");
+	    rs.next();
+	    assertEquals("1", rs.getString(2));
+	    commit();
+	    rs.next(); //because holdability is true, should be able to navigate the cursor after commit
+	    assertEquals("2", rs.getString(2));
+	    rs.close();
+	 }
+	 /**
+	  * Test Chaging isolation levels with and without held curosors
+	  * @throws Exception
+	  */
+	 public void testIsolationLevelChange() throws Exception
+	  {
+	     ResultSet	rs;
+	    //set current isolation to read committed
+	    setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+	    Statement s = createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,ResultSet.HOLD_CURSORS_OVER_COMMIT );
+	    //open a cursor with multiple rows resultset
+	    rs = s.executeQuery("select * from t1");
+	    rs.next();
+
+	    //Changing to different isolation from the current isolation for connection
+	    //will give an exception because there are held cursors
+		assertIsolationError("X0X03",Connection.TRANSACTION_SERIALIZABLE);
+
+	    //Close open cursors and then try changing to different isolation.
+	    //It should work.
+	    rs.close();
+	    setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+
+		// set the default holdability for the Connection and try setting the isolation level
+		setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+		setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
+		createStatement().executeUpdate("SET ISOLATION RS");
+
+			// test for bug4385 - internal ResultSets were being re-used incorrectly
+			// will occur in with JDBC 2.0,1.2 but the first statement I found that
+			// failed was an insert with generated keys.
+			
+		PreparedStatement ps = prepareStatement("insert into bug4385(i) values(?)", Statement.RETURN_GENERATED_KEYS);
+		ps.setInt(1, 199);
+		ps.executeUpdate();
+		assertGetIntEquals(1,1,ps.getGeneratedKeys());
+		rs.close();
+		
+		ps.setInt(1, 299);
+		ps.executeUpdate();
+		assertGetIntEquals(1,2,ps.getGeneratedKeys());
+		rs.close();
+		ps.close();
+		rollback();
+
+	    //switch back to default isolation & holdability
+		setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+		setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+	 }
+	 /**
+	     * Test that drop table cannot be performed when there is an open
+	     * cursor on that table.
+	     *
+	     * @exception SQLException 
+	     */
+	    public void testDropTable() throws SQLException {
+	        setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+	        final String dropTable = "DROP TABLE T1";
+	        Statement stmt1 = createStatement();
+	        Statement stmt2 = createStatement();
+	        ResultSet rs = stmt1.executeQuery("SELECT * FROM T1");
+	        rs.next();
+	        assertStatementError("X0X95", stmt2,dropTable);
+	        
+	        //	dropping t1 should fail because there is an open cursor on t1
+	        assertStatementError("X0X95", stmt2,dropTable);
+	        commit();
+	        
+	        // cursors are held over commit, so dropping should still fail
+	        assertStatementError("X0X95", stmt2,dropTable);
+	        rs.close();
+
+	        // cursor is closed, so this one should succeed
+	        stmt2.executeUpdate(dropTable);
+	        stmt1.close();
+	        stmt2.close();
+	        rollback();
+	    }
+	    /**
+	     * set connection holdability and test holdability of statements inside and outside procedures
+		 * test that holdability of statements always overrides holdability of connection
+	     * @throws SQLException
+	     */
+		public void testHoldabilityOverCommit() throws SQLException{
+				testStatements(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+				testStatements(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+		}
+		
+		public void StatementsInProcedureTest()throws SQLException{
+			StatementsInProcedure(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+			StatementsInProcedure(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+		}
+		
+		/**
+		 * test holdability of statements outside procedures
+		 * @param holdability
+		 * @throws SQLException
+		 */
+		public void testStatements(int holdability) throws SQLException{
+			setHoldability(holdability);
+			//HOLD_CURSORS_OVER_COMMIT
+			Statement st1 = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
+						ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
+			ResultSet rs1 = st1.executeQuery("select * from testtable1");
+			rs1.next();
+			assertEquals(11,rs1.getInt(1));
+			
+			commit();
+			rs1.next();
+			assertEquals(12,rs1.getInt(1));
+			st1.close();
+			
+			//CLOSE_CURSORS_AT_COMMIT
+			Statement st2 = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
+						ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+			ResultSet rs2 = st2.executeQuery("select * from testtable2");
+			rs2.next();
+			assertEquals(21,rs2.getInt(1));
+			commit();
+			assertNextError("XCL16",rs2);
+			st2.close();
+			rs1.close();
+			rs2.close();
+		 }
+		
+		/**
+		 * test holdability of statements in procedures
+		 * @param holdability
+		 * @throws SQLException
+		 */
+		public void StatementsInProcedure(int holdability) throws SQLException{
+			setHoldability(holdability);
+			CallableStatement cs1 = prepareCall("call MYPROC()");
+			cs1.execute();
+			ResultSet rs2 = cs1.getResultSet();
+			rs2.next();
+			assertEquals(11,rs2.getInt(1));
+			rs2.next();
+			assertEquals(12,rs2.getInt(1));
+			
+			CallableStatement cs2 = prepareCall("call MYPROC()");
+			cs2.execute();
+			commit();
+			ResultSet rs1 = cs2.getResultSet();
+			rs1.next();
+			assertEquals(11,rs1.getInt(1));
+			if(rs1.next())
+				assertEquals(12,rs1.getInt(1));
+			else
+				assertNull(rs1);
+			cs1.close();
+			cs2.close();
+			rs1.close();
+			rs2.close();
+		}
+		/**
+		 * Test for drop table after closing the cursor
+		 * @throws SQLException
+		 */
+		public void testCloseCursor()throws SQLException
+	{
+		// Run this test on one large table (T1) where the network
+		// server won't close the cursor implicitly, and on one small
+		// table (T2) where the network server will close the cursor
+		// implicitly.
+		final String[] tables = { "T1", "T2" };
+		Statement stmt1 = createStatement();
+		Statement stmt2 = createStatement();
+		for (int i = 0; i < tables.length; i++) {
+			String table = tables[i];
+			ResultSet rs = stmt1.executeQuery("SELECT * FROM " + table);
+			rs.next();
+			rs.close();
+			// Cursor is closed, so this should succeed. If the cursor
+			// is open, it will fail because a table cannot be
+			// dropped when there are open cursors depending on it.
+			stmt2.executeUpdate("DROP TABLE " + table);
+		}
+		stmt1.close();
+		stmt2.close();
+		rollback();
+	}
+	/**
+	  * Assert that the changing isolation throws
+	  * an SQLException with the expected state.
+	  * @param sqlState
+	  * @param level
+	  */
+	    public void assertIsolationError(String sqlState, int level) {
+
+	        try {
+	        	getConnection().setTransactionIsolation(level);
+	            fail("expected compile error: " + sqlState);
+	        } catch (SQLException se) {
+	            assertSQLState(sqlState, se);
+	        }
+	    }
+	    /**
+	     * Utility method to create a Statement using the connection
+	     * returned by getConnection.
+	     * @param resultSetType
+	     * @param resultSetConcurrency
+	     * @param resultSetHoldability
+	     * @return
+	     * @throws SQLException
+	     */
+	    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException
+	    {
+	        return getConnection().createStatement(resultSetType, resultSetConcurrency,resultSetHoldability);
+	    }
+	    /**
+	     * Utility method to set Transaction Isolation
+	     * @param level
+	     * @throws SQLException
+	     */
+	    public void setTransactionIsolation(int level) throws SQLException
+	    {
+	    	getConnection().setTransactionIsolation(level);
+	    }
+	    /**
+	     * Utility method to set Holdability
+	     * @param holdability
+	     * @throws SQLException
+	     */
+	    public void setHoldability(int holdability) throws SQLException
+	    {
+	    	getConnection().setHoldability(holdability);
+	    }
+	    /**
+	     * Perform getInt(position) with expected error
+	     * @param position
+	     * @param expected
+	     * @param rs
+	     */
+	    public static void assertGetIntEquals(int position,int expected,ResultSet rs)
+	    {
+	    	try{
+	    	while(rs.next()){
+	    	if(expected==rs.getInt(position))
+	    		return;
+	    	else 
+	    		fail("Wrong value returned: "+ rs.getInt(position));
+	    	}
+	    }catch(SQLException se){
+	    	se.printStackTrace();
+	    		
+	    	}
+	    	
+	    }
+	     /**
+	     * Java method for stored procedure
+	     * @param rs1
+	     * @param rs2
+	     * @throws Exception
+	     */
+	    public static void testProc(ResultSet[] rs1, ResultSet[] rs2) throws Exception
+		{
+			Connection conn = DriverManager.getConnection("jdbc:default:connection");
+
+			//HOLD_CURSORS_OVER_COMMIT
+			Statement st1 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
+						ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
+			rs1[0] = st1.executeQuery("select * from testtable1");
+
+			//CLOSE_CURSORS_AT_COMMIT
+			Statement st2 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
+						ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+			rs2[0] = st2.executeQuery("select * from testtable2");
+
+		}
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/HoldCursorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java?view=diff&rev=521453&r1=521452&r2=521453
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java Thu Mar 22 13:50:47 2007
@@ -85,6 +85,7 @@
         suite.addTest(InListMultiProbeTest.suite());
         suite.addTest(CurrentOfTest.suite());
         suite.addTest(UnaryArithmeticParameterTest.suite());
+        suite.addTest(HoldCursorTest.suite());
         suite.addTest(ShutdownDatabaseTest.suite());
 
         // Add the XML tests, which exist as a separate suite