|
26 | 26 | import com.google.common.collect.ImmutableList; |
27 | 27 | import com.google.protobuf.ListValue; |
28 | 28 | import com.google.protobuf.Value; |
| 29 | +import com.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest; |
29 | 30 | import com.google.spanner.v1.CommitRequest; |
30 | 31 | import com.google.spanner.v1.ExecuteSqlRequest; |
31 | 32 | import com.google.spanner.v1.ExecuteSqlRequest.QueryMode; |
|
46 | 47 | import java.util.Collections; |
47 | 48 | import java.util.List; |
48 | 49 | import java.util.TimeZone; |
| 50 | +import java.util.stream.Collectors; |
49 | 51 | import org.junit.BeforeClass; |
50 | 52 | import org.junit.Test; |
51 | 53 | import org.junit.runner.RunWith; |
@@ -634,4 +636,118 @@ public void testSetInvalidTimezone() throws SQLException { |
634 | 636 | "ERROR: invalid value for parameter \"TimeZone\": \"foo\"", exception.getMessage()); |
635 | 637 | } |
636 | 638 | } |
| 639 | + |
| 640 | + @Test |
| 641 | + public void testImplicitDdlBatch() throws SQLException { |
| 642 | + String sql = |
| 643 | + "create table test1 (id bigint primary key); " |
| 644 | + + "create table test2 (id bigint primary key); "; |
| 645 | + addDdlResponseToSpannerAdmin(); |
| 646 | + |
| 647 | + try (Connection connection = DriverManager.getConnection(createUrl())) { |
| 648 | + connection.createStatement().execute(sql); |
| 649 | + } |
| 650 | + |
| 651 | + List<UpdateDatabaseDdlRequest> requests = |
| 652 | + mockDatabaseAdmin.getRequests().stream() |
| 653 | + .filter(message -> message instanceof UpdateDatabaseDdlRequest) |
| 654 | + .map(message -> (UpdateDatabaseDdlRequest) message) |
| 655 | + .collect(Collectors.toList()); |
| 656 | + assertEquals(1, requests.size()); |
| 657 | + assertEquals(2, requests.get(0).getStatementsCount()); |
| 658 | + assertEquals("create table test1 (id bigint primary key)", requests.get(0).getStatements(0)); |
| 659 | + assertEquals("create table test2 (id bigint primary key)", requests.get(0).getStatements(1)); |
| 660 | + } |
| 661 | + |
| 662 | + @Test |
| 663 | + public void testDdlBatchWithStartAndRun() throws SQLException { |
| 664 | + String sql = |
| 665 | + "start batch ddl; " |
| 666 | + + "create table test1 (id bigint primary key); " |
| 667 | + + "create table test2 (id bigint primary key); " |
| 668 | + + "run batch"; |
| 669 | + addDdlResponseToSpannerAdmin(); |
| 670 | + |
| 671 | + try (Connection connection = DriverManager.getConnection(createUrl())) { |
| 672 | + connection.createStatement().execute(sql); |
| 673 | + } |
| 674 | + |
| 675 | + List<UpdateDatabaseDdlRequest> requests = |
| 676 | + mockDatabaseAdmin.getRequests().stream() |
| 677 | + .filter(message -> message instanceof UpdateDatabaseDdlRequest) |
| 678 | + .map(message -> (UpdateDatabaseDdlRequest) message) |
| 679 | + .collect(Collectors.toList()); |
| 680 | + assertEquals(1, requests.size()); |
| 681 | + assertEquals(2, requests.get(0).getStatementsCount()); |
| 682 | + assertEquals("create table test1 (id bigint primary key)", requests.get(0).getStatements(0)); |
| 683 | + assertEquals("create table test2 (id bigint primary key)", requests.get(0).getStatements(1)); |
| 684 | + } |
| 685 | + |
| 686 | + @Test |
| 687 | + public void testMixedImplicitDdlBatch() throws SQLException { |
| 688 | + String sql = |
| 689 | + "create table test1 (id bigint primary key); " |
| 690 | + + "show statement_timeout; " |
| 691 | + + "create table test2 (id bigint primary key); "; |
| 692 | + addDdlResponseToSpannerAdmin(); |
| 693 | + |
| 694 | + try (Connection connection = DriverManager.getConnection(createUrl())) { |
| 695 | + SQLException exception = |
| 696 | + assertThrows(SQLException.class, () -> connection.createStatement().execute(sql)); |
| 697 | + assertEquals( |
| 698 | + "ERROR: DDL statements are not allowed in mixed batches or transactions.", |
| 699 | + exception.getMessage()); |
| 700 | + } |
| 701 | + |
| 702 | + List<UpdateDatabaseDdlRequest> requests = |
| 703 | + mockDatabaseAdmin.getRequests().stream() |
| 704 | + .filter(message -> message instanceof UpdateDatabaseDdlRequest) |
| 705 | + .map(message -> (UpdateDatabaseDdlRequest) message) |
| 706 | + .collect(Collectors.toList()); |
| 707 | + assertEquals(0, requests.size()); |
| 708 | + } |
| 709 | + |
| 710 | + @Test |
| 711 | + public void testMixedDdlBatchWithStartAndRun() throws SQLException { |
| 712 | + String sql = |
| 713 | + "start batch ddl; " |
| 714 | + + "create table test1 (id bigint primary key); " |
| 715 | + + "set statement_timeout = '10s'; " |
| 716 | + + "create table test2 (id bigint primary key); " |
| 717 | + + "run batch"; |
| 718 | + addDdlResponseToSpannerAdmin(); |
| 719 | + |
| 720 | + try (Connection connection = DriverManager.getConnection(createUrl())) { |
| 721 | + SQLException exception = |
| 722 | + assertThrows(SQLException.class, () -> connection.createStatement().execute(sql)); |
| 723 | + assertEquals( |
| 724 | + "ERROR: DDL statements are not allowed in mixed batches or transactions.", |
| 725 | + exception.getMessage()); |
| 726 | + } |
| 727 | + |
| 728 | + List<UpdateDatabaseDdlRequest> requests = |
| 729 | + mockDatabaseAdmin.getRequests().stream() |
| 730 | + .filter(message -> message instanceof UpdateDatabaseDdlRequest) |
| 731 | + .map(message -> (UpdateDatabaseDdlRequest) message) |
| 732 | + .collect(Collectors.toList()); |
| 733 | + assertEquals(0, requests.size()); |
| 734 | + } |
| 735 | + |
| 736 | + @Test |
| 737 | + public void testImplicitBatchOfClientSideStatements() throws SQLException { |
| 738 | + String sql = "set statement_timeout = '10s'; " + "show statement_timeout; "; |
| 739 | + addDdlResponseToSpannerAdmin(); |
| 740 | + |
| 741 | + try (Connection connection = DriverManager.getConnection(createUrl())) { |
| 742 | + try (Statement statement = connection.createStatement()) { |
| 743 | + assertFalse(statement.execute(sql)); |
| 744 | + assertTrue(statement.getMoreResults()); |
| 745 | + try (ResultSet resultSet = statement.getResultSet()) { |
| 746 | + assertTrue(resultSet.next()); |
| 747 | + assertEquals("10s", resultSet.getString(1)); |
| 748 | + assertFalse(resultSet.next()); |
| 749 | + } |
| 750 | + } |
| 751 | + } |
| 752 | + } |
637 | 753 | } |
0 commit comments