package org.mariadb.jdbc;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import static org.junit.Assert.*;
public class FetchSizeTest extends BaseTest {
/**
* Tables initialisation.
*/
@BeforeClass()
public static void initClass() throws SQLException {
createTable("fetchSizeTest1", "id int, test varchar(100)");
createTable("fetchSizeTest2", "id int, test varchar(100)");
createTable("fetchSizeTest3", "id int, test varchar(100)");
createTable("fetchSizeTest4", "id int, test varchar(100)");
createTable("fetchSizeTest5", "id int, test varchar(100)");
}
@Test
public void batchFetchSizeTest() throws SQLException {
Statement stmt = sharedConnection.createStatement();
PreparedStatement pstmt = sharedConnection.prepareStatement("INSERT INTO fetchSizeTest1 (test) values (?)");
stmt.setFetchSize(1);
pstmt.setFetchSize(1);
//check that fetch isn't use by batch execution
for (int i = 0; i < 10; i++) {
pstmt.setString(1, "" + i);
pstmt.addBatch();
stmt.addBatch("INSERT INTO fetchSizeTest1 (test) values ('aaa" + i + "')");
}
pstmt.executeBatch();
stmt.executeBatch();
ResultSet resultSet = stmt.executeQuery("SELECT count(*) from fetchSizeTest1");
if (resultSet.next()) {
assertEquals(20, resultSet.getLong(1));
} else {
fail("must have resultset");
}
}
@Test
public void fetchSizeNormalTest() throws SQLException {
prepareRecords(100, "fetchSizeTest4");
Statement stmt = sharedConnection.createStatement();
stmt.setFetchSize(1);
ResultSet resultSet = stmt.executeQuery("SELECT test FROM fetchSizeTest4");
for (int counter = 0; counter < 100; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
assertFalse(resultSet.next());
}
@Test
public void fetchSizeErrorWhileFetchTest() throws SQLException {
prepareRecords(100, "fetchSizeTest3");
Statement stmt = sharedConnection.createStatement();
stmt.setFetchSize(1);
ResultSet resultSet = stmt.executeQuery("SELECT test FROM fetchSizeTest3");
for (int counter = 0; counter < 50; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
assertFalse(resultSet.isClosed());
try {
ResultSet rs2 = stmt.executeQuery("SELECT 1");
if (rs2.next()) {
assertEquals(1, rs2.getInt(1));
} else {
fail("resultset must have been active");
}
} catch (SQLException e) {
fail("Must have worked");
}
try {
assertFalse(resultSet.isClosed());
for (int counter = 50; counter < 100; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
resultSet.close();
assertTrue(resultSet.isClosed());
} catch (SQLException sqlexception) {
fail("must have throw an exception, since resulset must have been closed.");
}
}
@Test
public void fetchSizeBigSkipTest() throws SQLException {
prepareRecords(300, "fetchSizeTest5");
Statement stmt = sharedConnection.createStatement();
stmt.setFetchSize(1);
ResultSet resultSet = stmt.executeQuery("SELECT test FROM fetchSizeTest5");
for (int counter = 0; counter < 100; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
resultSet.close();
try {
resultSet.next();
fail("Must have thrown exception");
} catch (SQLException sqle) {
assertTrue(sqle.getMessage().contains("Operation not permit on a closed resultSet"));
}
resultSet = stmt.executeQuery("SELECT test FROM fetchSizeTest5");
for (int counter = 0; counter < 100; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
stmt.execute("Select 1");
//result must be completely loaded
for (int counter = 100; counter < 200; counter++) {
assertTrue(resultSet.next());
assertEquals("" + counter, resultSet.getString(1));
}
stmt.close();
resultSet.last();
assertEquals("299", resultSet.getString(1));
}
private void prepareRecords(int recordNumber, String tableName) throws SQLException {
PreparedStatement pstmt = sharedConnection.prepareStatement("INSERT INTO " + tableName + " (test) values (?)");
for (int i = 0; i < recordNumber; i++) {
pstmt.setString(1, "" + i);
pstmt.addBatch();
}
pstmt.executeBatch();
}
/**
* CONJ-315 : interrupt when closing statement.
*
* @throws SQLException sqle
*/
@Test
public void fetchSizeClose() throws SQLException {
Assume.assumeTrue(sharedOptions().killFetchStmtOnClose && !sharedOptions().profileSql);
long start = System.currentTimeMillis();
try (Statement stmt = sharedConnection.createStatement()) {
stmt.executeQuery("select * from information_schema.columns as c1, information_schema.tables LIMIT 50000");
}
final long normalExecutionTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
try (Statement stmt = sharedConnection.createStatement()) {
stmt.setFetchSize(1);
stmt.executeQuery("select * from information_schema.columns as c1, information_schema.tables LIMIT 50000");
}
long interruptedExecutionTime = System.currentTimeMillis() - start;
//normalExecutionTime = 1500
//interruptedExecutionTime = 77
assertTrue("interruptedExecutionTime:" + interruptedExecutionTime
+ " normalExecutionTime:" + normalExecutionTime,
interruptedExecutionTime < normalExecutionTime);
}
@Test
public void fetchSizePrepareClose() throws SQLException {
Assume.assumeTrue(sharedOptions().killFetchStmtOnClose && !sharedOptions().profileSql);
long start;
long normalExecutionTime;
try (PreparedStatement stmt = sharedConnection.prepareStatement(
"select * from information_schema.columns as c1, information_schema.tables LIMIT 50000")) {
start = System.currentTimeMillis();
stmt.executeQuery();
normalExecutionTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
stmt.setFetchSize(1);
stmt.executeQuery();
}
long interruptedExecutionTime = System.currentTimeMillis() - start;
//normalExecutionTime = 1500
//interruptedExecutionTime = 77
assertTrue("interruptedExecutionTime:" + interruptedExecutionTime
+ " normalExecutionTime:" + normalExecutionTime,
interruptedExecutionTime < normalExecutionTime);
}
}