1 19 20 package org.apache.derbyTesting.functionTests.tests.jdbcapi; 21 22 import java.sql.CallableStatement ; 23 import java.sql.Connection ; 24 import java.sql.DriverManager ; 25 import java.sql.PreparedStatement ; 26 import java.sql.ResultSet ; 27 import java.sql.SQLException ; 28 import java.sql.Statement ; 29 import junit.extensions.TestSetup; 30 import junit.framework.Test; 31 import junit.framework.TestSuite; 32 import org.apache.derbyTesting.junit.BaseJDBCTestCase; 33 import org.apache.derbyTesting.junit.BaseJDBCTestSetup; 34 import org.apache.derbyTesting.junit.CleanDatabaseTestSetup; 35 import org.apache.derbyTesting.junit.JDBC; 36 37 40 public class ProcedureTest extends BaseJDBCTestCase { 41 42 47 public ProcedureTest(String name) { 48 super(name); 49 } 50 51 53 58 public void testExecuteQueryWithNoDynamicResultSets() throws SQLException { 59 Statement stmt = createStatement(); 60 try { 61 stmt.executeQuery("CALL RETRIEVE_DYNAMIC_RESULTS(0)"); 62 fail("executeQuery() didn't fail."); 63 } catch (SQLException sqle) { 64 assertNoResultSetFromExecuteQuery(sqle); 65 } 66 stmt.close(); 67 } 68 69 74 public void testExecuteQueryWithOneDynamicResultSet() throws SQLException { 75 Statement stmt = createStatement(); 76 ResultSet rs = stmt.executeQuery("CALL RETRIEVE_DYNAMIC_RESULTS(1)"); 77 assertNotNull("executeQuery() returned null.", rs); 78 assertTrue("Result set has no data.", rs.next()); 79 rs.close(); 80 stmt.close(); 81 } 82 83 88 public void testExecuteQueryWithMoreThanOneDynamicResultSet() 89 throws SQLException 90 { 91 Statement stmt = createStatement(); 92 try { 93 stmt.executeQuery("CALL RETRIEVE_DYNAMIC_RESULTS(2)"); 94 fail("executeQuery() didn't fail."); 95 } catch (SQLException sqle) { 96 assertMultipleResultsFromExecuteQuery(sqle); 97 } 98 stmt.close(); 99 } 100 101 109 public void xtestExecuteUpdateWithNoDynamicResultSets() 110 throws SQLException 111 { 112 Statement stmt = getConnection().createStatement(); 113 int count = stmt.executeUpdate("CALL RETRIEVE_DYNAMIC_RESULTS(0)"); 114 assertEquals("Wrong update count.", 0, count); 115 stmt.close(); 116 } 117 118 123 public void testExecuteUpdateWithOneDynamicResultSet() throws SQLException { 124 Statement stmt = createStatement(); 125 try { 126 stmt.executeUpdate("CALL RETRIEVE_DYNAMIC_RESULTS(1)"); 127 fail("executeUpdate() didn't fail."); 128 } catch (SQLException sqle) { 129 assertResultsFromExecuteUpdate(sqle); 130 } 131 stmt.close(); 132 } 133 134 139 public void testExecuteQueryWithNoDynamicResultSets_prepared() 140 throws SQLException 141 { 142 PreparedStatement ps = 143 getConnection().prepareStatement("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 144 ps.setInt(1, 0); 145 try { 146 ps.executeQuery(); 147 fail("executeQuery() didn't fail."); 148 } catch (SQLException sqle) { 149 assertNoResultSetFromExecuteQuery(sqle); 150 } 151 ps.close(); 152 } 153 154 160 public void testExecuteQueryWithOneDynamicResultSet_prepared() 161 throws SQLException 162 { 163 PreparedStatement ps = 164 getConnection().prepareStatement("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 165 ps.setInt(1, 1); 166 ResultSet rs = ps.executeQuery(); 167 assertNotNull("executeQuery() returned null.", rs); 168 assertTrue("Result set has no data.", rs.next()); 169 rs.close(); 170 ps.close(); 171 } 172 173 178 public void testExecuteQueryWithMoreThanOneDynamicResultSet_prepared() 179 throws SQLException 180 { 181 PreparedStatement ps = 182 getConnection().prepareStatement("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 183 ps.setInt(1, 2); 184 try { 185 ps.executeQuery(); 186 fail("executeQuery() didn't fail."); 187 } catch (SQLException sqle) { 188 assertMultipleResultsFromExecuteQuery(sqle); 189 } 190 ps.close(); 191 } 192 193 201 public void xtestExecuteUpdateWithNoDynamicResultSets_prepared() 202 throws SQLException 203 { 204 PreparedStatement ps = 205 getConnection().prepareStatement("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 206 ps.setInt(1, 0); 207 int count = ps.executeUpdate(); 208 assertEquals("Wrong update count.", 0, count); 209 ps.close(); 210 } 211 212 223 public void xtestExecuteUpdateWithOneDynamicResultSet_prepared() 224 throws SQLException 225 { 226 PreparedStatement ps = 227 getConnection().prepareStatement("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 228 ps.setInt(1, 1); 229 try { 230 ps.executeUpdate(); 231 fail("executeUpdate() didn't fail."); 232 } catch (SQLException sqle) { 233 assertResultsFromExecuteUpdate(sqle); 234 } 235 ps.close(); 236 } 237 238 243 public void testExecuteQueryWithNoDynamicResultSets_callable() 244 throws SQLException 245 { 246 CallableStatement cs = 247 getConnection().prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 248 cs.setInt(1, 0); 249 try { 250 cs.executeQuery(); 251 fail("executeQuery() didn't fail."); 252 } catch (SQLException sqle) { 253 assertNoResultSetFromExecuteQuery(sqle); 254 } 255 } 256 257 263 public void testExecuteQueryWithOneDynamicResultSet_callable() 264 throws SQLException 265 { 266 CallableStatement cs = 267 getConnection().prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 268 cs.setInt(1, 1); 269 ResultSet rs = cs.executeQuery(); 270 assertNotNull("executeQuery() returned null.", rs); 271 assertTrue("Result set has no data.", rs.next()); 272 rs.close(); 273 cs.close(); 274 } 275 276 281 public void testExecuteQueryWithMoreThanOneDynamicResultSet_callable() 282 throws SQLException 283 { 284 CallableStatement cs = 285 getConnection().prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 286 cs.setInt(1, 2); 287 try { 288 cs.executeQuery(); 289 fail("executeQuery() didn't fail."); 290 } catch (SQLException sqle) { 291 assertMultipleResultsFromExecuteQuery(sqle); 292 } 293 } 294 295 303 public void xtestExecuteUpdateWithNoDynamicResultSets_callable() 304 throws SQLException 305 { 306 CallableStatement cs = 307 getConnection().prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 308 cs.setInt(1, 0); 309 int count = cs.executeUpdate(); 310 assertEquals("Wrong update count.", 0, count); 311 cs.close(); 312 } 313 314 319 public void testExecuteUpdateWithOneDynamicResultSet_callable() 320 throws SQLException 321 { 322 CallableStatement cs = 323 getConnection().prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)"); 324 cs.setInt(1, 1); 325 try { 326 cs.executeUpdate(); 327 fail("executeUpdate() didn't fail."); 328 } catch (SQLException sqle) { 329 assertResultsFromExecuteUpdate(sqle); 330 } 331 cs.close(); 332 } 333 334 340 public void testRollbackStoredProcWithExecuteQuery() throws SQLException { 341 342 Statement stmt = createStatement(); 343 ResultSet rs = stmt.executeQuery("CALL PROC_WITH_SIDE_EFFECTS(1)"); 344 rs.close(); 345 stmt.getConnection().rollback(); 346 ResultSet tableRs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 347 assertFalse("Side effects from stored procedure not rolled back.", 349 tableRs.next()); 350 tableRs.close(); 351 stmt.close(); 352 } 353 354 360 public void testRollbackStoredProcWithExecuteUpdate() throws SQLException { 361 Statement stmt = createStatement(); 362 stmt.executeUpdate("CALL PROC_WITH_SIDE_EFFECTS(0)"); 363 stmt.getConnection().rollback(); 364 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 365 assertFalse("Side effects from stored procedure not rolled back.", 367 rs.next()); 368 rs.close(); 369 stmt.close(); 370 } 371 372 381 public void xtestRollbackStoredProcWhenExecuteQueryReturnsNothing() 382 throws SQLException 383 { 384 Connection conn = getConnection(); 385 conn.setAutoCommit(true); 386 Statement stmt = conn.createStatement(); 387 try { 388 ResultSet rs = stmt.executeQuery("CALL PROC_WITH_SIDE_EFFECTS(0)"); 389 fail("executeQuery() didn't fail."); 390 } catch (SQLException sqle) { 391 assertNoResultSetFromExecuteQuery(sqle); 392 } 393 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 394 assertFalse("Side effects from stored procedure not rolled back.", 395 rs.next()); 396 rs.close(); 397 stmt.close(); 398 } 399 400 410 public void xtestRollbackStoredProcWhenExecuteQueryReturnsTooMuch() 411 throws SQLException 412 { 413 Connection conn = getConnection(); 414 conn.setAutoCommit(true); 415 Statement stmt = conn.createStatement(); 416 try { 417 ResultSet rs = stmt.executeQuery("CALL PROC_WITH_SIDE_EFFECTS(2)"); 418 fail("executeQuery() didn't fail."); 419 } catch (SQLException sqle) { 420 assertMultipleResultsFromExecuteQuery(sqle); 421 } 422 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 423 assertFalse("Side effects from stored procedure not rolled back.", 424 rs.next()); 425 rs.close(); 426 stmt.close(); 427 } 428 429 438 public void xtestRollbackStoredProcWhenExecuteUpdateReturnsResults() 439 throws SQLException 440 { 441 Connection conn = getConnection(); 442 conn.setAutoCommit(true); 443 Statement stmt = conn.createStatement(); 444 try { 445 stmt.executeUpdate("CALL PROC_WITH_SIDE_EFFECTS(1)"); 446 fail("executeUpdate() didn't fail."); 447 } catch (SQLException sqle) { 448 assertResultsFromExecuteUpdate(sqle); 449 } 450 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 451 assertFalse("Side effects from stored procedure not rolled back.", 452 rs.next()); 453 rs.close(); 454 stmt.close(); 455 } 456 457 466 public void xtestRollbackStoredProcWhenExecuteQueryReturnsNothing_prepared() 467 throws SQLException 468 { 469 Connection conn = getConnection(); 470 conn.setAutoCommit(true); 471 PreparedStatement ps = 472 conn.prepareStatement("CALL PROC_WITH_SIDE_EFFECTS(?)"); 473 ps.setInt(1, 0); 474 try { 475 ResultSet rs = ps.executeQuery(); 476 fail("executeQuery() didn't fail."); 477 } catch (SQLException sqle) { 478 assertNoResultSetFromExecuteQuery(sqle); 479 } 480 Statement stmt = conn.createStatement(); 481 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 482 assertFalse("Side effects from stored procedure not rolled back.", 483 rs.next()); 484 rs.close(); 485 ps.close(); 486 stmt.close(); 487 } 488 489 499 public void xtestRollbackStoredProcWhenExecuteQueryReturnsTooMuch_prepared() 500 throws SQLException 501 { 502 Connection conn = getConnection(); 503 conn.setAutoCommit(true); 504 PreparedStatement ps = 505 conn.prepareStatement("CALL PROC_WITH_SIDE_EFFECTS(?)"); 506 ps.setInt(1, 2); 507 try { 508 ResultSet rs = ps.executeQuery(); 509 fail("executeQuery() didn't fail."); 510 } catch (SQLException sqle) { 511 assertMultipleResultsFromExecuteQuery(sqle); 512 } 513 Statement stmt = conn.createStatement(); 514 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 515 assertFalse("Side effects from stored procedure not rolled back.", 516 rs.next()); 517 rs.close(); 518 ps.close(); 519 stmt.close(); 520 } 521 522 531 public void 532 xtestRollbackStoredProcWhenExecuteUpdateReturnsResults_prepared() 533 throws SQLException 534 { 535 Connection conn = getConnection(); 536 conn.setAutoCommit(true); 537 PreparedStatement ps = 538 conn.prepareStatement("CALL PROC_WITH_SIDE_EFFECTS(?)"); 539 ps.setInt(1, 1); 540 try { 541 ps.executeUpdate(); 542 fail("executeUpdate() didn't fail."); 543 } catch (SQLException sqle) { 544 assertResultsFromExecuteUpdate(sqle); 545 } 546 Statement stmt = conn.createStatement(); 547 ResultSet rs = stmt.executeQuery("SELECT * FROM SIMPLE_TABLE"); 548 assertFalse("Side effects from stored procedure not rolled back.", 549 rs.next()); 550 rs.close(); 551 ps.close(); 552 stmt.close(); 553 } 554 555 560 public void testClosedDynamicResultSetsFromExecuteQuery() 561 throws SQLException 562 { 563 Statement stmt = createStatement(); 564 try { 565 ResultSet rs = stmt.executeQuery("CALL RETRIEVE_CLOSED_RESULT()"); 566 fail("executeQuery() didn't fail."); 567 } catch (SQLException sqle) { 568 assertNoResultSetFromExecuteQuery(sqle); 569 } 570 stmt.close(); 571 } 572 573 578 public void testClosedDynamicResultSetsFromExecuteUpdate() 579 throws SQLException 580 { 581 Statement stmt = createStatement(); 582 stmt.executeUpdate("CALL RETRIEVE_CLOSED_RESULT()"); 583 stmt.close(); 584 } 585 586 591 public void testDynamicResultSetsFromOtherConnectionWithExecuteQuery() 592 throws SQLException 593 { 594 PreparedStatement ps = 595 getConnection().prepareStatement("CALL RETRIEVE_EXTERNAL_RESULT(?,?,?)"); 596 597 ps.setString(1, getTestConfiguration().getDatabaseName()); 598 ps.setString(2, getTestConfiguration().getUserName()); 599 ps.setString(3, getTestConfiguration().getUserPassword()); 600 try { 601 ps.executeQuery(); 602 fail("executeQuery() didn't fail."); 603 } catch (SQLException sqle) { 604 assertNoResultSetFromExecuteQuery(sqle); 605 } 606 ps.close(); 607 } 608 609 614 public void testDynamicResultSetsFromOtherConnectionWithExecuteUpdate() 615 throws SQLException 616 { 617 PreparedStatement ps = 618 getConnection().prepareStatement("CALL RETRIEVE_EXTERNAL_RESULT(?,?,?)"); 619 620 ps.setString(1, getTestConfiguration().getDatabaseName()); 621 ps.setString(2, getTestConfiguration().getUserName()); 622 ps.setString(3, getTestConfiguration().getUserPassword()); 623 624 ps.executeUpdate(); 625 ps.close(); 626 } 627 628 630 636 private void assertNoResultSetFromExecuteQuery(SQLException sqle) { 637 if (usingDerbyNet()) { 638 assertNull("Unexpected SQL state.", sqle.getSQLState()); 639 } else { 640 assertSQLState("Unexpected SQL state.", "X0Y78", sqle); 641 } 642 } 643 644 650 private void assertMultipleResultsFromExecuteQuery(SQLException sqle) 651 { 652 if (usingDerbyNet()) { 653 assertNull("Unexpected SQL state.", sqle.getSQLState()); 654 } else { 655 assertSQLState("Unexpected SQL state.", "X0Y78", sqle); 656 } 657 } 658 659 665 private void assertResultsFromExecuteUpdate(SQLException sqle) { 666 if (usingDerbyNet()) { 667 assertNull("Unexpected SQL state.", sqle.getSQLState()); 668 } else { 669 assertSQLState("Unexpected SQL state.", "X0Y79", sqle); 670 } 671 672 } 673 674 676 681 public static Test suite() { 682 TestSuite suite = new TestSuite(); 683 684 if (JDBC.vmSupportsJDBC2()) { 686 687 suite.addTestSuite(ProcedureTest.class); 688 if (!usingDerbyNet()) { 689 suite.addTest 690 (new ProcedureTest 691 ("xtestExecuteUpdateWithNoDynamicResultSets")); 692 suite.addTest 693 (new ProcedureTest 694 ("xtestExecuteUpdateWithNoDynamicResultSets_prepared")); 695 suite.addTest 696 (new ProcedureTest 697 ("xtestExecuteUpdateWithOneDynamicResultSet_prepared")); 698 suite.addTest 699 (new ProcedureTest 700 ("xtestExecuteUpdateWithNoDynamicResultSets_callable")); 701 suite.addTest 702 (new ProcedureTest 703 ("xtestRollbackStoredProcWhenExecuteQueryReturnsNothing")); 704 suite.addTest 705 (new ProcedureTest 706 ("xtestRollbackStoredProcWhenExecuteQueryReturnsTooMuch")); 707 suite.addTest 708 (new ProcedureTest 709 ("xtestRollbackStoredProcWhenExecuteUpdateReturnsResults")); 710 suite.addTest 711 (new ProcedureTest 712 ("xtestRollbackStoredProcWhenExecuteQueryReturnsNothing" + 713 "_prepared")); 714 suite.addTest 715 (new ProcedureTest 716 ("xtestRollbackStoredProcWhenExecuteQueryReturnsTooMuch" + 717 "_prepared")); 718 suite.addTest 719 (new ProcedureTest 720 ("xtestRollbackStoredProcWhenExecuteUpdateReturnsResults" + 721 "_prepared")); 722 } 723 } 724 Test test = new BaseJDBCTestSetup(suite) { 725 730 protected void setUp() throws SQLException { 731 Connection c = getConnection(); 732 c.setAutoCommit(false); 733 Statement s = c.createStatement(); 734 for (int i = 0; i < PROCEDURES.length; i++) { 735 s.execute(PROCEDURES[i][1]); 736 } 737 for (int i = 0; i < TABLES.length; i++) { 738 s.execute(TABLES[i][1]); 739 } 740 s.close(); 741 c.commit(); 742 c.close(); 743 } 744 748 protected void tearDown() throws Exception { 749 Connection c = getConnection(); 750 c.setAutoCommit(false); 751 Statement s = c.createStatement(); 752 for (int i = 0; i < PROCEDURES.length; i++) { 753 s.execute("DROP PROCEDURE " + PROCEDURES[i][0]); 754 } 755 for (int i = 0; i < TABLES.length; i++) { 756 s.execute("DROP TABLE " + TABLES[i][0]); 757 } 758 s.close(); 759 c.commit(); 760 c.close(); 761 762 super.tearDown(); 763 } 764 }; 765 766 return new CleanDatabaseTestSetup(test); 767 } 768 769 774 public void setUp() throws SQLException { 775 Connection conn = getConnection(); 776 conn.setAutoCommit(false); 777 Statement s = conn.createStatement(); 778 for (int i = 0; i < TABLES.length; i++) { 779 s.execute("DELETE FROM " + TABLES[i][0]); 780 } 781 s.close(); 782 conn.commit(); 783 } 784 785 791 private static final String [][] PROCEDURES = { 792 { "RETRIEVE_DYNAMIC_RESULTS", 793 "CREATE PROCEDURE RETRIEVE_DYNAMIC_RESULTS(number INT) " + 794 "LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME '" + 795 ProcedureTest.class.getName() + ".retrieveDynamicResults' " + 796 "DYNAMIC RESULT SETS 4" 797 }, 798 { "RETRIEVE_CLOSED_RESULT", 799 "CREATE PROCEDURE RETRIEVE_CLOSED_RESULT() LANGUAGE JAVA " + 800 "PARAMETER STYLE JAVA EXTERNAL NAME '" + 801 ProcedureTest.class.getName() + ".retrieveClosedResult' " + 802 "DYNAMIC RESULT SETS 1" 803 }, 804 { "RETRIEVE_EXTERNAL_RESULT", 805 "CREATE PROCEDURE RETRIEVE_EXTERNAL_RESULT(" + 806 "DBNAME VARCHAR(128), DBUSER VARCHAR(128), DBPWD VARCHAR(128)) LANGUAGE JAVA " + 807 "PARAMETER STYLE JAVA EXTERNAL NAME '" + 808 ProcedureTest.class.getName() + ".retrieveExternalResult' " + 809 "DYNAMIC RESULT SETS 1" 810 }, 811 { "PROC_WITH_SIDE_EFFECTS", 812 "CREATE PROCEDURE PROC_WITH_SIDE_EFFECTS(ret INT) LANGUAGE JAVA " + 813 "PARAMETER STYLE JAVA EXTERNAL NAME '" + 814 ProcedureTest.class.getName() + ".procWithSideEffects' " + 815 "DYNAMIC RESULT SETS 2" 816 }, 817 }; 818 819 826 private static final String [][] TABLES = { 827 { "SIMPLE_TABLE", "CREATE TABLE SIMPLE_TABLE (id INT)" }, 829 }; 830 831 833 843 public static void retrieveDynamicResults(int number, 844 ResultSet [] rs1, 845 ResultSet [] rs2, 846 ResultSet [] rs3, 847 ResultSet [] rs4) 848 throws SQLException 849 { 850 Connection c = DriverManager.getConnection("jdbc:default:connection"); 851 if (number > 0) { 852 rs1[0] = c.createStatement().executeQuery("VALUES(1)"); 853 } 854 if (number > 1) { 855 rs2[0] = c.createStatement().executeQuery("VALUES(1)"); 856 } 857 if (number > 2) { 858 rs3[0] = c.createStatement().executeQuery("VALUES(1)"); 859 } 860 if (number > 3) { 861 rs4[0] = c.createStatement().executeQuery("VALUES(1)"); 862 } 863 c.close(); 864 } 865 866 872 public static void retrieveClosedResult(ResultSet [] closed) 873 throws SQLException 874 { 875 Connection c = DriverManager.getConnection("jdbc:default:connection"); 876 closed[0] = c.createStatement().executeQuery("VALUES(1)"); 877 closed[0].close(); 878 c.close(); 879 } 880 881 888 public static void retrieveExternalResult(String dbName, 889 String user, String password, ResultSet [] external) 890 throws SQLException 891 { 892 String url = "jdbc:derby:" + dbName; 894 895 Connection conn = DriverManager.getConnection(url, user, password); 896 897 external[0] = 898 conn.createStatement().executeQuery("VALUES(1)"); 899 } 900 901 912 public static void procWithSideEffects(int returnResults, 913 ResultSet [] rs1, 914 ResultSet [] rs2) 915 throws SQLException 916 { 917 Connection c = DriverManager.getConnection("jdbc:default:connection"); 918 Statement stmt = c.createStatement(); 919 stmt.executeUpdate("INSERT INTO SIMPLE_TABLE VALUES (42)"); 920 if (returnResults > 0) { 921 rs1[0] = c.createStatement().executeQuery("VALUES(1)"); 922 } 923 if (returnResults > 1) { 924 rs2[0] = c.createStatement().executeQuery("VALUES(1)"); 925 } 926 c.close(); 927 } 928 } 929 | Popular Tags |