blob: 8af27e462c414cb31505d9738d2deccf5c7b6265 [file] [log] [blame]
/**
* Derby - Class org.apache.derbyTesting.functionTests.tests.lang.ScrollCursors2Test
*
* 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.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.TestConfiguration;
public class ScrollCursors2Test extends BaseJDBCTestCase {
public ScrollCursors2Test(String name) {
super(name);
}
private static boolean isDerbyNetClient = usingDerbyNetClient();
/**
* Set up the test.
*
* This method creates the table used by the rest of the test.
*
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void setUp() throws SQLException {
Statement s_i_r;
s_i_r = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
/* Create a table */
s_i_r.execute("create table t (i int, c50 char(50))");
/* Populate the table */
s_i_r.execute("insert into t (i) values (2), (3), (4), (5), (6)");
s_i_r.execute("update t set c50 = RTRIM(CAST (i AS CHAR(50)))");
s_i_r.close();
isDerbyNetClient = usingDerbyNetClient();
}
public void tearDown() throws SQLException, Exception {
dropTable("T");
commit();
super.tearDown();
}
public void testForwardOnlyNegative() throws SQLException {
Connection conn = getConnection();
PreparedStatement ps_f_r = null;
ResultSet rs;
Statement s_f_r = null;
s_f_r = createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
// We should have gotten no warnings and a read only forward only cursor
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
// Verify that setMaxRows(-1) fails
try {
s_f_r.setMaxRows(-1);
// Should never get here
fail("setMaxRows(-1) expected to fail");
} catch (SQLException sqle) {
/* Check to be sure the exception is the one we expect */
assertEquals("XJ063", sqle.getSQLState());
}
// Verify maxRows still 0
assertEquals("getMaxRows() expected to return 0", 0, s_f_r.getMaxRows());
// Verify that result set from statement is
// scroll insensitive and read only
rs = s_f_r.executeQuery("select * from t");
assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType());
assertEquals(ResultSet.CONCUR_READ_ONLY, rs.getConcurrency());
// Verify that first(), etc. don't work
try {
rs.first();
// Should never get here
fail("first() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
try {
rs.beforeFirst();
// Should never get here
fail("beforeFirst() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
try {
rs.isBeforeFirst();
// Should never get here
fail("isBeforeFirst() expected to fail");
} catch (SQLException sqle) {
// Check to be sure the exception is the one we expect
assertOnlyOnScrollableException(sqle);
}
try {
rs.isAfterLast();
// Should never get here
fail("isAfterLast() expected to fail");
} catch (SQLException sqle) {
// Check to be sure the exception is the one we expect
assertOnlyOnScrollableException(sqle);
}
try {
rs.isFirst();
// Should never get here
fail("isFirst() expected to fail");
} catch (SQLException sqle) {
// Check to be sure the exception is the one we expect
assertOnlyOnScrollableException(sqle);
}
try {
rs.isLast();
// Should never get here
fail("isLast() expected to fail");
} catch (SQLException sqle) {
// Check to be sure the exception is the one we expect
assertOnlyOnScrollableException(sqle);
}
try {
rs.absolute(1);
// Should never get here
fail("absolute() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
try {
rs.relative(1);
// Should never get here
fail("relative() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
// setFetchDirection should fail
try {
rs.setFetchDirection(ResultSet.FETCH_FORWARD);
// Should never get here
fail("setFetchDirection() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
// Book says that getFetchDirection(), getFetchSize() and
// setFetchSize() are all okay.
if (isDerbyNetClient)
assertEquals(0, rs.getFetchSize());
else
assertEquals(1, rs.getFetchSize());
rs.setFetchSize(5);
assertEquals(5,rs.getFetchSize());
assertEquals(ResultSet.FETCH_FORWARD,rs.getFetchDirection());
rs.close();
s_f_r.close();
ps_f_r = prepareStatement("select * from t",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// We should have gotten no warnings and a read only forward only cursor
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
// Verify that result set from statement is
// scroll insensitive and read only
rs = ps_f_r.executeQuery();
assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType());
assertEquals(ResultSet.CONCUR_READ_ONLY,rs.getConcurrency());
// Verify that first() doesn't work
try {
rs.first();
// Should never get here
fail("first() expected to fail");
} catch (SQLException sqle) {
assertOnlyOnScrollableException(sqle);
}
rs.close();
ps_f_r.close();
}
/**
* Positive tests for forward only cursors.
*
* This method tests forward only cursors.
*
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testForwardOnlyPositive() throws SQLException {
Connection conn = getConnection();
ResultSet rs;
Statement s_f_r = createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
// We should have gotten no warnings and a read only forward only cursor
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
// Verify that setMaxRows(4) succeeds
s_f_r.setMaxRows(5);
assertEquals(5, s_f_r.getMaxRows());
rs = s_f_r.executeQuery("values 1, 2, 3, 4, 5, 6");
// Iterate straight thru RS, expect only 5 rows.
JDBC.assertDrainResults(rs, 5);
s_f_r.close();
}
/**
* Scroll sensitive cursor tests
*
* This method tests scroll sensitive cursors. (Not implemented, so we
* should get back scroll insensitive curors with read only concurrency.)
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testScrollSensitive() throws SQLException {
Connection conn = getConnection();
ResultSet rs;
SQLWarning warning;
Statement s_s_r = null; // sensitive, read only
Statement s_s_u = null; // sensitive, updatable
s_s_r = createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// We should have gotten a warning and a scroll insensitive cursor
warning = conn.getWarnings();
assertNotNull(warning);
conn.clearWarnings();
// Verify that result set from statement is
// scroll insensitive and read only
rs = s_s_r.executeQuery("select * from t");
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, rs.getType());
assertEquals(ResultSet.CONCUR_READ_ONLY, rs.getConcurrency());
rs.close();
// Close the statement
s_s_r.close();
s_s_u = createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// We should have gotten 1 warning and a updatable scroll
// insensitive cursor.
warning = conn.getWarnings();
assertNotNull(warning);
conn.clearWarnings();
// Verify that result set from statement is
// scroll insensitive and read only
rs = s_s_u.executeQuery("select * from t");
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, rs.getType());
assertEquals(ResultSet.CONCUR_UPDATABLE, rs.getConcurrency());
rs.close();
}
/**
* Positive tests for scroll insensitive cursor.
*
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testScrollInsensitivePositive() throws SQLException {
Connection conn = getConnection();
ResultSet rs;
// insensitive, read only
Statement s_i_r = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// We should not have gotten any warnings
// and should have gotten a scroll insensitive cursor
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
// run a query
rs = s_i_r.executeQuery("select * from t");
// verify scroll insensitive and read only
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, rs.getType());
assertEquals(ResultSet.CONCUR_READ_ONLY, rs.getConcurrency());
// We should be positioned before the 1st row
assertTrue(rs.isBeforeFirst());
assertFalse(rs.absolute(0));
// still expected to be before first
assertTrue(rs.isBeforeFirst());
// go to first row
assertTrue(rs.first());
assertEquals(rs.getInt(1), 2);
assertTrue(rs.isFirst());
// move to before first
rs.beforeFirst();
assertTrue(rs.isBeforeFirst());
// move to last row
assertTrue(rs.last());
assertTrue(rs.isLast());
assertFalse(rs.isAfterLast());
assertEquals(6, rs.getInt(1));
assertFalse("not expecting to find another row", rs.next());
assertTrue(rs.isAfterLast());
// We're after the last row, verify that only isAfterLast()
// returns true
assertFalse(rs.isLast());
assertFalse(rs.isFirst());
assertFalse(rs.isBeforeFirst());
assertEquals(ResultSet.FETCH_FORWARD, rs.getFetchDirection());
rs.setFetchDirection(ResultSet.FETCH_UNKNOWN);
assertEquals(ResultSet.FETCH_UNKNOWN, rs.getFetchDirection());
if (isDerbyNetClient)
assertEquals(64, rs.getFetchSize());
else
assertEquals(1, rs.getFetchSize());
rs.setFetchSize(5);
assertEquals(5, rs.getFetchSize());
// setFetchSize() to 0 should have no effect.
// for client server, fetchSize should have to 64
rs.setFetchSize(0);
if (isDerbyNetClient)
assertEquals(64, rs.getFetchSize());
else
assertEquals(5, rs.getFetchSize());
// done
rs.close();
// Empty result set tests (DERBY-992)
rs = s_i_r.executeQuery("select * from t where 1=0");
rs.afterLast();
assertFalse("afterLast() on empty RS should be no-op", rs.isAfterLast());
rs.beforeFirst();
assertFalse("beforeFirst() on empty RS should be no-op", rs
.isBeforeFirst());
rs.close();
PreparedStatement ps_i_r = prepareStatement("select * from t",
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// We should not have gotten any warnings
// and should have gotten a prepared scroll insensitive cursor
JDBC.assertNoWarnings(conn.getWarnings());
rs = ps_i_r.executeQuery();
// make sure it's scrollable
rs.last();
rs.close();
ps_i_r.close();
// Check setMaxRows()/getMaxRows()
assertEquals(0, s_i_r.getMaxRows());
s_i_r.setMaxRows(5);
assertEquals(5, s_i_r.getMaxRows());
rs = s_i_r.executeQuery("values 1, 2, 3, 4, 5, 6");
assertNotNull(rs);
// Iterate straight thru RS, expect only 5 rows.
for (int index = 1; index < 6; index++) {
assertTrue(rs.next());
}
// We should not see another row (only 5, not 6)
assertFalse(rs.next());
rs.close();
// Jump around and verify setMaxRows() works.
rs = s_i_r.executeQuery("values 1, 2, 3, 4, 5, 6");
assertNotNull(rs);
assertTrue(rs.last());
// Iterate backwards thru RS, expect only 4 more (5 total) rows.
for (int index = 1; index < 5; index++) {
assertTrue(rs.previous());
}
// We should not see another row (only 5, not 6)
assertFalse(rs.previous());
rs.close();
rs = s_i_r.executeQuery("values 1, 2, 3, 4, 5, 6");
assertNotNull(rs);
rs.afterLast();
// Iterate backwards thru RS, expect only 5 rows.
for (int index = 1; index < 6; index++) {
assertTrue(rs.previous());
}
// We should not see another row (only 5, not 6)
assertFalse(rs.previous());
rs.close();
// Verify setting maxRows back to 0 works.
s_i_r.setMaxRows(0);
rs = s_i_r.executeQuery("values 1, 2, 3, 4, 5, 6");
assertNotNull(rs);
// Iterate straight thru RS, expect 6 rows.
for (int index = 1; index < 7; index++) {
assertTrue(rs.next());
}
// We should not see another row
assertFalse(rs.next());
rs.close();
}
/**
* Negative tests for scroll insensitive cursor.
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testScrollInsensitiveNegative() throws SQLException {
Connection conn = getConnection();
ResultSet rs;
// insensitive, read only
Statement s_i_r = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// We should not have gotten any warnings
// and should have gotten a scroll insensitive cursor
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
// Verify that setMaxRows(-1) fails
try {
s_i_r.setMaxRows(-1);
// Should never get here
fail("setMaxRows(-1) expected to fail");
} catch (SQLException sqle) {
/* Check to be sure the exception is the one we expect */
assertEquals("XJ063", sqle.getSQLState());
}
// Verify maxRows still 0
assertEquals(0, s_i_r.getMaxRows());
// Empty result set
rs = s_i_r.executeQuery("select * from t where 1=0");
// isBeforeFirst() and isAfterLast() should always return false
// when result set is empty
assertFalse(rs.isBeforeFirst());
assertFalse(rs.next());
assertFalse(rs.previous());
assertFalse(rs.isAfterLast());
assertFalse(rs.isFirst());
assertFalse(rs.isLast());
assertFalse(rs.relative(0));
assertFalse(rs.relative(1));
assertFalse(rs.relative(-1));
assertFalse(rs.absolute(0));
assertFalse(rs.absolute(1));
assertFalse(rs.absolute(-1));
rs.close();
// End of empty result set tests
// Non-empty result set
rs = s_i_r.executeQuery("select * from t");
// Negative fetch size
try {
rs.setFetchSize(-5);
fail("setFetchSize(-5) expected to fail");
} catch (SQLException sqle) {
/* Check to be sure the exception is the one we expect */
assertEquals("XJ062", sqle.getSQLState());
}
rs.close();
s_i_r.close();
}
/**
* CallableStatement tests.
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testCallableStatements() throws SQLException {
Connection conn = getConnection();
SQLWarning warning;
CallableStatement cs_s_r = null; // sensitive, read only
CallableStatement cs_s_u = null; // sensitive, updatable
CallableStatement cs_i_r = null; // insensitive, read only
CallableStatement cs_f_r = null; // forward only, read only
cs_s_r = prepareCall("values cast (? as Integer)",
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
// We should have gotten 1 warnings
warning = conn.getWarnings();
assertNotNull(warning);
if (!isDerbyNetClient)
assertEquals("01J02", warning.getSQLState());
else
assertEquals("01J10", warning.getSQLState());
JDBC.assertNoWarnings(warning.getNextWarning());
conn.clearWarnings();
cs_s_r.close();
cs_s_u = prepareCall("values cast (? as Integer)",
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// We should have gotten 1 warning
warning = conn.getWarnings();
assertNotNull(warning);
if (!isDerbyNetClient)
assertEquals("01J02", warning.getSQLState());
else
assertEquals("01J10", warning.getSQLState());
JDBC.assertNoWarnings(warning.getNextWarning());
conn.clearWarnings();
cs_s_u.close();
cs_i_r = prepareCall("values cast (? as Integer)",
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// We should have gotten 0 warnings
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
cs_i_r.close();
cs_f_r = prepareCall("values cast (? as Integer)",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// We should have gotten 0 warnings
JDBC.assertNoWarnings(conn.getWarnings());
conn.clearWarnings();
cs_f_r.close();
}
/**
* Tests for PreparedStatement.getMetaData().
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
public void testGetMetaData() throws SQLException {
PreparedStatement ps_f_r = null; // forward only, read only
ResultSet rs;
ResultSetMetaData rsmd_ps;
ResultSetMetaData rsmd_rs;
ps_f_r = prepareStatement("select c50, i, 43 from t",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
rsmd_ps = ps_f_r.getMetaData();
assertNotNull(rsmd_ps);
// Now get meta data from result set
rs = ps_f_r.executeQuery();
rsmd_rs = rs.getMetaData();
assertNotNull(rsmd_rs);
// check column count
assertEquals(rsmd_ps.getColumnCount(), rsmd_rs.getColumnCount());
// get column name for 2nd column
assertEquals(rsmd_ps.getColumnName(2), rsmd_rs.getColumnName(2));
assertEquals(rsmd_ps.isReadOnly(2), rsmd_rs.isReadOnly(2));
rs.close();
ps_f_r.close();
}
public void testScrollVerifyMaxRowWithFetchSize() throws SQLException {
scrollVerifyMaxRowWithFetchSize(10, 10);
scrollVerifyMaxRowWithFetchSize(10, 5);
scrollVerifyMaxRowWithFetchSize(10, 0);
scrollVerifyMaxRowWithFetchSize(0, 0);
scrollVerifyMaxRowWithFetchSize(0, 5);
scrollVerifyMaxRowWithFetchSize(0, 10);
scrollVerifyMaxRowWithFetchSize(0, 15);
}
/**
* Tests for maxRow and fetchSize with scrollable cursors
*
*
* @param maxRows
* The maxRows value to use
* @param fetchSize
* The fetchSize value to use
*
* @exception SQLException
* Thrown if some unexpected error happens
*/
private void scrollVerifyMaxRowWithFetchSize(int maxRows, int fetchSize)
throws SQLException {
ResultSet rs;
Statement s_i_r = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
s_i_r.setMaxRows(maxRows);
// Execute query
rs = s_i_r
.executeQuery("values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15");
rs.setFetchSize(fetchSize);
// this should not affect the ResultSet because
s_i_r.setMaxRows(2);
if (maxRows == 0)
maxRows = 15;
assertNotNull(rs);
// Start from before first
// Iterate straight thru RS, expect only maxRows rows.
for (int index = 1; index < maxRows + 1; index++) {
assertTrue("rs.next() failed, index = " + index, rs.next());
assertEquals(index, rs.getInt(1));
}
// We should not see another row (only maxRows, not total)
assertFalse(rs.next());
// Start from first and verify maxRows
assertTrue(rs.first());
// Iterate forward thru RS, expect only (maxRows - 1) more rows.
for (int index = 1; index < maxRows; index++) {
assertTrue(rs.next());
assertEquals(index + 1, rs.getInt(1));
}
// We should not see another row (only maxRows, not total)
assertFalse(rs.next());
// Start from afterLast and verify maxRows
rs.afterLast();
// Iterate backwards thru RS, expect only (maxRows - 1) rows.
for (int index = 1; index < maxRows + 1; index++) {
assertTrue(rs.previous());
assertEquals(maxRows - index + 1, rs.getInt(1));
}
// We should not see another row (only maxRows, not total)
assertFalse(rs.previous());
// Start from last and verify maxRows
assertTrue(rs.last());
// Iterate backwards thru RS, expect only (maxRows - 1) more rows.
for (int index = 1; index < maxRows; index++) {
assertTrue(rs.previous());
assertEquals((maxRows - index), rs.getInt(1));
}
// We should not see another row (only 5, not 6)
assertFalse(rs.previous());
rs.last();
int rows = rs.getRow();
rs.absolute(rows / 2);
assertFalse(rs.relative(-1 * (rows)));
assertTrue(rs.isBeforeFirst());
rs.absolute(rows / 2);
assertFalse(rs.relative(rows));
assertTrue(rs.isAfterLast());
rs.absolute(rows / 2);
assertFalse("absolute(" + (rows + 1)
+ ") should return false, position outside of the resultSet",
rs.absolute(rows + 1));
rs.absolute(rows / 2);
assertFalse(rs.absolute((-1) * (rows + 1)));
assertTrue(rs.isBeforeFirst());
rs.close();
}
private void assertOnlyOnScrollableException(SQLException sqle) {
if (!isDerbyNetClient) {
assertEquals("XJ061", sqle.getSQLState());
} else {
assertEquals("XJ125", sqle.getSQLState());
}
}
public static Test suite() {
return TestConfiguration.defaultSuite(ScrollCursors2Test.class);
}
}