diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index f60d774937..a79f06271b 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:fc52b202aa298a50a12c64efd04fea3884d867947effe2fa85382a246c09e813 -# created: 2022-04-06T16:30:03.627422514Z + digest: sha256:2567a120ce90fadb6201999b87d649d9f67459de28815ad239bce9ebfaa18a74 +# created: 2022-05-19T15:12:45.278246753Z diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg new file mode 100644 index 0000000000..a3f7fb9d49 --- /dev/null +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -0,0 +1,33 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/graalvm17" +} + +env_vars: { + key: "JOB_TYPE" + value: "graalvm17" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d3609ba58..bc13c6d19d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [6.25.0](https://github.com/googleapis/java-spanner/compare/v6.24.0...v6.25.0) (2022-05-20) + + +### Features + +* add build scripts for native image testing in Java 17 ([#1440](https://github.com/googleapis/java-spanner/issues/1440)) ([#1881](https://github.com/googleapis/java-spanner/issues/1881)) ([993e893](https://github.com/googleapis/java-spanner/commit/993e89365d167e07114ebc352dfa835487045ecb)) +* Add support for Explain feature ([#1852](https://github.com/googleapis/java-spanner/issues/1852)) ([01f460e](https://github.com/googleapis/java-spanner/commit/01f460e9fc755c02797c50a50d8dc2df31116268)) +* AuditConfig for IAM v1 ([f7437b2](https://github.com/googleapis/java-spanner/commit/f7437b294a7c05f288142626d71c7aff00616c89)) +* support analyze DDL statement ([#1879](https://github.com/googleapis/java-spanner/issues/1879)) ([1704ac3](https://github.com/googleapis/java-spanner/commit/1704ac3dbcf959294b6d609b4dce2aa1fa80d594)) +* support analyzeUpdate ([#1867](https://github.com/googleapis/java-spanner/issues/1867)) ([2d8cfa4](https://github.com/googleapis/java-spanner/commit/2d8cfa40a22e5b77a39b6ec86552734ec47afbe0)) + + +### Bug Fixes + +* ignore errors during Connection.close() ([#1877](https://github.com/googleapis/java-spanner/issues/1877)) ([6ab8ed2](https://github.com/googleapis/java-spanner/commit/6ab8ed236b1393e67a4edc5d430d9535dffbadb5)) + + +### Dependencies + +* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.12.0 ([#1880](https://github.com/googleapis/java-spanner/issues/1880)) ([daccd1b](https://github.com/googleapis/java-spanner/commit/daccd1b394a95f59246b36ef91c5d9459b3be577)) +* update opencensus.version to v0.31.1 ([#1863](https://github.com/googleapis/java-spanner/issues/1863)) ([2d2b526](https://github.com/googleapis/java-spanner/commit/2d2b526777b918f50511ef57433a809a672ab832)) + ## [6.24.0](https://github.com/googleapis/java-spanner/compare/v6.23.3...v6.24.0) (2022-05-05) diff --git a/README.md b/README.md index 473c27dff2..ae09624ddd 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file com.google.cloud libraries-bom - 25.2.0 + 25.3.0 pom import @@ -41,7 +41,7 @@ If you are using Maven without BOM, add this to your dependencies: com.google.cloud google-cloud-spanner - 6.23.3 + 6.24.0 ``` @@ -49,20 +49,20 @@ If you are using Maven without BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies ```Groovy -implementation platform('com.google.cloud:libraries-bom:25.2.0') +implementation platform('com.google.cloud:libraries-bom:25.3.0') implementation 'com.google.cloud:google-cloud-spanner' ``` If you are using Gradle without BOM, add this to your dependencies ```Groovy -implementation 'com.google.cloud:google-cloud-spanner:6.23.3' +implementation 'com.google.cloud:google-cloud-spanner:6.24.0' ``` If you are using SBT, add this to your dependencies ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.23.3" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.24.0" ``` ## Authentication diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 3c4da8c7ca..0fe701fc29 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner-bom - 6.24.0 + 6.25.0 pom com.google.cloud @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.24.0 + 6.25.0 com.google.cloud google-cloud-spanner test-jar - 6.24.0 + 6.25.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.24.0 + 6.25.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.24.0 + 6.25.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.24.0 + 6.25.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.24.0 + 6.25.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.24.0 + 6.25.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.24.0 + 6.25.0 diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index ef38a8cfa0..b8aca39a27 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -70,4 +70,15 @@ com/google/cloud/spanner/DatabaseAdminClient com.google.api.gax.longrunning.OperationFuture createDatabase(java.lang.String, java.lang.String, com.google.cloud.spanner.Dialect, java.lang.Iterable) + + + 7012 + com/google/cloud/spanner/TransactionContext + com.google.spanner.v1.ResultSetStats analyzeUpdate(com.google.cloud.spanner.Statement, com.google.cloud.spanner.ReadContext$QueryAnalyzeMode, com.google.cloud.spanner.Options$UpdateOption[]) + + + 7012 + com/google/cloud/spanner/connection/Connection + com.google.spanner.v1.ResultSetStats analyzeUpdate(com.google.cloud.spanner.Statement, com.google.cloud.spanner.ReadContext$QueryAnalyzeMode) + diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 3c364f6a57..5adfe34736 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner - 6.24.0 + 6.25.0 jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,11 +11,11 @@ com.google.cloud google-cloud-spanner-parent - 6.24.0 + 6.25.0 google-cloud-spanner - 0.31.0 + 0.31.1 com.google.cloud.spanner.GceTestEnvConfig projects/gcloud-devel/instances/spanner-testing-east1 gcloud-devel diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/PartitionedDmlTransaction.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/PartitionedDmlTransaction.java index cbe01c2d33..976f6136db 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/PartitionedDmlTransaction.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/PartitionedDmlTransaction.java @@ -95,7 +95,7 @@ long executeStreamingPartitionedUpdate( resumeToken = rs.getResumeToken(); } if (rs.hasStats()) { - foundStats = true; + foundStats = rs.getStats().hasRowCountLowerBound(); updateCount += rs.getStats().getRowCountLowerBound(); } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java index 7e5ffc43d4..05340b4f17 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java @@ -67,6 +67,7 @@ import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; import com.google.protobuf.Empty; +import com.google.spanner.v1.ResultSetStats; import io.opencensus.common.Scope; import io.opencensus.metrics.DerivedLongCumulative; import io.opencensus.metrics.DerivedLongGauge; @@ -713,6 +714,16 @@ public ApiFuture bufferAsync(Iterable mutations) { return delegate.bufferAsync(mutations); } + @Override + public ResultSetStats analyzeUpdate( + Statement statement, QueryAnalyzeMode analyzeMode, UpdateOption... options) { + try { + return delegate.analyzeUpdate(statement, analyzeMode, options); + } catch (SessionNotFoundException e) { + throw handler.handleSessionNotFound(e); + } + } + @Override public long executeUpdate(Statement statement, UpdateOption... options) { try { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionContext.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionContext.java index 2590d5b309..5499d347b9 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionContext.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionContext.java @@ -18,6 +18,7 @@ import com.google.api.core.ApiFuture; import com.google.cloud.spanner.Options.UpdateOption; +import com.google.spanner.v1.ResultSetStats; /** * Context for a single attempt of a locking read-write transaction. This type of transaction is the @@ -126,6 +127,19 @@ default ApiFuture bufferAsync(Iterable mutations) { */ ApiFuture executeUpdateAsync(Statement statement, UpdateOption... options); + /** + * Analyzes a DML statement and returns query plan and/or execution statistics information. + * + *

