// jTDS JDBC Driver for Microsoft SQL Server and Sybase
// Copyright (C) 2004 The jTDS Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
package net.sourceforge.jtds.jdbc;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ParameterMetaData;
import java.sql.Types;
import java.math.BigDecimal;
/**
* Test for miscellaneous JDBC 3.0 features.
*
* @author Alin Sinpalean
* @version $Id: JDBC3Test.java,v 1.3.2.1 2009-08-04 10:33:54 ickzon Exp $
*/
public class JDBC3Test extends TestBase {
public JDBC3Test(String name) {
super(name);
}
/**
* Test return of multiple open result sets from one execute.
*/
public void testMultipleResults() throws Exception {
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//
// Create 4 test tables
//
for (int rs = 1; rs <= 4; rs++) {
stmt.execute("CREATE TABLE #TESTRS" + rs + " (id int, data varchar(255))");
for (int row = 1; row <= 10; row++) {
assertEquals(1, stmt.executeUpdate("INSERT INTO #TESTRS" + rs +
" VALUES(" + row + ", 'TABLE " + rs + " ROW " + row + "')"));
}
}
assertTrue(stmt.execute(
"SELECT * FROM #TESTRS1\r\n" +
"SELECT * FROM #TESTRS2\r\n" +
"SELECT * FROM #TESTRS3\r\n" +
"SELECT * FROM #TESTRS4\r\n"));
ResultSet rs = stmt.getResultSet();
assertTrue(rs.next());
assertEquals("TABLE 1 ROW 1", rs.getString(2));
// Get RS 2 keeping RS 1 open
assertTrue(stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT));
ResultSet rs2 = stmt.getResultSet();
assertTrue(rs2.next());
assertEquals("TABLE 2 ROW 1", rs2.getString(2));
// Check RS 1 still open and on row 1
assertEquals("TABLE 1 ROW 1", rs.getString(2));
// Read a cached row from RS 1
assertTrue(rs.next());
assertEquals("TABLE 1 ROW 2", rs.getString(2));
// Close RS 2 but keep RS 1 open and get RS 3
assertTrue(stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT));
ResultSet rs3 = stmt.getResultSet();
assertTrue(rs3.next());
assertEquals("TABLE 3 ROW 1", rs3.getString(2));
// Check RS 2 is closed
try {
assertEquals("TABLE 2 ROW 1", rs2.getString(2));
fail("Expected RS 2 to be closed!");
} catch (SQLException e) {
// Ignore
}
// Check RS 1 is still open
assertEquals("TABLE 1 ROW 2", rs.getString(2));
// Close all result sets and get RS 4
assertTrue(stmt.getMoreResults(Statement.CLOSE_ALL_RESULTS));
ResultSet rs4 = stmt.getResultSet();
assertTrue(rs4.next());
assertEquals("TABLE 4 ROW 1", rs4.getString(2));
// check RS 1 is now closed as well
try {
assertEquals("TABLE 1 ROW 2", rs.getString(2));
fail("Expected RS 1 to be closed!");
} catch (SQLException e) {
// Ignore
}
assertFalse(stmt.getMoreResults());
stmt.close();
}
/**
* Test closing a <code>ResultSet</code> when it's out of scope.
* <p/>
* If a finalize() method which tries to call close() is added to
* JtdsResultSet the next() calls will be executed concurrently with any
* other result processing, with no synchronization whatsoever.
*/
public void testSocketConcurrency5() throws Exception {
Statement stmt = con.createStatement();
assertTrue(stmt.execute(
"SELECT 1 SELECT 2, 3"));
ResultSet rs = stmt.getResultSet();
assertTrue(stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT));
ResultSet rs2 = stmt.getResultSet();
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertFalse(rs.next());
rs.close();
assertTrue(rs2.next());
assertEquals(2, rs2.getInt(1));
assertEquals(3, rs2.getInt(2));
assertFalse(rs2.next());
rs2.close();
stmt.close();
}
/**
* Test for bug [1222205] getParameterMetaData returns not implemented.
*/
public void testGetParamMetaData() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("SELECT ?,?,?");
pstmt.setString(1, "TEST");
pstmt.setBigDecimal(2, new BigDecimal("123.45"));
pstmt.setBoolean(3, true);
ParameterMetaData pmd = pstmt.getParameterMetaData();
assertEquals(3, pmd.getParameterCount());
assertEquals(Types.VARCHAR, pmd.getParameterType(1));
assertEquals("java.lang.String", pmd.getParameterClassName(1));
assertEquals(2, pmd.getScale(2));
assertEquals(38, pmd.getPrecision(2));
assertEquals(ParameterMetaData.parameterModeIn,
pmd.getParameterMode(3));
pstmt.close();
}
}