diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java index e7e5d85d22675d33d61b0313b4a662ef11bc8734..dc9bafd2bbe8dfd361f03494b31533bae1686bbc 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java @@ -8,7 +8,7 @@ import java.util.Vector; import org.postgresql.largeobject.*; import org.postgresql.util.*; -/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Statement.java,v 1.9 2002/09/11 05:38:44 barry Exp $ +/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Statement.java,v 1.10 2002/09/14 03:52:56 barry Exp $ * This class defines methods of the jdbc1 specification. This class is * extended by org.postgresql.jdbc2.AbstractJdbc2Statement which adds the jdbc2 * methods. The real Statement class (for jdbc1) is org.postgresql.jdbc1.Jdbc1Statement @@ -129,6 +129,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme { String l_sql = replaceProcessing(p_sql); m_sqlFragments = new String[] {l_sql}; + m_binds = new Object[0]; //If we have already created a server prepared statement, we need //to deallocate the existing one if (m_statementName != null) { diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java index 3dbc1f8d321f38bf2f09c76a1b46cc6d54e70a7e..2a117cecf0356ea6b380eb2b3a6ca5526d1f6187 100644 --- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java @@ -48,6 +48,9 @@ public class Jdbc2TestSuite extends TestSuite // PreparedStatement + // ServerSide Prepared Statements + suite.addTestSuite(ServerPreparedStmtTest.class); + // BatchExecute suite.addTestSuite(BatchExecuteTest.class); @@ -60,9 +63,9 @@ public class Jdbc2TestSuite extends TestSuite // Fastpath/LargeObject suite.addTestSuite(BlobTest.class); - suite.addTestSuite( UpdateableResultTest.class ); + suite.addTestSuite(UpdateableResultTest.class ); - suite.addTestSuite( CallableStmtTest.class ); + suite.addTestSuite(CallableStmtTest.class ); // That's all folks return suite; diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7617603857e441d757d7e088eaa057c00af7530b --- /dev/null +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java @@ -0,0 +1,153 @@ +package org.postgresql.test.jdbc2; + +import org.postgresql.test.TestUtil; +import org.postgresql.PGStatement; +import junit.framework.TestCase; +import java.io.*; +import java.sql.*; + +/* + * Tests for using server side prepared statements + */ +public class ServerPreparedStmtTest extends TestCase +{ + private Connection con; + + public ServerPreparedStmtTest(String name) + { + super(name); + } + + protected void setUp() throws Exception + { + con = TestUtil.openDB(); + Statement stmt = con.createStatement(); + + TestUtil.createTable(con, "testsps", "id integer"); + + stmt.executeUpdate("INSERT INTO testsps VALUES (1)"); + stmt.executeUpdate("INSERT INTO testsps VALUES (2)"); + stmt.executeUpdate("INSERT INTO testsps VALUES (3)"); + stmt.executeUpdate("INSERT INTO testsps VALUES (4)"); + stmt.executeUpdate("INSERT INTO testsps VALUES (6)"); + stmt.executeUpdate("INSERT INTO testsps VALUES (9)"); + + stmt.close(); + } + + protected void tearDown() throws Exception + { + TestUtil.dropTable(con, "testsps"); + TestUtil.closeDB(con); + } + + public void testPreparedStatementsNoBinds() throws Exception + { + PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = 2"); + ((PGStatement)pstmt).setUseServerPrepare(true); + if (((org.postgresql.jdbc1.AbstractJdbc1Connection)con).haveMinimumServerVersion("7.3")) { + assertTrue(((PGStatement)pstmt).isUseServerPrepare()); + } else { + assertTrue(!((PGStatement)pstmt).isUseServerPrepare()); + } + + //Test that basic functionality works + ResultSet rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + //Verify that subsequent calls still work + rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + //Verify that using the statement to execute a different query works + rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9"); + assertTrue(rs.next()); + assertEquals(9, rs.getInt(1)); + rs.close(); + + ((PGStatement)pstmt).setUseServerPrepare(false); + assertTrue(!((PGStatement)pstmt).isUseServerPrepare()); + + //Verify that using the statement still works after turning off prepares + rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9"); + assertTrue(rs.next()); + assertEquals(9, rs.getInt(1)); + rs.close(); + + pstmt.close(); + } + + public void testPreparedStatementsWithOneBind() throws Exception + { + PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = ?"); + ((PGStatement)pstmt).setUseServerPrepare(true); + if (((org.postgresql.jdbc1.AbstractJdbc1Connection)con).haveMinimumServerVersion("7.3")) { + assertTrue(((PGStatement)pstmt).isUseServerPrepare()); + } else { + assertTrue(!((PGStatement)pstmt).isUseServerPrepare()); + } + + //Test that basic functionality works + pstmt.setInt(1,2); + ResultSet rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + //Verify that subsequent calls still work + rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + //Verify that using the statement to execute a different query works + rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9"); + assertTrue(rs.next()); + assertEquals(9, rs.getInt(1)); + rs.close(); + + ((PGStatement)pstmt).setUseServerPrepare(false); + assertTrue(!((PGStatement)pstmt).isUseServerPrepare()); + + //Verify that using the statement still works after turning off prepares + rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9"); + assertTrue(rs.next()); + assertEquals(9, rs.getInt(1)); + rs.close(); + + pstmt.close(); + } + + public void testPreparedStatementsWithBinds() throws Exception + { + PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = ? or id = ?"); + ((PGStatement)pstmt).setUseServerPrepare(true); + if (((org.postgresql.jdbc1.AbstractJdbc1Connection)con).haveMinimumServerVersion("7.3")) { + assertTrue(((PGStatement)pstmt).isUseServerPrepare()); + } else { + assertTrue(!((PGStatement)pstmt).isUseServerPrepare()); + } + + //Test that basic functionality works + //bind different datatypes + pstmt.setInt(1,2); + pstmt.setString(2,"2"); + ResultSet rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + //Verify that subsequent calls still work + rs = pstmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + rs.close(); + + pstmt.close(); + } + +}