{@link com.google.cloud.spanner.ReadContext.QueryAnalyzeMode#PLAN} only returns the plan for + * the statement. {@link com.google.cloud.spanner.ReadContext.QueryAnalyzeMode#PROFILE} executes + * the DML statement, returns the modified row count and execution statistics, and the effects of + * the DML statement will be visible to subsequent operations in the transaction. + */ + default ResultSetStats analyzeUpdate( + Statement statement, QueryAnalyzeMode analyzeMode, UpdateOption... options) { + throw new UnsupportedOperationException("method should be overwritten"); + } + /** * Executes a list of DML statements in a single request. The statements will be executed in order * and the semantics is the same as if each statement is executed by {@code executeUpdate} in a diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java index 510288677f..e18f63e97f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java @@ -43,6 +43,7 @@ import com.google.spanner.v1.ExecuteSqlRequest; import com.google.spanner.v1.ExecuteSqlRequest.QueryMode; import com.google.spanner.v1.RequestOptions; +import com.google.spanner.v1.ResultSetStats; import com.google.spanner.v1.RollbackRequest; import com.google.spanner.v1.Transaction; import com.google.spanner.v1.TransactionOptions; @@ -669,13 +670,39 @@ public ApiFuture bufferAsync(Iterable mutations) { return ApiFutures.immediateFuture(null); } + @Override + public ResultSetStats analyzeUpdate( + Statement statement, QueryAnalyzeMode analyzeMode, UpdateOption... options) { + Preconditions.checkNotNull(analyzeMode); + QueryMode queryMode; + switch (analyzeMode) { + case PLAN: + queryMode = QueryMode.PLAN; + break; + case PROFILE: + queryMode = QueryMode.PROFILE; + break; + default: + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, "Unknown analyze mode: " + analyzeMode); + } + return internalExecuteUpdate(statement, queryMode, options); + } + @Override public long executeUpdate(Statement statement, UpdateOption... options) { + ResultSetStats resultSetStats = internalExecuteUpdate(statement, QueryMode.NORMAL, options); + // For standard DML, using the exact row count. + return resultSetStats.getRowCountExact(); + } + + private ResultSetStats internalExecuteUpdate( + Statement statement, QueryMode queryMode, UpdateOption... options) { beforeReadOrQuery(); final ExecuteSqlRequest.Builder builder = getExecuteSqlRequestBuilder( statement, - QueryMode.NORMAL, + queryMode, Options.fromUpdateOptions(options), /* withTransactionSelector = */ true); try { @@ -689,8 +716,7 @@ public long executeUpdate(Statement statement, UpdateOption... options) { throw new IllegalArgumentException( "DML response missing stats possibly due to non-DML statement as input"); } - // For standard DML, using the exact row count. - return resultSet.getStats().getRowCountExact(); + return resultSet.getStats(); } catch (Throwable t) { throw onError( SpannerExceptionFactory.asSpannerException(t), builder.getTransaction().hasBegin()); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java index d8110bd947..8bb5d30f81 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,6 +88,8 @@ * calls that map to API methods. Sample code to get started: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
  *   DatabaseName name = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
  *   Database response = databaseAdminClient.getDatabase(name);
@@ -123,6 +125,8 @@
  * 

To customize credentials: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * DatabaseAdminSettings databaseAdminSettings =
  *     DatabaseAdminSettings.newBuilder()
  *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
@@ -133,6 +137,8 @@
  * 

To customize the endpoint: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * DatabaseAdminSettings databaseAdminSettings =
  *     DatabaseAdminSettings.newBuilder().setEndpoint(myEndpoint).build();
  * DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create(databaseAdminSettings);
@@ -211,6 +217,8 @@ public final OperationsClient getOperationsClient() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   for (Database element : databaseAdminClient.listDatabases(parent).iterateAll()) {
@@ -238,6 +246,8 @@ public final ListDatabasesPagedResponse listDatabases(InstanceName parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   for (Database element : databaseAdminClient.listDatabases(parent).iterateAll()) {
@@ -262,6 +272,8 @@ public final ListDatabasesPagedResponse listDatabases(String parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabasesRequest request =
    *       ListDatabasesRequest.newBuilder()
@@ -289,6 +301,8 @@ public final ListDatabasesPagedResponse listDatabases(ListDatabasesRequest reque
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabasesRequest request =
    *       ListDatabasesRequest.newBuilder()
@@ -317,6 +331,8 @@ public final ListDatabasesPagedResponse listDatabases(ListDatabasesRequest reque
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabasesRequest request =
    *       ListDatabasesRequest.newBuilder()
@@ -356,6 +372,8 @@ public final UnaryCallable listData
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   String createStatement = "createStatement744686547";
@@ -395,6 +413,8 @@ public final OperationFuture createDatabaseAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   String createStatement = "createStatement744686547";
@@ -434,6 +454,8 @@ public final OperationFuture createDatabaseAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateDatabaseRequest request =
    *       CreateDatabaseRequest.newBuilder()
@@ -468,6 +490,8 @@ public final OperationFuture createDatabaseAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateDatabaseRequest request =
    *       CreateDatabaseRequest.newBuilder()
@@ -502,6 +526,8 @@ public final OperationFuture createDatabaseAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateDatabaseRequest request =
    *       CreateDatabaseRequest.newBuilder()
@@ -529,6 +555,8 @@ public final UnaryCallable createDatabaseCalla
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DatabaseName name = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   Database response = databaseAdminClient.getDatabase(name);
@@ -552,6 +580,8 @@ public final Database getDatabase(DatabaseName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String name = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   Database response = databaseAdminClient.getDatabase(name);
@@ -574,6 +604,8 @@ public final Database getDatabase(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetDatabaseRequest request =
    *       GetDatabaseRequest.newBuilder()
@@ -597,6 +629,8 @@ public final Database getDatabase(GetDatabaseRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetDatabaseRequest request =
    *       GetDatabaseRequest.newBuilder()
@@ -625,6 +659,8 @@ public final UnaryCallable getDatabaseCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   List statements = new ArrayList<>();
@@ -659,6 +695,8 @@ public final OperationFuture updateDatabaseDdl
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   List statements = new ArrayList<>();
@@ -693,6 +731,8 @@ public final OperationFuture updateDatabaseDdl
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   UpdateDatabaseDdlRequest request =
    *       UpdateDatabaseDdlRequest.newBuilder()
@@ -725,6 +765,8 @@ public final OperationFuture updateDatabaseDdl
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   UpdateDatabaseDdlRequest request =
    *       UpdateDatabaseDdlRequest.newBuilder()
@@ -757,6 +799,8 @@ public final OperationFuture updateDatabaseDdl
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   UpdateDatabaseDdlRequest request =
    *       UpdateDatabaseDdlRequest.newBuilder()
@@ -784,6 +828,8 @@ public final UnaryCallable updateDatabaseDd
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   databaseAdminClient.dropDatabase(database);
@@ -810,6 +856,8 @@ public final void dropDatabase(DatabaseName database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   databaseAdminClient.dropDatabase(database);
@@ -833,6 +881,8 @@ public final void dropDatabase(String database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DropDatabaseRequest request =
    *       DropDatabaseRequest.newBuilder()
@@ -858,6 +908,8 @@ public final void dropDatabase(DropDatabaseRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DropDatabaseRequest request =
    *       DropDatabaseRequest.newBuilder()
@@ -882,6 +934,8 @@ public final UnaryCallable dropDatabaseCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   GetDatabaseDdlResponse response = databaseAdminClient.getDatabaseDdl(database);
@@ -909,6 +963,8 @@ public final GetDatabaseDdlResponse getDatabaseDdl(DatabaseName database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   GetDatabaseDdlResponse response = databaseAdminClient.getDatabaseDdl(database);
@@ -934,6 +990,8 @@ public final GetDatabaseDdlResponse getDatabaseDdl(String database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetDatabaseDdlRequest request =
    *       GetDatabaseDdlRequest.newBuilder()
@@ -959,6 +1017,8 @@ public final GetDatabaseDdlResponse getDatabaseDdl(GetDatabaseDdlRequest request
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetDatabaseDdlRequest request =
    *       GetDatabaseDdlRequest.newBuilder()
@@ -988,6 +1048,8 @@ public final GetDatabaseDdlResponse getDatabaseDdl(GetDatabaseDdlRequest request
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ResourceName resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]");
    *   Policy policy = Policy.newBuilder().build();
@@ -1023,6 +1085,8 @@ public final Policy setIamPolicy(ResourceName resource, Policy policy) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString();
    *   Policy policy = Policy.newBuilder().build();
@@ -1055,11 +1119,14 @@ public final Policy setIamPolicy(String resource, Policy policy) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   SetIamPolicyRequest request =
    *       SetIamPolicyRequest.newBuilder()
    *           .setResource(BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString())
    *           .setPolicy(Policy.newBuilder().build())
+   *           .setUpdateMask(FieldMask.newBuilder().build())
    *           .build();
    *   Policy response = databaseAdminClient.setIamPolicy(request);
    * }
@@ -1084,11 +1151,14 @@ public final Policy setIamPolicy(SetIamPolicyRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   SetIamPolicyRequest request =
    *       SetIamPolicyRequest.newBuilder()
    *           .setResource(BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString())
    *           .setPolicy(Policy.newBuilder().build())
+   *           .setUpdateMask(FieldMask.newBuilder().build())
    *           .build();
    *   ApiFuture future = databaseAdminClient.setIamPolicyCallable().futureCall(request);
    *   // Do something.
@@ -1113,6 +1183,8 @@ public final UnaryCallable setIamPolicyCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ResourceName resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]");
    *   Policy response = databaseAdminClient.getIamPolicy(resource);
@@ -1144,6 +1216,8 @@ public final Policy getIamPolicy(ResourceName resource) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString();
    *   Policy response = databaseAdminClient.getIamPolicy(resource);
@@ -1172,6 +1246,8 @@ public final Policy getIamPolicy(String resource) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
@@ -1202,6 +1278,8 @@ public final Policy getIamPolicy(GetIamPolicyRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
@@ -1231,6 +1309,8 @@ public final UnaryCallable getIamPolicyCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ResourceName resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]");
    *   List permissions = new ArrayList<>();
@@ -1269,6 +1349,8 @@ public final TestIamPermissionsResponse testIamPermissions(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String resource = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString();
    *   List permissions = new ArrayList<>();
@@ -1307,6 +1389,8 @@ public final TestIamPermissionsResponse testIamPermissions(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
@@ -1337,6 +1421,8 @@ public final TestIamPermissionsResponse testIamPermissions(TestIamPermissionsReq
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
@@ -1371,6 +1457,8 @@ public final TestIamPermissionsResponse testIamPermissions(TestIamPermissionsReq
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   Backup backup = Backup.newBuilder().build();
@@ -1416,6 +1504,8 @@ public final OperationFuture createBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   Backup backup = Backup.newBuilder().build();
@@ -1461,6 +1551,8 @@ public final OperationFuture createBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateBackupRequest request =
    *       CreateBackupRequest.newBuilder()
@@ -1497,6 +1589,8 @@ public final OperationFuture createBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateBackupRequest request =
    *       CreateBackupRequest.newBuilder()
@@ -1533,6 +1627,8 @@ public final OperationFuture createBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CreateBackupRequest request =
    *       CreateBackupRequest.newBuilder()
@@ -1567,6 +1663,8 @@ public final UnaryCallable createBackupCallable(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   String backupId = "backupId2121930365";
@@ -1620,6 +1718,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   String backupId = "backupId2121930365";
@@ -1673,6 +1773,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   String backupId = "backupId2121930365";
@@ -1726,6 +1828,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   String backupId = "backupId2121930365";
@@ -1779,6 +1883,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CopyBackupRequest request =
    *       CopyBackupRequest.newBuilder()
@@ -1816,6 +1922,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CopyBackupRequest request =
    *       CopyBackupRequest.newBuilder()
@@ -1853,6 +1961,8 @@ public final OperationFuture copyBackupAsync(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   CopyBackupRequest request =
    *       CopyBackupRequest.newBuilder()
@@ -1879,6 +1989,8 @@ public final UnaryCallable copyBackupCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   BackupName name = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]");
    *   Backup response = databaseAdminClient.getBackup(name);
@@ -1902,6 +2014,8 @@ public final Backup getBackup(BackupName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String name = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString();
    *   Backup response = databaseAdminClient.getBackup(name);
@@ -1924,6 +2038,8 @@ public final Backup getBackup(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetBackupRequest request =
    *       GetBackupRequest.newBuilder()
@@ -1947,6 +2063,8 @@ public final Backup getBackup(GetBackupRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   GetBackupRequest request =
    *       GetBackupRequest.newBuilder()
@@ -1969,6 +2087,8 @@ public final UnaryCallable getBackupCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   Backup backup = Backup.newBuilder().build();
    *   FieldMask updateMask = FieldMask.newBuilder().build();
@@ -1998,6 +2118,8 @@ public final Backup updateBackup(Backup backup, FieldMask updateMask) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   UpdateBackupRequest request =
    *       UpdateBackupRequest.newBuilder()
@@ -2022,6 +2144,8 @@ public final Backup updateBackup(UpdateBackupRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   UpdateBackupRequest request =
    *       UpdateBackupRequest.newBuilder()
@@ -2045,6 +2169,8 @@ public final UnaryCallable updateBackupCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   BackupName name = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]");
    *   databaseAdminClient.deleteBackup(name);
@@ -2068,6 +2194,8 @@ public final void deleteBackup(BackupName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String name = BackupName.of("[PROJECT]", "[INSTANCE]", "[BACKUP]").toString();
    *   databaseAdminClient.deleteBackup(name);
@@ -2090,6 +2218,8 @@ public final void deleteBackup(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DeleteBackupRequest request =
    *       DeleteBackupRequest.newBuilder()
@@ -2113,6 +2243,8 @@ public final void deleteBackup(DeleteBackupRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   DeleteBackupRequest request =
    *       DeleteBackupRequest.newBuilder()
@@ -2136,6 +2268,8 @@ public final UnaryCallable deleteBackupCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   for (Backup element : databaseAdminClient.listBackups(parent).iterateAll()) {
@@ -2164,6 +2298,8 @@ public final ListBackupsPagedResponse listBackups(InstanceName parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   for (Backup element : databaseAdminClient.listBackups(parent).iterateAll()) {
@@ -2189,6 +2325,8 @@ public final ListBackupsPagedResponse listBackups(String parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupsRequest request =
    *       ListBackupsRequest.newBuilder()
@@ -2218,6 +2356,8 @@ public final ListBackupsPagedResponse listBackups(ListBackupsRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupsRequest request =
    *       ListBackupsRequest.newBuilder()
@@ -2247,6 +2387,8 @@ public final ListBackupsPagedResponse listBackups(ListBackupsRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupsRequest request =
    *       ListBackupsRequest.newBuilder()
@@ -2294,6 +2436,8 @@ public final UnaryCallable listBackupsC
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   String databaseId = "databaseId1688905718";
@@ -2346,6 +2490,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   String databaseId = "databaseId1688905718";
@@ -2398,6 +2544,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   String databaseId = "databaseId1688905718";
@@ -2450,6 +2598,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   String databaseId = "databaseId1688905718";
@@ -2502,6 +2652,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   RestoreDatabaseRequest request =
    *       RestoreDatabaseRequest.newBuilder()
@@ -2541,6 +2693,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   RestoreDatabaseRequest request =
    *       RestoreDatabaseRequest.newBuilder()
@@ -2580,6 +2734,8 @@ public final OperationFuture restoreDatabaseA
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   RestoreDatabaseRequest request =
    *       RestoreDatabaseRequest.newBuilder()
@@ -2610,6 +2766,8 @@ public final UnaryCallable restoreDatabaseCal
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   for (Operation element : databaseAdminClient.listDatabaseOperations(parent).iterateAll()) {
@@ -2642,6 +2800,8 @@ public final ListDatabaseOperationsPagedResponse listDatabaseOperations(Instance
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   for (Operation element : databaseAdminClient.listDatabaseOperations(parent).iterateAll()) {
@@ -2672,6 +2832,8 @@ public final ListDatabaseOperationsPagedResponse listDatabaseOperations(String p
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabaseOperationsRequest request =
    *       ListDatabaseOperationsRequest.newBuilder()
@@ -2706,6 +2868,8 @@ public final ListDatabaseOperationsPagedResponse listDatabaseOperations(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabaseOperationsRequest request =
    *       ListDatabaseOperationsRequest.newBuilder()
@@ -2740,6 +2904,8 @@ public final ListDatabaseOperationsPagedResponse listDatabaseOperations(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListDatabaseOperationsRequest request =
    *       ListDatabaseOperationsRequest.newBuilder()
@@ -2783,6 +2949,8 @@ public final ListDatabaseOperationsPagedResponse listDatabaseOperations(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   InstanceName parent = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   for (Operation element : databaseAdminClient.listBackupOperations(parent).iterateAll()) {
@@ -2817,6 +2985,8 @@ public final ListBackupOperationsPagedResponse listBackupOperations(InstanceName
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   String parent = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   for (Operation element : databaseAdminClient.listBackupOperations(parent).iterateAll()) {
@@ -2849,6 +3019,8 @@ public final ListBackupOperationsPagedResponse listBackupOperations(String paren
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupOperationsRequest request =
    *       ListBackupOperationsRequest.newBuilder()
@@ -2885,6 +3057,8 @@ public final ListBackupOperationsPagedResponse listBackupOperations(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupOperationsRequest request =
    *       ListBackupOperationsRequest.newBuilder()
@@ -2921,6 +3095,8 @@ public final ListBackupOperationsPagedResponse listBackupOperations(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
    *   ListBackupOperationsRequest request =
    *       ListBackupOperationsRequest.newBuilder()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminSettings.java
index 5d924f60ed..d0f6aeb24b 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -90,6 +90,8 @@
  * 

For example, to set the total timeout of getDatabase to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * DatabaseAdminSettings.Builder databaseAdminSettingsBuilder = DatabaseAdminSettings.newBuilder();
  * databaseAdminSettingsBuilder
  *     .getDatabaseSettings()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/package-info.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/package-info.java
index 42874c08c8..199af03da5 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/package-info.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,8 @@
  * 

Sample for DatabaseAdminClient: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
  *   DatabaseName name = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
  *   Database response = databaseAdminClient.getDatabase(name);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStub.java
index 5572033a6a..6b9df8b0e5 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStubSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStubSettings.java
index 992e5a79d2..c6cab995b3 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStubSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/DatabaseAdminStubSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -108,6 +108,8 @@
  * 

For example, to set the total timeout of getDatabase to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * DatabaseAdminStubSettings.Builder databaseAdminSettingsBuilder =
  *     DatabaseAdminStubSettings.newBuilder();
  * databaseAdminSettingsBuilder
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminCallableFactory.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminCallableFactory.java
index 172d6b25ab..eaec711af7 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminCallableFactory.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminCallableFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminStub.java
index 0df16f344e..f7f0d8472b 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/stub/GrpcDatabaseAdminStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClient.java
index 745c922943..e122abe48e 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClient.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClient.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -85,6 +85,8 @@
  * calls that map to API methods. Sample code to get started:
  *
  * 
{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
  *   InstanceConfigName name = InstanceConfigName.of("[PROJECT]", "[INSTANCE_CONFIG]");
  *   InstanceConfig response = instanceAdminClient.getInstanceConfig(name);
@@ -120,6 +122,8 @@
  * 

To customize credentials: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * InstanceAdminSettings instanceAdminSettings =
  *     InstanceAdminSettings.newBuilder()
  *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
@@ -130,6 +134,8 @@
  * 

To customize the endpoint: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * InstanceAdminSettings instanceAdminSettings =
  *     InstanceAdminSettings.newBuilder().setEndpoint(myEndpoint).build();
  * InstanceAdminClient instanceAdminClient = InstanceAdminClient.create(instanceAdminSettings);
@@ -208,6 +214,8 @@ public final OperationsClient getOperationsClient() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ProjectName parent = ProjectName.of("[PROJECT]");
    *   for (InstanceConfig element : instanceAdminClient.listInstanceConfigs(parent).iterateAll()) {
@@ -235,6 +243,8 @@ public final ListInstanceConfigsPagedResponse listInstanceConfigs(ProjectName pa
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String parent = ProjectName.of("[PROJECT]").toString();
    *   for (InstanceConfig element : instanceAdminClient.listInstanceConfigs(parent).iterateAll()) {
@@ -260,6 +270,8 @@ public final ListInstanceConfigsPagedResponse listInstanceConfigs(String parent)
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstanceConfigsRequest request =
    *       ListInstanceConfigsRequest.newBuilder()
@@ -288,6 +300,8 @@ public final ListInstanceConfigsPagedResponse listInstanceConfigs(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstanceConfigsRequest request =
    *       ListInstanceConfigsRequest.newBuilder()
@@ -316,6 +330,8 @@ public final ListInstanceConfigsPagedResponse listInstanceConfigs(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstanceConfigsRequest request =
    *       ListInstanceConfigsRequest.newBuilder()
@@ -351,6 +367,8 @@ public final ListInstanceConfigsPagedResponse listInstanceConfigs(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   InstanceConfigName name = InstanceConfigName.of("[PROJECT]", "[INSTANCE_CONFIG]");
    *   InstanceConfig response = instanceAdminClient.getInstanceConfig(name);
@@ -376,6 +394,8 @@ public final InstanceConfig getInstanceConfig(InstanceConfigName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String name = InstanceConfigName.of("[PROJECT]", "[INSTANCE_CONFIG]").toString();
    *   InstanceConfig response = instanceAdminClient.getInstanceConfig(name);
@@ -398,6 +418,8 @@ public final InstanceConfig getInstanceConfig(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetInstanceConfigRequest request =
    *       GetInstanceConfigRequest.newBuilder()
@@ -421,6 +443,8 @@ public final InstanceConfig getInstanceConfig(GetInstanceConfigRequest request)
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetInstanceConfigRequest request =
    *       GetInstanceConfigRequest.newBuilder()
@@ -444,6 +468,8 @@ public final UnaryCallable getInstance
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ProjectName parent = ProjectName.of("[PROJECT]");
    *   for (Instance element : instanceAdminClient.listInstances(parent).iterateAll()) {
@@ -471,6 +497,8 @@ public final ListInstancesPagedResponse listInstances(ProjectName parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String parent = ProjectName.of("[PROJECT]").toString();
    *   for (Instance element : instanceAdminClient.listInstances(parent).iterateAll()) {
@@ -495,6 +523,8 @@ public final ListInstancesPagedResponse listInstances(String parent) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstancesRequest request =
    *       ListInstancesRequest.newBuilder()
@@ -523,6 +553,8 @@ public final ListInstancesPagedResponse listInstances(ListInstancesRequest reque
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstancesRequest request =
    *       ListInstancesRequest.newBuilder()
@@ -552,6 +584,8 @@ public final ListInstancesPagedResponse listInstances(ListInstancesRequest reque
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ListInstancesRequest request =
    *       ListInstancesRequest.newBuilder()
@@ -586,6 +620,8 @@ public final UnaryCallable listInst
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   InstanceName name = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   Instance response = instanceAdminClient.getInstance(name);
@@ -609,6 +645,8 @@ public final Instance getInstance(InstanceName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String name = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   Instance response = instanceAdminClient.getInstance(name);
@@ -631,6 +669,8 @@ public final Instance getInstance(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetInstanceRequest request =
    *       GetInstanceRequest.newBuilder()
@@ -655,6 +695,8 @@ public final Instance getInstance(GetInstanceRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetInstanceRequest request =
    *       GetInstanceRequest.newBuilder()
@@ -706,6 +748,8 @@ public final UnaryCallable getInstanceCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ProjectName parent = ProjectName.of("[PROJECT]");
    *   String instanceId = "instanceId902024336";
@@ -769,6 +813,8 @@ public final OperationFuture createInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String parent = ProjectName.of("[PROJECT]").toString();
    *   String instanceId = "instanceId902024336";
@@ -832,6 +878,8 @@ public final OperationFuture createInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   CreateInstanceRequest request =
    *       CreateInstanceRequest.newBuilder()
@@ -886,6 +934,8 @@ public final OperationFuture createInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   CreateInstanceRequest request =
    *       CreateInstanceRequest.newBuilder()
@@ -940,6 +990,8 @@ public final OperationFuture createInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   CreateInstanceRequest request =
    *       CreateInstanceRequest.newBuilder()
@@ -997,6 +1049,8 @@ public final UnaryCallable createInstanceCalla
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   Instance instance = Instance.newBuilder().build();
    *   FieldMask fieldMask = FieldMask.newBuilder().build();
@@ -1061,6 +1115,8 @@ public final OperationFuture updateInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   UpdateInstanceRequest request =
    *       UpdateInstanceRequest.newBuilder()
@@ -1118,6 +1174,8 @@ public final OperationFuture updateInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   UpdateInstanceRequest request =
    *       UpdateInstanceRequest.newBuilder()
@@ -1175,6 +1233,8 @@ public final OperationFuture updateInstanceAsy
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   UpdateInstanceRequest request =
    *       UpdateInstanceRequest.newBuilder()
@@ -1208,6 +1268,8 @@ public final UnaryCallable updateInstanceCalla
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   InstanceName name = InstanceName.of("[PROJECT]", "[INSTANCE]");
    *   instanceAdminClient.deleteInstance(name);
@@ -1240,6 +1302,8 @@ public final void deleteInstance(InstanceName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String name = InstanceName.of("[PROJECT]", "[INSTANCE]").toString();
    *   instanceAdminClient.deleteInstance(name);
@@ -1271,6 +1335,8 @@ public final void deleteInstance(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   DeleteInstanceRequest request =
    *       DeleteInstanceRequest.newBuilder()
@@ -1303,6 +1369,8 @@ public final void deleteInstance(DeleteInstanceRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   DeleteInstanceRequest request =
    *       DeleteInstanceRequest.newBuilder()
@@ -1328,6 +1396,8 @@ public final UnaryCallable deleteInstanceCallable(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ResourceName resource = ProjectName.of("[PROJECT]");
    *   Policy policy = Policy.newBuilder().build();
@@ -1361,6 +1431,8 @@ public final Policy setIamPolicy(ResourceName resource, Policy policy) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String resource = ProjectName.of("[PROJECT]").toString();
    *   Policy policy = Policy.newBuilder().build();
@@ -1391,11 +1463,14 @@ public final Policy setIamPolicy(String resource, Policy policy) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   SetIamPolicyRequest request =
    *       SetIamPolicyRequest.newBuilder()
    *           .setResource(ProjectName.of("[PROJECT]").toString())
    *           .setPolicy(Policy.newBuilder().build())
+   *           .setUpdateMask(FieldMask.newBuilder().build())
    *           .build();
    *   Policy response = instanceAdminClient.setIamPolicy(request);
    * }
@@ -1418,11 +1493,14 @@ public final Policy setIamPolicy(SetIamPolicyRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   SetIamPolicyRequest request =
    *       SetIamPolicyRequest.newBuilder()
    *           .setResource(ProjectName.of("[PROJECT]").toString())
    *           .setPolicy(Policy.newBuilder().build())
+   *           .setUpdateMask(FieldMask.newBuilder().build())
    *           .build();
    *   ApiFuture future = instanceAdminClient.setIamPolicyCallable().futureCall(request);
    *   // Do something.
@@ -1445,6 +1523,8 @@ public final UnaryCallable setIamPolicyCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ResourceName resource = ProjectName.of("[PROJECT]");
    *   Policy response = instanceAdminClient.getIamPolicy(resource);
@@ -1474,6 +1554,8 @@ public final Policy getIamPolicy(ResourceName resource) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String resource = ProjectName.of("[PROJECT]").toString();
    *   Policy response = instanceAdminClient.getIamPolicy(resource);
@@ -1500,6 +1582,8 @@ public final Policy getIamPolicy(String resource) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
@@ -1528,6 +1612,8 @@ public final Policy getIamPolicy(GetIamPolicyRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
@@ -1555,6 +1641,8 @@ public final UnaryCallable getIamPolicyCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   ResourceName resource = ProjectName.of("[PROJECT]");
    *   List permissions = new ArrayList<>();
@@ -1591,6 +1679,8 @@ public final TestIamPermissionsResponse testIamPermissions(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   String resource = ProjectName.of("[PROJECT]").toString();
    *   List permissions = new ArrayList<>();
@@ -1627,6 +1717,8 @@ public final TestIamPermissionsResponse testIamPermissions(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
@@ -1655,6 +1747,8 @@ public final TestIamPermissionsResponse testIamPermissions(TestIamPermissionsReq
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminSettings.java
index 13cce892be..dc2c2b81ef 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -74,6 +74,8 @@
  * 

For example, to set the total timeout of getInstanceConfig to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * InstanceAdminSettings.Builder instanceAdminSettingsBuilder = InstanceAdminSettings.newBuilder();
  * instanceAdminSettingsBuilder
  *     .getInstanceConfigSettings()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/package-info.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/package-info.java
index fcc5426dfe..385739e5c8 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/package-info.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,6 +40,8 @@
  * 

Sample for InstanceAdminClient: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (InstanceAdminClient instanceAdminClient = InstanceAdminClient.create()) {
  *   InstanceConfigName name = InstanceConfigName.of("[PROJECT]", "[INSTANCE_CONFIG]");
  *   InstanceConfig response = instanceAdminClient.getInstanceConfig(name);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminCallableFactory.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminCallableFactory.java
index 63cb836620..f4f9405403 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminCallableFactory.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminCallableFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminStub.java
index 1f6a7cb6b7..20cd1496cf 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/GrpcInstanceAdminStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStub.java
index ccd71babf2..dbc187aee6 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStubSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStubSettings.java
index 9f9cce8660..a9351322d1 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStubSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/instance/v1/stub/InstanceAdminStubSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -92,6 +92,8 @@
  * 

For example, to set the total timeout of getInstanceConfig to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * InstanceAdminStubSettings.Builder instanceAdminSettingsBuilder =
  *     InstanceAdminStubSettings.newBuilder();
  * instanceAdminSettingsBuilder
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractStatementParser.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractStatementParser.java
index 1465b8b402..b2b94c0213 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractStatementParser.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/AbstractStatementParser.java
@@ -320,7 +320,7 @@ ClientSideStatement getClientSideStatement() {
     }
   }
 
-  static final Set ddlStatements = ImmutableSet.of("CREATE", "DROP", "ALTER");
+  static final Set ddlStatements = ImmutableSet.of("CREATE", "DROP", "ALTER", "ANALYZE");
   static final Set selectStatements = ImmutableSet.of("SELECT", "WITH", "SHOW");
   static final Set dmlStatements = ImmutableSet.of("INSERT", "UPDATE", "DELETE");
   private final Set statements;
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementExplainExecutor.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementExplainExecutor.java
new file mode 100644
index 0000000000..7ce201cb0b
--- /dev/null
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementExplainExecutor.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection;
+
+import com.google.cloud.spanner.ErrorCode;
+import com.google.cloud.spanner.SpannerExceptionFactory;
+import com.google.cloud.spanner.connection.ClientSideStatementImpl.CompileException;
+import com.google.cloud.spanner.connection.ClientSideStatementValueConverters.ExplainCommandConverter;
+import com.google.common.collect.ImmutableSet;
+import java.lang.reflect.Method;
+import java.util.Set;
+import java.util.regex.Matcher;
+
+/** Specific executor for the EXPLAIN statement for PostgreSQL. */
+class ClientSideStatementExplainExecutor implements ClientSideStatementExecutor {
+  private final ClientSideStatementImpl statement;
+  private final Method method;
+  private final ExplainCommandConverter converter;
+  public static final Set EXPLAIN_OPTIONS =
+      ImmutableSet.of(
+          "verbose", "costs", "settings", "buffers", "wal", "timing", "summary", "format");
+
+  ClientSideStatementExplainExecutor(ClientSideStatementImpl statement) throws CompileException {
+    try {
+      this.statement = statement;
+      this.converter = new ExplainCommandConverter();
+      this.method =
+          ConnectionStatementExecutor.class.getDeclaredMethod(
+              statement.getMethodName(), converter.getParameterClass());
+    } catch (Exception e) {
+      throw new CompileException(e, statement);
+    }
+  }
+
+  @Override
+  public StatementResult execute(ConnectionStatementExecutor connection, String sql)
+      throws Exception {
+    return (StatementResult) method.invoke(connection, getParameterValue(sql));
+  }
+
+  String getParameterValue(String sql) {
+    Matcher matcher = statement.getPattern().matcher(sql);
+    if (matcher.find() && matcher.groupCount() >= 1) {
+      String value = matcher.group(0);
+      if (value != null) {
+        String res = converter.convert(value.trim());
+        if (res != null) {
+          return res;
+        }
+        throw SpannerExceptionFactory.newSpannerException(
+            ErrorCode.INVALID_ARGUMENT, String.format("Invalid argument for EXPLAIN: %s", value));
+      }
+    }
+    return null;
+  }
+}
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java
index 2e5dab87fb..a2b011eac6 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java
@@ -342,4 +342,23 @@ public Priority convert(String value) {
       return values.get("PRIORITY_" + value);
     }
   }
+
+  static class ExplainCommandConverter implements ClientSideStatementValueConverter {
+    @Override
+    public Class getParameterClass() {
+      return String.class;
+    }
+
+    @Override
+    public String convert(String value) {
+      /* The first word in the string should be "explain"
+       *  So, if the size of the string <= 7 (number of letters in the word "explain"), its an invalid statement
+       *  If the size is greater than 7, we'll consider everything after explain as the query.
+       */
+      if (value.length() <= 7) {
+        return null;
+      }
+      return value.substring(7).trim();
+    }
+  }
 }
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
index e3a5f7edbc..04ea893cb9 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
@@ -37,6 +37,7 @@
 import com.google.cloud.spanner.TimestampBound;
 import com.google.cloud.spanner.connection.StatementResult.ResultType;
 import com.google.spanner.v1.ExecuteBatchDmlRequest;
+import com.google.spanner.v1.ResultSetStats;
 import java.util.Iterator;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -922,7 +923,8 @@ default RpcPriority getRPCPriority() {
   AsyncResultSet executeQueryAsync(Statement query, QueryOption... options);
 
   /**
-   * Analyzes a query and returns query plan and/or query execution statistics information.
+   * Analyzes a query or a DML statement and returns query plan and/or query execution statistics
+   * information.
    *
    * 

The query plan and query statistics information is contained in {@link * com.google.spanner.v1.ResultSetStats} that can be accessed by calling {@link @@ -957,6 +959,18 @@ default RpcPriority getRPCPriority() { */ long executeUpdate(Statement update); + /** + * Analyzes a DML statement and returns query plan and/or execution statistics information. + * + *

{@link com.google.cloud.spanner.ReadContext.QueryAnalyzeMode#PLAN} only returns the plan for + * the statement. {@link com.google.cloud.spanner.ReadContext.QueryAnalyzeMode#PROFILE} executes + * the DML statement, returns the modified row count and execution statistics, and the effects of + * the DML statement will be visible to subsequent operations in the transaction. + */ + default ResultSetStats analyzeUpdate(Statement update, QueryAnalyzeMode analyzeMode) { + throw new UnsupportedOperationException("Not implemented"); + } + /** * Executes the given statement asynchronously as a DML statement. If the statement does not * contain a valid DML statement, the method will throw a {@link SpannerException}. diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java index 6770cf42d9..c6251e64db 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java @@ -48,6 +48,7 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.MoreExecutors; import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions; +import com.google.spanner.v1.ResultSetStats; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -293,13 +294,20 @@ public void close() { public ApiFuture closeAsync() { if (!isClosed()) { List> futures = new ArrayList<>(); + if (isBatchActive()) { + abortBatch(); + } if (isTransactionStarted()) { - futures.add(rollbackAsync()); + try { + futures.add(rollbackAsync()); + } catch (Exception exception) { + // ignore and continue to close the connection. + } } // Try to wait for the current statement to finish (if any) before we actually close the // connection. this.closed = true; - // Add a no-op statement to the execute. Once this has been executed, we know that all + // Add a no-op statement to the executor. Once this has been executed, we know that all // preceding statements have also been executed, as the executor is single-threaded and // executes all statements in order of submitting. futures.add(statementExecutor.submit(() -> null)); @@ -970,6 +978,7 @@ public long executeUpdate(Statement update) { "Statement is not an update statement: " + parsedStatement.getSqlWithoutComments()); } + @Override public ApiFuture executeUpdateAsync(Statement update) { Preconditions.checkNotNull(update); ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); @@ -990,6 +999,27 @@ public ApiFuture executeUpdateAsync(Statement update) { "Statement is not an update statement: " + parsedStatement.getSqlWithoutComments()); } + @Override + public ResultSetStats analyzeUpdate(Statement update, QueryAnalyzeMode analyzeMode) { + Preconditions.checkNotNull(update); + ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); + ParsedStatement parsedStatement = getStatementParser().parse(update); + if (parsedStatement.isUpdate()) { + switch (parsedStatement.getType()) { + case UPDATE: + return get(internalAnalyzeUpdateAsync(parsedStatement, AnalyzeMode.of(analyzeMode))); + case CLIENT_SIDE: + case QUERY: + case DDL: + case UNKNOWN: + default: + } + } + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, + "Statement is not an update statement: " + parsedStatement.getSqlWithoutComments()); + } + @Override public long[] executeBatchUpdate(Iterable updates) { Preconditions.checkNotNull(updates); @@ -1101,7 +1131,9 @@ private ResultSet internalExecuteQuery( final AnalyzeMode analyzeMode, final QueryOption... options) { Preconditions.checkArgument( - statement.getType() == StatementType.QUERY, "Statement must be a query"); + statement.getType() == StatementType.QUERY + || (statement.getType() == StatementType.UPDATE && analyzeMode != AnalyzeMode.NONE), + "Statement must either be a query or a DML mode with analyzeMode!=NONE"); UnitOfWork transaction = getCurrentUnitOfWorkOrStartNewUnitOfWork(); return get( transaction.executeQueryAsync( @@ -1131,6 +1163,15 @@ private ApiFuture internalExecuteUpdateAsync( update, mergeUpdateRequestOptions(mergeUpdateStatementTag(options))); } + private ApiFuture internalAnalyzeUpdateAsync( + final ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + Preconditions.checkArgument( + update.getType() == StatementType.UPDATE, "Statement must be an update"); + UnitOfWork transaction = getCurrentUnitOfWorkOrStartNewUnitOfWork(); + return transaction.analyzeUpdateAsync( + update, analyzeMode, mergeUpdateRequestOptions(mergeUpdateStatementTag(options))); + } + private ApiFuture internalExecuteBatchUpdateAsync( List updates, UpdateOption... options) { UnitOfWork transaction = getCurrentUnitOfWorkOrStartNewUnitOfWork(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutor.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutor.java index 2d3da27e90..25809823f0 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutor.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutor.java @@ -111,4 +111,6 @@ StatementResult statementSetPgSessionCharacteristicsTransactionMode( StatementResult statementShowRPCPriority(); StatementResult statementShowTransactionIsolationLevel(); + + StatementResult statementExplain(String sql); } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutorImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutorImpl.java index 15da7d0553..18aee5e98f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutorImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionStatementExecutorImpl.java @@ -59,9 +59,13 @@ import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.CommitStats; import com.google.cloud.spanner.Dialect; +import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Options.RpcPriority; +import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.ResultSets; +import com.google.cloud.spanner.SpannerExceptionFactory; +import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.Struct; import com.google.cloud.spanner.TimestampBound; import com.google.cloud.spanner.Type; @@ -71,8 +75,11 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.protobuf.Duration; +import com.google.spanner.v1.PlanNode; +import com.google.spanner.v1.QueryPlan; import com.google.spanner.v1.RequestOptions; import com.google.spanner.v1.RequestOptions.Priority; +import java.util.ArrayList; import java.util.Collections; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -83,6 +90,7 @@ * calls are then forwarded into a {@link Connection}. */ class ConnectionStatementExecutorImpl implements ConnectionStatementExecutor { + static final class StatementTimeoutGetter implements DurationValueGetter { private final Connection connection; @@ -442,4 +450,196 @@ public StatementResult statementShowRPCPriority() { public StatementResult statementShowTransactionIsolationLevel() { return resultSet("transaction_isolation", "serializable", SHOW_TRANSACTION_ISOLATION_LEVEL); } + + private String processQueryPlan(PlanNode planNode) { + StringBuilder planNodeDescription = new StringBuilder(" : { "); + com.google.protobuf.Struct metadata = planNode.getMetadata(); + + for (String key : metadata.getFieldsMap().keySet()) { + planNodeDescription + .append(key) + .append(" : ") + .append(metadata.getFieldsMap().get(key).getStringValue()) + .append(" , "); + } + String substring = planNodeDescription.substring(0, planNodeDescription.length() - 3); + planNodeDescription.setLength(0); + planNodeDescription.append(substring).append(" }"); + + return planNodeDescription.toString(); + } + + private String processExecutionStats(PlanNode planNode) { + StringBuilder executionStats = new StringBuilder(""); + for (String key : planNode.getExecutionStats().getFieldsMap().keySet()) { + executionStats.append(key).append(" : { "); + com.google.protobuf.Struct value = + planNode.getExecutionStats().getFieldsMap().get(key).getStructValue(); + for (String newKey : value.getFieldsMap().keySet()) { + String newValue = value.getFieldsMap().get(newKey).getStringValue(); + executionStats.append(newKey).append(" : ").append(newValue).append(" , "); + } + String substring = executionStats.substring(0, executionStats.length() - 3); + executionStats.setLength(0); + executionStats.append(substring).append(" } , "); + } + String substring = executionStats.substring(0, executionStats.length() - 3); + executionStats.setLength(0); + executionStats.append(substring); + return executionStats.toString(); + } + + private StatementResult getStatementResultFromQueryPlan(QueryPlan queryPlan, boolean isAnalyze) { + ArrayList list = new ArrayList<>(); + for (PlanNode planNode : queryPlan.getPlanNodesList()) { + String planNodeDescription = planNode.getDisplayName(); + String executionStats = ""; + + if (!planNode.getMetadata().toString().equalsIgnoreCase("")) { + planNodeDescription += processQueryPlan(planNode); + } + + if (!planNode.getShortRepresentation().toString().equalsIgnoreCase("")) { + planNodeDescription += " : " + planNode.getShortRepresentation().getDescription(); + } + + if (isAnalyze && !planNode.getExecutionStats().toString().equals("")) { + executionStats = processExecutionStats(planNode); + } + Struct.Builder builder = Struct.newBuilder().set("QUERY PLAN").to(planNodeDescription); + + if (isAnalyze) { + builder.set("EXECUTION STATS").to(executionStats); + } + list.add(builder.build()); + } + + ResultSet resultSet; + if (isAnalyze) { + resultSet = + ResultSets.forRows( + Type.struct( + StructField.of("QUERY PLAN", Type.string()), + StructField.of("EXECUTION STATS", Type.string())), + list); + } else { + resultSet = + ResultSets.forRows(Type.struct(StructField.of("QUERY PLAN", Type.string())), list); + } + return StatementResultImpl.of(resultSet); + } + + private StatementResult executeStatement(String sql, QueryAnalyzeMode queryAnalyzeMode) { + Statement statement = Statement.newBuilder(sql).build(); + try (ResultSet resultSet = getConnection().analyzeQuery(statement, queryAnalyzeMode)) { + while (resultSet.next()) { + // ResultSet.next() should return false in order to access the ResultSet.Stats + } + + if (resultSet.getStats() != null && resultSet.getStats().getQueryPlan() != null) { + return getStatementResultFromQueryPlan( + resultSet.getStats().getQueryPlan(), queryAnalyzeMode.equals(QueryAnalyzeMode.PROFILE)); + } + } + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, String.format("Couldn't fetch stats for %s", sql)); + } + + // This method removes parenthesis from the sql string assuming it is ending with the closing + // parenthesis + private String removeParenthesisAndTrim(String sql) { + sql = sql.trim(); + if (sql.charAt(0) == '(') { + sql = sql.substring(1, sql.length() - 1); + } + return sql.trim(); + } + + /* + * This method executes the given SQL string in either PLAN or PROFILE mode and returns + * the query plan and execution stats (if necessary). + * + * The only additional option that is supported is ANALYZE. The method will throw a SpannerException + * if it is invoked with a statement that includes any other options. + * + * If the SQL string has ANALYZE option, it will be executed in PROFILE mode and will return a resultset + * with two String columns namely QUERY PLAN and EXECUTION STATS. + * + * If the sql string doesn't have any option, it will be executed in PLAN mode and will return a resultset + * with one string column namely QUERY PLAN. + */ + @Override + public StatementResult statementExplain(String sql) { + if (sql == null) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, String.format("Invalid String with Explain")); + } + + if (sql.charAt(0) == '(') { + int index = sql.indexOf(')'); + if (index == -1) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, + String.format("Missing closing parenthesis in the query: %s", sql)); + } + String options[] = sql.substring(1, index).split("\\s*,\\s*"); + boolean isAnalyze = false, startAfterIndex = false; + for (String option : options) { + String optionExpression[] = option.trim().split("\\s+"); + if (optionExpression.length >= 3) { + isAnalyze = false; + break; + } else if (ClientSideStatementExplainExecutor.EXPLAIN_OPTIONS.contains( + optionExpression[0].toLowerCase())) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.UNIMPLEMENTED, + String.format("%s is not implemented yet", optionExpression[0])); + } else if (optionExpression[0].equalsIgnoreCase("analyse") + || optionExpression[0].equalsIgnoreCase("analyze")) { + isAnalyze = true; + } else { + isAnalyze = false; + break; + } + + if (optionExpression.length == 2) { + if (optionExpression[1].equalsIgnoreCase("false") + || optionExpression[1].equalsIgnoreCase("0") + || optionExpression[1].equalsIgnoreCase("off")) { + isAnalyze = false; + startAfterIndex = true; + } else if (!(optionExpression[1].equalsIgnoreCase("true") + || optionExpression[1].equalsIgnoreCase("1") + || optionExpression[1].equalsIgnoreCase("on"))) { + isAnalyze = false; + break; + } + } + } + if (isAnalyze) { + String newSql = removeParenthesisAndTrim(sql.substring(index + 1)); + return executeStatement(newSql, QueryAnalyzeMode.PROFILE); + } else if (startAfterIndex) { + String newSql = removeParenthesisAndTrim(sql.substring(index + 1)); + return executeStatement(newSql, QueryAnalyzeMode.PLAN); + } else { + return executeStatement(removeParenthesisAndTrim(sql), QueryAnalyzeMode.PLAN); + } + } else { + String[] arr = sql.split("\\s+", 2); + if (arr.length >= 2) { + String option = arr[0].toLowerCase(); + String statementToBeExplained = arr[1]; + + if (ClientSideStatementExplainExecutor.EXPLAIN_OPTIONS.contains(option)) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.UNIMPLEMENTED, String.format("%s is not implemented yet", option)); + } else if (option.equals("analyze") || option.equals("analyse")) { + return executeStatement( + removeParenthesisAndTrim(statementToBeExplained), QueryAnalyzeMode.PROFILE); + } + } + return executeStatement(sql, QueryAnalyzeMode.PLAN); + } + } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlBatch.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlBatch.java index 0a34e6b576..31a07f0573 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlBatch.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlBatch.java @@ -38,6 +38,7 @@ import com.google.common.base.Preconditions; import com.google.spanner.admin.database.v1.DatabaseAdminGrpc; import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata; +import com.google.spanner.v1.ResultSetStats; import com.google.spanner.v1.SpannerGrpc; import java.util.ArrayList; import java.util.Arrays; @@ -201,6 +202,13 @@ public ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption.. ErrorCode.FAILED_PRECONDITION, "Executing updates is not allowed for DDL batches."); } + @Override + public ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, "Analyzing updates is not allowed for DDL batches."); + } + @Override public ApiFuture executeBatchUpdateAsync( Iterable updates, UpdateOption... options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DmlBatch.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DmlBatch.java index d2224f98ad..960f95b44d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DmlBatch.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DmlBatch.java @@ -33,6 +33,7 @@ import com.google.cloud.spanner.connection.AbstractStatementParser.StatementType; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.MoreExecutors; +import com.google.spanner.v1.ResultSetStats; import java.util.ArrayList; import java.util.List; @@ -161,6 +162,13 @@ public ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption.. return ApiFutures.immediateFuture(-1L); } + @Override + public ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, "Analyzing updates is not allowed for DML batches."); + } + @Override public ApiFuture executeBatchUpdateAsync( Iterable updates, UpdateOption... options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadOnlyTransaction.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadOnlyTransaction.java index f473133667..dd14ad5bee 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadOnlyTransaction.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadOnlyTransaction.java @@ -30,6 +30,7 @@ import com.google.cloud.spanner.TimestampBound; import com.google.cloud.spanner.connection.AbstractStatementParser.ParsedStatement; import com.google.common.base.Preconditions; +import com.google.spanner.v1.ResultSetStats; /** * Transaction that is used when a {@link Connection} is in read-only mode or when the transaction @@ -163,6 +164,14 @@ public ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption.. "Update statements are not allowed for read-only transactions"); } + @Override + public ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, + "Analyzing updates is not allowed for read-only transactions"); + } + @Override public ApiFuture executeBatchUpdateAsync( Iterable updates, UpdateOption... options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadWriteTransaction.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadWriteTransaction.java index 822eb3b016..93d38f1793 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadWriteTransaction.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReadWriteTransaction.java @@ -51,6 +51,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.MoreExecutors; +import com.google.spanner.v1.ResultSetStats; import com.google.spanner.v1.SpannerGrpc; import java.util.ArrayList; import java.util.LinkedList; @@ -390,13 +391,27 @@ public void onSuccess(ResultSet result) {} return res; } + @Override + public ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + return internalExecuteUpdateAsync(update, analyzeMode, options); + } + @Override public ApiFuture executeUpdateAsync( final ParsedStatement update, final UpdateOption... options) { + return ApiFutures.transform( + internalExecuteUpdateAsync(update, AnalyzeMode.NONE, options), + ResultSetStats::getRowCountExact, + MoreExecutors.directExecutor()); + } + + private ApiFuture internalExecuteUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { Preconditions.checkNotNull(update); Preconditions.checkArgument(update.isUpdate(), "The statement is not an update statement"); checkValidTransaction(); - ApiFuture res; + ApiFuture res; if (retryAbortsInternally) { res = executeStatementAsync( @@ -411,9 +426,25 @@ public ApiFuture executeUpdateAsync( update, StatementExecutionStep.EXECUTE_STATEMENT, ReadWriteTransaction.this); - long updateCount = - get(txContextFuture).executeUpdate(update.getStatement(), options); - createAndAddRetriableUpdate(update, updateCount, options); + + ResultSetStats updateCount; + if (analyzeMode == AnalyzeMode.NONE) { + updateCount = + ResultSetStats.newBuilder() + .setRowCountExact( + get(txContextFuture) + .executeUpdate(update.getStatement(), options)) + .build(); + } else { + updateCount = + get(txContextFuture) + .analyzeUpdate( + update.getStatement(), + analyzeMode.getQueryAnalyzeMode(), + options); + } + createAndAddRetriableUpdate( + update, updateCount.getRowCountExact(), options); return updateCount; } catch (AbortedException e) { throw e; @@ -433,13 +464,21 @@ public ApiFuture executeUpdateAsync( () -> { checkTimedOut(); checkAborted(); - return get(txContextFuture).executeUpdate(update.getStatement()); + if (analyzeMode == AnalyzeMode.NONE) { + return ResultSetStats.newBuilder() + .setRowCountExact( + get(txContextFuture).executeUpdate(update.getStatement(), options)) + .build(); + } + return get(txContextFuture) + .analyzeUpdate( + update.getStatement(), analyzeMode.getQueryAnalyzeMode(), options); }, SpannerGrpc.getExecuteSqlMethod()); } ApiFutures.addCallback( res, - new ApiFutureCallback() { + new ApiFutureCallback() { @Override public void onFailure(Throwable t) { if (t instanceof SpannerException) { @@ -448,7 +487,7 @@ public void onFailure(Throwable t) { } @Override - public void onSuccess(Long result) {} + public void onSuccess(ResultSetStats result) {} }, MoreExecutors.directExecutor()); return res; diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SingleUseTransaction.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SingleUseTransaction.java index 2747b07778..9646c7c9c9 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SingleUseTransaction.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SingleUseTransaction.java @@ -20,6 +20,7 @@ import static com.google.cloud.spanner.connection.AbstractStatementParser.RUN_BATCH_STATEMENT; import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; import com.google.api.core.SettableApiFuture; import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.Timestamp; @@ -43,7 +44,9 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.MoreExecutors; import com.google.spanner.admin.database.v1.DatabaseAdminGrpc; +import com.google.spanner.v1.ResultSetStats; import com.google.spanner.v1.SpannerGrpc; import java.util.concurrent.Callable; @@ -175,9 +178,15 @@ public ApiFuture executeQueryAsync( final AnalyzeMode analyzeMode, final QueryOption... options) { Preconditions.checkNotNull(statement); - Preconditions.checkArgument(statement.isQuery(), "Statement is not a query"); + Preconditions.checkArgument( + statement.isQuery() || (statement.isUpdate() && analyzeMode != AnalyzeMode.NONE), + "The statement must be a query, or the statement must be DML and AnalyzeMode must be PLAN or PROFILE"); checkAndMarkUsed(); + if (statement.isUpdate() && analyzeMode != AnalyzeMode.NONE) { + return analyzeTransactionalUpdateAsync(statement, analyzeMode); + } + final ReadOnlyTransaction currentTransaction = dbClient.singleUseReadOnlyTransaction(readOnlyStaleness); Callable callable = @@ -299,7 +308,11 @@ public ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption.. ApiFuture res; switch (autocommitDmlMode) { case TRANSACTIONAL: - res = executeTransactionalUpdateAsync(update, options); + res = + ApiFutures.transform( + executeTransactionalUpdateAsync(update, AnalyzeMode.NONE, options), + ResultSetStats::getRowCountExact, + MoreExecutors.directExecutor()); break; case PARTITIONED_NON_ATOMIC: res = executePartitionedUpdateAsync(update, options); @@ -311,6 +324,21 @@ public ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption.. return res; } + @Override + public ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options) { + Preconditions.checkNotNull(update); + Preconditions.checkArgument(update.isUpdate(), "Statement is not an update statement"); + ConnectionPreconditions.checkState( + !isReadOnly(), "Update statements are not allowed in read-only mode"); + ConnectionPreconditions.checkState( + autocommitDmlMode != AutocommitDmlMode.PARTITIONED_NON_ATOMIC, + "Analyzing update statements is not supported for Partitioned DML"); + checkAndMarkUsed(); + + return executeTransactionalUpdateAsync(update, analyzeMode, options); + } + @Override public ApiFuture executeBatchUpdateAsync( Iterable updates, UpdateOption... options) { @@ -358,15 +386,24 @@ private TransactionRunner createWriteTransaction() { return dbClient.readWriteTransaction(options); } - private ApiFuture executeTransactionalUpdateAsync( - final ParsedStatement update, final UpdateOption... options) { - Callable callable = + private ApiFuture executeTransactionalUpdateAsync( + final ParsedStatement update, AnalyzeMode analyzeMode, final UpdateOption... options) { + Callable callable = () -> { try { writeTransaction = createWriteTransaction(); - Long res = + ResultSetStats res = writeTransaction.run( - transaction -> transaction.executeUpdate(update.getStatement(), options)); + transaction -> { + if (analyzeMode == AnalyzeMode.NONE) { + return ResultSetStats.newBuilder() + .setRowCountExact( + transaction.executeUpdate(update.getStatement(), options)) + .build(); + } + return transaction.analyzeUpdate( + update.getStatement(), analyzeMode.getQueryAnalyzeMode(), options); + }); state = UnitOfWorkState.COMMITTED; return res; } catch (Throwable t) { @@ -380,6 +417,31 @@ private ApiFuture executeTransactionalUpdateAsync( ImmutableList.of(SpannerGrpc.getExecuteSqlMethod(), SpannerGrpc.getCommitMethod())); } + private ApiFuture analyzeTransactionalUpdateAsync( + final ParsedStatement update, AnalyzeMode analyzeMode) { + Callable callable = + () -> { + try { + writeTransaction = createWriteTransaction(); + ResultSet resultSet = + writeTransaction.run( + transaction -> + DirectExecuteResultSet.ofResultSet( + transaction.analyzeQuery( + update.getStatement(), analyzeMode.getQueryAnalyzeMode()))); + state = UnitOfWorkState.COMMITTED; + return resultSet; + } catch (Throwable t) { + state = UnitOfWorkState.COMMIT_FAILED; + throw t; + } + }; + return executeStatementAsync( + update, + callable, + ImmutableList.of(SpannerGrpc.getExecuteSqlMethod(), SpannerGrpc.getCommitMethod())); + } + private ApiFuture executePartitionedUpdateAsync( final ParsedStatement update, final UpdateOption... options) { Callable callable = diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementResult.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementResult.java index 71a9a88cab..dea97b2b1f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementResult.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementResult.java @@ -83,7 +83,8 @@ enum ClientSideStatementType { ABORT_BATCH, SET_RPC_PRIORITY, SHOW_RPC_PRIORITY, - SHOW_TRANSACTION_ISOLATION_LEVEL + SHOW_TRANSACTION_ISOLATION_LEVEL, + EXPLAIN } /** diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/UnitOfWork.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/UnitOfWork.java index cf68f4ddaf..bb90866c89 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/UnitOfWork.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/UnitOfWork.java @@ -177,6 +177,18 @@ ApiFuture executeQueryAsync( */ ApiFuture executeUpdateAsync(ParsedStatement update, UpdateOption... options); + /** + * Execute a DML statement on Spanner. + * + * @param update The DML statement to execute. + * @param analyzeMode Specifies the query/analyze mode to use for the DML statement. + * @param options Update options to apply for the statement. + * @return an {@link ApiFuture} containing the {@link ResultSetStats} that were returned by this + * statement. + */ + ApiFuture analyzeUpdateAsync( + ParsedStatement update, AnalyzeMode analyzeMode, UpdateOption... options); + /** * Execute a batch of DML statements on Spanner. * diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerClient.java index f9ea725bb4..62fc1d3886 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,6 +73,8 @@ * calls that map to API methods. Sample code to get started: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (SpannerClient spannerClient = SpannerClient.create()) {
  *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
  *   Session response = spannerClient.createSession(database);
@@ -108,6 +110,8 @@
  * 

To customize credentials: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * SpannerSettings spannerSettings =
  *     SpannerSettings.newBuilder()
  *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
@@ -118,6 +122,8 @@
  * 

To customize the endpoint: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * SpannerSettings spannerSettings = SpannerSettings.newBuilder().setEndpoint(myEndpoint).build();
  * SpannerClient spannerClient = SpannerClient.create(spannerSettings);
  * }
@@ -196,6 +202,8 @@ public SpannerStub getStub() { *

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   Session response = spannerClient.createSession(database);
@@ -234,6 +242,8 @@ public final Session createSession(DatabaseName database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   Session response = spannerClient.createSession(database);
@@ -269,6 +279,8 @@ public final Session createSession(String database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   CreateSessionRequest request =
    *       CreateSessionRequest.newBuilder()
@@ -307,6 +319,8 @@ public final Session createSession(CreateSessionRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   CreateSessionRequest request =
    *       CreateSessionRequest.newBuilder()
@@ -333,6 +347,8 @@ public final UnaryCallable createSessionCallable(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   int sessionCount = 185691686;
@@ -368,6 +384,8 @@ public final BatchCreateSessionsResponse batchCreateSessions(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   int sessionCount = 185691686;
@@ -402,6 +420,8 @@ public final BatchCreateSessionsResponse batchCreateSessions(String database, in
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   BatchCreateSessionsRequest request =
    *       BatchCreateSessionsRequest.newBuilder()
@@ -430,6 +450,8 @@ public final BatchCreateSessionsResponse batchCreateSessions(BatchCreateSessions
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   BatchCreateSessionsRequest request =
    *       BatchCreateSessionsRequest.newBuilder()
@@ -457,6 +479,8 @@ public final BatchCreateSessionsResponse batchCreateSessions(BatchCreateSessions
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName name = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   Session response = spannerClient.getSession(name);
@@ -480,6 +504,8 @@ public final Session getSession(SessionName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String name = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
    *   Session response = spannerClient.getSession(name);
@@ -502,6 +528,8 @@ public final Session getSession(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   GetSessionRequest request =
    *       GetSessionRequest.newBuilder()
@@ -527,6 +555,8 @@ public final Session getSession(GetSessionRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   GetSessionRequest request =
    *       GetSessionRequest.newBuilder()
@@ -550,6 +580,8 @@ public final UnaryCallable getSessionCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
    *   for (Session element : spannerClient.listSessions(database).iterateAll()) {
@@ -576,6 +608,8 @@ public final ListSessionsPagedResponse listSessions(DatabaseName database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]").toString();
    *   for (Session element : spannerClient.listSessions(database).iterateAll()) {
@@ -599,6 +633,8 @@ public final ListSessionsPagedResponse listSessions(String database) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ListSessionsRequest request =
    *       ListSessionsRequest.newBuilder()
@@ -627,6 +663,8 @@ public final ListSessionsPagedResponse listSessions(ListSessionsRequest request)
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ListSessionsRequest request =
    *       ListSessionsRequest.newBuilder()
@@ -655,6 +693,8 @@ public final ListSessionsPagedResponse listSessions(ListSessionsRequest request)
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ListSessionsRequest request =
    *       ListSessionsRequest.newBuilder()
@@ -690,6 +730,8 @@ public final UnaryCallable listSessio
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName name = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   spannerClient.deleteSession(name);
@@ -713,6 +755,8 @@ public final void deleteSession(SessionName name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String name = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
    *   spannerClient.deleteSession(name);
@@ -735,6 +779,8 @@ public final void deleteSession(String name) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   DeleteSessionRequest request =
    *       DeleteSessionRequest.newBuilder()
@@ -760,6 +806,8 @@ public final void deleteSession(DeleteSessionRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   DeleteSessionRequest request =
    *       DeleteSessionRequest.newBuilder()
@@ -792,6 +840,8 @@ public final UnaryCallable deleteSessionCallable()
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ExecuteSqlRequest request =
    *       ExecuteSqlRequest.newBuilder()
@@ -834,6 +884,8 @@ public final ResultSet executeSql(ExecuteSqlRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ExecuteSqlRequest request =
    *       ExecuteSqlRequest.newBuilder()
@@ -869,6 +921,8 @@ public final UnaryCallable executeSqlCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ExecuteSqlRequest request =
    *       ExecuteSqlRequest.newBuilder()
@@ -913,6 +967,8 @@ public final UnaryCallable executeSqlCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ExecuteBatchDmlRequest request =
    *       ExecuteBatchDmlRequest.newBuilder()
@@ -950,6 +1006,8 @@ public final ExecuteBatchDmlResponse executeBatchDml(ExecuteBatchDmlRequest requ
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ExecuteBatchDmlRequest request =
    *       ExecuteBatchDmlRequest.newBuilder()
@@ -989,6 +1047,8 @@ public final ExecuteBatchDmlResponse executeBatchDml(ExecuteBatchDmlRequest requ
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ReadRequest request =
    *       ReadRequest.newBuilder()
@@ -1032,6 +1092,8 @@ public final ResultSet read(ReadRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ReadRequest request =
    *       ReadRequest.newBuilder()
@@ -1067,6 +1129,8 @@ public final UnaryCallable readCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   ReadRequest request =
    *       ReadRequest.newBuilder()
@@ -1102,6 +1166,8 @@ public final ServerStreamingCallable streamingRea
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName session = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   TransactionOptions options = TransactionOptions.newBuilder().build();
@@ -1131,6 +1197,8 @@ public final Transaction beginTransaction(SessionName session, TransactionOption
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String session =
    *       SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
@@ -1158,6 +1226,8 @@ public final Transaction beginTransaction(String session, TransactionOptions opt
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   BeginTransactionRequest request =
    *       BeginTransactionRequest.newBuilder()
@@ -1186,6 +1256,8 @@ public final Transaction beginTransaction(BeginTransactionRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   BeginTransactionRequest request =
    *       BeginTransactionRequest.newBuilder()
@@ -1222,6 +1294,8 @@ public final UnaryCallable beginTransactio
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName session = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   ByteString transactionId = ByteString.EMPTY;
@@ -1265,6 +1339,8 @@ public final CommitResponse commit(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName session = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   TransactionOptions singleUseTransaction = TransactionOptions.newBuilder().build();
@@ -1314,6 +1390,8 @@ public final CommitResponse commit(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String session =
    *       SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
@@ -1358,6 +1436,8 @@ public final CommitResponse commit(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String session =
    *       SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
@@ -1408,6 +1488,8 @@ public final CommitResponse commit(
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   CommitRequest request =
    *       CommitRequest.newBuilder()
@@ -1446,6 +1528,8 @@ public final CommitResponse commit(CommitRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   CommitRequest request =
    *       CommitRequest.newBuilder()
@@ -1478,6 +1562,8 @@ public final UnaryCallable commitCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   SessionName session = SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]");
    *   ByteString transactionId = ByteString.EMPTY;
@@ -1511,6 +1597,8 @@ public final void rollback(SessionName session, ByteString transactionId) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   String session =
    *       SessionName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]").toString();
@@ -1542,6 +1630,8 @@ public final void rollback(String session, ByteString transactionId) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   RollbackRequest request =
    *       RollbackRequest.newBuilder()
@@ -1573,6 +1663,8 @@ public final void rollback(RollbackRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   RollbackRequest request =
    *       RollbackRequest.newBuilder()
@@ -1606,6 +1698,8 @@ public final UnaryCallable rollbackCallable() {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   PartitionQueryRequest request =
    *       PartitionQueryRequest.newBuilder()
@@ -1644,6 +1738,8 @@ public final PartitionResponse partitionQuery(PartitionQueryRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   PartitionQueryRequest request =
    *       PartitionQueryRequest.newBuilder()
@@ -1683,6 +1779,8 @@ public final UnaryCallable partitionQu
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   PartitionReadRequest request =
    *       PartitionReadRequest.newBuilder()
@@ -1723,6 +1821,8 @@ public final PartitionResponse partitionRead(PartitionReadRequest request) {
    * 

Sample code: * *

{@code
+   * // This snippet has been automatically generated for illustrative purposes only.
+   * // It may require modifications to work in your environment.
    * try (SpannerClient spannerClient = SpannerClient.create()) {
    *   PartitionReadRequest request =
    *       PartitionReadRequest.newBuilder()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerSettings.java
index 7954ce7fd6..6541b6528c 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/SpannerSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -76,6 +76,8 @@
  * 

For example, to set the total timeout of createSession to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * SpannerSettings.Builder spannerSettingsBuilder = SpannerSettings.newBuilder();
  * spannerSettingsBuilder
  *     .createSessionSettings()
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/package-info.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/package-info.java
index 656eaf03cd..bc57d4c62e 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/package-info.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,8 @@
  * 

Sample for SpannerClient: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * try (SpannerClient spannerClient = SpannerClient.create()) {
  *   DatabaseName database = DatabaseName.of("[PROJECT]", "[INSTANCE]", "[DATABASE]");
  *   Session response = spannerClient.createSession(database);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerCallableFactory.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerCallableFactory.java
index 3a16ff4801..e427ff1801 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerCallableFactory.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerCallableFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerStub.java
index 5983a3a9c5..0e99079a91 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStub.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStub.java
index 77719dfb94..7f7a4d95d4 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStub.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStubSettings.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStubSettings.java
index dfa85e2d85..f5cb1b7cc8 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStubSettings.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/SpannerStubSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -91,6 +91,8 @@
  * 

For example, to set the total timeout of createSession to 30 seconds: * *

{@code
+ * // This snippet has been automatically generated for illustrative purposes only.
+ * // It may require modifications to work in your environment.
  * SpannerStubSettings.Builder spannerSettingsBuilder = SpannerStubSettings.newBuilder();
  * spannerSettingsBuilder
  *     .createSessionSettings()
diff --git a/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/PG_ClientSideStatements.json b/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/PG_ClientSideStatements.json
index 281fc4792d..9e9ce15998 100644
--- a/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/PG_ClientSideStatements.json
+++ b/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/PG_ClientSideStatements.json
@@ -149,6 +149,15 @@
       "method": "statementShowTransactionIsolationLevel",
       "exampleStatements": ["show transaction isolation level","show variable transaction isolation level"]
     },
+    {
+      "name": "EXPLAIN ",
+      "executorName": "ClientSideStatementExplainExecutor",
+      "resultType": "RESULT_SET",
+      "statementType": "EXPLAIN",
+      "regex": "(?is)\\A\\s*explain(\\s+|\\()(.*)\\z",
+      "method": "statementExplain",
+      "exampleStatements": []
+    },
     {
       "name": "{START | BEGIN} [TRANSACTION | WORK] [{ (READ ONLY|READ WRITE) | (ISOLATION LEVEL (DEFAULT|SERIALIZABLE)) }]",
       "executorName": "ClientSideStatementPgBeginExecutor",
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java
index 3de9f5358a..9161b1da56 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java
@@ -180,7 +180,7 @@ private void cleanUpOldDatabases(InstanceId instanceId) {
     while (page != null) {
       for (Database db : page.iterateAll()) {
         try {
-          long timeDiff = db.getCreateTime().getSeconds() - currentTimestamp.getSeconds();
+          long timeDiff = currentTimestamp.getSeconds() - db.getCreateTime().getSeconds();
           // Delete all databases which are more than OLD_DB_THRESHOLD_SECS seconds
           // old.
           if ((db.getId().getDatabase().matches(TEST_DB_REGEX))
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
index 04cf3af641..44942bb566 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
@@ -217,6 +217,9 @@ public PartialResultSet next() {
         recordCount++;
         currentRow++;
       }
+      if (currentRow == resultSet.getRowsCount()) {
+        builder.setStats(resultSet.getStats());
+      }
       builder.setResumeToken(ByteString.copyFromUtf8(String.format("%09d", currentRow)));
       hasNext = currentRow < resultSet.getRowsCount();
       return builder.build();
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClientTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClientTest.java
index 4f6d204035..d018c53e95 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClientTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
 import com.google.api.gax.rpc.StatusCode;
 import com.google.api.resourcenames.ResourceName;
 import com.google.common.collect.Lists;
+import com.google.iam.v1.AuditConfig;
 import com.google.iam.v1.Binding;
 import com.google.iam.v1.GetIamPolicyRequest;
 import com.google.iam.v1.Policy;
@@ -656,6 +657,7 @@ public void setIamPolicyTest() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockDatabaseAdmin.addResponse(expectedResponse);
@@ -699,6 +701,7 @@ public void setIamPolicyTest2() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockDatabaseAdmin.addResponse(expectedResponse);
@@ -742,6 +745,7 @@ public void getIamPolicyTest() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockDatabaseAdmin.addResponse(expectedResponse);
@@ -782,6 +786,7 @@ public void getIamPolicyTest2() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockDatabaseAdmin.addResponse(expectedResponse);
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdmin.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdmin.java
index 652b7fbd19..ed3dc44115 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdmin.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdmin.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdminImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdminImpl.java
index ce169fef29..7768ba3263 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdminImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/database/v1/MockDatabaseAdminImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClientTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClientTest.java
index 929de268de..323ebb4037 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClientTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/InstanceAdminClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
 import com.google.api.gax.rpc.StatusCode;
 import com.google.api.resourcenames.ResourceName;
 import com.google.common.collect.Lists;
+import com.google.iam.v1.AuditConfig;
 import com.google.iam.v1.Binding;
 import com.google.iam.v1.GetIamPolicyRequest;
 import com.google.iam.v1.Policy;
@@ -701,6 +702,7 @@ public void setIamPolicyTest() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockInstanceAdmin.addResponse(expectedResponse);
@@ -744,6 +746,7 @@ public void setIamPolicyTest2() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockInstanceAdmin.addResponse(expectedResponse);
@@ -787,6 +790,7 @@ public void getIamPolicyTest() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockInstanceAdmin.addResponse(expectedResponse);
@@ -827,6 +831,7 @@ public void getIamPolicyTest2() throws Exception {
         Policy.newBuilder()
             .setVersion(351608024)
             .addAllBindings(new ArrayList())
+            .addAllAuditConfigs(new ArrayList())
             .setEtag(ByteString.EMPTY)
             .build();
     mockInstanceAdmin.addResponse(expectedResponse);
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdmin.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdmin.java
index 3f441d917e..e107d158b1 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdmin.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdmin.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdminImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdminImpl.java
index 3d0fcde6f5..85d1d5d2d6 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdminImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/admin/instance/v1/MockInstanceAdminImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AnalyzeStatementsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AnalyzeStatementsTest.java
new file mode 100644
index 0000000000..2039eb29b9
--- /dev/null
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AnalyzeStatementsTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import com.google.cloud.spanner.ErrorCode;
+import com.google.cloud.spanner.MockSpannerServiceImpl;
+import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode;
+import com.google.cloud.spanner.ResultSet;
+import com.google.cloud.spanner.SpannerException;
+import com.google.cloud.spanner.Statement;
+import com.google.spanner.v1.BeginTransactionRequest;
+import com.google.spanner.v1.CommitRequest;
+import com.google.spanner.v1.ExecuteSqlRequest;
+import com.google.spanner.v1.ExecuteSqlRequest.QueryMode;
+import com.google.spanner.v1.PlanNode;
+import com.google.spanner.v1.QueryPlan;
+import com.google.spanner.v1.ResultSetMetadata;
+import com.google.spanner.v1.ResultSetStats;
+import com.google.spanner.v1.StructType;
+import com.google.spanner.v1.StructType.Field;
+import com.google.spanner.v1.Type;
+import com.google.spanner.v1.TypeCode;
+import java.util.List;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class AnalyzeStatementsTest extends AbstractMockServerTest {
+  private static final Statement PLAN_QUERY =
+      Statement.of("SELECT * FROM SomeTable ORDER BY Value");
+  private static final Statement PLAN_UPDATE = Statement.of("UPDATE SomeTable SET Value=Value+1");
+
+  @BeforeClass
+  public static void setupAnalyzeResults() {
+    mockSpanner.putStatementResult(
+        MockSpannerServiceImpl.StatementResult.query(
+            PLAN_QUERY,
+            com.google.spanner.v1.ResultSet.newBuilder()
+                .setMetadata(
+                    ResultSetMetadata.newBuilder()
+                        .setRowType(
+                            StructType.newBuilder()
+                                .addFields(
+                                    Field.newBuilder()
+                                        .setType(Type.newBuilder().setCode(TypeCode.INT64).build())
+                                        .setName("Key")
+                                        .build())
+                                .addFields(
+                                    Field.newBuilder()
+                                        .setType(Type.newBuilder().setCode(TypeCode.STRING).build())
+                                        .setName("Value")
+                                        .build())
+                                .build())
+                        .build())
+                .setStats(
+                    ResultSetStats.newBuilder()
+                        .setQueryPlan(
+                            QueryPlan.newBuilder()
+                                .addPlanNodes(
+                                    PlanNode.newBuilder().setDisplayName("some-plan-node").build())
+                                .build())
+                        .build())
+                .build()));
+    mockSpanner.putStatementResults(
+        MockSpannerServiceImpl.StatementResult.query(
+            PLAN_UPDATE,
+            com.google.spanner.v1.ResultSet.newBuilder()
+                .setMetadata(ResultSetMetadata.newBuilder().build())
+                .setStats(
+                    ResultSetStats.newBuilder()
+                        .setQueryPlan(
+                            QueryPlan.newBuilder()
+                                .addPlanNodes(
+                                    PlanNode.newBuilder().setDisplayName("some-plan-node").build())
+                                .build())
+                        .build())
+                .build()));
+  }
+
+  @After
+  public void clearRequests() {
+    mockSpanner.clearRequests();
+  }
+
+  @Test
+  public void testAnalyzeQuery() {
+    for (boolean readOnly : new boolean[] {true, false}) {
+      for (boolean autocommit : new boolean[] {true, false}) {
+        mockSpanner.clearRequests();
+
+        try (Connection connection = createConnection()) {
+          connection.setAutocommit(autocommit);
+          connection.setReadOnly(readOnly);
+
+          try (ResultSet resultSet = connection.analyzeQuery(PLAN_QUERY, QueryAnalyzeMode.PLAN)) {
+            // Stats are only available after ResultSet#next() has returned false.
+            assertFalse(resultSet.next());
+
+            assertNotNull(resultSet.getStats());
+            assertNotNull(resultSet.getStats().getQueryPlan());
+          }
+        }
+
+        List requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class);
+        assertEquals(1, requests.size());
+        ExecuteSqlRequest request = requests.get(0);
+        assertEquals(PLAN_QUERY.getSql(), request.getSql());
+        assertEquals(QueryMode.PLAN, request.getQueryMode());
+        if (autocommit) {
+          // Autocommit should use a single-use read-only transaction.
+          assertTrue(request.getTransaction().hasSingleUse());
+          assertTrue(request.getTransaction().getSingleUse().hasReadOnly());
+        } else {
+          // Non-autocommit should start a transaction.
+          if (readOnly) {
+            // Read-only transaction begin is not inlined.
+            BeginTransactionRequest beginTransactionRequest =
+                mockSpanner.getRequestsOfType(BeginTransactionRequest.class).stream()
+                    .findFirst()
+                    .orElse(null);
+            assertNotNull(beginTransactionRequest);
+            assertTrue(beginTransactionRequest.getOptions().hasReadOnly());
+            assertTrue(request.getTransaction().hasId());
+          } else {
+            assertTrue(request.getTransaction().hasBegin());
+            assertTrue(request.getTransaction().getBegin().hasReadWrite());
+          }
+        }
+      }
+    }
+  }
+
+  @Test
+  public void testAnalyzeUpdate() {
+    for (boolean autocommit : new boolean[] {true, false}) {
+      mockSpanner.clearRequests();
+
+      try (Connection connection = createConnection()) {
+        connection.setAutocommit(autocommit);
+
+        ResultSetStats stats = connection.analyzeUpdate(PLAN_UPDATE, QueryAnalyzeMode.PLAN);
+        assertNotNull(stats);
+        assertNotNull(stats.getQueryPlan());
+      }
+
+      List requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class);
+      assertEquals(1, requests.size());
+      ExecuteSqlRequest request = requests.get(0);
+      assertEquals(PLAN_UPDATE.getSql(), request.getSql());
+      assertEquals(QueryMode.PLAN, request.getQueryMode());
+
+      // As it is a DML statement, we should always start a read/write transaction, even though it
+      // is not executed. This is required by Cloud Spanner.
+      assertTrue(request.getTransaction().hasBegin());
+      assertTrue(request.getTransaction().getBegin().hasReadWrite());
+
+      if (autocommit) {
+        // The read/write transaction should automatically be committed in case of autocommit.
+        assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class));
+      } else {
+        assertEquals(0, mockSpanner.countRequestsOfType(CommitRequest.class));
+      }
+    }
+  }
+
+  @Test
+  public void testAnalyzeUpdateReadOnly() {
+    for (boolean autocommit : new boolean[] {true, false}) {
+      mockSpanner.clearRequests();
+
+      try (Connection connection = createConnection()) {
+        connection.setReadOnly(true);
+        connection.setAutocommit(autocommit);
+
+        SpannerException exception =
+            assertThrows(
+                SpannerException.class,
+                () -> connection.analyzeUpdate(PLAN_UPDATE, QueryAnalyzeMode.PLAN));
+        assertEquals(ErrorCode.FAILED_PRECONDITION, exception.getErrorCode());
+      }
+
+      assertEquals(0, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
+      assertEquals(0, mockSpanner.countRequestsOfType(CommitRequest.class));
+    }
+  }
+
+  @Test
+  public void testAnalyzeUpdateDdlBatch() {
+    try (Connection connection = createConnection()) {
+      connection.startBatchDdl();
+
+      SpannerException exception =
+          assertThrows(
+              SpannerException.class,
+              () -> connection.analyzeUpdate(PLAN_UPDATE, QueryAnalyzeMode.PLAN));
+      assertEquals(ErrorCode.FAILED_PRECONDITION, exception.getErrorCode());
+    }
+
+    assertEquals(0, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
+    assertEquals(0, mockSpanner.countRequestsOfType(CommitRequest.class));
+  }
+
+  @Test
+  public void testAnalyzeUpdateDmlBatch() {
+    try (Connection connection = createConnection()) {
+      connection.startBatchDml();
+
+      SpannerException exception =
+          assertThrows(
+              SpannerException.class,
+              () -> connection.analyzeUpdate(PLAN_UPDATE, QueryAnalyzeMode.PLAN));
+      assertEquals(ErrorCode.FAILED_PRECONDITION, exception.getErrorCode());
+    }
+
+    assertEquals(0, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
+    assertEquals(0, mockSpanner.countRequestsOfType(CommitRequest.class));
+  }
+}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java
new file mode 100644
index 0000000000..0b9b2bdd8d
--- /dev/null
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.cloud.spanner.Statement;
+import com.google.cloud.spanner.connection.StatementResult.ResultType;
+import com.google.longrunning.Operation;
+import com.google.protobuf.Any;
+import com.google.protobuf.Empty;
+import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata;
+import com.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class DdlTest extends AbstractMockServerTest {
+
+  @After
+  public void reset() {
+    mockDatabaseAdmin.reset();
+  }
+
+  @Override
+  protected String getBaseUrl() {
+    return String.format(
+        "cloudspanner://localhost:%d/projects/proj/instances/inst/databases/db?usePlainText=true",
+        getPort());
+  }
+
+  private void addUpdateDdlResponse() {
+    mockDatabaseAdmin.addResponse(
+        Operation.newBuilder()
+            .setMetadata(
+                Any.pack(
+                    UpdateDatabaseDdlMetadata.newBuilder()
+                        .setDatabase("projects/proj/instances/inst/databases/db")
+                        .build()))
+            .setName("projects/proj/instances/inst/databases/db/operations/1")
+            .setDone(true)
+            .setResponse(Any.pack(Empty.getDefaultInstance()))
+            .build());
+  }
+
+  @Test
+  public void testSingleAnalyzeStatement() {
+    addUpdateDdlResponse();
+
+    try (Connection connection = createConnection()) {
+      StatementResult result = connection.execute(Statement.of("analyze"));
+      assertEquals(ResultType.NO_RESULT, result.getResultType());
+    }
+
+    List requests =
+        mockDatabaseAdmin.getRequests().stream()
+            .filter(request -> request instanceof UpdateDatabaseDdlRequest)
+            .map(request -> (UpdateDatabaseDdlRequest) request)
+            .collect(Collectors.toList());
+    assertEquals(1, requests.size());
+    assertEquals(1, requests.get(0).getStatementsCount());
+    assertEquals("analyze", requests.get(0).getStatements(0));
+  }
+
+  @Test
+  public void testBatchedAnalyzeStatement() {
+    addUpdateDdlResponse();
+
+    try (Connection connection = createConnection()) {
+      connection.startBatchDdl();
+      assertEquals(
+          ResultType.NO_RESULT,
+          connection
+              .execute(Statement.of("create table foo (id int64) primary key (id)"))
+              .getResultType());
+      assertEquals(
+          ResultType.NO_RESULT, connection.execute(Statement.of("analyze")).getResultType());
+      connection.runBatch();
+    }
+
+    List requests =
+        mockDatabaseAdmin.getRequests().stream()
+            .filter(request -> request instanceof UpdateDatabaseDdlRequest)
+            .map(request -> (UpdateDatabaseDdlRequest) request)
+            .collect(Collectors.toList());
+    assertEquals(1, requests.size());
+    assertEquals(2, requests.get(0).getStatementsCount());
+    assertEquals("create table foo (id int64) primary key (id)", requests.get(0).getStatements(0));
+    assertEquals("analyze", requests.get(0).getStatements(1));
+  }
+}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainCommandConverterTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainCommandConverterTest.java
new file mode 100644
index 0000000000..b927668d47
--- /dev/null
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainCommandConverterTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.cloud.spanner.connection.ClientSideStatementValueConverters.ExplainCommandConverter;
+import org.junit.Test;
+
+public class ExplainCommandConverterTest {
+  @Test
+  public void testConvert() {
+    ExplainCommandConverter explainCommandConverter = new ExplainCommandConverter();
+    assertEquals(
+        "select * from table1", explainCommandConverter.convert("explain select * from table1"));
+    assertEquals(
+        "select    *   \t from table1",
+        explainCommandConverter.convert("explain \tselect    *   \t from table1"));
+    assertEquals(
+        "select    *   \t from table1",
+        explainCommandConverter.convert("EXPLAIN \tselect    *   \t from table1"));
+    assertEquals(
+        "select    *   \t from table1",
+        explainCommandConverter.convert("ExplAIn \tselect    *   \t from table1"));
+    assertEquals(
+        "select    *   \t from table1",
+        explainCommandConverter.convert("explain \n select    *   \t from table1"));
+    assertEquals(
+        "select    *   \t from table1",
+        explainCommandConverter.convert("explain \n \t select    *   \t from table1"));
+    assertEquals("foo", explainCommandConverter.convert("explain   foo"));
+    assertEquals(null, explainCommandConverter.convert("explain"));
+
+    assertEquals(
+        "analyze select * from table1",
+        explainCommandConverter.convert("explain analyze select * from table1"));
+    assertEquals(
+        "analyze \tselect    *   \t from table1",
+        explainCommandConverter.convert("explain \t analyze \tselect    *   \t from table1"));
+    assertEquals(
+        "analyze \n select    *   \t from table1",
+        explainCommandConverter.convert("explain \n analyze \n select    *   \t from table1"));
+    assertEquals(
+        "ANALYZE \n select    *   \t from table1",
+        explainCommandConverter.convert("EXPLAIN \n ANALYZE \n select    *   \t from table1"));
+    assertEquals(
+        "aNALyzE \n select    *   \t from table1",
+        explainCommandConverter.convert("ExPLaiN \n aNALyzE \n select    *   \t from table1"));
+    assertEquals(
+        "analyze \t select    *   \t from table1",
+        explainCommandConverter.convert("explain \n analyze \t select    *   \t from table1"));
+    assertEquals("analyze foo", explainCommandConverter.convert("explain  analyze foo"));
+    assertEquals("analyze", explainCommandConverter.convert("explain analyze"));
+    assertEquals(
+        "(analyze \t select    *   \t from table1",
+        explainCommandConverter.convert("explain \n (analyze \t select    *   \t from table1"));
+    assertEquals(
+        "(analyze \t select    *   \t from table1)",
+        explainCommandConverter.convert("explain \n (analyze \t select    *   \t from table1)"));
+
+    assertEquals(
+        "analyse select * from table1",
+        explainCommandConverter.convert("explain analyse select * from table1"));
+    assertEquals(
+        "analyse \tselect    *   \t from table1",
+        explainCommandConverter.convert("explain \t analyse \tselect    *   \t from table1"));
+    assertEquals("analyse foo", explainCommandConverter.convert("explain  analyse foo"));
+    assertEquals("analyse", explainCommandConverter.convert("explain analyse"));
+  }
+}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainTest.java
new file mode 100644
index 0000000000..a78684b2b4
--- /dev/null
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ExplainTest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.fail;
+
+import com.google.cloud.spanner.Dialect;
+import com.google.cloud.spanner.MockSpannerServiceImpl;
+import com.google.cloud.spanner.ResultSet;
+import com.google.cloud.spanner.SpannerException;
+import com.google.cloud.spanner.Statement;
+import com.google.protobuf.Struct;
+import com.google.protobuf.Value;
+import com.google.spanner.v1.ExecuteSqlRequest;
+import com.google.spanner.v1.ExecuteSqlRequest.QueryMode;
+import com.google.spanner.v1.PlanNode;
+import com.google.spanner.v1.QueryPlan;
+import com.google.spanner.v1.ResultSetMetadata;
+import com.google.spanner.v1.ResultSetStats;
+import com.google.spanner.v1.StructType;
+import com.google.spanner.v1.StructType.Field;
+import com.google.spanner.v1.Type;
+import com.google.spanner.v1.TypeCode;
+import java.util.List;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class ExplainTest extends AbstractMockServerTest {
+  private static final Statement EXPLAIN_STATEMENT_QUERY =
+      Statement.of("SELECT * FROM SomeTable ORDER BY Value");
+
+  @BeforeClass
+  public static void setupAnalyzeResults() {
+    mockSpanner.putStatementResult(
+        MockSpannerServiceImpl.StatementResult.detectDialectResult(Dialect.POSTGRESQL));
+    Struct metadata =
+        Struct.newBuilder()
+            .putFields("subquery_cluster_node", Value.newBuilder().setStringValue("1").build())
+            .build();
+    Struct cpuTime =
+        Struct.newBuilder()
+            .putFields("unit", Value.newBuilder().setStringValue("msec").build())
+            .putFields("total_time", Value.newBuilder().setStringValue("10").build())
+            .build();
+    Struct executionStats =
+        Struct.newBuilder()
+            .putFields("cpu_time", Value.newBuilder().setStructValue(cpuTime).build())
+            .build();
+    ResultSetStats resultSetStats =
+        ResultSetStats.newBuilder()
+            .setQueryPlan(
+                QueryPlan.newBuilder()
+                    .addPlanNodes(
+                        PlanNode.newBuilder()
+                            .setDisplayName("some-plan-node")
+                            .setMetadata(metadata)
+                            .setExecutionStats(executionStats)
+                            .build())
+                    .build())
+            .build();
+    mockSpanner.putStatementResult(
+        MockSpannerServiceImpl.StatementResult.query(
+            EXPLAIN_STATEMENT_QUERY,
+            com.google.spanner.v1.ResultSet.newBuilder()
+                .setMetadata(
+                    ResultSetMetadata.newBuilder()
+                        .setRowType(
+                            StructType.newBuilder()
+                                .addFields(
+                                    Field.newBuilder()
+                                        .setType(Type.newBuilder().setCode(TypeCode.INT64).build())
+                                        .setName("Key")
+                                        .build())
+                                .addFields(
+                                    Field.newBuilder()
+                                        .setType(Type.newBuilder().setCode(TypeCode.STRING).build())
+                                        .setName("Value")
+                                        .build())
+                                .build())
+                        .build())
+                .setStats(resultSetStats)
+                .build()));
+  }
+
+  @After
+  public void clearRequests() {
+    mockSpanner.clearRequests();
+  }
+
+  private void testExplain(String statement) {
+    mockSpanner.clearRequests();
+    final Statement explainStatement = Statement.of(statement);
+
+    try (Connection connection = createConnection()) {
+
+      try (ResultSet resultSet = connection.execute(explainStatement).getResultSet()) {
+        int count = 0;
+
+        while (resultSet.next()) {
+          if (count == 1) {
+            fail(
+                "The resultset was expected t contains exactly 1 row but it contains more than 1 row");
+          }
+
+          ++count;
+
+          com.google.cloud.spanner.Struct row = resultSet.getCurrentRowAsStruct();
+
+          assertEquals(1, row.getColumnCount());
+          assertNotNull(row.getString("QUERY PLAN"));
+          String expectedQueryPlan = "some-plan-node : { subquery_cluster_node : 1 }";
+          assertEquals(expectedQueryPlan, row.getString("QUERY PLAN"));
+        }
+      }
+    }
+
+    List requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class);
+    assertEquals(1, requests.size());
+    ExecuteSqlRequest request = requests.get(0);
+    assertEquals(EXPLAIN_STATEMENT_QUERY.getSql(), request.getSql());
+    assertEquals(QueryMode.PLAN, request.getQueryMode());
+  }
+
+  private void testExplainAnalyze(String statement) {
+    mockSpanner.clearRequests();
+    final Statement explainAnalyzeStatement = Statement.of(statement);
+    try (Connection connection = createConnection()) {
+
+      try (ResultSet resultSet = connection.execute(explainAnalyzeStatement).getResultSet()) {
+        int count = 0;
+
+        while (resultSet.next()) {
+          if (count == 1) {
+            fail(
+                "The resultset was expected t contains exactly 1 row but it contains more than 1 row");
+          }
+
+          ++count;
+
+          com.google.cloud.spanner.Struct row = resultSet.getCurrentRowAsStruct();
+
+          assertEquals(2, row.getColumnCount());
+
+          assertNotNull(row.getString("QUERY PLAN"));
+          String expectedQueryPlan = "some-plan-node : { subquery_cluster_node : 1 }";
+          assertEquals(expectedQueryPlan, row.getString("QUERY PLAN"));
+
+          assertNotNull(row.getString("EXECUTION STATS"));
+          String expectedExecutionStats = "cpu_time : { unit : msec , total_time : 10 }";
+          assertEquals(expectedExecutionStats, row.getString("EXECUTION STATS"));
+        }
+      }
+    }
+
+    List requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class);
+    assertEquals(1, requests.size());
+    ExecuteSqlRequest request = requests.get(0);
+    assertEquals(EXPLAIN_STATEMENT_QUERY.getSql(), request.getSql());
+    assertEquals(QueryMode.PROFILE, request.getQueryMode());
+  }
+
+  @Test
+  public void testValidExplain() {
+    String statement = "Explain " + EXPLAIN_STATEMENT_QUERY;
+    testExplain(statement);
+
+    statement = "explain " + EXPLAIN_STATEMENT_QUERY;
+    testExplain(statement);
+
+    statement = "explain     " + EXPLAIN_STATEMENT_QUERY;
+    testExplain(statement);
+
+    statement = "explain \t (" + EXPLAIN_STATEMENT_QUERY + ") ";
+    testExplain(statement);
+
+    statement = "    explain \t ( \n   " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+
+    statement = "    ExpLAin  (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+
+    statement = "    EXPLAIN  (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+  }
+
+  @Test
+  public void testValidExplainWithFalseAnalyze() {
+    String statement = "    explain (analyze false)      " + EXPLAIN_STATEMENT_QUERY;
+    testExplain(statement);
+
+    statement = "    explain (analyze FALSE)      " + EXPLAIN_STATEMENT_QUERY + "    ";
+    testExplain(statement);
+
+    statement = "    explain (analyze fAlsE)  (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+
+    statement = "    explain (analyze 0)  (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+
+    statement = "    explain (analyze off)  (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplain(statement);
+
+    statement =
+        "    explain (analyze false, analyze true, analyze false, analyze false)      "
+            + EXPLAIN_STATEMENT_QUERY;
+    testExplain(statement);
+
+    statement =
+        "    explain (   analyze off , analyze true , analyze 0  )  (    "
+            + EXPLAIN_STATEMENT_QUERY
+            + "   ) ";
+    testExplain(statement);
+
+    statement =
+        "    explain (   analyze off , analyze 0 , analyze 0  )  (    "
+            + EXPLAIN_STATEMENT_QUERY
+            + "   ) ";
+    testExplain(statement);
+
+    statement =
+        "    explain (   analyze off , analyze,   analyze 0 , analyze false  )  (    "
+            + EXPLAIN_STATEMENT_QUERY
+            + "   ) ";
+    testExplain(statement);
+  }
+
+  @Test
+  public void testValidExplainAnalyze() {
+    String statement = "Explain analyze " + EXPLAIN_STATEMENT_QUERY;
+    testExplainAnalyze(statement);
+
+    statement = "explain analyze " + EXPLAIN_STATEMENT_QUERY;
+    testExplainAnalyze(statement);
+
+    statement = "explain   analyze  " + EXPLAIN_STATEMENT_QUERY;
+    testExplainAnalyze(statement);
+
+    statement = "explain analyze (" + EXPLAIN_STATEMENT_QUERY + ") ";
+    testExplainAnalyze(statement);
+
+    statement = "    explain (  analyze true  ) (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement = "    ExpLAin(   analyze 1  ) (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement = "    ExpLAin(   analyze On  ) (    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement = "    EXPLAIN(analyze)(    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement =
+        "    EXPLAIN(analyze , analyze false , analyze 1)(    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement =
+        "    EXPLAIN(analyze , aNAlyzE false , analyze  )(    " + EXPLAIN_STATEMENT_QUERY + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement =
+        "    EXPLAIN(analyze off  , analyze false , AnalYZE  )(    "
+            + EXPLAIN_STATEMENT_QUERY
+            + "   ) ";
+    testExplainAnalyze(statement);
+
+    statement =
+        "    EXPLAIN(analyze \n off  , analyze false , analyze  )(    "
+            + EXPLAIN_STATEMENT_QUERY
+            + " \t  ) ";
+    testExplainAnalyze(statement);
+
+    statement =
+        "    EXPLAIN(analyse \n off  , analyze false , analyse  )(    "
+            + EXPLAIN_STATEMENT_QUERY
+            + " \t  ) ";
+    testExplainAnalyze(statement);
+  }
+
+  @Test
+  public void testInvalidExplain() {
+
+    String statement = " explain  verbose " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement));
+
+    String statement2 = " explain  foo " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement2));
+
+    String statement3 = " explain  analyze analyze  " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement3));
+
+    String statement4 = " explain  analyze true  " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement4));
+
+    String statement5 = " explain  (analyze true , verbose )   " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement5));
+
+    String statement6 = " explain  (analyze hello)   " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement6));
+
+    String statement7 = " explain  (analyze true , verbose , costs )   " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement7));
+
+    String statement8 = " explain  (analyze true , verbose , costs    " + EXPLAIN_STATEMENT_QUERY;
+    assertThrows(SpannerException.class, () -> testExplain(statement8));
+  }
+}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ITAbstractSpannerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ITAbstractSpannerTest.java
index a36b12b2fe..0c2396af95 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ITAbstractSpannerTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ITAbstractSpannerTest.java
@@ -182,7 +182,7 @@ private static StatusRuntimeException createAbortedExceptionWithMinimalRetry() {
 
   @ClassRule public static IntegrationTestEnv env = new IntegrationTestEnv();
   private static final String DEFAULT_KEY_FILE = null;
-  private static Database database;
+  public static Database database;
 
   protected static String getKeyFile() {
     return System.getProperty(GceTestEnvConfig.GCE_CREDENTIALS_FILE, DEFAULT_KEY_FILE);
@@ -322,9 +322,9 @@ protected boolean tableExists(Connection connection, String table) {
     try (ResultSet rs =
         connection.executeQuery(
             Statement.newBuilder(
-                    "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE UPPER(TABLE_NAME)=@table_name")
-                .bind("table_name")
-                .to(table.toUpperCase())
+                    String.format(
+                        "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE UPPER(TABLE_NAME)=UPPER(\'%s\')",
+                        table))
                 .build())) {
       while (rs.next()) {
         return true;
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementParserTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementParserTest.java
index da0ceacd50..b45f6cb3ea 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementParserTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementParserTest.java
@@ -510,6 +510,13 @@ public void testIsDdlStatement() {
                         + "          CONCAT(Singers.FirstName, Singers.LastName) as Name\n"
                         + "   FROM Singers"))
             .isDdl());
+
+    assertTrue(parser.parse(Statement.of("analyze")).isDdl());
+    assertTrue(parser.parse(Statement.of("Analyze")).isDdl());
+    assertTrue(parser.parse(Statement.of("ANALYZE")).isDdl());
+    assertTrue(parser.parse(Statement.of("\t ANALYZE\n ")).isDdl());
+    assertTrue(parser.parse(Statement.of("/* This is a comment */ ANALYZE ")).isDdl());
+    assertTrue(parser.parse(Statement.of("-- comment\n ANALYZE ")).isDdl());
   }
 
   @Test
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITExplainTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITExplainTest.java
new file mode 100644
index 0000000000..2cb0bb61ef
--- /dev/null
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITExplainTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.connection.it;
+
+import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assume.assumeFalse;
+
+import com.google.cloud.spanner.Dialect;
+import com.google.cloud.spanner.Mutation;
+import com.google.cloud.spanner.ParallelIntegrationTest;
+import com.google.cloud.spanner.ResultSet;
+import com.google.cloud.spanner.Statement;
+import com.google.cloud.spanner.connection.Connection;
+import com.google.cloud.spanner.connection.ITAbstractSpannerTest;
+import java.util.Arrays;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@Category(ParallelIntegrationTest.class)
+@RunWith(JUnit4.class)
+public class ITExplainTest extends ITAbstractSpannerTest {
+  @Override
+  public void appendConnectionUri(StringBuilder uri) {
+    uri.append(";autocommit=false");
+  }
+
+  @BeforeClass
+  public static void setupPostgreSQL() {
+    assumeFalse("Emulator does not support PostgreSQL Dialect", isUsingEmulator());
+    database = env.getTestHelper().createTestDatabase(Dialect.POSTGRESQL, Collections.emptyList());
+  }
+
+  @Before
+  public void createTestTable() {
+    try (Connection connection = createConnection()) {
+      connection.setAutocommit(true);
+      if (!tableExists(connection, "TEST")) {
+        connection.setAutocommit(false);
+        connection.startBatchDdl();
+        connection.execute(
+            Statement.of(
+                "CREATE TABLE TEST (ID INT NOT NULL PRIMARY KEY, NAME VARCHAR(100) NOT NULL)"));
+        connection.runBatch();
+      }
+    }
+  }
+
+  @Test
+  public void testExplainStatement() {
+    assumeFalse("Emulator does not support PostgreSQL Dialect", isUsingEmulator());
+    try (ITConnection connection = createConnection()) {
+      connection.bufferedWrite(
+          Arrays.asList(
+              Mutation.newInsertBuilder("TEST").set("ID").to(3L).set("NAME").to("TEST-3").build(),
+              Mutation.newInsertBuilder("TEST").set("ID").to(4L).set("NAME").to("TEST-4").build()));
+      connection.commit();
+
+      ResultSet resultSet =
+          connection.execute(Statement.of("EXPLAIN SELECT * from TEST")).getResultSet();
+      while (resultSet.next()) {
+        assertNotNull(resultSet.getString("QUERY PLAN"));
+      }
+      assertEquals(1, resultSet.getColumnCount());
+    }
+  }
+
+  @Test
+  public void testExplainAnalyzeStatement() {
+    assumeFalse("Emulator does not support PostgreSQL Dialect", isUsingEmulator());
+    try (ITConnection connection = createConnection()) {
+      connection.bufferedWrite(
+          Arrays.asList(
+              Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST-1").build(),
+              Mutation.newInsertBuilder("TEST").set("ID").to(2L).set("NAME").to("TEST-2").build()));
+      connection.commit();
+
+      ResultSet resultSet =
+          connection.execute(Statement.of("EXPLAIN ANALYZE SELECT * from TEST")).getResultSet();
+      while (resultSet.next()) {
+        assertNotNull(resultSet.getString("QUERY PLAN"));
+        assertNotNull(resultSet.getString("EXECUTION STATS"));
+      }
+      assertEquals(2, resultSet.getColumnCount());
+    }
+  }
+}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITReadWriteAutocommitSpannerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITReadWriteAutocommitSpannerTest.java
index d394013fbe..8c9aaba823 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITReadWriteAutocommitSpannerTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITReadWriteAutocommitSpannerTest.java
@@ -20,17 +20,25 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.cloud.spanner.ErrorCode;
 import com.google.cloud.spanner.Mutation;
 import com.google.cloud.spanner.ParallelIntegrationTest;
+import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode;
 import com.google.cloud.spanner.ResultSet;
 import com.google.cloud.spanner.SpannerBatchUpdateException;
 import com.google.cloud.spanner.SpannerException;
 import com.google.cloud.spanner.Statement;
 import com.google.cloud.spanner.connection.ITAbstractSpannerTest;
 import com.google.cloud.spanner.connection.SqlScriptVerifier;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
+import com.google.spanner.v1.ResultSetStats;
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 import org.junit.FixMethodOrder;
@@ -171,4 +179,42 @@ public void test05_BatchUpdateWithException() {
       }
     }
   }
+
+  @Test
+  public void test06_AnalyzeUpdate() {
+    assumeFalse(
+        "Emulator does not support PLAN and PROFILE", EmulatorSpannerHelper.isUsingEmulator());
+
+    // PLAN should not execute the update.
+    try (ITConnection connection = createConnection()) {
+      ResultSetStats resultSetStats =
+          connection.analyzeUpdate(
+              Statement.of("UPDATE TEST SET NAME='test_updated' WHERE ID > 0"),
+              QueryAnalyzeMode.PLAN);
+
+      assertNotNull(resultSetStats);
+      assertTrue(resultSetStats.hasQueryPlan());
+      assertFalse(resultSetStats.hasQueryStats());
+
+      // The backend indicates that the statement would return an exact row count, but as the
+      // statement is not executed, the actual row count is zero.
+      assertTrue(resultSetStats.hasRowCountExact());
+      assertEquals(0, resultSetStats.getRowCountExact());
+    }
+
+    try (ITConnection connection = createConnection()) {
+      ResultSetStats resultSetStats =
+          connection.analyzeUpdate(
+              Statement.of("UPDATE TEST SET NAME='test_updated' WHERE ID > 0"),
+              QueryAnalyzeMode.PROFILE);
+
+      // Executing the update in PROFILE mode should execute the update
+      assertNotNull(resultSetStats);
+      assertTrue(resultSetStats.hasQueryPlan());
+      assertTrue(resultSetStats.hasQueryStats());
+
+      assertTrue(resultSetStats.hasRowCountExact());
+      assertTrue(resultSetStats.getRowCountExact() > 0);
+    }
+  }
 }
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpanner.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpanner.java
index 08688574d1..3a53cde122 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpanner.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpanner.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpannerImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpannerImpl.java
index 455bca0476..d6176e1f27 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpannerImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/MockSpannerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/SpannerClientTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/SpannerClientTest.java
index aa0d6cc183..24b2c4bbfb 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/SpannerClientTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/v1/SpannerClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ConnectionImplGeneratedSqlScriptTest.sql b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ConnectionImplGeneratedSqlScriptTest.sql
index be5a1671ae..e0908afcc5 100644
--- a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ConnectionImplGeneratedSqlScriptTest.sql
+++ b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ConnectionImplGeneratedSqlScriptTest.sql
@@ -1,23 +1,23 @@
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -26,125 +26,123 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -153,60 +151,58 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:27.061000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:27.061000000Z'
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:00.730000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:00.730000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:27.061000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:27.061000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:00.730000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -221,34 +217,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -257,8 +253,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -301,46 +297,45 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -351,36 +346,28 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -389,173 +376,123 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -564,78 +501,58 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:27.474000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:27.474000000Z'
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.057000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.057000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:27.474000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:27.474000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.057000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -650,48 +567,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -700,10 +603,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -746,62 +647,45 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -812,207 +696,324 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+ROLLBACK;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
+SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:27.868000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:27.868000000Z'
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.385000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.385000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:27.868000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.385000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -1027,34 +1028,55 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-NEW_CONNECTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -1063,8 +1085,11 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1107,71 +1132,116 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -1180,125 +1250,195 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -1307,60 +1447,85 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.152000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.152000000Z'
+COMMIT;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.738000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.738000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.152000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.152000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.738000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -1375,34 +1540,55 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -1411,8 +1597,11 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1455,46 +1644,69 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -1505,217 +1717,208 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.470000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.470000000Z'
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.043000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:02.043000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.470000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.470000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.043000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -1730,34 +1933,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -1766,8 +1969,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1810,230 +2013,282 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.774000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.774000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.308000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.774000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.774000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.308000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
-SHOW VARIABLE COMMIT_RESPONSE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
+SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -2048,27 +2303,41 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -2077,7 +2346,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2120,254 +2391,254 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.031000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.031000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.608000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.031000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.608000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -2383,33 +2654,33 @@ SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -2419,7 +2690,7 @@ SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2463,76 +2734,66 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -2542,122 +2803,98 @@ SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -2667,57 +2904,48 @@ SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.261000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.261000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.880000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:02.880000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.261000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.880000000Z';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -2733,33 +2961,26 @@ SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -2769,7 +2990,6 @@ SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2813,44 +3033,36 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -2862,39 +3074,26 @@ BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -2902,196 +3101,134 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+COMMIT;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-ROLLBACK;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+COMMIT;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-ROLLBACK;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -3099,86 +3236,59 @@ SET READONLY=TRUE;
 @EXPECT RESULT_SET 'READONLY',TRUE
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.514000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.514000000Z'
+COMMIT;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.154000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:03.154000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.514000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.154000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -3192,56 +3302,35 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -3249,12 +3338,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -3296,117 +3382,84 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -3414,196 +3467,182 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -3611,86 +3650,77 @@ SET READONLY=TRUE;
 @EXPECT RESULT_SET 'READONLY',TRUE
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.790000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.790000000Z'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.457000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:03.457000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.790000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.457000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -3704,56 +3734,49 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-NEW_CONNECTION;
-SET READONLY=TRUE;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+NEW_CONNECTION;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -3761,12 +3784,11 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -3808,282 +3830,305 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-NEW_CONNECTION;
-SET READONLY=TRUE;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+NEW_CONNECTION;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.050000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:30.050000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.755000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.050000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.755000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -4097,35 +4142,42 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -4133,9 +4185,10 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4177,283 +4230,255 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+START BATCH DDL;
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.238000000Z';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.963000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.238000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.963000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -4467,42 +4492,35 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -4510,10 +4528,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4555,255 +4572,378 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.477000000Z';
+COMMIT;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.163000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.163000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.477000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.163000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -4817,35 +4957,56 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -4853,9 +5014,12 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4897,220 +5061,279 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ ONLY;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=TRUE;
-SET AUTOCOMMIT=FALSE;
 SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.698000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:30.698000000Z'
+SET TRANSACTION READ ONLY;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.403000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.403000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.698000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.403000000Z';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -5124,28 +5347,35 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -5153,8 +5383,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5196,243 +5427,267 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=TRUE;
+SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
+SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.897000000Z';
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.591000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.591000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.897000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.591000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -5447,34 +5702,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -5483,8 +5738,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5527,284 +5782,381 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
+SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.065000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.065000000Z'
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.802000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.802000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.065000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.802000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -5819,41 +6171,55 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -5862,9 +6228,11 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5907,87 +6275,113 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
@@ -5997,150 +6391,166 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6152,9 +6562,10 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6166,17 +6577,18 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
@@ -6186,77 +6598,84 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.341000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.341000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.094000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:05.094000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.341000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:31.341000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.094000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -6272,47 +6691,54 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -6322,9 +6748,10 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -6368,61 +6795,67 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
@@ -6433,137 +6866,138 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6575,68 +7009,68 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READONLY=FALSE;
+SET READONLY=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.608000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.608000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.339000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:05.339000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.608000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.339000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -6652,33 +7086,33 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -6688,7 +7122,7 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -6732,193 +7166,206 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT UPDATE_COUNT 1
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT UPDATE_COUNT 1
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -6929,76 +7376,76 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.834000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.834000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.555000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.834000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:31.834000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.555000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -7013,34 +7460,41 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -7049,8 +7503,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7093,200 +7548,190 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7297,76 +7742,65 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.161000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.161000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.798000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.161000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.161000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.798000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -7381,34 +7815,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -7417,8 +7851,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7461,81 +7895,67 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -7544,130 +7964,83 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7678,9 +8051,7 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7691,16 +8062,11 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -7709,69 +8075,49 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.402000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.402000000Z'
+SET AUTOCOMMIT=FALSE;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.040000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.040000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.402000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.402000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.040000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -7786,41 +8132,27 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -7829,9 +8161,7 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7874,54 +8204,36 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -7931,232 +8243,201 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP'
+START BATCH DDL;
+@EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
-SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.626000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.626000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.222000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.626000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.626000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.222000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -8172,33 +8453,33 @@ SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -8208,7 +8489,7 @@ SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -8252,242 +8533,283 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT UPDATE_COUNT 1
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
-SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.905000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.905000000Z'
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.418000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.418000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.905000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.905000000Z'
-SHOW VARIABLE READ_ONLY_STALENESS;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.418000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -8503,26 +8825,40 @@ SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -8532,6 +8868,8 @@ SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -8575,66 +8913,86 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
@@ -8644,103 +9002,150 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -8752,7 +9157,9 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -8764,12 +9171,17 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
@@ -8779,57 +9191,77 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.118000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:33.118000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.625000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.625000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.118000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.625000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:06.625000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -8845,33 +9277,47 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -8881,7 +9327,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -8925,43 +9373,61 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
@@ -8972,198 +9438,138 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -9174,95 +9580,69 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READONLY=FALSE;
-@EXPECT RESULT_SET 'READONLY',FALSE
-SHOW VARIABLE READONLY;
-SET READONLY=TRUE;
-@EXPECT RESULT_SET 'READONLY',TRUE
-SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.313000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:33.313000000Z'
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.864000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.864000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.313000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.864000000Z';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -9277,48 +9657,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -9327,10 +9693,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -9373,303 +9737,272 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.570000000Z';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.090000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.090000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.570000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.090000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.090000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -9685,40 +10018,33 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -9728,8 +10054,7 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -9773,254 +10098,280 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.779000000Z';
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.439000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.439000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.779000000Z';
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.439000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.439000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -10035,34 +10386,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -10071,8 +10422,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10115,83 +10466,81 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -10200,167 +10549,130 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -10371,11 +10683,9 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -10386,19 +10696,16 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -10407,85 +10714,69 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.015000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.015000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.678000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.678000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.015000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.678000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.678000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -10500,55 +10791,41 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -10557,11 +10834,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10604,68 +10879,54 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -10675,207 +10936,232 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.249000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.249000000Z'
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.914000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.914000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.249000000Z';
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.914000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.914000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -10890,34 +11176,34 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -10926,8 +11212,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10970,71 +11256,73 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -11043,104 +11331,88 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -11151,8 +11423,7 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -11163,13 +11434,12 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -11178,58 +11448,51 @@ SET READONLY=TRUE;
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.423000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.423000000Z'
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.126000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.126000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.423000000Z';
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.126000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.126000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -11244,34 +11507,27 @@ SET OPTIMIZER_VERSION='';
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -11280,8 +11536,7 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -11324,44 +11579,38 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -11371,40 +11620,27 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -11412,206 +11648,126 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT UPDATE_COUNT 1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -11619,86 +11775,61 @@ SET READONLY=TRUE;
 @EXPECT RESULT_SET 'READONLY',TRUE
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.634000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.634000000Z'
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.309000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.309000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.634000000Z';
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.309000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.309000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
+NEW_CONNECTION;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -11712,56 +11843,35 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -11769,12 +11879,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -11816,113 +11923,85 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
@@ -11932,204 +12011,172 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET READONLY=FALSE;
@@ -12139,84 +12186,77 @@ SET READONLY=TRUE;
 @EXPECT RESULT_SET 'READONLY',TRUE
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.943000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.943000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.515000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.515000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.943000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.515000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.515000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET OPTIMIZER_VERSION='1';
@@ -12232,54 +12272,47 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'
+@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
@@ -12289,10 +12322,9 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
@@ -12336,283 +12368,273 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET AUTOCOMMIT=TRUE;
-NEW_CONNECTION;
-SET READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+NEW_CONNECTION;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READONLY=TRUE;
-NEW_CONNECTION;
 SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+NEW_CONNECTION;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.194000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:35.194000000Z'
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.747000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.747000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.194000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.747000000Z';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -12627,34 +12649,34 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -12663,8 +12685,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -12707,286 +12729,260 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.388000000Z';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.943000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.943000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.388000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.943000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.943000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -13001,41 +12997,34 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -13044,9 +13033,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -13089,259 +13077,267 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'READ_TIMESTAMP'
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=FALSE;
+@EXPECT RESULT_SET 'READONLY',FALSE
+SHOW VARIABLE READONLY;
 SET READONLY=TRUE;
+@EXPECT RESULT_SET 'READONLY',TRUE
+SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.635000000Z';
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:09.155000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:09.155000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.635000000Z';
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:09.155000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:09.155000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
@@ -13356,34 +13352,34 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -13392,8 +13388,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -13436,68 +13432,75 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION'
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -13505,110 +13508,102 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT UPDATE_COUNT 1
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'READ_TIMESTAMP',null
 SHOW VARIABLE READ_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET READONLY=FALSE;
 @EXPECT RESULT_SET 'READONLY',FALSE
 SHOW VARIABLE READONLY;
@@ -13616,50 +13611,52 @@ SET READONLY=TRUE;
 @EXPECT RESULT_SET 'READONLY',TRUE
 SHOW VARIABLE READONLY;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.872000000Z';
-@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:35.872000000Z'
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:09.352000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:09.352000000Z'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.872000000Z';
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:09.352000000Z';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:09.352000000Z'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION','1'
 SHOW VARIABLE OPTIMIZER_VERSION;
@@ -13673,28 +13670,28 @@ SET OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'OPTIMIZER_VERSION',''
 SHOW VARIABLE OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null
 SHOW VARIABLE COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
@@ -13702,8 +13699,8 @@ SET OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -13745,44 +13742,47 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT',null
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'READ_ONLY_STALENESS'
 SHOW VARIABLE READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
diff --git a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ClientSideStatementsTest.sql b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ClientSideStatementsTest.sql
index 2d07102d90..9bf0d64dbe 100644
--- a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ClientSideStatementsTest.sql
+++ b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ClientSideStatementsTest.sql
@@ -6770,6 +6770,407 @@ NEW_CONNECTION;
 @EXPECT EXCEPTION UNIMPLEMENTED
 show variable/-spanner.rpc_priority;
 NEW_CONNECTION;
+show transaction isolation level;
+NEW_CONNECTION;
+SHOW TRANSACTION ISOLATION LEVEL;
+NEW_CONNECTION;
+show transaction isolation level;
+NEW_CONNECTION;
+   show transaction isolation level;
+NEW_CONNECTION;
+			show transaction isolation level;
+NEW_CONNECTION;
+
+
+
+show transaction isolation level;
+NEW_CONNECTION;
+show transaction isolation level  ;
+NEW_CONNECTION;
+show transaction isolation level		;
+NEW_CONNECTION;
+show transaction isolation level
+
+;
+NEW_CONNECTION;
+show   transaction   isolation   level;
+NEW_CONNECTION;
+show	transaction	isolation	level;
+NEW_CONNECTION;
+show
+transaction
+isolation
+level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+foo show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level bar;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+%show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level%;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation%level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+_show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level_;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation_level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+&show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level&;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation&level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+$show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level$;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation$level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+@show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level@;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation@level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+!show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level!;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation!level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+*show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level*;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation*level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+(show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level(;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation(level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+)show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level);
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation)level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level-;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation-level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
++show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level+;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation+level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-#show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level-#;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation-#level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level/;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation/level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+\show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level\;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation\level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+?show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level?;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation?level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-/show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level-/;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation-/level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/#show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level/#;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation/#level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/-show transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation level/-;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show transaction isolation/-level;
+NEW_CONNECTION;
+show variable transaction isolation level;
+NEW_CONNECTION;
+SHOW VARIABLE TRANSACTION ISOLATION LEVEL;
+NEW_CONNECTION;
+show variable transaction isolation level;
+NEW_CONNECTION;
+   show variable transaction isolation level;
+NEW_CONNECTION;
+			show variable transaction isolation level;
+NEW_CONNECTION;
+
+
+
+show variable transaction isolation level;
+NEW_CONNECTION;
+show variable transaction isolation level  ;
+NEW_CONNECTION;
+show variable transaction isolation level		;
+NEW_CONNECTION;
+show variable transaction isolation level
+
+;
+NEW_CONNECTION;
+show   variable   transaction   isolation   level;
+NEW_CONNECTION;
+show	variable	transaction	isolation	level;
+NEW_CONNECTION;
+show
+variable
+transaction
+isolation
+level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+foo show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level bar;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+%show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level%;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation%level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+_show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level_;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation_level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+&show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level&;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation&level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+$show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level$;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation$level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+@show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level@;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation@level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+!show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level!;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation!level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+*show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level*;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation*level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+(show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level(;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation(level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+)show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level);
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation)level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level-;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation-level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
++show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level+;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation+level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-#show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level-#;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation-#level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level/;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation/level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+\show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level\;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation\level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+?show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level?;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation?level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+-/show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level-/;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation-/level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/#show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level/#;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation/#level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION INVALID_ARGUMENT
+/-show variable transaction isolation level;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation level/-;
+NEW_CONNECTION;
+@EXPECT EXCEPTION UNIMPLEMENTED
+show variable transaction isolation/-level;
+NEW_CONNECTION;
 begin;
 NEW_CONNECTION;
 BEGIN;
diff --git a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ConnectionImplGeneratedSqlScriptTest.sql b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ConnectionImplGeneratedSqlScriptTest.sql
index ac9528cc83..a71bc2443c 100644
--- a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ConnectionImplGeneratedSqlScriptTest.sql
+++ b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/postgresql/ConnectionImplGeneratedSqlScriptTest.sql
@@ -1,23 +1,23 @@
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -26,125 +26,123 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -153,60 +151,58 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:27.293000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:27.293000000Z'
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:00.893000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:00.893000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:27.293000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:27.293000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:00.893000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -221,34 +217,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -257,8 +253,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -301,46 +297,45 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -351,36 +346,28 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -389,173 +376,123 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -564,78 +501,58 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:27.688000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:27.688000000Z'
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.224000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.224000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:27.688000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:27.688000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.224000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -650,48 +567,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -700,10 +603,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -746,62 +647,45 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -812,207 +696,324 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-COMMIT;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+ROLLBACK;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
+SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.001000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.001000000Z'
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.578000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.578000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.001000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.578000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -1027,34 +1028,55 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-NEW_CONNECTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -1063,8 +1085,11 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1107,71 +1132,116 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -1180,125 +1250,195 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -1307,60 +1447,85 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.314000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.314000000Z'
+COMMIT;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:01.911000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:01.911000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.314000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.314000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:01.911000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -1375,34 +1540,55 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -1411,8 +1597,11 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1455,46 +1644,69 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -1505,217 +1717,208 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.639000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.639000000Z'
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.161000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:02.161000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.639000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.639000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.161000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -1730,34 +1933,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -1766,8 +1969,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -1810,230 +2013,282 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:28.902000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:28.902000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.469000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:28.902000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:28.902000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.469000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
-SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
+SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -2048,27 +2303,41 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -2077,7 +2346,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2120,254 +2391,254 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.148000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.148000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:02.742000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.148000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:02.742000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -2383,33 +2654,33 @@ SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -2419,7 +2690,7 @@ SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2463,76 +2734,66 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
-BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-COMMIT;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -2542,122 +2803,98 @@ SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -2667,57 +2904,48 @@ SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.376000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.376000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.002000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:03.002000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.376000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.002000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -2733,33 +2961,26 @@ SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -2769,7 +2990,6 @@ SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -2813,44 +3033,36 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -2862,39 +3074,26 @@ BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=TRUE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -2902,196 +3101,134 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+COMMIT;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-ROLLBACK;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+COMMIT;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-ROLLBACK;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -3099,86 +3236,59 @@ SET SPANNER.READONLY=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.657000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.657000000Z'
+COMMIT;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.330000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:03.330000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.657000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.330000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -3192,56 +3302,35 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -3249,12 +3338,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -3296,117 +3382,84 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -3414,196 +3467,182 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -3611,86 +3650,77 @@ SET SPANNER.READONLY=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:29.941000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:29.941000000Z'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.636000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:03.636000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:29.941000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.636000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -3704,56 +3734,49 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
+NEW_CONNECTION;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -3761,12 +3784,11 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -3808,282 +3830,305 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-COMMIT;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+NEW_CONNECTION;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.135000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:30.135000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:03.861000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.135000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:03.861000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -4097,35 +4142,42 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -4133,9 +4185,10 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4177,283 +4230,255 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
+START BATCH DDL;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+START BATCH DDL;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.355000000Z';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.052000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.355000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.052000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -4467,42 +4492,35 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -4510,10 +4528,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4555,255 +4572,378 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.594000000Z';
+COMMIT;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.288000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.288000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.594000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.288000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -4817,35 +4957,56 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -4853,9 +5014,12 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -4897,220 +5061,279 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+COMMIT;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+COMMIT;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
+COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ ONLY;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
-SET AUTOCOMMIT=FALSE;
 SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.790000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:30.790000000Z'
+SET TRANSACTION READ ONLY;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.498000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.498000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.790000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.498000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -5124,28 +5347,35 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -5153,8 +5383,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5196,243 +5427,267 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=TRUE;
+SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
+SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:30.980000000Z';
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.687000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.687000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:30.980000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.687000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -5447,34 +5702,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -5483,8 +5738,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5527,284 +5782,381 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
+SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
+SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.151000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.151000000Z'
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:04.945000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:04.945000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.151000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:04.945000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -5819,41 +6171,55 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -5862,9 +6228,11 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -5907,87 +6275,113 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET TRANSACTION READ ONLY;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
@@ -5997,150 +6391,166 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6152,9 +6562,10 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6166,17 +6577,18 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
@@ -6186,77 +6598,84 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.485000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.485000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.224000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:05.224000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.485000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:31.485000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.224000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -6272,47 +6691,54 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -6322,9 +6748,10 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -6368,61 +6795,67 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
@@ -6433,137 +6866,138 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -6575,68 +7009,68 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READONLY=FALSE;
+SET SPANNER.READONLY=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:31.700000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:31.700000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.442000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:05.442000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:31.700000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.442000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -6652,33 +7086,33 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -6688,7 +7122,7 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -6732,193 +7166,206 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT UPDATE_COUNT 1
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT UPDATE_COUNT 1
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -6929,76 +7376,76 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.018000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.018000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.677000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.018000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.018000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.677000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -7013,34 +7460,41 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -7049,8 +7503,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7093,200 +7548,190 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'TEST',1
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7297,76 +7742,65 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.292000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.292000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:05.933000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.292000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.292000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:05.933000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -7381,34 +7815,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -7417,8 +7851,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7461,81 +7895,67 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
-BEGIN TRANSACTION;
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-UPDATE foo SET bar=1;
+SET AUTOCOMMIT=FALSE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -7544,130 +7964,83 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7678,9 +8051,7 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -7691,16 +8062,11 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -7709,69 +8075,49 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.518000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.518000000Z'
+SET AUTOCOMMIT=FALSE;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.132000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.132000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.518000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.518000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.132000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -7786,41 +8132,27 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -7829,9 +8161,7 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -7874,54 +8204,36 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -7931,232 +8243,201 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'TEST',1
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
+START BATCH DDL;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
-SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:32.770000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:32.770000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.314000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:32.770000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:32.770000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.314000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -8172,33 +8453,33 @@ SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -8208,7 +8489,7 @@ SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -8252,242 +8533,283 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+START BATCH DDL;
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
-BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SELECT 1 AS TEST;
+START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
-SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT UPDATE_COUNT 1
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
-@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
-SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
-SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.018000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:33.018000000Z'
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.511000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.511000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.018000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-03-23T14:42:33.018000000Z'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.511000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
-SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -8503,26 +8825,40 @@ SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -8532,6 +8868,8 @@ SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -8575,66 +8913,86 @@ SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET TRANSACTION READ ONLY;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
@@ -8644,103 +9002,150 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -8752,7 +9157,9 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
@@ -8764,12 +9171,17 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
@@ -8779,57 +9191,77 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.206000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:33.206000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.750000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.750000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.206000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.750000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:06.750000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -8845,33 +9277,47 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -8881,7 +9327,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -8925,43 +9373,61 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
@@ -8972,198 +9438,138 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+UPDATE foo SET bar=1;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
-SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
-@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
-SHOW VARIABLE AUTOCOMMIT;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -9174,95 +9580,69 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READONLY=FALSE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
-SHOW VARIABLE SPANNER.READONLY;
-SET SPANNER.READONLY=TRUE;
-@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
-SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.448000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:33.448000000Z'
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:06.962000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:06.962000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.449000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:06.962000000Z';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -9277,48 +9657,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -9327,10 +9693,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -9373,303 +9737,272 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SELECT 1 AS TEST;
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-RUN BATCH;
+SET AUTOCOMMIT=TRUE;
+BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.677000000Z';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.312000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.312000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.677000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.312000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.312000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -9685,40 +10018,33 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -9728,8 +10054,7 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -9773,254 +10098,280 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:33.887000000Z';
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.554000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.554000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:33.887000000Z';
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.554000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.554000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -10035,34 +10386,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -10071,8 +10422,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10115,83 +10466,81 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
+SET AUTOCOMMIT=TRUE;
+UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -10200,167 +10549,130 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -10371,11 +10683,9 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -10386,19 +10696,16 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -10407,85 +10714,69 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.149000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.149000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:07.791000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:07.791000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.149000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:07.791000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:07.791000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -10500,55 +10791,41 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -10557,11 +10834,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10604,68 +10879,54 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -10675,207 +10936,232 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
-COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+START BATCH DDL;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+START BATCH DML;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.333000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.333000000Z'
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.029000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.029000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.333000000Z';
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.029000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.029000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -10890,34 +11176,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -10926,8 +11212,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -10970,71 +11256,73 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET TRANSACTION READ ONLY;
+SET AUTOCOMMIT=TRUE;
+SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -11043,104 +11331,88 @@ SET AUTOCOMMIT=TRUE;
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT UPDATE_COUNT 1
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.AUTOCOMMIT_DML_MODE='TRANSACTIONAL';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','TRANSACTIONAL'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
+@EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE','PARTITIONED_NON_ATOMIC'
+SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 START BATCH DDL;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -11151,8 +11423,7 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 START BATCH DDL;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 START BATCH DML;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SELECT 1 AS TEST;
@@ -11163,13 +11434,12 @@ UPDATE foo SET bar=1;
 START BATCH DML;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -11178,58 +11448,51 @@ SET SPANNER.READONLY=TRUE;
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.517000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.517000000Z'
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.217000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.217000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.517000000Z';
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.217000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.217000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -11244,34 +11507,27 @@ SET SPANNER.OPTIMIZER_VERSION='';
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -11280,8 +11536,7 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -11324,44 +11579,38 @@ SET STATEMENT_TIMEOUT='0ns';
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 UPDATE foo SET bar=1;
@@ -11371,40 +11620,27 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 BEGIN TRANSACTION;
 NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 10s';
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -11412,206 +11648,126 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT UPDATE_COUNT 1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -11619,86 +11775,61 @@ SET SPANNER.READONLY=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:34.777000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:34.777000000Z'
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.398000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.398000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:34.777000000Z';
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.398000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.398000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
-NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
-SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
+NEW_CONNECTION;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -11712,56 +11843,35 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -11769,12 +11879,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -11816,113 +11923,85 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-ROLLBACK;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 10s';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET AUTOCOMMIT=FALSE;
@@ -11932,204 +12011,172 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READONLY=FALSE;
@@ -12139,84 +12186,77 @@ SET SPANNER.READONLY=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.084000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:35.084000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.638000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.638000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.084000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.638000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:08.638000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.OPTIMIZER_VERSION='1';
@@ -12232,54 +12272,47 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
-@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP'
+@EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
@@ -12289,10 +12322,9 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 SET STATEMENT_TIMEOUT='1s';
@@ -12336,283 +12368,273 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET AUTOCOMMIT=TRUE;
-NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
 SET AUTOCOMMIT=FALSE;
+NEW_CONNECTION;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READONLY=TRUE;
-NEW_CONNECTION;
 SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+NEW_CONNECTION;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.282000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:35.282000000Z'
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:08.836000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:08.836000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.282000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:08.836000000Z';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -12627,34 +12649,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -12663,8 +12685,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -12707,286 +12729,260 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.509000000Z';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:09.051000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:09.051000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.509000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:09.051000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:09.051000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -13001,41 +12997,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -13044,9 +13033,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -13089,259 +13077,267 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT RESULT_SET 'TEST',1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET AUTOCOMMIT=FALSE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
+SHOW VARIABLE AUTOCOMMIT;
 SET AUTOCOMMIT=TRUE;
+@EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
+SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT UPDATE_COUNT 1
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
+@EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP'
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SELECT 1 AS TEST;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=FALSE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
+SHOW VARIABLE SPANNER.READONLY;
 SET SPANNER.READONLY=TRUE;
+@EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
+SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.756000000Z';
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:09.257000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:09.257000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.756000000Z';
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:09.257000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:09.257000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
@@ -13356,34 +13352,34 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
@@ -13392,8 +13388,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
@@ -13436,68 +13432,75 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
+BEGIN TRANSACTION;
+SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+UPDATE foo SET bar=1;
+@EXPECT EXCEPTION FAILED_PRECONDITION
+CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 ABORT BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET AUTOCOMMIT=FALSE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',FALSE
 SHOW VARIABLE AUTOCOMMIT;
@@ -13505,110 +13508,102 @@ SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'AUTOCOMMIT',TRUE
 SHOW VARIABLE AUTOCOMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT UPDATE_COUNT 1
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'TEST',1
 SELECT 1 AS TEST;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.AUTOCOMMIT_DML_MODE'
 SHOW VARIABLE SPANNER.AUTOCOMMIT_DML_MODE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ ONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET TRANSACTION READ WRITE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READ_TIMESTAMP',null
 SHOW VARIABLE SPANNER.READ_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DDL;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-UPDATE foo SET bar=1;
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DDL;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-START BATCH DML;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SELECT 1 AS TEST;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
-UPDATE foo SET bar=1;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 START BATCH DML;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 ROLLBACK;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READONLY=FALSE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',FALSE
 SHOW VARIABLE SPANNER.READONLY;
@@ -13616,50 +13611,52 @@ SET SPANNER.READONLY=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READONLY',TRUE
 SHOW VARIABLE SPANNER.READONLY;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='STRONG';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','STRONG'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-03-23T14:42:35.963000000Z';
-@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-03-23T14:42:35.963000000Z'
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='READ_TIMESTAMP 2022-05-12T17:20:09.444000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','READ_TIMESTAMP 2022-05-12T17:20:09.444000000Z'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
-SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-03-23T14:42:35.963000000Z';
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+SET SPANNER.READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2022-05-12T17:20:09.444000000Z';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2022-05-12T17:20:09.444000000Z'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 1s';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 1s'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
-@EXPECT EXCEPTION FAILED_PRECONDITION
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='MAX_STALENESS 100ms';
+@EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','MAX_STALENESS 100ms'
+SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.READ_ONLY_STALENESS='EXACT_STALENESS 100us';
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS','EXACT_STALENESS 100us'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_RESPONSE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.OPTIMIZER_VERSION='1';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION','1'
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
@@ -13673,28 +13670,28 @@ SET SPANNER.OPTIMIZER_VERSION='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_VERSION',''
 SHOW VARIABLE SPANNER.OPTIMIZER_VERSION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.COMMIT_TIMESTAMP',null
 SHOW VARIABLE SPANNER.COMMIT_TIMESTAMP;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='custom-package';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE','custom-package'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
@@ -13702,8 +13699,8 @@ SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE='';
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE',''
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 SET STATEMENT_TIMEOUT='1s';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','1s'
 SHOW VARIABLE STATEMENT_TIMEOUT;
@@ -13745,44 +13742,47 @@ SET STATEMENT_TIMEOUT='0ns';
 @EXPECT RESULT_SET 'STATEMENT_TIMEOUT','0'
 SHOW VARIABLE STATEMENT_TIMEOUT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.READ_ONLY_STALENESS'
 SHOW VARIABLE SPANNER.READ_ONLY_STALENESS;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 COMMIT;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT RESULT_SET 'SPANNER.OPTIMIZER_STATISTICS_PACKAGE'
 SHOW VARIABLE SPANNER.OPTIMIZER_STATISTICS_PACKAGE;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 RUN BATCH;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 SET SPANNER.TRANSACTION_TAG = 'some-tag';
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
 BEGIN TRANSACTION;
 SELECT 1 AS TEST;
+@EXPECT EXCEPTION FAILED_PRECONDITION
 UPDATE foo SET bar=1;
 @EXPECT EXCEPTION FAILED_PRECONDITION
 CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id);
 @EXPECT EXCEPTION FAILED_PRECONDITION
 BEGIN TRANSACTION;
 NEW_CONNECTION;
-SET SPANNER.READONLY=FALSE;
-SET AUTOCOMMIT=FALSE;
+SET SPANNER.READONLY=TRUE;
+SET AUTOCOMMIT=TRUE;
diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml
index 41a0ea926e..ba304605fd 100644
--- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml
+++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   grpc-google-cloud-spanner-admin-database-v1
-  6.24.0
+  6.25.0
   grpc-google-cloud-spanner-admin-database-v1
   GRPC library for grpc-google-cloud-spanner-admin-database-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
index 24c25239d4..abaa3c9a7a 100644
--- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
+++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   grpc-google-cloud-spanner-admin-instance-v1
-  6.24.0
+  6.25.0
   grpc-google-cloud-spanner-admin-instance-v1
   GRPC library for grpc-google-cloud-spanner-admin-instance-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml
index db36a9d41a..15a86104e3 100644
--- a/grpc-google-cloud-spanner-v1/pom.xml
+++ b/grpc-google-cloud-spanner-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   grpc-google-cloud-spanner-v1
-  6.24.0
+  6.25.0
   grpc-google-cloud-spanner-v1
   GRPC library for grpc-google-cloud-spanner-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/pom.xml b/pom.xml
index 939f8bdcec..b85c72fefd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   com.google.cloud
   google-cloud-spanner-parent
   pom
-  6.24.0
+  6.25.0
   Google Cloud Spanner Parent
   https://github.com/googleapis/java-spanner
   
@@ -54,7 +54,7 @@
     UTF-8
     github
     google-cloud-spanner-parent
-    2.10.0
+    2.12.0
   
 
   
@@ -62,37 +62,37 @@
       
         com.google.api.grpc
         proto-google-cloud-spanner-admin-instance-v1
-        6.24.0
+        6.25.0
       
       
         com.google.api.grpc
         proto-google-cloud-spanner-v1
-        6.24.0
+        6.25.0
       
       
         com.google.api.grpc
         proto-google-cloud-spanner-admin-database-v1
-        6.24.0
+        6.25.0
       
       
         com.google.api.grpc
         grpc-google-cloud-spanner-v1
-        6.24.0
+        6.25.0
       
       
         com.google.api.grpc
         grpc-google-cloud-spanner-admin-instance-v1
-        6.24.0
+        6.25.0
       
       
         com.google.api.grpc
         grpc-google-cloud-spanner-admin-database-v1
-        6.24.0
+        6.25.0
       
       
         com.google.cloud
         google-cloud-spanner
-        6.24.0
+        6.25.0
       
 
       
diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml
index 9cd0d6b5d5..8550d92ad1 100644
--- a/proto-google-cloud-spanner-admin-database-v1/pom.xml
+++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   proto-google-cloud-spanner-admin-database-v1
-  6.24.0
+  6.25.0
   proto-google-cloud-spanner-admin-database-v1
   PROTO library for proto-google-cloud-spanner-admin-database-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Backup.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Backup.java
index ff197cea3f..e325b21dc0 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Backup.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Backup.java
@@ -217,6 +217,8 @@ private Backup(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupInfo.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupInfo.java
index 536df4cce0..741eb0841c 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupInfo.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupInfo.java
@@ -126,6 +126,8 @@ private BackupInfo(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupName.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupName.java
index 6733a90275..3c1ab29352 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupName.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/BackupName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupEncryptionConfig.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupEncryptionConfig.java
index ea29df0725..b4903c043e 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupEncryptionConfig.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupEncryptionConfig.java
@@ -96,6 +96,8 @@ private CopyBackupEncryptionConfig(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupMetadata.java
index 01e3732645..70f71853fb 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupMetadata.java
@@ -129,6 +129,8 @@ private CopyBackupMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupRequest.java
index 3e5aa64bae..10e39890fe 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CopyBackupRequest.java
@@ -137,6 +137,8 @@ private CopyBackupRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupEncryptionConfig.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupEncryptionConfig.java
index bd85564f7b..932f9b67a0 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupEncryptionConfig.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupEncryptionConfig.java
@@ -96,6 +96,8 @@ private CreateBackupEncryptionConfig(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupMetadata.java
index 02f579b5aa..e4e78f7c3f 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupMetadata.java
@@ -129,6 +129,8 @@ private CreateBackupMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupRequest.java
index c775d99c42..f1077c25c5 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateBackupRequest.java
@@ -130,6 +130,8 @@ private CreateBackupRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseMetadata.java
index 0d722c0701..deb1bb9067 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseMetadata.java
@@ -89,6 +89,8 @@ private CreateDatabaseMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseRequest.java
index 9e75cb8015..0a081115d6 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/CreateDatabaseRequest.java
@@ -133,6 +133,8 @@ private CreateDatabaseRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Database.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Database.java
index 02000562c6..c2eea64196 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Database.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/Database.java
@@ -198,6 +198,8 @@ private Database(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DatabaseName.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DatabaseName.java
index ca0fd6abf6..93da0e4ae8 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DatabaseName.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DatabaseName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DeleteBackupRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DeleteBackupRequest.java
index c979bcaec2..15e059950a 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DeleteBackupRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DeleteBackupRequest.java
@@ -88,6 +88,8 @@ private DeleteBackupRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DropDatabaseRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DropDatabaseRequest.java
index 7ca9b458ca..b9aec131ed 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DropDatabaseRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/DropDatabaseRequest.java
@@ -88,6 +88,8 @@ private DropDatabaseRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionConfig.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionConfig.java
index 64528abd94..1165591534 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionConfig.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionConfig.java
@@ -88,6 +88,8 @@ private EncryptionConfig(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionInfo.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionInfo.java
index cd3a5581b1..9e6f6bdf24 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionInfo.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/EncryptionInfo.java
@@ -111,6 +111,8 @@ private EncryptionInfo(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetBackupRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetBackupRequest.java
index efde5caa55..6ace6fad05 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetBackupRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetBackupRequest.java
@@ -88,6 +88,8 @@ private GetBackupRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlRequest.java
index a5f8846f48..7d7f0c0327 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlRequest.java
@@ -88,6 +88,8 @@ private GetDatabaseDdlRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlResponse.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlResponse.java
index de7f8389d1..7de9bcb0a5 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlResponse.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseDdlResponse.java
@@ -92,6 +92,8 @@ private GetDatabaseDdlResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseRequest.java
index 2c2459cd88..ad7eee68ed 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/GetDatabaseRequest.java
@@ -88,6 +88,8 @@ private GetDatabaseRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/InstanceName.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/InstanceName.java
index 07ca96c5cf..abe1ad6b3d 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/InstanceName.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/InstanceName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsRequest.java
index a28e28e18f..e7f8000221 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsRequest.java
@@ -110,6 +110,8 @@ private ListBackupOperationsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsResponse.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsResponse.java
index be50a78b62..1f75fff4b5 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsResponse.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupOperationsResponse.java
@@ -101,6 +101,8 @@ private ListBackupOperationsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsRequest.java
index 02eae73714..7dc809545d 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsRequest.java
@@ -109,6 +109,8 @@ private ListBackupsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsResponse.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsResponse.java
index 8605068ea7..1792c4a292 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsResponse.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListBackupsResponse.java
@@ -101,6 +101,8 @@ private ListBackupsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsRequest.java
index da529706e5..8ce2cf95d5 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsRequest.java
@@ -110,6 +110,8 @@ private ListDatabaseOperationsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsResponse.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsResponse.java
index 78f56d7573..f4d6436bdf 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsResponse.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabaseOperationsResponse.java
@@ -102,6 +102,8 @@ private ListDatabaseOperationsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesRequest.java
index 7e93e917a3..c93221182b 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesRequest.java
@@ -101,6 +101,8 @@ private ListDatabasesRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesResponse.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesResponse.java
index c38330972a..1c4a6ff13b 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesResponse.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/ListDatabasesResponse.java
@@ -102,6 +102,8 @@ private ListDatabasesResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OperationProgress.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OperationProgress.java
index b4dc5c581e..69e9af1c68 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OperationProgress.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OperationProgress.java
@@ -115,6 +115,8 @@ private OperationProgress(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OptimizeRestoredDatabaseMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OptimizeRestoredDatabaseMetadata.java
index a62311cce7..b2cb0b8f1b 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OptimizeRestoredDatabaseMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/OptimizeRestoredDatabaseMetadata.java
@@ -109,6 +109,8 @@ private OptimizeRestoredDatabaseMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseEncryptionConfig.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseEncryptionConfig.java
index 91b0ddab62..e17e96bf2e 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseEncryptionConfig.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseEncryptionConfig.java
@@ -97,6 +97,8 @@ private RestoreDatabaseEncryptionConfig(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseMetadata.java
index 87a8bc413c..72f009ac4f 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseMetadata.java
@@ -154,6 +154,8 @@ private RestoreDatabaseMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -1343,8 +1345,9 @@ public Builder mergeBackupInfo(com.google.spanner.admin.database.v1.BackupInfo v
       } else {
         if (sourceInfoCase_ == 3) {
           backupInfoBuilder_.mergeFrom(value);
+        } else {
+          backupInfoBuilder_.setMessage(value);
         }
-        backupInfoBuilder_.setMessage(value);
       }
       sourceInfoCase_ = 3;
       return this;
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseRequest.java
index b50f8e871a..46f145a431 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreDatabaseRequest.java
@@ -122,6 +122,8 @@ private RestoreDatabaseRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreInfo.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreInfo.java
index 9e18faf6d3..667d9f8fc3 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreInfo.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/RestoreInfo.java
@@ -105,6 +105,8 @@ private RestoreInfo(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -852,8 +854,9 @@ public Builder mergeBackupInfo(com.google.spanner.admin.database.v1.BackupInfo v
       } else {
         if (sourceInfoCase_ == 2) {
           backupInfoBuilder_.mergeFrom(value);
+        } else {
+          backupInfoBuilder_.setMessage(value);
         }
-        backupInfoBuilder_.setMessage(value);
       }
       sourceInfoCase_ = 2;
       return this;
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateBackupRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateBackupRequest.java
index 6eb84dbaf8..3d01e71b4e 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateBackupRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateBackupRequest.java
@@ -110,6 +110,8 @@ private UpdateBackupRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlMetadata.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlMetadata.java
index 83ee4e374d..ed624d9d92 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlMetadata.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlMetadata.java
@@ -132,6 +132,8 @@ private UpdateDatabaseDdlMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java
index 69187cd942..087317405c 100644
--- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java
+++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java
@@ -122,6 +122,8 @@ private UpdateDatabaseDdlRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml
index fbf0723d58..6e3c25c90a 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml
+++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   proto-google-cloud-spanner-admin-instance-v1
-  6.24.0
+  6.25.0
   proto-google-cloud-spanner-admin-instance-v1
   PROTO library for proto-google-cloud-spanner-admin-instance-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceMetadata.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceMetadata.java
index a5923b520b..a83eec6294 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceMetadata.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceMetadata.java
@@ -141,6 +141,8 @@ private CreateInstanceMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceRequest.java
index 6222aff845..ec500f8d50 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/CreateInstanceRequest.java
@@ -112,6 +112,8 @@ private CreateInstanceRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/DeleteInstanceRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/DeleteInstanceRequest.java
index 70afcc5065..9f7b984502 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/DeleteInstanceRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/DeleteInstanceRequest.java
@@ -88,6 +88,8 @@ private DeleteInstanceRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceConfigRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceConfigRequest.java
index 486571ad3b..7aca3afb5c 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceConfigRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceConfigRequest.java
@@ -89,6 +89,8 @@ private GetInstanceConfigRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceRequest.java
index a2fc0d3a4b..73b50eb3d7 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/GetInstanceRequest.java
@@ -103,6 +103,8 @@ private GetInstanceRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/Instance.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/Instance.java
index ecae61417b..545ba582ca 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/Instance.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/Instance.java
@@ -147,6 +147,8 @@ private Instance(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -658,7 +660,7 @@ public int getLabelsCount() {
   @java.lang.Override
   public boolean containsLabels(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     return internalGetLabels().getMap().containsKey(key);
   }
@@ -727,7 +729,7 @@ public java.util.Map getLabelsMap() {
   @java.lang.Override
   public java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.String defaultValue) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map = internalGetLabels().getMap();
     return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -761,7 +763,7 @@ public java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.Strin
   @java.lang.Override
   public java.lang.String getLabelsOrThrow(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map = internalGetLabels().getMap();
     if (!map.containsKey(key)) {
@@ -1965,7 +1967,7 @@ public int getLabelsCount() {
     @java.lang.Override
     public boolean containsLabels(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetLabels().getMap().containsKey(key);
     }
@@ -2035,7 +2037,7 @@ public java.util.Map getLabelsMap() {
     public java.lang.String getLabelsOrDefault(
         java.lang.String key, java.lang.String defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetLabels().getMap();
       return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -2069,7 +2071,7 @@ public java.lang.String getLabelsOrDefault(
     @java.lang.Override
     public java.lang.String getLabelsOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetLabels().getMap();
       if (!map.containsKey(key)) {
@@ -2110,7 +2112,7 @@ public Builder clearLabels() {
      */
     public Builder removeLabels(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       internalGetMutableLabels().getMutableMap().remove(key);
       return this;
@@ -2148,11 +2150,12 @@ public java.util.Map getMutableLabels() {
      */
     public Builder putLabels(java.lang.String key, java.lang.String value) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       if (value == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map value");
       }
+
       internalGetMutableLabels().getMutableMap().put(key, value);
       return this;
     }
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfig.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfig.java
index a233b3abee..9051e78c16 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfig.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfig.java
@@ -123,6 +123,8 @@ private InstanceConfig(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfigName.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfigName.java
index 6cb41a82ee..f35e648619 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfigName.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceConfigName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceName.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceName.java
index 0e512305c9..c20c3d693c 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceName.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceOrBuilder.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceOrBuilder.java
index 450b7a99dd..ac663b7245 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceOrBuilder.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/InstanceOrBuilder.java
@@ -295,7 +295,12 @@ public interface InstanceOrBuilder
    *
    * map<string, string> labels = 7;
    */
-  java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.String defaultValue);
+
+  /* nullable */
+  java.lang.String getLabelsOrDefault(
+      java.lang.String key,
+      /* nullable */
+      java.lang.String defaultValue);
   /**
    *
    *
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsRequest.java
index ebf2739853..74baac36e5 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsRequest.java
@@ -101,6 +101,8 @@ private ListInstanceConfigsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsResponse.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsResponse.java
index 1726c7ec5d..69d6dd0ebd 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsResponse.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstanceConfigsResponse.java
@@ -103,6 +103,8 @@ private ListInstanceConfigsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesRequest.java
index deb10d38b4..ddcaa8ee26 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesRequest.java
@@ -109,6 +109,8 @@ private ListInstancesRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesResponse.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesResponse.java
index bd03fe5c75..e85c06d399 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesResponse.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ListInstancesResponse.java
@@ -102,6 +102,8 @@ private ListInstancesResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ProjectName.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ProjectName.java
index 50c5b7c8fd..54cecb928a 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ProjectName.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ProjectName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ReplicaInfo.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ReplicaInfo.java
index e31bd637c9..c217a63830 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ReplicaInfo.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/ReplicaInfo.java
@@ -93,6 +93,8 @@ private ReplicaInfo(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceMetadata.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceMetadata.java
index fdb914299e..6db0704d62 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceMetadata.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceMetadata.java
@@ -141,6 +141,8 @@ private UpdateInstanceMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceRequest.java b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceRequest.java
index 44034ce459..5450910e70 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceRequest.java
+++ b/proto-google-cloud-spanner-admin-instance-v1/src/main/java/com/google/spanner/admin/instance/v1/UpdateInstanceRequest.java
@@ -110,6 +110,8 @@ private UpdateInstanceRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml
index 6535738221..4b2a68acfb 100644
--- a/proto-google-cloud-spanner-v1/pom.xml
+++ b/proto-google-cloud-spanner-v1/pom.xml
@@ -4,13 +4,13 @@
   4.0.0
   com.google.api.grpc
   proto-google-cloud-spanner-v1
-  6.24.0
+  6.25.0
   proto-google-cloud-spanner-v1
   PROTO library for proto-google-cloud-spanner-v1
   
     com.google.cloud
     google-cloud-spanner-parent
-    6.24.0
+    6.25.0
   
   
     
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsRequest.java
index 02a2260cb9..4b864f147d 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsRequest.java
@@ -108,6 +108,8 @@ private BatchCreateSessionsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsResponse.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsResponse.java
index 76704fd06e..f0a483cc23 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsResponse.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BatchCreateSessionsResponse.java
@@ -92,6 +92,8 @@ private BatchCreateSessionsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BeginTransactionRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BeginTransactionRequest.java
index 3651eee977..5723cafb43 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BeginTransactionRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/BeginTransactionRequest.java
@@ -120,6 +120,8 @@ private BeginTransactionRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequest.java
index 4039631299..8c017a0826 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequest.java
@@ -81,8 +81,8 @@ private CommitRequest(
             }
           case 18:
             {
-              transactionCase_ = 2;
               transaction_ = input.readBytes();
+              transactionCase_ = 2;
               break;
             }
           case 26:
@@ -143,6 +143,8 @@ private CommitRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -1362,8 +1364,9 @@ public Builder mergeSingleUseTransaction(com.google.spanner.v1.TransactionOption
       } else {
         if (transactionCase_ == 3) {
           singleUseTransactionBuilder_.mergeFrom(value);
+        } else {
+          singleUseTransactionBuilder_.setMessage(value);
         }
-        singleUseTransactionBuilder_.setMessage(value);
       }
       transactionCase_ = 3;
       return this;
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponse.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponse.java
index 8079a480ee..43275224b3 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponse.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponse.java
@@ -110,6 +110,8 @@ private CommitResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -223,6 +225,8 @@ private CommitStats(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CreateSessionRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CreateSessionRequest.java
index 4e32e35449..4aff42e77c 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CreateSessionRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CreateSessionRequest.java
@@ -103,6 +103,8 @@ private CreateSessionRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DatabaseName.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DatabaseName.java
index 1c81611049..e7f0be608a 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DatabaseName.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DatabaseName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DeleteSessionRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DeleteSessionRequest.java
index 23ec70f9b5..45c6e27252 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DeleteSessionRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/DeleteSessionRequest.java
@@ -88,6 +88,8 @@ private DeleteSessionRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlRequest.java
index 9d5558673f..040730173d 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlRequest.java
@@ -141,6 +141,8 @@ private ExecuteBatchDmlRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -319,8 +321,12 @@ public interface StatementOrBuilder
      *
      * map<string, .google.spanner.v1.Type> param_types = 3;
      */
+
+    /* nullable */
     com.google.spanner.v1.Type getParamTypesOrDefault(
-        java.lang.String key, com.google.spanner.v1.Type defaultValue);
+        java.lang.String key,
+        /* nullable */
+        com.google.spanner.v1.Type defaultValue);
     /**
      *
      *
@@ -439,6 +445,8 @@ private Statement(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -636,7 +644,7 @@ public int getParamTypesCount() {
     @java.lang.Override
     public boolean containsParamTypes(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetParamTypes().getMap().containsKey(key);
     }
@@ -684,7 +692,7 @@ public java.util.Map getParamTypes
     public com.google.spanner.v1.Type getParamTypesOrDefault(
         java.lang.String key, com.google.spanner.v1.Type defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -708,7 +716,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
     @java.lang.Override
     public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -1508,7 +1516,7 @@ public int getParamTypesCount() {
       @java.lang.Override
       public boolean containsParamTypes(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         return internalGetParamTypes().getMap().containsKey(key);
       }
@@ -1556,7 +1564,7 @@ public java.util.Map getParamTypes
       public com.google.spanner.v1.Type getParamTypesOrDefault(
           java.lang.String key, com.google.spanner.v1.Type defaultValue) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         java.util.Map map =
             internalGetParamTypes().getMap();
@@ -1580,7 +1588,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
       @java.lang.Override
       public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         java.util.Map map =
             internalGetParamTypes().getMap();
@@ -1611,7 +1619,7 @@ public Builder clearParamTypes() {
        */
       public Builder removeParamTypes(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         internalGetMutableParamTypes().getMutableMap().remove(key);
         return this;
@@ -1638,11 +1646,12 @@ public java.util.Map getMutablePar
        */
       public Builder putParamTypes(java.lang.String key, com.google.spanner.v1.Type value) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         if (value == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map value");
         }
+
         internalGetMutableParamTypes().getMutableMap().put(key, value);
         return this;
       }
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlResponse.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlResponse.java
index 814553409d..509713731b 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlResponse.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteBatchDmlResponse.java
@@ -123,6 +123,8 @@ private ExecuteBatchDmlResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequest.java
index d12a7f0c1a..15a6bc6092 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequest.java
@@ -202,6 +202,8 @@ private ExecuteSqlRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -594,6 +596,8 @@ private QueryOptions(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -1829,7 +1833,7 @@ public int getParamTypesCount() {
   @java.lang.Override
   public boolean containsParamTypes(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     return internalGetParamTypes().getMap().containsKey(key);
   }
@@ -1877,7 +1881,7 @@ public java.util.Map getParamTypes
   public com.google.spanner.v1.Type getParamTypesOrDefault(
       java.lang.String key, com.google.spanner.v1.Type defaultValue) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map =
         internalGetParamTypes().getMap();
@@ -1901,7 +1905,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
   @java.lang.Override
   public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map =
         internalGetParamTypes().getMap();
@@ -3422,7 +3426,7 @@ public int getParamTypesCount() {
     @java.lang.Override
     public boolean containsParamTypes(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetParamTypes().getMap().containsKey(key);
     }
@@ -3470,7 +3474,7 @@ public java.util.Map getParamTypes
     public com.google.spanner.v1.Type getParamTypesOrDefault(
         java.lang.String key, com.google.spanner.v1.Type defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -3494,7 +3498,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
     @java.lang.Override
     public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -3525,7 +3529,7 @@ public Builder clearParamTypes() {
      */
     public Builder removeParamTypes(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       internalGetMutableParamTypes().getMutableMap().remove(key);
       return this;
@@ -3552,11 +3556,12 @@ public java.util.Map getMutablePar
      */
     public Builder putParamTypes(java.lang.String key, com.google.spanner.v1.Type value) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       if (value == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map value");
       }
+
       internalGetMutableParamTypes().getMutableMap().put(key, value);
       return this;
     }
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequestOrBuilder.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequestOrBuilder.java
index 869777efc0..1b99cbbfa2 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequestOrBuilder.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ExecuteSqlRequestOrBuilder.java
@@ -255,8 +255,12 @@ public interface ExecuteSqlRequestOrBuilder
    *
    * map<string, .google.spanner.v1.Type> param_types = 5;
    */
+
+  /* nullable */
   com.google.spanner.v1.Type getParamTypesOrDefault(
-      java.lang.String key, com.google.spanner.v1.Type defaultValue);
+      java.lang.String key,
+      /* nullable */
+      com.google.spanner.v1.Type defaultValue);
   /**
    *
    *
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/GetSessionRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/GetSessionRequest.java
index 163a4ce19c..959d2a90b8 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/GetSessionRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/GetSessionRequest.java
@@ -88,6 +88,8 @@ private GetSessionRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeyRange.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeyRange.java
index 31eeafed84..4a470237c3 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeyRange.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeyRange.java
@@ -199,6 +199,8 @@ private KeyRange(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -1172,8 +1174,9 @@ public Builder mergeStartClosed(com.google.protobuf.ListValue value) {
       } else {
         if (startKeyTypeCase_ == 1) {
           startClosedBuilder_.mergeFrom(value);
+        } else {
+          startClosedBuilder_.setMessage(value);
         }
-        startClosedBuilder_.setMessage(value);
       }
       startKeyTypeCase_ = 1;
       return this;
@@ -1387,8 +1390,9 @@ public Builder mergeStartOpen(com.google.protobuf.ListValue value) {
       } else {
         if (startKeyTypeCase_ == 2) {
           startOpenBuilder_.mergeFrom(value);
+        } else {
+          startOpenBuilder_.setMessage(value);
         }
-        startOpenBuilder_.setMessage(value);
       }
       startKeyTypeCase_ = 2;
       return this;
@@ -1601,8 +1605,9 @@ public Builder mergeEndClosed(com.google.protobuf.ListValue value) {
       } else {
         if (endKeyTypeCase_ == 3) {
           endClosedBuilder_.mergeFrom(value);
+        } else {
+          endClosedBuilder_.setMessage(value);
         }
-        endClosedBuilder_.setMessage(value);
       }
       endKeyTypeCase_ = 3;
       return this;
@@ -1815,8 +1820,9 @@ public Builder mergeEndOpen(com.google.protobuf.ListValue value) {
       } else {
         if (endKeyTypeCase_ == 4) {
           endOpenBuilder_.mergeFrom(value);
+        } else {
+          endOpenBuilder_.setMessage(value);
         }
-        endOpenBuilder_.setMessage(value);
       }
       endKeyTypeCase_ = 4;
       return this;
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeySet.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeySet.java
index c9cc35fa86..a0938c188d 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeySet.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/KeySet.java
@@ -113,6 +113,8 @@ private KeySet(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsRequest.java
index e04fad96d9..ef73e426ed 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsRequest.java
@@ -109,6 +109,8 @@ private ListSessionsRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsResponse.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsResponse.java
index 9bdc707569..1efb5afb56 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsResponse.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ListSessionsResponse.java
@@ -100,6 +100,8 @@ private ListSessionsResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Mutation.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Mutation.java
index b06d742616..971756934c 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Mutation.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Mutation.java
@@ -161,6 +161,8 @@ private Mutation(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -456,6 +458,8 @@ private Write(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -2112,6 +2116,8 @@ private Delete(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -3920,8 +3926,9 @@ public Builder mergeInsert(com.google.spanner.v1.Mutation.Write value) {
       } else {
         if (operationCase_ == 1) {
           insertBuilder_.mergeFrom(value);
+        } else {
+          insertBuilder_.setMessage(value);
         }
-        insertBuilder_.setMessage(value);
       }
       operationCase_ = 1;
       return this;
@@ -4137,8 +4144,9 @@ public Builder mergeUpdate(com.google.spanner.v1.Mutation.Write value) {
       } else {
         if (operationCase_ == 2) {
           updateBuilder_.mergeFrom(value);
+        } else {
+          updateBuilder_.setMessage(value);
         }
-        updateBuilder_.setMessage(value);
       }
       operationCase_ = 2;
       return this;
@@ -4374,8 +4382,9 @@ public Builder mergeInsertOrUpdate(com.google.spanner.v1.Mutation.Write value) {
       } else {
         if (operationCase_ == 3) {
           insertOrUpdateBuilder_.mergeFrom(value);
+        } else {
+          insertOrUpdateBuilder_.setMessage(value);
         }
-        insertOrUpdateBuilder_.setMessage(value);
       }
       operationCase_ = 3;
       return this;
@@ -4637,8 +4646,9 @@ public Builder mergeReplace(com.google.spanner.v1.Mutation.Write value) {
       } else {
         if (operationCase_ == 4) {
           replaceBuilder_.mergeFrom(value);
+        } else {
+          replaceBuilder_.setMessage(value);
         }
-        replaceBuilder_.setMessage(value);
       }
       operationCase_ = 4;
       return this;
@@ -4878,8 +4888,9 @@ public Builder mergeDelete(com.google.spanner.v1.Mutation.Delete value) {
       } else {
         if (operationCase_ == 5) {
           deleteBuilder_.mergeFrom(value);
+        } else {
+          deleteBuilder_.setMessage(value);
         }
-        deleteBuilder_.setMessage(value);
       }
       operationCase_ = 5;
       return this;
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartialResultSet.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartialResultSet.java
index 4caabb2902..e87558b78e 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartialResultSet.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartialResultSet.java
@@ -136,6 +136,8 @@ private PartialResultSet(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Partition.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Partition.java
index 6c366b815b..a3e59d46f9 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Partition.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Partition.java
@@ -87,6 +87,8 @@ private Partition(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionOptions.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionOptions.java
index 9f51c4c833..152c58f2d9 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionOptions.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionOptions.java
@@ -90,6 +90,8 @@ private PartitionOptions(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequest.java
index 58d5a55b13..af28148b08 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequest.java
@@ -159,6 +159,8 @@ private PartitionQueryRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -475,7 +477,7 @@ public int getParamTypesCount() {
   @java.lang.Override
   public boolean containsParamTypes(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     return internalGetParamTypes().getMap().containsKey(key);
   }
@@ -523,7 +525,7 @@ public java.util.Map getParamTypes
   public com.google.spanner.v1.Type getParamTypesOrDefault(
       java.lang.String key, com.google.spanner.v1.Type defaultValue) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map =
         internalGetParamTypes().getMap();
@@ -547,7 +549,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
   @java.lang.Override
   public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map =
         internalGetParamTypes().getMap();
@@ -1809,7 +1811,7 @@ public int getParamTypesCount() {
     @java.lang.Override
     public boolean containsParamTypes(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetParamTypes().getMap().containsKey(key);
     }
@@ -1857,7 +1859,7 @@ public java.util.Map getParamTypes
     public com.google.spanner.v1.Type getParamTypesOrDefault(
         java.lang.String key, com.google.spanner.v1.Type defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -1881,7 +1883,7 @@ public com.google.spanner.v1.Type getParamTypesOrDefault(
     @java.lang.Override
     public com.google.spanner.v1.Type getParamTypesOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map =
           internalGetParamTypes().getMap();
@@ -1912,7 +1914,7 @@ public Builder clearParamTypes() {
      */
     public Builder removeParamTypes(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       internalGetMutableParamTypes().getMutableMap().remove(key);
       return this;
@@ -1939,11 +1941,12 @@ public java.util.Map getMutablePar
      */
     public Builder putParamTypes(java.lang.String key, com.google.spanner.v1.Type value) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       if (value == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map value");
       }
+
       internalGetMutableParamTypes().getMutableMap().put(key, value);
       return this;
     }
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequestOrBuilder.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequestOrBuilder.java
index e771b3d289..55f3a659ad 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequestOrBuilder.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionQueryRequestOrBuilder.java
@@ -253,8 +253,12 @@ public interface PartitionQueryRequestOrBuilder
    *
    * map<string, .google.spanner.v1.Type> param_types = 5;
    */
+
+  /* nullable */
   com.google.spanner.v1.Type getParamTypesOrDefault(
-      java.lang.String key, com.google.spanner.v1.Type defaultValue);
+      java.lang.String key,
+      /* nullable */
+      com.google.spanner.v1.Type defaultValue);
   /**
    *
    *
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionReadRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionReadRequest.java
index f0d19a0acc..7baa5cc3a2 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionReadRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionReadRequest.java
@@ -162,6 +162,8 @@ private PartitionReadRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionResponse.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionResponse.java
index 7ee074e71c..7b2384ab22 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionResponse.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PartitionResponse.java
@@ -108,6 +108,8 @@ private PartitionResponse(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PlanNode.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PlanNode.java
index 689b8088c8..f9cca39d45 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PlanNode.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/PlanNode.java
@@ -160,6 +160,8 @@ private PlanNode(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -525,6 +527,8 @@ private ChildLink(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -1593,6 +1597,8 @@ private ShortRepresentation(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -1719,7 +1725,7 @@ public int getSubqueriesCount() {
     @java.lang.Override
     public boolean containsSubqueries(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetSubqueries().getMap().containsKey(key);
     }
@@ -1762,7 +1768,7 @@ public java.util.Map getSubqueriesMap() {
     @java.lang.Override
     public int getSubqueriesOrDefault(java.lang.String key, int defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetSubqueries().getMap();
       return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -1783,7 +1789,7 @@ public int getSubqueriesOrDefault(java.lang.String key, int defaultValue) {
     @java.lang.Override
     public int getSubqueriesOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetSubqueries().getMap();
       if (!map.containsKey(key)) {
@@ -2309,7 +2315,7 @@ public int getSubqueriesCount() {
       @java.lang.Override
       public boolean containsSubqueries(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         return internalGetSubqueries().getMap().containsKey(key);
       }
@@ -2352,7 +2358,7 @@ public java.util.Map getSubqueriesMap() {
       @java.lang.Override
       public int getSubqueriesOrDefault(java.lang.String key, int defaultValue) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         java.util.Map map = internalGetSubqueries().getMap();
         return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -2373,7 +2379,7 @@ public int getSubqueriesOrDefault(java.lang.String key, int defaultValue) {
       @java.lang.Override
       public int getSubqueriesOrThrow(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         java.util.Map map = internalGetSubqueries().getMap();
         if (!map.containsKey(key)) {
@@ -2401,7 +2407,7 @@ public Builder clearSubqueries() {
        */
       public Builder removeSubqueries(java.lang.String key) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
         internalGetMutableSubqueries().getMutableMap().remove(key);
         return this;
@@ -2426,7 +2432,7 @@ public java.util.Map getMutableSubqueries()
        */
       public Builder putSubqueries(java.lang.String key, int value) {
         if (key == null) {
-          throw new java.lang.NullPointerException();
+          throw new NullPointerException("map key");
         }
 
         internalGetMutableSubqueries().getMutableMap().put(key, value);
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/QueryPlan.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/QueryPlan.java
index d00d511db2..ff43f87a24 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/QueryPlan.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/QueryPlan.java
@@ -92,6 +92,8 @@ private QueryPlan(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ReadRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ReadRequest.java
index 99c4419cac..0cebc9cdd8 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ReadRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ReadRequest.java
@@ -180,6 +180,8 @@ private ReadRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RequestOptions.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RequestOptions.java
index f915ca2d64..751e1440d4 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RequestOptions.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RequestOptions.java
@@ -104,6 +104,8 @@ private RequestOptions(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSet.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSet.java
index 18f72a29bd..f4bc8b2256 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSet.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSet.java
@@ -125,6 +125,8 @@ private ResultSet(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetMetadata.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetMetadata.java
index a9d3e4f45b..72c8bb44cf 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetMetadata.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetMetadata.java
@@ -109,6 +109,8 @@ private ResultSetMetadata(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetStats.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetStats.java
index cbd9063c37..a1bda97f88 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetStats.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/ResultSetStats.java
@@ -100,14 +100,14 @@ private ResultSetStats(
             }
           case 24:
             {
-              rowCountCase_ = 3;
               rowCount_ = input.readInt64();
+              rowCountCase_ = 3;
               break;
             }
           case 32:
             {
-              rowCountCase_ = 4;
               rowCount_ = input.readInt64();
+              rowCountCase_ = 4;
               break;
             }
           default:
@@ -121,6 +121,8 @@ private ResultSetStats(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RollbackRequest.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RollbackRequest.java
index 41e9da856e..e2984e096e 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RollbackRequest.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/RollbackRequest.java
@@ -94,6 +94,8 @@ private RollbackRequest(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Session.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Session.java
index 66b43f7680..a41708c4f9 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Session.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Session.java
@@ -132,6 +132,8 @@ private Session(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -256,7 +258,7 @@ public int getLabelsCount() {
   @java.lang.Override
   public boolean containsLabels(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     return internalGetLabels().getMap().containsKey(key);
   }
@@ -303,7 +305,7 @@ public java.util.Map getLabelsMap() {
   @java.lang.Override
   public java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.String defaultValue) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map = internalGetLabels().getMap();
     return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -326,7 +328,7 @@ public java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.Strin
   @java.lang.Override
   public java.lang.String getLabelsOrThrow(java.lang.String key) {
     if (key == null) {
-      throw new java.lang.NullPointerException();
+      throw new NullPointerException("map key");
     }
     java.util.Map map = internalGetLabels().getMap();
     if (!map.containsKey(key)) {
@@ -1003,7 +1005,7 @@ public int getLabelsCount() {
     @java.lang.Override
     public boolean containsLabels(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       return internalGetLabels().getMap().containsKey(key);
     }
@@ -1051,7 +1053,7 @@ public java.util.Map getLabelsMap() {
     public java.lang.String getLabelsOrDefault(
         java.lang.String key, java.lang.String defaultValue) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetLabels().getMap();
       return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -1074,7 +1076,7 @@ public java.lang.String getLabelsOrDefault(
     @java.lang.Override
     public java.lang.String getLabelsOrThrow(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       java.util.Map map = internalGetLabels().getMap();
       if (!map.containsKey(key)) {
@@ -1104,7 +1106,7 @@ public Builder clearLabels() {
      */
     public Builder removeLabels(java.lang.String key) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       internalGetMutableLabels().getMutableMap().remove(key);
       return this;
@@ -1131,11 +1133,12 @@ public java.util.Map getMutableLabels() {
      */
     public Builder putLabels(java.lang.String key, java.lang.String value) {
       if (key == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map key");
       }
       if (value == null) {
-        throw new java.lang.NullPointerException();
+        throw new NullPointerException("map value");
       }
+
       internalGetMutableLabels().getMutableMap().put(key, value);
       return this;
     }
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionName.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionName.java
index 839d4d6556..84eb4091a6 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionName.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Google LLC
+ * Copyright 2022 Google LLC
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionOrBuilder.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionOrBuilder.java
index 556832d009..f25619e848 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionOrBuilder.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SessionOrBuilder.java
@@ -114,7 +114,12 @@ public interface SessionOrBuilder
    *
    * map<string, string> labels = 2;
    */
-  java.lang.String getLabelsOrDefault(java.lang.String key, java.lang.String defaultValue);
+
+  /* nullable */
+  java.lang.String getLabelsOrDefault(
+      java.lang.String key,
+      /* nullable */
+      java.lang.String defaultValue);
   /**
    *
    *
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/StructType.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/StructType.java
index 028b7e7559..b6d2eef84b 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/StructType.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/StructType.java
@@ -93,6 +93,8 @@ private StructType(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -278,6 +280,8 @@ private Field(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Transaction.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Transaction.java
index be57d6c504..088073c16c 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Transaction.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Transaction.java
@@ -101,6 +101,8 @@ private Transaction(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionOptions.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionOptions.java
index 3de89cc4c8..9c3fd1a22c 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionOptions.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionOptions.java
@@ -349,6 +349,8 @@ private TransactionOptions(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -438,6 +440,8 @@ private ReadWrite(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -885,6 +889,8 @@ private PartitionedDml(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -1607,8 +1613,8 @@ private ReadOnly(
               break;
             case 8:
               {
-                timestampBoundCase_ = 1;
                 timestampBound_ = input.readBool();
+                timestampBoundCase_ = 1;
                 break;
               }
             case 18:
@@ -1687,6 +1693,8 @@ private ReadOnly(
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(this);
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
         throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
       } finally {
@@ -2823,8 +2831,9 @@ public Builder mergeMinReadTimestamp(com.google.protobuf.Timestamp value) {
         } else {
           if (timestampBoundCase_ == 2) {
             minReadTimestampBuilder_.mergeFrom(value);
+          } else {
+            minReadTimestampBuilder_.setMessage(value);
           }
-          minReadTimestampBuilder_.setMessage(value);
         }
         timestampBoundCase_ = 2;
         return this;
@@ -3105,8 +3114,9 @@ public Builder mergeMaxStaleness(com.google.protobuf.Duration value) {
         } else {
           if (timestampBoundCase_ == 3) {
             maxStalenessBuilder_.mergeFrom(value);
+          } else {
+            maxStalenessBuilder_.setMessage(value);
           }
-          maxStalenessBuilder_.setMessage(value);
         }
         timestampBoundCase_ = 3;
         return this;
@@ -3398,8 +3408,9 @@ public Builder mergeReadTimestamp(com.google.protobuf.Timestamp value) {
         } else {
           if (timestampBoundCase_ == 4) {
             readTimestampBuilder_.mergeFrom(value);
+          } else {
+            readTimestampBuilder_.setMessage(value);
           }
-          readTimestampBuilder_.setMessage(value);
         }
         timestampBoundCase_ = 4;
         return this;
@@ -3682,8 +3693,9 @@ public Builder mergeExactStaleness(com.google.protobuf.Duration value) {
         } else {
           if (timestampBoundCase_ == 5) {
             exactStalenessBuilder_.mergeFrom(value);
+          } else {
+            exactStalenessBuilder_.setMessage(value);
           }
-          exactStalenessBuilder_.setMessage(value);
         }
         timestampBoundCase_ = 5;
         return this;
@@ -4903,8 +4915,9 @@ public Builder mergeReadWrite(com.google.spanner.v1.TransactionOptions.ReadWrite
       } else {
         if (modeCase_ == 1) {
           readWriteBuilder_.mergeFrom(value);
+        } else {
+          readWriteBuilder_.setMessage(value);
         }
-        readWriteBuilder_.setMessage(value);
       }
       modeCase_ = 1;
       return this;
@@ -5142,8 +5155,9 @@ public Builder mergePartitionedDml(
       } else {
         if (modeCase_ == 3) {
           partitionedDmlBuilder_.mergeFrom(value);
+        } else {
+          partitionedDmlBuilder_.setMessage(value);
         }
-        partitionedDmlBuilder_.setMessage(value);
       }
       modeCase_ = 3;
       return this;
@@ -5380,8 +5394,9 @@ public Builder mergeReadOnly(com.google.spanner.v1.TransactionOptions.ReadOnly v
       } else {
         if (modeCase_ == 2) {
           readOnlyBuilder_.mergeFrom(value);
+        } else {
+          readOnlyBuilder_.setMessage(value);
         }
-        readOnlyBuilder_.setMessage(value);
       }
       modeCase_ = 2;
       return this;
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionSelector.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionSelector.java
index 0ea44276aa..9b032924ca 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionSelector.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/TransactionSelector.java
@@ -89,8 +89,8 @@ private TransactionSelector(
             }
           case 18:
             {
-              selectorCase_ = 2;
               selector_ = input.readBytes();
+              selectorCase_ = 2;
               break;
             }
           case 26:
@@ -120,6 +120,8 @@ private TransactionSelector(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
@@ -875,8 +877,9 @@ public Builder mergeSingleUse(com.google.spanner.v1.TransactionOptions value) {
       } else {
         if (selectorCase_ == 1) {
           singleUseBuilder_.mergeFrom(value);
+        } else {
+          singleUseBuilder_.setMessage(value);
         }
-        singleUseBuilder_.setMessage(value);
       }
       selectorCase_ = 1;
       return this;
@@ -1173,8 +1176,9 @@ public Builder mergeBegin(com.google.spanner.v1.TransactionOptions value) {
       } else {
         if (selectorCase_ == 3) {
           beginBuilder_.mergeFrom(value);
+        } else {
+          beginBuilder_.setMessage(value);
         }
-        beginBuilder_.setMessage(value);
       }
       selectorCase_ = 3;
       return this;
diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Type.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Type.java
index be8ca8f5e9..63f411de12 100644
--- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Type.java
+++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/Type.java
@@ -127,6 +127,8 @@ private Type(
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
       throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
       throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
     } finally {
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 45dfb79414..27f7447ffe 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -21,7 +21,7 @@
     1.8
     1.8
     UTF-8
-    0.31.0
+    0.31.1
     2.1.11
     3.2.9
   
@@ -32,7 +32,7 @@
     
       com.google.cloud
       google-cloud-spanner
-      6.23.3
+      6.24.0
     
     
     
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 7a99556e4b..37cff1be06 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -21,7 +21,7 @@
     1.8
     1.8
     UTF-8
-    0.31.0
+    0.31.1
     2.1.11
     3.2.9
   
@@ -31,7 +31,7 @@
     
       com.google.cloud
       google-cloud-spanner
-      6.24.0
+      6.25.0
     
     
     
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index b76670a913..e7be3718e0 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -23,7 +23,7 @@
     1.8
     1.8
     UTF-8
-    0.31.0
+    0.31.1
   
 
 
@@ -33,7 +33,7 @@
       
         com.google.cloud
         libraries-bom
-        25.2.0
+        25.3.0
         pom
         import
       
diff --git a/versions.txt b/versions.txt
index 109c09bd8a..4813072a5c 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
 # Format:
 # module:released-version:current-version
 
-proto-google-cloud-spanner-admin-instance-v1:6.24.0:6.24.0
-proto-google-cloud-spanner-v1:6.24.0:6.24.0
-proto-google-cloud-spanner-admin-database-v1:6.24.0:6.24.0
-grpc-google-cloud-spanner-v1:6.24.0:6.24.0
-grpc-google-cloud-spanner-admin-instance-v1:6.24.0:6.24.0
-grpc-google-cloud-spanner-admin-database-v1:6.24.0:6.24.0
-google-cloud-spanner:6.24.0:6.24.0
+proto-google-cloud-spanner-admin-instance-v1:6.25.0:6.25.0
+proto-google-cloud-spanner-v1:6.25.0:6.25.0
+proto-google-cloud-spanner-admin-database-v1:6.25.0:6.25.0
+grpc-google-cloud-spanner-v1:6.25.0:6.25.0
+grpc-google-cloud-spanner-admin-instance-v1:6.25.0:6.25.0
+grpc-google-cloud-spanner-admin-database-v1:6.25.0:6.25.0
+google-cloud-spanner:6.25.0:6.25.0