|
26 | 26 | import com.google.cloud.Timestamp;
|
27 | 27 | import com.google.cloud.spanner.ErrorCode;
|
28 | 28 | import com.google.cloud.spanner.MockSpannerServiceImpl.StatementResult;
|
| 29 | +import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode; |
29 | 30 | import com.google.cloud.spanner.ResultSet;
|
30 | 31 | import com.google.cloud.spanner.SpannerException;
|
31 | 32 | import com.google.cloud.spanner.Statement;
|
|
37 | 38 | import com.google.spanner.v1.CommitRequest;
|
38 | 39 | import com.google.spanner.v1.ExecuteBatchDmlRequest;
|
39 | 40 | import com.google.spanner.v1.ExecuteSqlRequest;
|
| 41 | +import com.google.spanner.v1.ExecuteSqlRequest.QueryMode; |
40 | 42 | import io.grpc.Status;
|
41 | 43 | import io.grpc.StatusRuntimeException;
|
42 | 44 | import java.util.Collections;
|
| 45 | +import java.util.List; |
43 | 46 | import org.junit.Test;
|
44 | 47 | import org.junit.runner.RunWith;
|
45 | 48 | import org.junit.runners.JUnit4;
|
@@ -299,6 +302,41 @@ public void testRetryUsesTags() {
|
299 | 302 | assertEquals(2L, commitRequestCount);
|
300 | 303 | }
|
301 | 304 |
|
| 305 | + @Test |
| 306 | + public void testRetryUsesAnalyzeModeForUpdate() { |
| 307 | + mockSpanner.putStatementResult( |
| 308 | + StatementResult.query(SELECT_COUNT_STATEMENT, SELECT_COUNT_RESULTSET_BEFORE_INSERT)); |
| 309 | + mockSpanner.putStatementResult(StatementResult.update(INSERT_STATEMENT, 0)); |
| 310 | + try (ITConnection connection = createConnection()) { |
| 311 | + assertEquals( |
| 312 | + 0L, connection.analyzeUpdate(INSERT_STATEMENT, QueryAnalyzeMode.PLAN).getRowCountExact()); |
| 313 | + |
| 314 | + mockSpanner.abortNextStatement(); |
| 315 | + connection.executeQuery(SELECT_COUNT_STATEMENT); |
| 316 | + |
| 317 | + mockSpanner.putStatementResult(StatementResult.update(INSERT_STATEMENT, 1)); |
| 318 | + assertEquals(1L, connection.executeUpdate(INSERT_STATEMENT)); |
| 319 | + |
| 320 | + connection.commit(); |
| 321 | + } |
| 322 | + // 5 requests because: |
| 323 | + // 1. Analyze INSERT |
| 324 | + // 2. Execute SELECT COUNT(*) (Aborted) |
| 325 | + // 3. Analyze INSERT (retry) |
| 326 | + // 4. Execute SELECT COUNT(*) (retry) |
| 327 | + // 5. Execute INSERT |
| 328 | + assertEquals(5, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)); |
| 329 | + List<ExecuteSqlRequest> requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class); |
| 330 | + assertEquals(QueryMode.PLAN, requests.get(0).getQueryMode()); |
| 331 | + assertEquals(QueryMode.NORMAL, requests.get(1).getQueryMode()); |
| 332 | + |
| 333 | + // This used NORMAL because of https://github.com/googleapis/java-spanner/issues/2009. |
| 334 | + assertEquals(QueryMode.PLAN, requests.get(2).getQueryMode()); |
| 335 | + |
| 336 | + assertEquals(QueryMode.NORMAL, requests.get(3).getQueryMode()); |
| 337 | + assertEquals(QueryMode.NORMAL, requests.get(4).getQueryMode()); |
| 338 | + } |
| 339 | + |
302 | 340 | ITConnection createConnection(TransactionRetryListener listener) {
|
303 | 341 | ITConnection connection =
|
304 | 342 | super.createConnection(ImmutableList.of(), ImmutableList.of(listener));
|
|
0 commit comments