|
58 | 58 | import java.nio.charset.Charset; |
59 | 59 | import java.security.Security; |
60 | 60 | import java.security.cert.CertificateException; |
| 61 | +import java.sql.CallableStatement; |
61 | 62 | import java.sql.Connection; |
| 63 | +import java.sql.DatabaseMetaData; |
62 | 64 | import java.sql.DriverManager; |
63 | 65 | import java.sql.DriverPropertyInfo; |
64 | 66 | import java.sql.PreparedStatement; |
@@ -12354,4 +12356,143 @@ void testBug19948601() throws Exception { |
12354 | 12356 | }); |
12355 | 12357 | } |
12356 | 12358 |
|
| 12359 | + /** |
| 12360 | + * Tests fix for Bug#44791 (Bug#11753361), Setting/getting holdability on connection does not work properly. |
| 12361 | + * |
| 12362 | + * @throws Exception |
| 12363 | + */ |
| 12364 | + @Test |
| 12365 | + void testBug44791() throws Exception { |
| 12366 | + createProcedure("testBug44791", "() BEGIN SELECT 1; END"); |
| 12367 | + final int fakeResultSetHoldability = 99; |
| 12368 | + Properties props = new Properties(); |
| 12369 | + |
| 12370 | + /* |
| 12371 | + * Pedantic off. |
| 12372 | + */ |
| 12373 | + props.setProperty(PropertyKey.pedantic.getKeyName(), "false"); |
| 12374 | + |
| 12375 | + try (Connection testConn = getConnectionWithProps(props)) { |
| 12376 | + DatabaseMetaData testDbmd = testConn.getMetaData(); |
| 12377 | + assertTrue(testDbmd.supportsResultSetHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT)); |
| 12378 | + assertFalse(testDbmd.supportsResultSetHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT)); |
| 12379 | + assertFalse(testDbmd.supportsResultSetHoldability(fakeResultSetHoldability)); |
| 12380 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testDbmd.getResultSetHoldability()); |
| 12381 | + |
| 12382 | + testConn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT); |
| 12383 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12384 | + |
| 12385 | + testConn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT); |
| 12386 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12387 | + |
| 12388 | + testConn.setHoldability(fakeResultSetHoldability); |
| 12389 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12390 | + } |
| 12391 | + |
| 12392 | + boolean useSPS = false; |
| 12393 | + do { |
| 12394 | + try (Connection testConn = getConnectionWithProps(props)) { |
| 12395 | + for (int h : new int[] { ResultSet.HOLD_CURSORS_OVER_COMMIT, ResultSet.CLOSE_CURSORS_AT_COMMIT, fakeResultSetHoldability }) { |
| 12396 | + Statement testStmt = testConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, h); |
| 12397 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testStmt.getResultSetHoldability()); |
| 12398 | + ResultSet testRs = testStmt.executeQuery("SELECT 1"); |
| 12399 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12400 | + |
| 12401 | + PreparedStatement testPstmt = testConn.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, h); |
| 12402 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testPstmt.getResultSetHoldability()); |
| 12403 | + testRs = testPstmt.executeQuery(); |
| 12404 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12405 | + |
| 12406 | + CallableStatement testCstmt = testConn.prepareCall("{ CALL testBug44791() }", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, h); |
| 12407 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testCstmt.getResultSetHoldability()); |
| 12408 | + testRs = testCstmt.executeQuery(); |
| 12409 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12410 | + } |
| 12411 | + } |
| 12412 | + } while (useSPS = !useSPS); |
| 12413 | + |
| 12414 | + /* |
| 12415 | + * Pedantic on. |
| 12416 | + */ |
| 12417 | + props.setProperty(PropertyKey.pedantic.getKeyName(), "true"); |
| 12418 | + |
| 12419 | + try (Connection testConn = getConnectionWithProps(props)) { |
| 12420 | + DatabaseMetaData testDbmd = testConn.getMetaData(); |
| 12421 | + assertTrue(testDbmd.supportsResultSetHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT)); |
| 12422 | + assertFalse(testDbmd.supportsResultSetHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT)); |
| 12423 | + assertFalse(testDbmd.supportsResultSetHoldability(fakeResultSetHoldability)); |
| 12424 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testDbmd.getResultSetHoldability()); |
| 12425 | + |
| 12426 | + testConn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT); |
| 12427 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12428 | + |
| 12429 | + assertThrows(SQLFeatureNotSupportedException.class, "Holdability 'ResultSet.CLOSE_CURSORS_AT_COMMIT' is not supported", () -> { |
| 12430 | + testConn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT); |
| 12431 | + return null; |
| 12432 | + }); |
| 12433 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12434 | + |
| 12435 | + assertThrows(SQLException.class, "Unknown holdability constant '99'", () -> { |
| 12436 | + testConn.setHoldability(fakeResultSetHoldability); |
| 12437 | + return null; |
| 12438 | + }); |
| 12439 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testConn.getHoldability()); |
| 12440 | + } |
| 12441 | + |
| 12442 | + useSPS = false; |
| 12443 | + do { |
| 12444 | + try (Connection testConn = getConnectionWithProps(props)) { |
| 12445 | + // ResultSet.HOLD_CURSORS_OVER_COMMIT: works correctly. |
| 12446 | + Statement testStmt = testConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT); |
| 12447 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testStmt.getResultSetHoldability()); |
| 12448 | + ResultSet testRs = testStmt.executeQuery("SELECT 1"); |
| 12449 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12450 | + |
| 12451 | + PreparedStatement testPstmt = testConn.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, |
| 12452 | + ResultSet.HOLD_CURSORS_OVER_COMMIT); |
| 12453 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testPstmt.getResultSetHoldability()); |
| 12454 | + testRs = testPstmt.executeQuery(); |
| 12455 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12456 | + |
| 12457 | + CallableStatement testCstmt = testConn.prepareCall("{ CALL testBug44791() }", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, |
| 12458 | + ResultSet.HOLD_CURSORS_OVER_COMMIT); |
| 12459 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testCstmt.getResultSetHoldability()); |
| 12460 | + testRs = testCstmt.executeQuery(); |
| 12461 | + assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, testRs.getHoldability()); |
| 12462 | + |
| 12463 | + // ResultSet.CLOSE_CURSORS_AT_COMMIT: not supported - throws SQLFeatureNotSupportedException. |
| 12464 | + assertThrows(SQLFeatureNotSupportedException.class, "Holdability 'ResultSet.CLOSE_CURSORS_AT_COMMIT' is not supported", () -> { |
| 12465 | + testConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); |
| 12466 | + return null; |
| 12467 | + }); |
| 12468 | + |
| 12469 | + assertThrows(SQLFeatureNotSupportedException.class, "Holdability 'ResultSet.CLOSE_CURSORS_AT_COMMIT' is not supported", () -> { |
| 12470 | + testConn.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); |
| 12471 | + return null; |
| 12472 | + }); |
| 12473 | + |
| 12474 | + assertThrows(SQLFeatureNotSupportedException.class, "Holdability 'ResultSet.CLOSE_CURSORS_AT_COMMIT' is not supported", () -> { |
| 12475 | + testConn.prepareCall("{ CALL testBug44791() }", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); |
| 12476 | + return null; |
| 12477 | + }); |
| 12478 | + |
| 12479 | + // fakeResultSetHoldability: unknown holdability - throws SQLException. |
| 12480 | + assertThrows(SQLException.class, "Unknown holdability constant '99'", () -> { |
| 12481 | + testConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, fakeResultSetHoldability); |
| 12482 | + return null; |
| 12483 | + }); |
| 12484 | + |
| 12485 | + assertThrows(SQLException.class, "Unknown holdability constant '99'", () -> { |
| 12486 | + testConn.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, fakeResultSetHoldability); |
| 12487 | + return null; |
| 12488 | + }); |
| 12489 | + |
| 12490 | + assertThrows(SQLException.class, "Unknown holdability constant '99'", () -> { |
| 12491 | + testConn.prepareCall("{ CALL testBug44791() }", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, fakeResultSetHoldability); |
| 12492 | + return null; |
| 12493 | + }); |
| 12494 | + } |
| 12495 | + } while (useSPS = !useSPS); |
| 12496 | + } |
| 12497 | + |
12357 | 12498 | } |
0 commit comments