2020
2121import com .google .cloud .spanner .MockSpannerServiceImpl .StatementResult ;
2222import com .google .cloud .spanner .SpannerOptions ;
23+ import com .google .cloud .spanner .SpannerOptions .SpannerEnvironment ;
2324import com .google .cloud .spanner .Statement ;
2425import com .google .cloud .spanner .connection .AbstractMockServerTest ;
2526import com .google .common .base .MoreObjects ;
@@ -40,33 +41,47 @@ public void setup() throws Exception {
4041 }
4142
4243 @ Test
43- public void testDefaultOptimizerVersion () throws SQLException {
44+ public void testDefaultOptions () throws SQLException {
4445 try (java .sql .Connection connection = createJdbcConnection ()) {
4546 try (java .sql .ResultSet rs =
4647 connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_VERSION" )) {
4748 assertThat (rs .next ()).isTrue ();
4849 assertThat (rs .getString ("OPTIMIZER_VERSION" )).isEqualTo ("" );
4950 assertThat (rs .next ()).isFalse ();
5051 }
52+ try (java .sql .ResultSet rs =
53+ connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE" )) {
54+ assertThat (rs .next ()).isTrue ();
55+ assertThat (rs .getString ("OPTIMIZER_STATISTICS_PACKAGE" )).isEqualTo ("" );
56+ assertThat (rs .next ()).isFalse ();
57+ }
5158 }
5259 }
5360
5461 @ Test
55- public void testOptimizerVersionInConnectionUrl () throws SQLException {
62+ public void testOptionsInConnectionUrl () throws SQLException {
5663 try (java .sql .Connection connection =
5764 DriverManager .getConnection (
58- String .format ("jdbc:%s;optimizerVersion=%s" , getBaseUrl (), "100" ))) {
65+ String .format (
66+ "jdbc:%s;optimizerVersion=%s;optimizerStatisticsPackage=%s" ,
67+ getBaseUrl (), "100" , "url_package" ))) {
5968 try (java .sql .ResultSet rs =
6069 connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_VERSION" )) {
6170 assertThat (rs .next ()).isTrue ();
6271 assertThat (rs .getString ("OPTIMIZER_VERSION" )).isEqualTo ("100" );
6372 assertThat (rs .next ()).isFalse ();
6473 }
74+ try (java .sql .ResultSet rs =
75+ connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE" )) {
76+ assertThat (rs .next ()).isTrue ();
77+ assertThat (rs .getString ("OPTIMIZER_STATISTICS_PACKAGE" )).isEqualTo ("url_package" );
78+ assertThat (rs .next ()).isFalse ();
79+ }
6580 }
6681 }
6782
6883 @ Test
69- public void testSetOptimizerVersion () throws SQLException {
84+ public void testSetOptions () throws SQLException {
7085 try (java .sql .Connection connection = createJdbcConnection ()) {
7186 connection .createStatement ().execute ("SET OPTIMIZER_VERSION='20'" );
7287 try (java .sql .ResultSet rs =
@@ -89,41 +104,64 @@ public void testSetOptimizerVersion() throws SQLException {
89104 assertThat (rs .getString ("OPTIMIZER_VERSION" )).isEqualTo ("" );
90105 assertThat (rs .next ()).isFalse ();
91106 }
107+
108+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE='20210609'" );
109+ try (java .sql .ResultSet rs =
110+ connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE" )) {
111+ assertThat (rs .next ()).isTrue ();
112+ assertThat (rs .getString ("OPTIMIZER_STATISTICS_PACKAGE" )).isEqualTo ("20210609" );
113+ assertThat (rs .next ()).isFalse ();
114+ }
115+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE='latest'" );
116+ try (java .sql .ResultSet rs =
117+ connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE" )) {
118+ assertThat (rs .next ()).isTrue ();
119+ assertThat (rs .getString ("OPTIMIZER_STATISTICS_PACKAGE" )).isEqualTo ("latest" );
120+ assertThat (rs .next ()).isFalse ();
121+ }
122+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE=''" );
123+ try (java .sql .ResultSet rs =
124+ connection .createStatement ().executeQuery ("SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE" )) {
125+ assertThat (rs .next ()).isTrue ();
126+ assertThat (rs .getString ("OPTIMIZER_STATISTICS_PACKAGE" )).isEqualTo ("" );
127+ assertThat (rs .next ()).isFalse ();
128+ }
92129 }
93130 }
94131
95132 @ Test
96- public void testSetAndUseOptimizerVersion () throws SQLException {
133+ public void testSetAndUseOptions () throws SQLException {
97134 try (java .sql .Connection connection = createJdbcConnection ()) {
98135 connection .createStatement ().execute ("SET OPTIMIZER_VERSION='20'" );
136+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE='20210609'" );
99137 try (java .sql .ResultSet rs =
100138 connection .createStatement ().executeQuery (SELECT_COUNT_STATEMENT .getSql ())) {
101139 assertThat (rs .next ()).isTrue ();
102140 assertThat (rs .getLong (1 )).isEqualTo (COUNT_BEFORE_INSERT );
103141 assertThat (rs .next ()).isFalse ();
104- // Verify that the last ExecuteSqlRequest that the server received specified optimizer
105- // version 20 .
142+ // Verify that the last ExecuteSqlRequest that the server received used the options that
143+ // were set .
106144 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
107145 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("20" );
146+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ()).isEqualTo ("20210609" );
108147 }
109148
110- // Do another query, but now with optimizer version 'latest'.
111149 connection .createStatement ().execute ("SET OPTIMIZER_VERSION='latest'" );
150+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE='latest'" );
112151 try (java .sql .ResultSet rs =
113152 connection .createStatement ().executeQuery (SELECT_COUNT_STATEMENT .getSql ())) {
114153 assertThat (rs .next ()).isTrue ();
115154 assertThat (rs .getLong (1 )).isEqualTo (COUNT_BEFORE_INSERT );
116155 assertThat (rs .next ()).isFalse ();
117- // Verify that the last ExecuteSqlRequest that the server received specified optimizer
118- // version 'latest'.
119156 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
120157 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("latest" );
158+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ()).isEqualTo ("latest" );
121159 }
122160
123- // Set the optimizer version to ''. This will do a fallback to the default, meaning that it
124- // will be read from the environment variable SPANNER_OPTIMIZER_VERSION as we have nothing set
125- // on the connection URL.
161+ // Set the options to ''. This will do a fallback to the default, meaning that it will be read
162+ // from the environment variables as we have nothing set on the connection URL.
126163 connection .createStatement ().execute ("SET OPTIMIZER_VERSION=''" );
164+ connection .createStatement ().execute ("SET OPTIMIZER_STATISTICS_PACKAGE=''" );
127165 try (java .sql .ResultSet rs =
128166 connection .createStatement ().executeQuery (SELECT_COUNT_STATEMENT .getSql ())) {
129167 assertThat (rs .next ()).isTrue ();
@@ -134,31 +172,49 @@ public void testSetAndUseOptimizerVersion() throws SQLException {
134172 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
135173 assertThat (request .getQueryOptions ().getOptimizerVersion ())
136174 .isEqualTo (MoreObjects .firstNonNull (System .getenv ("SPANNER_OPTIMIZER_VERSION" ), "" ));
175+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ())
176+ .isEqualTo (MoreObjects .firstNonNull (System .getenv ("OPTIMIZER_STATISTICS_PACKAGE" ), "" ));
137177 }
138178 }
139179 }
140180
141181 @ Test
142- public void testUseOptimizerVersionFromConnectionUrl () throws SQLException {
182+ public void testUseOptionsFromConnectionUrl () throws SQLException {
143183 try (java .sql .Connection connection =
144- DriverManager .getConnection (String .format ("jdbc:%s;optimizerVersion=10" , getBaseUrl ()))) {
184+ DriverManager .getConnection (
185+ String .format (
186+ "jdbc:%s;optimizerVersion=10;optimizerStatisticsPackage=20210609_10_00_00" ,
187+ getBaseUrl ()))) {
145188 // Do a query and verify that the version from the connection URL is used.
146189 try (java .sql .ResultSet rs =
147190 connection .createStatement ().executeQuery (SELECT_COUNT_STATEMENT .getSql ())) {
148191 assertThat (rs .next ()).isTrue ();
149192 assertThat (rs .getLong (1 )).isEqualTo (COUNT_BEFORE_INSERT );
150193 assertThat (rs .next ()).isFalse ();
151- // The optimizer version used should be '10' from the connection URL.
194+ // The options should come from the connection URL.
152195 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
153196 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("10" );
197+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ())
198+ .isEqualTo ("20210609_10_00_00" );
154199 }
155200 }
156201 }
157202
158203 @ Test
159- public void testUseOptimizerVersionFromEnvironment () throws SQLException {
204+ public void testUseOptionsFromEnvironment () throws SQLException {
160205 try {
161- SpannerOptions .useEnvironment (() -> "20" );
206+ SpannerOptions .useEnvironment (
207+ new SpannerEnvironment () {
208+ @ Override
209+ public String getOptimizerVersion () {
210+ return "20" ;
211+ }
212+
213+ @ Override
214+ public String getOptimizerStatisticsPackage () {
215+ return "env_package" ;
216+ }
217+ });
162218 try (java .sql .Connection connection =
163219 DriverManager .getConnection (String .format ("jdbc:%s" , getBaseUrl ()))) {
164220 // Do a query and verify that the version from the environment is used.
@@ -170,6 +226,8 @@ public void testUseOptimizerVersionFromEnvironment() throws SQLException {
170226 // Verify query options from the environment.
171227 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
172228 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("20" );
229+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ())
230+ .isEqualTo ("env_package" );
173231 }
174232 // Now set one of the query options on the connection. That option should be used in
175233 // combination with the other option from the environment.
@@ -183,6 +241,9 @@ public void testUseOptimizerVersionFromEnvironment() throws SQLException {
183241 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
184242 // Optimizer version should come from the connection.
185243 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("30" );
244+ // Optimizer statistics package should come from the environment.
245+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ())
246+ .isEqualTo ("env_package" );
186247 }
187248 }
188249 } finally {
@@ -195,22 +256,27 @@ public void testUseQueryHint() throws SQLException {
195256 mockSpanner .putStatementResult (
196257 StatementResult .query (
197258 Statement .of (
198- String .format ("@{optimizer_version=1} %s" , SELECT_COUNT_STATEMENT .getSql ())),
259+ String .format (
260+ "@{optimizer_version=1, optimizer_statistics_package=hint_package} %s" ,
261+ SELECT_COUNT_STATEMENT .getSql ())),
199262 SELECT_COUNT_RESULTSET_BEFORE_INSERT ));
200263 try (java .sql .Connection connection =
201264 DriverManager .getConnection (String .format ("jdbc:%s" , getBaseUrl ()))) {
202265 try (java .sql .ResultSet rs =
203266 connection
204267 .createStatement ()
205268 .executeQuery (
206- String .format ("@{optimizer_version=1} %s" , SELECT_COUNT_STATEMENT .getSql ()))) {
269+ String .format (
270+ "@{optimizer_version=1, optimizer_statistics_package=hint_package} %s" ,
271+ SELECT_COUNT_STATEMENT .getSql ()))) {
207272 assertThat (rs .next ()).isTrue ();
208273 assertThat (rs .getLong (1 )).isEqualTo (COUNT_BEFORE_INSERT );
209274 assertThat (rs .next ()).isFalse ();
210- // The optimizer version used in the ExecuteSqlRequest should be empty as the query hint is
211- // parsed by the backend.
275+ // The options used in the ExecuteSqlRequest should be empty as the query hint is parsed by
276+ // the backend.
212277 ExecuteSqlRequest request = getLastExecuteSqlRequest ();
213278 assertThat (request .getQueryOptions ().getOptimizerVersion ()).isEqualTo ("" );
279+ assertThat (request .getQueryOptions ().getOptimizerStatisticsPackage ()).isEqualTo ("" );
214280 }
215281 }
216282 }
0 commit comments