/* This file is part of VoltDB. * Copyright (C) 2008-2017 VoltDB Inc. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package org.voltdb.jdbc; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.voltdb.BackendTarget; import org.voltdb.ServerThread; import org.voltdb.VoltDB.Configuration; import org.voltdb.compiler.VoltProjectBuilder; import org.voltdb.utils.MiscUtils; public class TestJDBCResultSet { static Connection HsqlConn; PreparedStatement hsqlEmptyStmt; PreparedStatement hsql3RowStmt; ResultSet hsqlEmptyRS; ResultSet hsql3RowRS; static ServerThread voltDBServer; static Connection VoltDBConn; static VoltProjectBuilder pb; static String testjar; Statement voltEmptyStmt; Statement volt3RowStmt; ResultSet voltEmptyRS; ResultSet volt3RowRS; @BeforeClass public static void setUp() throws Exception { final String TEST_XML = "jdbcresultsettest.xml"; final String TEST_JAR = "jdbcresultsettest.jar"; final String table1Stmt = "CREATE TABLE HSQLTABLE (COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20))"; final String table2Stmt = "CREATE TABLE HSQLEMPTY (COLEM1 INTEGER PRIMARY KEY, COLEM2 VARCHAR(20))"; final String insert1Stmt = "INSERT INTO HSQLTABLE(COL1, COL2) VALUES(1,'FirstRow')"; final String insert2Stmt = "INSERT INTO HSQLTABLE(COL1, COL2) VALUES(2,'SecondRow')"; final String insert3Stmt = "INSERT INTO HSQLTABLE(COL1, COL2) VALUES(3,'ThirdRow')"; try { // HSQL setup Class.forName("org.hsqldb_voltpatches.jdbcDriver"); HsqlConn = DriverManager.getConnection("jdbc:hsqldb:mem:temptest", "sa", ""); Statement hsqlStmt = null; hsqlStmt = HsqlConn.createStatement(); int i = hsqlStmt.executeUpdate(table1Stmt); assertFalse(i == -1); i = hsqlStmt.executeUpdate(table2Stmt); assertFalse(i == -1); i = hsqlStmt.executeUpdate(insert1Stmt); assertFalse(i == -1); i = hsqlStmt.executeUpdate(insert2Stmt); assertFalse(i == -1); i = hsqlStmt.executeUpdate(insert3Stmt); assertFalse(i == -1); hsqlStmt.close(); // VoltDB Setup String ddl = table1Stmt + ";" + table2Stmt + ";"; pb = new VoltProjectBuilder(); pb.addLiteralSchema(ddl); boolean success = pb.compile( Configuration.getPathToCatalogForTest(TEST_JAR), 3, 1, 0); assert (success); MiscUtils.copyFile(pb.getPathToDeployment(), Configuration.getPathToCatalogForTest(TEST_XML)); testjar = Configuration.getPathToCatalogForTest(TEST_JAR); // Set up ServerThread and Connection startServer(); Statement VoltDBStmt = VoltDBConn.createStatement(); i = VoltDBStmt.executeUpdate(insert1Stmt); assertFalse(i == -1); i = VoltDBStmt.executeUpdate(insert2Stmt); assertFalse(i == -1); i = VoltDBStmt.executeUpdate(insert3Stmt); assertFalse(i == -1); VoltDBStmt.close(); } catch (SQLException ex) { fail(); } } @AfterClass public static void tearDown() throws Exception { try { Statement st = HsqlConn.createStatement(); st.execute("SHUTDOWN"); st.close(); HsqlConn.close(); stopServer(); } catch (SQLException ex) { fail(); } } private static void startServer() throws ClassNotFoundException, SQLException { voltDBServer = new ServerThread(testjar, pb.getPathToDeployment(), BackendTarget.NATIVE_EE_JNI); voltDBServer.start(); voltDBServer.waitForInitialization(); Class.forName("org.voltdb.jdbc.Driver"); VoltDBConn = DriverManager .getConnection("jdbc:voltdb://localhost:21212"); } private static void stopServer() throws SQLException { if (VoltDBConn != null) { VoltDBConn.close(); VoltDBConn = null; } if (voltDBServer != null) { try { voltDBServer.shutdown(); } catch (InterruptedException e) { /* empty */ } voltDBServer = null; } } @Before public void populateResult() { try { hsqlEmptyStmt = HsqlConn.prepareStatement( "SELECT * FROM HSQLEMPTY", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); hsql3RowStmt = HsqlConn.prepareStatement("SELECT * FROM HSQLTABLE ORDER BY COL1", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); hsqlEmptyRS = hsqlEmptyStmt.executeQuery(); hsql3RowRS = hsql3RowStmt.executeQuery(); voltEmptyStmt = VoltDBConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); volt3RowStmt = VoltDBConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); voltEmptyRS = voltEmptyStmt.executeQuery("SELECT * FROM HSQLEMPTY"); volt3RowRS = volt3RowStmt.executeQuery("SELECT * FROM HSQLTABLE ORDER BY COL1"); } catch (SQLException ex) { fail(); } } @After public void clearResult() { try { hsqlEmptyRS.close(); hsqlEmptyRS = null; hsql3RowRS.close(); hsql3RowRS = null; hsqlEmptyStmt.close(); hsqlEmptyStmt = null; hsql3RowStmt.close(); hsql3RowStmt = null; } catch (SQLException e) { } try { voltEmptyRS.close(); voltEmptyRS = null; volt3RowRS.close(); volt3RowRS = null; voltEmptyStmt.close(); voltEmptyStmt = null; volt3RowStmt.close(); volt3RowStmt = null; } catch (SQLException e) { } } // Tests For Table with data @Test public void testFirst() throws Exception { assertEquals(hsql3RowRS.absolute(2), volt3RowRS.absolute(2)); assertTrue(hsql3RowRS.first() == volt3RowRS.first()); assertTrue(hsql3RowRS.getRow() == volt3RowRS.getRow()); assertEquals(hsql3RowRS.getInt(1), volt3RowRS.getInt(1)); } @Test public void testLast() throws Exception { assertTrue(hsql3RowRS.last() == volt3RowRS.last()); assertTrue(hsql3RowRS.getRow() == volt3RowRS.getRow()); assertEquals(hsql3RowRS.getInt(1), volt3RowRS.getInt(1)); } @Test public void testBeforeFirst() throws Exception { hsql3RowRS.beforeFirst(); volt3RowRS.beforeFirst(); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.next(), volt3RowRS.next()); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); } @Test public void testAfterLast() throws Exception { assertEquals(hsql3RowRS.next(), volt3RowRS.next()); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.previous(), volt3RowRS.previous()); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); } @Test public void testIsBeforeFirst() throws Exception { hsql3RowRS.beforeFirst(); volt3RowRS.beforeFirst(); assertEquals(hsql3RowRS.isBeforeFirst(), volt3RowRS.isBeforeFirst()); } @Test public void testIsAfterLast() throws Exception { hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsql3RowRS.isAfterLast(), volt3RowRS.isAfterLast()); } @Test public void testIsFirst() throws Exception { hsql3RowRS.beforeFirst(); volt3RowRS.beforeFirst(); assertEquals( hsql3RowRS.isFirst(), volt3RowRS.isFirst()); } @Test public void testIsLast() throws Exception { hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsql3RowRS.isLast(), volt3RowRS.isLast()); } @Test public void testAbsolute() throws Exception { assertEquals(hsql3RowRS.previous(), volt3RowRS.previous()); assertEquals(hsql3RowRS.absolute(2), volt3RowRS.absolute(2)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); // afterLast position assertEquals(hsql3RowRS.absolute(4), volt3RowRS.absolute(4)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); // random afterLast position assertEquals(hsql3RowRS.absolute(10), volt3RowRS.absolute(10)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); // Absolute 0 position assertEquals(hsql3RowRS.absolute(0), volt3RowRS.absolute(0)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); // negative position assertEquals(hsql3RowRS.absolute(-3), volt3RowRS.absolute(-3)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); } @Test public void testRelative() throws Exception { assertEquals(hsql3RowRS.next(), volt3RowRS.next()); assertEquals(hsql3RowRS.relative(2), volt3RowRS.relative(2)); hsql3RowRS.beforeFirst(); volt3RowRS.beforeFirst(); assertEquals(hsql3RowRS.relative(0), volt3RowRS.relative(0)); assertEquals(hsql3RowRS.relative(-3), volt3RowRS.relative(-3)); assertEquals(hsql3RowRS.relative(2), volt3RowRS.relative(2)); assertEquals(hsql3RowRS.previous(), volt3RowRS.previous()); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.relative(2), volt3RowRS.relative(2)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.absolute(4), volt3RowRS.absolute(4)); assertEquals(hsql3RowRS.relative(-3), volt3RowRS.relative(-3)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.relative(-10), volt3RowRS.relative(-10)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsql3RowRS.relative(1), volt3RowRS.relative(1)); hsql3RowRS.absolute(3); volt3RowRS.absolute(3); assertEquals(hsql3RowRS.absolute(3), volt3RowRS.absolute(3)); assertEquals(hsql3RowRS.relative(-3), volt3RowRS.relative(-3)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.absolute(1), volt3RowRS.absolute(1)); hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsql3RowRS.relative(-4), volt3RowRS.relative(-4)); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); } @Test public void testNextBoundaryRows() throws SQLException { assertEquals(hsql3RowRS.last(), volt3RowRS.last()); assertEquals(hsql3RowRS.next(), volt3RowRS.next()); assertEquals(hsql3RowRS.getRow(), volt3RowRS.getRow()); assertEquals(hsql3RowRS.absolute(4), volt3RowRS.absolute(4)); assertTrue(hsql3RowRS.getRow() == volt3RowRS.getRow()); } @Test public void testPreviousBoundaryRows() throws SQLException { assertEquals(hsql3RowRS.previous(), volt3RowRS.previous()); assertTrue(hsql3RowRS.getRow() == volt3RowRS.getRow()); } // Tests for empty table @Test public void testEmptyFirst() throws Exception { assertTrue(hsqlEmptyRS.first() == voltEmptyRS.first()); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); } @Test public void testEmptyLast() throws Exception { assertTrue(hsqlEmptyRS.last() == voltEmptyRS.last()); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); } @Test public void testEmptyBeforeFirst() throws Exception { hsql3RowRS.beforeFirst(); volt3RowRS.beforeFirst(); assertEquals(hsqlEmptyRS.getRow(), voltEmptyRS.getRow()); assertEquals(hsql3RowRS.next(), volt3RowRS.next()); assertEquals(hsqlEmptyRS.getRow(), voltEmptyRS.getRow()); } @Test public void testEmptyAfterLast() throws Exception { hsql3RowRS.afterLast(); volt3RowRS.afterLast(); assertEquals(hsqlEmptyRS.getRow(), voltEmptyRS.getRow()); assertEquals(hsql3RowRS.previous(), volt3RowRS.previous()); assertEquals(hsqlEmptyRS.getRow(), voltEmptyRS.getRow()); } @Test public void testEmptyAbsolute() throws Exception { assertTrue(hsqlEmptyRS.absolute(-1) == voltEmptyRS.absolute(-1)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); assertTrue(hsqlEmptyRS.absolute(0) == voltEmptyRS.absolute(0)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); assertTrue(hsqlEmptyRS.absolute(1) == voltEmptyRS.absolute(1)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); } @Test public void testEmptyRelative() throws Exception { assertTrue(hsqlEmptyRS.relative(-1) == voltEmptyRS.relative(-1)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); assertTrue(hsqlEmptyRS.relative(0) == voltEmptyRS.relative(0)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); assertTrue(hsqlEmptyRS.relative(1) == voltEmptyRS.relative(1)); assertTrue(hsqlEmptyRS.getRow() == voltEmptyRS.getRow()); } }