blob: 90dc1b774af5cd76403496a21b4ca3c337ff6096 [file] [log] [blame]
/*
* 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.
*/
package org.apache.derbyTesting.functionTests.tests.lang;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.TestConfiguration;
/**
* Tests cursors
*/
public class CursorTest extends BaseJDBCTestCase {
/**
* Creates a new <code>CursorTest</code> instance.
*
* @param name
* name of the test
*/
public CursorTest(String name) {
super(name);
}
/**
* Test cursor methods with regular cursor
*
* @throws SQLException
*/
public void testCursor() throws SQLException {
PreparedStatement select;
ResultSet cursor;
// because there is no order by (nor can there be)
// the fact that this test prints out rows may someday
// be a problem. When that day comes, the row printing
// can (should) be removed from this test.
select = prepareStatement("select i, c from t for update");
cursor = select.executeQuery(); // cursor is now open
cursor.next();
assertEquals(1956, cursor.getInt(1));
assertEquals("hello world", cursor.getString(2).trim());
// close and then test that fetch causes an error
cursor.close();
if (usingEmbedded()) {
assertNextError("XCL16", cursor);
} else if (usingDerbyNetClient()) {
assertNextError("XCL16", cursor);
}
// restart the query for another test
cursor = select.executeQuery();
// test next/getInt past the end of table
while (cursor.next())
;
cursor.next();
if (usingEmbedded()) {
assertGetIntError(1, "24000", cursor);
} else if (usingDerbyNetClient()) {
assertGetIntError(1, "XJ121", cursor);
}
cursor.close();
}
/**
* Test cursor methods with parameter
*
* @throws SQLException
*/
public void testCursorParam() throws SQLException {
PreparedStatement select;
ResultSet cursor;
select = prepareStatement("select i, c from t where ?=1 for update");
select.setInt(1, 1);
cursor = select.executeQuery();
// TEST: fetch of a row works
assertTrue("FAIL: unable to fetch row.", cursor.next());
assertEquals("FAIL: Wrong row on fetch with param", 1956, cursor
.getInt(1));
// TEST: Close and then fetch gets an error on fetch.
cursor.close();
assertNextError("XCL16", cursor);
// restart the query for another test
select.setBoolean(1, false);
select.setCursorName("ForCoverageSake");
cursor = select.executeQuery();
assertEquals("ForCoverageSake", cursor.getCursorName());
cursor.next();
if (usingEmbedded()) {
assertGetIntError(1, "24000", cursor);
} else if (usingDerbyNetClient()) {
assertGetIntError(1, "XJ121", cursor);
}
cursor.close();
}
/**
* Test getCursorName with and without update cursor
*
* @throws SQLException
*/
public void testGetCursorName() throws SQLException {
Statement s = createStatement();
ResultSet rs = s.executeQuery("select * from t");
if (usingEmbedded())
assertNull(rs.getCursorName());
else if (usingDerbyNetClient())
assertNotNull(rs.getCursorName());
rs.close();
// test Automatic naming of cursor for update
rs = s.executeQuery("select * from t for update");
assertNotNull( rs.getCursorName());
rs.close();
rs = s.executeQuery("select * from t for update of i");
assertNotNull(rs.getCursorName());
rs.close();
s.setCursorName("myselect");
rs = s.executeQuery("select * from t");
assertEquals("myselect", rs.getCursorName());
rs.close();
s.setCursorName("myselect2");
rs = s.executeQuery("select * from t for update");
assertEquals("myselect2", rs.getCursorName());
rs.close();
s.setCursorName("myselect3");
rs = s.executeQuery("select * from t for update of i");
assertEquals("myselect3", rs.getCursorName());
rs.close();
s.close();
}
/**
* Test that Statement.setCursorName affects only the next
* execution and not any open ResultSet.
*/
public void derby2417testSetCursorNextExecute() throws SQLException
{
// Assert setCursorName only affects the next execution.
// For statements
Statement s = createStatement();
ResultSet rs = s.executeQuery("select * from t for update");
s.setCursorName("AFTER_EXECUTE");
assertFalse("AFTER_EXECUTE".equals(rs.getCursorName()));
rs.close();
rs = s.executeQuery("select * from t");
assertEquals("AFTER_EXECUTE", rs.getCursorName());
s.setCursorName("CHANGE_AGAIN");
assertEquals("AFTER_EXECUTE", rs.getCursorName());
rs.close();
rs = s.executeQuery("select * from t");
assertEquals("CHANGE_AGAIN", rs.getCursorName());
s.close();
// And prepared statements
PreparedStatement ps = prepareStatement("select * from t for update");
rs = ps.executeQuery();
ps.setCursorName("AFTER_EXECUTE");
assertFalse("AFTER_EXECUTE".equals(rs.getCursorName()));
rs.close();
rs = ps.executeQuery();
assertEquals("AFTER_EXECUTE", rs.getCursorName());
ps.setCursorName("CHANGE_AGAIN");
assertEquals("AFTER_EXECUTE", rs.getCursorName());
rs.close();
rs = ps.executeQuery();
assertEquals("CHANGE_AGAIN", rs.getCursorName());
ps.close();
}
public static Test suite() {
BaseTestSuite suite = new BaseTestSuite("CursorTest");
suite.addTest(TestConfiguration.defaultSuite(CursorTest.class));
// DERBY-2417 client throws exception for setCursorName
// on Statement with active ResultSet.
suite.addTest(new CursorTest("derby2417testSetCursorNextExecute"));
return suite;
}
protected void setUp() throws SQLException {
getConnection().setAutoCommit(false);
Statement stmt = createStatement();
stmt.executeUpdate("create table t (i int, c char(50))");
stmt.executeUpdate("create table s (i int, c char(50))");
stmt.executeUpdate("insert into t values (1956, 'hello world')");
stmt.executeUpdate("insert into t values (456, 'hi yourself')");
stmt.executeUpdate("insert into t values (180, 'rubber ducky')");
stmt.executeUpdate("insert into t values (3, 'you are the one')");
stmt.close();
commit();
}
protected void tearDown() throws Exception {
Statement stmt = createStatement();
rollback();
stmt.executeUpdate("drop table t");
stmt.executeUpdate("drop table s");
stmt.close();
commit();
super.tearDown();
}
}