blob: 88104a86d33a379b5651d1428365472579811e98 [file] [log] [blame]
/*
*
* Derby - Class URCoveringIndexTest
*
* 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.jdbcapi;
import org.apache.derbyTesting.functionTests.util.TestUtil;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.TestConfiguration;
import junit.framework.*;
import java.sql.*;
/**
* Tests updatable result sets when there is a index that includes all data for
* the query (covering index).
*
* DERBY-1087
*
*/
public class URCoveringIndexTest extends BaseJDBCTestCase {
public static Test suite() {
return TestConfiguration.defaultSuite(URCoveringIndexTest.class);
}
/** Creates a new instance of SURBaseTest */
public URCoveringIndexTest(String name) {
super(name);
}
/**
* Set up the connection to the database.
*/
public void setUp() throws Exception {
Connection con = getConnection();
con.setAutoCommit(false);
String createTableWithPK = "CREATE TABLE tableWithPK (" +
"c1 int primary key," +
"c2 int)";
String insertData = "INSERT INTO tableWithPK values (1, 1)";
Statement stmt = con.createStatement();
stmt.execute(createTableWithPK);
stmt.execute(insertData);
stmt.close();
}
private void testUpdateUpdatedTupleWithCoveringIndex(
boolean scroll,
boolean usePositionedUpdate) throws SQLException{
SQLWarning w = null;
int resultsetType = scroll ? ResultSet.TYPE_SCROLL_INSENSITIVE :
ResultSet.TYPE_FORWARD_ONLY;
Connection con = getConnection();
if (!(con.getMetaData().supportsResultSetConcurrency(resultsetType,
ResultSet.CONCUR_UPDATABLE))) {
return;
}
Statement updStmt = con.createStatement(resultsetType,
ResultSet.CONCUR_UPDATABLE);
Statement roStmt = con.createStatement();
ResultSet rs = updStmt.executeQuery("SELECT c1 FROM tableWithPK");
rs.next();
int orig_c1 = rs.getInt(1);
roStmt.executeUpdate("UPDATE tableWithPK SET c1 = " +
(orig_c1 + 10) + "WHERE c1 = " + rs.getInt(1));
rs.clearWarnings();
if (usePositionedUpdate) {
roStmt.executeUpdate("UPDATE tableWithPK set c1 = " +
(orig_c1 + 20) + "WHERE CURRENT OF " +
rs.getCursorName());
w = roStmt.getWarnings();
} else {
rs.updateInt(1, (orig_c1 + 20));
rs.updateRow();
w = rs.getWarnings();
}
JDBC.assertNoWarnings(w);
rs.close();
rs = roStmt.executeQuery("SELECT c1 FROM tableWithPK");
rs.next();
assertEquals("Expecting c1 to be " + orig_c1 + " + 20",
rs.getInt(1), (orig_c1 + 20));
rs.close();
roStmt.close();
updStmt.close();
}
/**
* Updates a previously updated row with a covering index using positioned
* updates and scrollable result sets.
*/
public void testUpdateUpdatedTupleScrollPostitioned() throws SQLException{
testUpdateUpdatedTupleWithCoveringIndex(true, true);
}
/**
* Updates a previously updated row with a covering index using updateRow
* and scrollable result sets.
*/
public void testUpdateUpdatedTupleScrollUpdateRow() throws SQLException{
testUpdateUpdatedTupleWithCoveringIndex(true, false);
}
/**
* Updates a previously updated row with a covering index using positioned
* updates and forward only result sets.
*/
public void testUpdateUpdatedTupleFOPositioned() throws SQLException{
testUpdateUpdatedTupleWithCoveringIndex(false, true);
}
/**
* Updates a previously updated row with a covering index using updateRow
* and forward only result sets.
*/
public void testUpdateUpdatedTupleFOUpdateRow() throws SQLException{
testUpdateUpdatedTupleWithCoveringIndex(false, false);
}
}