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 da...@apache.org on 2011/07/04 13:15:34 UTC
svn commit: r1142626 [2/3] - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting:
functionTests/master/ functionTests/suites/ functionTests/tests/store/ junit/
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/UpdateLocksTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/UpdateLocksTest.java?rev=1142626&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/UpdateLocksTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/UpdateLocksTest.java Mon Jul 4 11:15:34 2011
@@ -0,0 +1,7642 @@
+/*
+ *
+ * Derby - Class org.apache.derbyTesting.functionTests.tests.store.UpdateLocksTest
+ *
+ * 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.store;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.ResultSetMetaData;
+
+import java.util.Properties;
+import java.util.Arrays;
+
+import junit.framework.Test;
+
+import org.apache.derbyTesting.functionTests.util.Formatters;
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.SystemPropertyTestSetup;
+import org.apache.derbyTesting.junit.TestConfiguration;
+
+/**
+ * Test lock setting for updates for the cartesian product of:
+ * <p/>
+ * all four ISO isolation levels <b>X</b> <br>
+ * {unpadded varchar column, padded varchar column} <b>X</b> <br>
+ * {unique, non-unique indexes} <b>X</b> <br>
+ * {index on unpadded varchar column, index on padded varchar column}
+ * <p/>
+ * This test started out as <code>updatelocks.sql</code> in the old
+ * harness. The structure of this JUnit test mirrors the old test closely.
+ * It contains a test fixture for each isolation level, e.g. four.
+ */
+
+public class UpdateLocksTest extends BaseJDBCTestCase {
+
+ public UpdateLocksTest(String name) {
+ super(name);
+ }
+
+
+ public void setUp() throws Exception {
+ super.setUp();
+ getLocksQuery = prepareStatement(lock_table_query);
+ }
+
+
+ public void tearDown() throws Exception {
+ getLocksQuery = null;
+
+ try {
+ dropTable("a");
+ } catch (SQLException e) {
+ assertSQLState("42Y55", e);
+ }
+
+ super.tearDown();
+ }
+
+
+ public static Test suite() {
+
+ Test suite = TestConfiguration.embeddedSuite(UpdateLocksTest.class);
+
+ Properties p = new Properties();
+ p.put("derby.storage.pageSize", "4096");
+
+ return new CleanDatabaseTestSetup(
+ new SystemPropertyTestSetup(suite, p, false)) {
+
+ /**
+ * Creates the views and procedures used by the test cases.
+ */
+ protected void decorateSQL(Statement s) throws SQLException {
+ Connection conn = s.getConnection();
+
+ s.executeUpdate(
+ "create function PADSTRING (data varchar(32000), " +
+ " length integer) " +
+ " returns varchar(32000) " +
+ " external name " +
+ " 'org.apache.derbyTesting.functionTests." +
+ "util.Formatters.padString' " +
+ " language java parameter style java");
+
+ s.executeUpdate(
+ "create view LOCK_TABLE as " +
+ "select " +
+ " cast(username as char(8)) as username, " +
+ " cast(t.type as char(8)) as trantype, " +
+ " cast(l.type as char(8)) as type, " +
+ " cast(lockcount as char(3)) as cnt, " +
+ " mode, " +
+ " cast(tablename as char(12)) as tabname, " +
+ " cast(lockname as char(10)) as lockname, " +
+ " state, " +
+ " status " +
+ "from " +
+ " syscs_diag.lock_table l right outer join " +
+ " syscs_diag.transaction_table t " +
+ "on l.xid = t.xid " +
+ "where l.tableType <> 'S' and " +
+ " t.type='UserTransaction'");
+ }
+ };
+ }
+
+
+ private final static int UNIQUE_INDEX = 0;
+ private final static int NON_UNIQUE_INDEX = 1;
+ private final static int NO_IDX_1 = 2;
+ private final static int NO_IDX_2 = 3;
+ private final static String _g = "GRANT";
+ private final static String _a = "ACTIVE";
+ private final static String _app = "APP";
+ private final static String _ut = "UserTran";
+ private final static String _t = "TABLE";
+ private final static String _r = "ROW";
+ private final static String _tl = "Tablelock";
+ private final static String _A = "A";
+ private final static String _X = "X";
+ private final static String _IX = "IX";
+ private final static String _U = "U";
+
+
+ /**
+ * Should be the same as SERIALIZABLE results except no previous key locks.
+ */
+ public void testRepeatableRead () throws Exception {
+ doRunTests(Connection.TRANSACTION_REPEATABLE_READ);
+ }
+
+ public void testReadCommitted() throws Exception {
+ doRunTests(Connection.TRANSACTION_READ_COMMITTED);
+ }
+
+ public void testSerializable() throws Exception {
+ doRunTests(Connection.TRANSACTION_SERIALIZABLE);
+ }
+
+ public void testReadUncommitted() throws Exception {
+ doRunTests(Connection.TRANSACTION_READ_UNCOMMITTED);
+ }
+
+ private void insertValuesUnpaddedVarchar(Statement s) throws SQLException {
+ s.executeUpdate("insert into a values (1, 10, 'one')");
+ s.executeUpdate("insert into a values (2, 20, 'two')");
+ s.executeUpdate("insert into a values (3, 30, 'three')");
+ s.executeUpdate("insert into a values (4, 40, 'four')");
+ s.executeUpdate("insert into a values (5, 50, 'five')");
+ s.executeUpdate("insert into a values (6, 60, 'six')");
+ s.executeUpdate("insert into a values (7, 70, 'seven')");
+ }
+
+ private void doRunTests (int isolation) throws Exception {
+ setAutoCommit(false);
+ getConnection().setTransactionIsolation(
+ isolation);
+ commit();
+
+ // Run each test with rows on one page in the interesting conglomerate
+ // (heap in the non-index tests, and in the index in the index based
+ // tests).
+
+ // cursor, no index run
+ // To create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+ Statement s = createStatement();
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ commit();
+ updatecursorlocks(getConnection(), isolation, 0, NO_IDX_1);
+
+ // non cursor, no index run
+ // to create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ commit();
+ updatesetlocks(getConnection(), isolation, 0, NO_IDX_1);
+
+ // cursor, unique index run
+ // to create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ s.executeUpdate("create unique index a_idx on a (a)");
+ commit();
+ updateBtreeCursorLocks1(getConnection(),
+ isolation,
+ UNIQUE_INDEX,
+ true, 0, 0);
+ updateBtreeCursorLocks2(getConnection(),
+ isolation,
+ UNIQUE_INDEX,
+ true, 0, 0);
+
+ // cursor, non-unique index run
+ // to create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ s.executeUpdate("create index a_idx on a (a)");
+ commit();
+ updateBtreeCursorLocks1(getConnection(), isolation,
+ NON_UNIQUE_INDEX,
+ true, 0, 0);
+ updateBtreeCursorLocks2(getConnection(), isolation,
+ NON_UNIQUE_INDEX,
+ true, 0, 0);
+
+ // non cursor, unique index run
+ // to create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ s.executeUpdate("create unique index a_idx on a (a)");
+ commit();
+ updateBtreeSetLocks(
+ getConnection(), isolation, UNIQUE_INDEX, true, 0, 0);
+
+ // non cursor, non-unique index run
+ // to create tables of page size 4k and still keep the following tbl
+ // create table a (a int, b int, c varchar(1900));
+
+ s.executeUpdate("create table a(a int, b int)");
+ s.executeUpdate("alter table a add column c varchar(1900)");
+ insertValuesUnpaddedVarchar(s);
+ s.executeUpdate("create index a_idx on a (a)");
+ commit();
+ updateBtreeSetLocks(
+ getConnection(), isolation, NON_UNIQUE_INDEX, true, 0, 0);
+
+ // run each test with rows across multiple pages in the interesting
+ // conglomerate (heap in the non-index tests, and in the index in the
+ // index based tests).
+
+ // cursor, no index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900))");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900))");
+ commit();
+ updatecursorlocks(getConnection(), isolation, 1900, NO_IDX_2);
+
+ // non cursor, no index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900))");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900))");
+ commit();
+ updatesetlocks(getConnection(), isolation, 1900, NO_IDX_2);
+
+ // cursor, unique index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900)," +
+ " index_pad varchar(600) )");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900), " +
+ " PADSTRING('index pad 1',600))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900), " +
+ " PADSTRING('index pad 2',600))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900), " +
+ " PADSTRING('index pad 3',600))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900), " +
+ " PADSTRING('index pad 4',600))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900), " +
+ " PADSTRING('index pad 5',600))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900), " +
+ " PADSTRING('index pad 6',600))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900), " +
+ " PADSTRING('index pad 7',600))");
+ s.executeUpdate("create unique index a_idx on a (a, index_pad)");
+ commit();
+ updateBtreeCursorLocks1(getConnection(), isolation,
+ UNIQUE_INDEX, false, 1900, 600);
+ updateBtreeCursorLocks2(getConnection(), isolation,
+ UNIQUE_INDEX, false, 1900, 600);
+
+ // cursor, non-unique index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900)," +
+ " index_pad varchar(700) )");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900), " +
+ " PADSTRING('index pad 1',700))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900), " +
+ " PADSTRING('index pad 2',700))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900), " +
+ " PADSTRING('index pad 3',700))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900), " +
+ " PADSTRING('index pad 4',700))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900), " +
+ " PADSTRING('index pad 5',700))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900), " +
+ " PADSTRING('index pad 6',700))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900), " +
+ " PADSTRING('index pad 7',700))");
+ s.executeUpdate("create index a_idx on a (a, index_pad)");
+ commit();
+ updateBtreeCursorLocks1(getConnection(), isolation,
+ NON_UNIQUE_INDEX, false, 1900, 700);
+ updateBtreeCursorLocks2(getConnection(), isolation,
+ NON_UNIQUE_INDEX, false, 1900, 700);
+
+ // non cursor, unique index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900)," +
+ " index_pad varchar(800) )");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900), " +
+ " PADSTRING('index pad 1',800))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900), " +
+ " PADSTRING('index pad 2',800))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900), " +
+ " PADSTRING('index pad 3',800))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900), " +
+ " PADSTRING('index pad 4',800))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900), " +
+ " PADSTRING('index pad 5',800))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900), " +
+ " PADSTRING('index pad 6',800))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900), " +
+ " PADSTRING('index pad 7',800))");
+ s.executeUpdate("create unique index a_idx on a (a, index_pad)");
+ commit();
+ updateBtreeSetLocks(getConnection(), isolation,
+ UNIQUE_INDEX, false, 1900, 800);
+
+ // non cursor, non-unique index run
+ s.executeUpdate("create table a (a int, b int, c varchar(1900), " +
+ " index_pad varchar(900) )");
+ s.executeUpdate("insert into a values (1, 10, " +
+ " PADSTRING('one',1900), " +
+ " PADSTRING('index pad 1',900))");
+ s.executeUpdate("insert into a values (2, 20, " +
+ " PADSTRING('two',1900), " +
+ " PADSTRING('index pad 2',900))");
+ s.executeUpdate("insert into a values (3, 30, " +
+ " PADSTRING('three',1900), " +
+ " PADSTRING('index pad 3',900))");
+ s.executeUpdate("insert into a values (4, 40, " +
+ " PADSTRING('four',1900), " +
+ " PADSTRING('index pad 4',900))");
+ s.executeUpdate("insert into a values (5, 50, " +
+ " PADSTRING('five',1900), " +
+ " PADSTRING('index pad 5',900))");
+ s.executeUpdate("insert into a values (6, 60, " +
+ " PADSTRING('six',1900), " +
+ " PADSTRING('index pad 6',900))");
+ s.executeUpdate("insert into a values (7, 70, " +
+ " PADSTRING('seven',1900), " +
+ " PADSTRING('index pad 7',900))");
+ s.executeUpdate("create index a_idx on a (a, index_pad)");
+ commit();
+ updateBtreeSetLocks(getConnection(), isolation,
+ NON_UNIQUE_INDEX, false, 1900, 900);
+
+ commit();
+ }
+
+
+ private void updatecursorlocks(
+ Connection c, int isolation, int pad, int mode) throws SQLException {
+
+ Statement s = c.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_UPDATABLE);
+ ResultSet rs = s.executeQuery(
+ "select a, b, c from a for update");
+
+ ResultSet ltrs = getLocks();
+
+ verifyRsMetaData(ltrs);
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+
+ rs.next();
+
+ assertRow(rs, new String[] {"1", "10", pad2("one", pad)});
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"2", "20", pad2("two", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"3", "30", pad2("three", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ ( mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a}}
+ )
+ ));
+
+ rs.next();
+ assertRow(rs, new String[] {"4", "40", pad2("four", pad)});
+ ltrs = getLocks();
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a}}
+ )
+ ));
+
+ rs.next();
+ assertRow(rs, new String[] {"5", "50", pad2("five", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"6", "60", pad2("six", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"7", "70", pad2("seven", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ rs.close();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ commit();
+ ltrs = getLocks();
+ JDBC.assertEmpty(ltrs);
+
+ commit();
+
+ /* ------------------------------------------------------------
+ * Test full cursor scan which deletes "even" rows. Will claim an U
+ * lock as it visits each row. Will claim an X lock on any row it
+ * actually deletes.
+ * ------------------------------------------------------------
+ */
+ rs = s.executeQuery(
+ "select a, b, c from a for update");
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"1", "10", pad2("one", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"2", "20", pad2(pad2("two", pad), pad)});
+ rs.deleteRow();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"3", "30", pad2("three", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"4", "40", pad2("four", pad)});
+ rs.deleteRow();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"5", "50", pad2("five", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"6", "60", pad2("six", pad)});
+ rs.deleteRow();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"7", "70", pad2("seven", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ rs.close();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,10)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,12)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "4", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,8)", _g, _a}}
+ )
+ ));
+ commit();
+ ltrs = getLocks();
+ JDBC.assertEmpty(ltrs);
+ commit();
+
+ JDBC.assertUnorderedResultSet(
+ s.executeQuery(
+ "select * from a"),
+ new String[][] {
+ {"1", "10", pad2("one", pad)},
+ {"3", "30", pad2("three", pad)},
+ {"5", "50", pad2("five", pad)},
+ {"7", "70", pad2("seven", pad)}},
+ false);
+ commit();
+
+ /* ------------------------------------------------------------
+ * Test full cursor scan which does no updates, now there are committed
+ * deleted rows in the heap, make sure there are no locks on the
+ * committed deleted rows.
+ *
+ * At this point the table should look like:
+ * 1, 10, 'one'
+ * 3, 30, 'three'
+ * 5, 50, 'five'
+ * 7, 70, 'seven'
+ * ------------------------------------------------------------
+ */
+ rs = s.executeQuery(
+ "select a, b, c from a for update");
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"1", "10", pad2("one", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"3", "30", pad2("three", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"5", "50", pad2("five", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"7", "70", pad2("seven", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ rs.close();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ commit();
+ ltrs = getLocks();
+ JDBC.assertEmpty(ltrs);
+
+ commit();
+ JDBC.assertUnorderedResultSet(
+ s.executeQuery("select * from a"),
+ new String[][] {
+ {"1", "10", pad2("one", pad)},
+ {"3", "30", pad2("three", pad)},
+ {"5", "50", pad2("five", pad)},
+ {"7", "70", pad2("seven", pad)}},
+ false);
+ commit();
+ /* ------------------------------------------------------------
+ * Test full cursor scan which updates the middle 2 rows, now there are
+ * committed deleted rows in the heap. Will get X locks only on the
+ * rows which are updated.
+ *
+ * At this point the table should look like:
+ * 1, 10, 'one'
+ * 3, 30, 'three'
+ * 5, 50, 'five'
+ * 7, 70, 'seven'
+ * ------------------------------------------------------------
+ */
+ rs = s.executeQuery(
+ "select a, b, c from a for update");
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"1", "10", pad2("one", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"3", "30", pad2("three", pad)});
+
+ rs.updateInt(_A, -3);
+ rs.updateInt("B", -30);
+ rs.updateString("C", pad2("-three", pad));
+ rs.updateRow();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"5", "50", pad2("five", pad)});
+
+ rs.updateInt(_A,-5);
+ rs.updateInt("B",-50);
+ rs.updateString("C", pad2("-five", pad));
+ rs.updateRow();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"7", "70", pad2("seven", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ rs.close();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ commit();
+ ltrs = getLocks();
+ JDBC.assertEmpty(ltrs);
+
+ commit();
+ JDBC.assertUnorderedResultSet(
+ s.executeQuery("select * from a"),
+ new String[][] {
+ {"1", "10", pad2("one", pad)},
+ {"-3", "-30", pad2("-three", pad)},
+ {"-5", "-50", pad2("-five", pad)},
+ {"7", "70", pad2("seven", pad)}},
+ false);
+ commit();
+
+ /* ------------------------------------------------------------
+ * Test qualified full cursor scan which does no updates.
+ *
+ * At this point the table should look like:
+ * 1, 10, 'one'
+ * -3, -30, '-three'
+ * -5, -50, '-five'
+ * 7, 70, 'seven'
+ * ------------------------------------------------------------
+ */
+ rs = s.executeQuery(
+ "select a, b, c from a where a < 0 for update");
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"-3", "-30", pad2("-three", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"-5", "-50", pad2("-five", pad)});
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ rs.close();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,11)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,9)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(2,6)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(3,6)", _g, _a}}
+ )
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ )
+ ));
+ commit();
+ ltrs = getLocks();
+ JDBC.assertEmpty(ltrs);
+
+ commit();
+
+ JDBC.assertUnorderedResultSet(
+ s.executeQuery("select * from a"),
+ new String[][] {
+ {"1", "10", pad2("one", pad)},
+ {"-3", "-30", pad2("-three", pad)},
+ {"-5", "-50", pad2("-five", pad)},
+ {"7", "70", pad2("seven", pad)}},
+ false);
+ commit();
+
+ /* ------------------------------------------------------------
+ * Test qualified full cursor scan which deletes the positive rows.
+ *
+ * At this point the table should look like:
+ * 1, 10, 'one'
+ * -3, -30, '-three'
+ * -5, -50, '-five'
+ * 7, 70, 'seven'
+ * ------------------------------------------------------------
+ */
+ rs = s.executeQuery(
+ "select a, b, c from a where a > 0 for update");
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"1", "10", pad2("one", pad)});
+ rs.deleteRow();
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "1", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,7)", _g, _a}}
+ ));
+ rs.next();
+ assertRow(rs, new String[] {"7", "70", pad2("seven", pad)});
+ rs.deleteRow();
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
+ isolation == Connection.TRANSACTION_REPEATABLE_READ ?
+ (mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,7)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,7)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(4,6)", _g, _a}}
+ )
+ :
+ (
+ mode == NO_IDX_1 ?
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,13)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,7)", _g, _a}}
+ :
+ new String[][]{
+ {_app, _ut, _t, "3", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _r, "1", _U, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(4,6)", _g, _a},
+ {_app, _ut, _r, "1", _X, _A, "(1,7)", _g, _a}}
+ )
+ ));
+ assertFalse(rs.next());
+
+ ltrs = getLocks();
+
+ JDBC.assertUnorderedResultSet(
+ ltrs,
+ isolation == Connection.TRANSACTION_SERIALIZABLE ?
+ new String[][]{
+ {_app, _ut, _t, "2", _IX, _A, _tl, _g, _a},
+ {_app, _ut, _t, "1", _X, _A, _tl, _g, _a}}
+ :
+ (
[... 5633 lines stripped ...]