@@ -2211,6 +2211,96 @@ public void testConnectionWithMultipleTransactionCommits() throws SQLException {
22112211 connection .close ();
22122212 }
22132213
2214+ @ Test
2215+ public void testPreparedStatementCloseDoesNotRollbackTransaction () throws SQLException {
2216+ String TRANSACTION_TABLE = "JDBC_PS_CLOSE_TABLE" + randomNumber ;
2217+ String createTransactionTable =
2218+ String .format (
2219+ "CREATE OR REPLACE TABLE %s.%s (`id` INTEGER, `name` STRING, `age` INTEGER);" ,
2220+ DATASET , TRANSACTION_TABLE );
2221+ String insertQuery =
2222+ String .format (
2223+ "INSERT INTO %s.%s (id, name, age) VALUES (?, ?, ?);" , DATASET , TRANSACTION_TABLE );
2224+ String selectQuery =
2225+ String .format ("SELECT id, name, age FROM %s.%s ORDER BY id;" , DATASET , TRANSACTION_TABLE );
2226+
2227+ bigQueryStatement .execute (createTransactionTable );
2228+
2229+ try (Connection connection = DriverManager .getConnection (session_enabled_connection_uri )) {
2230+ connection .setAutoCommit (false );
2231+ try (PreparedStatement ps1 = connection .prepareStatement (insertQuery );
2232+ PreparedStatement ps2 = connection .prepareStatement (insertQuery )) {
2233+ ps1 .setInt (1 , 1 );
2234+ ps1 .setString (2 , "DwightShrute" );
2235+ ps1 .setInt (3 , 10 );
2236+ assertEquals (1 , ps1 .executeUpdate ());
2237+
2238+ ps2 .setInt (1 , 2 );
2239+ ps2 .setString (2 , "MichaelScott" );
2240+ ps2 .setInt (3 , 20 );
2241+ assertEquals (1 , ps2 .executeUpdate ());
2242+
2243+ ps1 .close ();
2244+ connection .commit ();
2245+
2246+ try (ResultSet resultSet = bigQueryStatement .executeQuery (selectQuery )) {
2247+ int rowCount = 0 ;
2248+ while (resultSet .next ()) {
2249+ rowCount ++;
2250+ assertEquals (rowCount , resultSet .getInt (1 ));
2251+ }
2252+ assertEquals (2 , rowCount );
2253+ }
2254+ } finally {
2255+ bigQueryStatement .execute (
2256+ String .format ("DROP TABLE IF EXISTS %s.%s" , DATASET , TRANSACTION_TABLE ));
2257+ }
2258+ }
2259+ }
2260+
2261+ @ Test
2262+ public void testClosingUnusedPreparedStatementDoesNotRollbackPreviousExecute ()
2263+ throws SQLException {
2264+ String TRANSACTION_TABLE = "JDBC_PS_UNUSED_CLOSE_TABLE" + randomNumber ;
2265+ String createTransactionTable =
2266+ String .format (
2267+ "CREATE OR REPLACE TABLE %s.%s (`id` INTEGER, `name` STRING, `age` INTEGER);" ,
2268+ DATASET , TRANSACTION_TABLE );
2269+ String insertQuery =
2270+ String .format (
2271+ "INSERT INTO %s.%s (id, name, age) VALUES (?, ?, ?);" , DATASET , TRANSACTION_TABLE );
2272+ String selectQuery =
2273+ String .format ("SELECT id, name, age FROM %s.%s ORDER BY id;" , DATASET , TRANSACTION_TABLE );
2274+
2275+ bigQueryStatement .execute (createTransactionTable );
2276+
2277+ try (Connection connection = DriverManager .getConnection (session_enabled_connection_uri )) {
2278+ connection .setAutoCommit (false );
2279+ try (PreparedStatement ps1 = connection .prepareStatement (insertQuery );
2280+ PreparedStatement ps2 = connection .prepareStatement (insertQuery )) {
2281+
2282+ ps2 .setInt (1 , 1 );
2283+ ps2 .setString (2 , "MichaelScott" );
2284+ ps2 .setInt (3 , 20 );
2285+ assertEquals (1 , ps2 .executeUpdate ());
2286+
2287+ ps1 .close ();
2288+ connection .commit ();
2289+
2290+ try (ResultSet resultSet = bigQueryStatement .executeQuery (selectQuery )) {
2291+ assertTrue (resultSet .next ());
2292+ assertEquals (1 , resultSet .getInt (1 ));
2293+ assertEquals ("MichaelScott" , resultSet .getString (2 ));
2294+ assertEquals (20 , resultSet .getInt (3 ));
2295+ assertFalse (resultSet .next ());
2296+ }
2297+ }
2298+ } finally {
2299+ bigQueryStatement .execute (
2300+ String .format ("DROP TABLE IF EXISTS %s.%s" , DATASET , TRANSACTION_TABLE ));
2301+ }
2302+ }
2303+
22142304 // Private Helper functions
22152305 private String getSessionId () throws InterruptedException {
22162306 QueryJobConfiguration stubJobConfig =
0 commit comments