/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.h2.test.TestBase;
/**
* Test for limit updates.
*/
public class TestLimitUpdates extends TestBase {
private static final String DATABASE_NAME = "limitUpdates";
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws SQLException {
testLimitUpdates();
deleteDb(DATABASE_NAME);
}
private void testLimitUpdates() throws SQLException {
deleteDb(DATABASE_NAME);
Connection conn = null;
PreparedStatement prep = null;
try {
conn = getConnection(DATABASE_NAME);
prep = conn.prepareStatement(
"CREATE TABLE TEST(KEY_ID INT PRIMARY KEY, VALUE_ID INT)");
prep.executeUpdate();
prep.close();
prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)");
int numRows = 10;
for (int i = 0; i < numRows; ++i) {
prep.setInt(1, i);
prep.setInt(2, 0);
prep.execute();
}
assertEquals(numRows, countWhere(conn, 0));
// update all elements than available
prep.close();
prep = conn.prepareStatement("UPDATE TEST SET VALUE_ID = ?");
prep.setInt(1, 1);
prep.execute();
assertEquals(numRows, countWhere(conn, 1));
// update less elements than available
updateLimit(conn, 2, numRows / 2);
assertEquals(numRows / 2, countWhere(conn, 2));
// update more elements than available
updateLimit(conn, 3, numRows * 2);
assertEquals(numRows, countWhere(conn, 3));
// update no elements
updateLimit(conn, 4, 0);
assertEquals(0, countWhere(conn, 4));
} finally {
if (prep != null) {
prep.close();
}
if (conn != null) {
conn.close();
}
}
}
private static int countWhere(final Connection conn, final int where)
throws SQLException {
PreparedStatement prep = null;
ResultSet rs = null;
try {
prep = conn.prepareStatement(
"SELECT COUNT(*) FROM TEST WHERE VALUE_ID = ?");
prep.setInt(1, where);
rs = prep.executeQuery();
rs.next();
return rs.getInt(1);
} finally {
if (rs != null) {
rs.close();
}
if (prep != null) {
prep.close();
}
}
}
private static void updateLimit(final Connection conn, final int value,
final int limit) throws SQLException {
PreparedStatement prep = null;
try {
prep = conn.prepareStatement(
"UPDATE TEST SET VALUE_ID = ? LIMIT ?");
prep.setInt(1, value);
prep.setInt(2, limit);
prep.execute();
} finally {
if (prep != null) {
prep.close();
}
}
}
}